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)
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)
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
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)
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