Ejemplo n.º 1
0
    def setup_logger(log_level=logging.INFO, enable_update_logging=False):
        """
        Setup the OpenMotics logger.
        :param log_level: Sets the main log level for OpenMotics logging to the default StreamHandler/SysLogHandler
        :param enable_update_logging: Enables logging to the `update_log` file. This will always log in DEBUG
        """

        import constants
        from platform_utils import System

        # Remove all log handlers (since python2 `defaultConfig` has no `force` flag)
        root_logger = logging.getLogger()
        while root_logger.handlers:
            root_logger.removeHandler(root_logger.handlers[0])

        # Setup basic stream handler
        logging.basicConfig(format=Logs.LOG_FORMAT, level=logging.INFO)
        openmotics_log_level = log_level

        # Alter some system loggers
        requests_logger = logging.getLogger(
            'requests.packages.urllib3.connectionpool')
        requests_logger.setLevel(logging.WARNING)

        update_handler = None
        if enable_update_logging:
            update_handler = handlers.RotatingFileHandler(
                constants.get_update_log_location(),
                maxBytes=3 * 1024**2,
                backupCount=2)
            update_handler.setLevel(logging.DEBUG)
            update_handler.setFormatter(logging.Formatter(Logs.LOG_FORMAT))
            openmotics_log_level = min(log_level, logging.DEBUG)

        syslog_handler = None
        if System.get_operating_system().get('ID') == System.OS.BUILDROOT:
            syslog_handler = handlers.SysLogHandler(address='/dev/log')
            syslog_handler.setLevel(log_level)
            syslog_handler.setFormatter(logging.Formatter(Logs.LOG_FORMAT))

        for logger_namespace in ['openmotics', 'gateway']:
            _logger = logging.getLogger(logger_namespace)
            _logger.setLevel(openmotics_log_level)
            _logger.propagate = True

            for extra_handler in [update_handler, syslog_handler]:
                # Add extra handlers, where available
                if extra_handler is not None:
                    _logger.addHandler(extra_handler)
Ejemplo n.º 2
0
def setup_logger():
    """ Setup the OpenMotics logger. """

    logger.setLevel(logging.INFO)
    logger.propagate = False

    handler = logging.StreamHandler()
    handler.setLevel(logging.INFO)
    handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
    logger.addHandler(handler)

    if System.get_operating_system().get('ID') == System.OS.BUILDROOT:
        syslog_handler = logging.handlers.SysLogHandler(address='/dev/log')
        syslog_handler.setLevel(logging.INFO)
        syslog_handler.setFormatter(logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s"))
        logger.addHandler(syslog_handler)
Ejemplo n.º 3
0
def update_gateway_backend(tarball, date, version):
    try:
        backup_dir = os.path.join(PREFIX, 'backup')
        python_dir = os.path.join(PREFIX, 'python')
        etc_dir = os.path.join(PREFIX, 'etc')
        cmd(['mkdir', '-p', backup_dir])


        # TODO: symlink, blue green deployment
        cmd(['mkdir', '-p', os.path.join(backup_dir, date)])
        cmd(['mkdir', '-p', os.path.join(backup_dir, date, 'hex')])
        cmd(['mv', python_dir, os.path.join(backup_dir, date)])
        cmd(['cp', '-r', etc_dir, os.path.join(backup_dir, date)])
        cmd('cp {0} {1} || true'.format(os.path.join(PREFIX, '*.hex'), os.path.join(backup_dir, date, 'hex')), shell=True)  # Add the '|| true' to the end of the command to be sure it exits with exit code 0!

        # Cleanup for old versions.
        old_dist_dir = os.path.join(PREFIX, 'dist-packages')
        if os.path.exists(old_dist_dir):
            cmd(['mv', old_dist_dir, os.path.join(backup_dir, date)])

        logger.info('Extracting gateway')
        cmd(['mkdir', '-p', python_dir])
        run_tarball_extract(tarball, python_dir)
        cmd(['sync'])

        plugins = glob.glob('{}/{}/python/plugins/*/'.format(backup_dir, date))
        if plugins:
            logger.info('Restoring plugins')
            for plugin in plugins:
                cmd(['cp', '-r', plugin, os.path.join(python_dir, 'plugins')])

        logger.info('Running post-update')

        system_os = System.get_operating_system().get('ID')
        if system_os != System.OS.BUILDROOT:
            cmd(['bash', os.path.join(python_dir, 'post-update.sh')])
        cmd(['sync'])
    except Exception as exc:
        logger.exception('Updating Gateway service failed')
        return exc
Ejemplo n.º 4
0
    def start(
                master_controller=INJECTED,  # type: MasterController
                maintenance_controller=INJECTED,  # type: MaintenanceController
                power_communicator=INJECTED,  # type: PowerCommunicator
                power_serial=INJECTED,  # type: RS485
                metrics_controller=INJECTED,  # type: MetricsController
                passthrough_service=INJECTED,  # type: PassthroughService
                scheduling_controller=INJECTED,  # type: SchedulingController
                metrics_collector=INJECTED,  # type: MetricsCollector
                web_service=INJECTED,  # type: WebService
                web_interface=INJECTED,  # type: WebInterface
                watchdog=INJECTED,  # type: Watchdog
                plugin_controller=INJECTED,  # type: PluginController
                event_sender=INJECTED,  # type: EventSender
                thermostat_controller=INJECTED,  # type: ThermostatController
                output_controller=INJECTED,  # type: OutputController
                input_controller=INJECTED,  # type: InputController
                pulse_counter_controller=INJECTED,  # type: PulseCounterController
                sensor_controller=INJECTED,  # type: SensorController
                shutter_controller=INJECTED,  # type: ShutterController
                group_action_controller=INJECTED,  # type: GroupActionController
                frontpanel_controller=INJECTED,  # type: FrontpanelController
                module_controller=INJECTED,  # type: ModuleController
                user_controller=INJECTED,  # type: UserController
                ventilation_controller=INJECTED,  # type: VentilationController
                pubsub=INJECTED  # type: PubSub
    ):
        """ Main function. """
        logger.info('Starting OM core service...')

        # MasterController should be running
        master_controller.start()

        # Sync ORM with sources of thruth
        output_controller.run_sync_orm()
        input_controller.run_sync_orm()
        pulse_counter_controller.run_sync_orm()
        sensor_controller.run_sync_orm()
        shutter_controller.run_sync_orm()

        # Execute data migration(s)
        # TODO: Make the master communication work before executing the migrations (needs eeprom use or other)
        if not System.get_operating_system().get('ID') == System.OS.BUILDROOT:
            FeatureMigrator.migrate()
            RoomsMigrator.migrate()
            InputMigrator.migrate()
            ScheduleMigrator.migrate()
            UserMigrator.migrate()
            ConfigMigrator.migrate()

        # Start rest of the stack
        maintenance_controller.start()
        if power_communicator:
            power_serial.start()
            power_communicator.start()
        metrics_controller.start()
        if passthrough_service:
            passthrough_service.start()
        scheduling_controller.start()
        user_controller.start()
        module_controller.start()
        thermostat_controller.start()
        ventilation_controller.start()
        metrics_collector.start()
        web_service.start()
        if frontpanel_controller:
            frontpanel_controller.start()
        event_sender.start()
        watchdog.start()
        plugin_controller.start()
        output_controller.start()
        input_controller.start()
        pulse_counter_controller.start()
        sensor_controller.start()
        shutter_controller.start()
        group_action_controller.start()
        pubsub.start()

        web_interface.set_service_state(True)
        signal_request = {'stop': False}

        def stop(signum, frame):
            """ This function is called on SIGTERM. """
            _ = signum, frame
            logger.info('Stopping OM core service...')
            watchdog.stop()
            output_controller.stop()
            input_controller.stop()
            pulse_counter_controller.stop()
            sensor_controller.stop()
            shutter_controller.stop()
            group_action_controller.stop()
            web_service.stop()
            if power_communicator:
                power_communicator.stop()
            master_controller.stop()
            maintenance_controller.stop()
            metrics_collector.stop()
            metrics_controller.stop()
            user_controller.stop()
            ventilation_controller.start()
            thermostat_controller.stop()
            plugin_controller.stop()
            if frontpanel_controller:
                frontpanel_controller.stop()
            event_sender.stop()
            pubsub.stop()
            logger.info('Stopping OM core service... Done')
            signal_request['stop'] = True

        try:
            import prctl
            prctl.set_name('omservice')
        except ImportError:
            pass

        signal(SIGTERM, stop)
        logger.info('Starting OM core service... Done')
        while not signal_request['stop']:
            time.sleep(1)
Ejemplo n.º 5
0
class VpnController(object):
    """ Contains methods to check the vpn status, start and stop the vpn. """
    if System.get_operating_system().get('ID') == System.OS.BUILDROOT:
        vpn_binary = 'openvpn'
        config_location = '/etc/openvpn/client/'
        start_cmd = 'cd {} ; {} --suppress-timestamps --nobind --config vpn.conf > /dev/null'.format(
            config_location, vpn_binary)
        stop_cmd = 'killall {} > /dev/null'.format(vpn_binary)
        check_cmd = 'ps -a | grep {} | grep -v "grep" > /dev/null'.format(
            vpn_binary)
    else:
        vpn_service = System.get_vpn_service()
        start_cmd = 'systemctl start {0} > /dev/null'.format(vpn_service)
        stop_cmd = 'systemctl stop {0} > /dev/null'.format(vpn_service)
        check_cmd = 'systemctl is-active {0} > /dev/null'.format(vpn_service)

    def __init__(self):
        self.vpn_connected = False
        self._vpn_tester = DaemonThread(name='vpnctl',
                                        target=self._vpn_connected,
                                        interval=5)

    def start(self):
        self._vpn_tester.start()

    @staticmethod
    def start_vpn():
        """ Start openvpn """
        logger.info('Starting VPN')
        return subprocess.call(VpnController.start_cmd, shell=True) == 0

    @staticmethod
    def stop_vpn():
        """ Stop openvpn """
        logger.info('Stopping VPN')
        return subprocess.call(VpnController.stop_cmd, shell=True) == 0

    @staticmethod
    def check_vpn():
        """ Check if openvpn is running """
        return subprocess.call(VpnController.check_cmd, shell=True) == 0

    def _vpn_connected(self):
        """ Checks if the VPN tunnel is connected """
        try:
            routes = subprocess.check_output(
                'ip r | grep tun | grep via || true', shell=True).strip()
            # example output:
            # 10.0.0.0/24 via 10.37.0.5 dev tun0\n
            # 10.37.0.1 via 10.37.0.5 dev tun0
            result = False
            if routes:
                if not isinstance(
                        routes, str):  # to ensure python 2 and 3 compatibility
                    routes = routes.decode()

                vpn_servers = [
                    route.split(' ')[0] for route in routes.split('\n')
                    if '/' not in route
                ]
                for vpn_server in vpn_servers:
                    if TaskExecutor._ping(vpn_server, verbose=False):
                        result = True
                        break
            self.vpn_connected = result
        except Exception as ex:
            logger.info(
                'Exception occured during vpn connectivity test: {0}'.format(
                    ex))
            self.vpn_connected = False