def kill_daemon(): ''' Shutdown the Onionr daemon (communicator) ''' logger.warn('Stopping the running daemon...', timestamp=False, terminal=True) try: # On platforms where we can, fork out to prevent locking try: pid = os.fork() if pid != 0: return except (AttributeError, OSError) as e: pass events.event('daemon_stop') net = NetController(config.get('client.port', 59496)) try: daemonqueue.daemon_queue_add('shutdown') except sqlite3.OperationalError: pass net.killTor() except Exception as e: logger.error('Failed to shutdown daemon: ' + str(e), error=e, timestamp=False, terminal=True) return
def kill_daemon(): """Shutdown the Onionr daemon (communicator).""" config.reload() logger.warn('Stopping the running daemon...', timestamp=False, terminal=True) # On platforms where we can, fork out to prevent locking try: pid = os.fork() if pid != 0: return except (AttributeError, OSError): pass events.event('daemon_stop') net = NetController(config.get('client.port', 59496)) try: spawn( localcommand.local_command, '/shutdownclean' ).get(timeout=5) except sqlite3.OperationalError: pass net.killTor()
def killDaemon(self): ''' Shutdown the Onionr daemon ''' logger.warn('Killing the running daemon') net = NetController(config.get('client')['port']) try: self.onionrUtils.localCommand('shutdown') except requests.exceptions.ConnectionError: pass self.onionrCore.daemonQueueAdd('shutdown') net.killTor() return
def kill_daemon(o_inst): ''' Shutdown the Onionr daemon ''' logger.warn('Stopping the running daemon...', timestamp = False) try: events.event('daemon_stop', onionr = o_inst) net = NetController(o_inst.onionrCore.config.get('client.port', 59496)) try: o_inst.onionrCore.daemonQueueAdd('shutdown') except sqlite3.OperationalError: pass net.killTor() except Exception as e: logger.error('Failed to shutdown daemon.', error = e, timestamp = False) return
def killDaemon(self): ''' Shutdown the Onionr daemon ''' logger.warn('Killing the running daemon...', timestamp=False) try: events.event('daemon_stop', onionr=self) net = NetController(config.get('client')['port']) try: self.onionrUtils.localCommand('shutdown') except requests.exceptions.ConnectionError: pass self.onionrCore.daemonQueueAdd('shutdown') net.killTor() except Exception as e: logger.error('Failed to shutdown daemon.', error=e, timestamp=False) return
def daemon(o_inst): ''' Starts the Onionr communication daemon ''' # remove runcheck if it exists if os.path.isfile('%s/.runcheck' % (o_inst.onionrCore.dataDir,)): logger.debug('Runcheck file found on daemon start, deleting in advance.') os.remove('%s/.runcheck' % (o_inst.onionrCore.dataDir,)) Thread(target=api.API, args=(o_inst, o_inst.debug, onionr.API_VERSION)).start() Thread(target=api.PublicAPI, args=[o_inst.getClientApi()]).start() try: time.sleep(0) except KeyboardInterrupt: logger.debug('Got keyboard interrupt, shutting down...') _proper_shutdown(o_inst) apiHost = '' while apiHost == '': try: with open(o_inst.onionrCore.publicApiHostFile, 'r') as hostFile: apiHost = hostFile.read() except FileNotFoundError: pass time.sleep(0.5) #onionr.Onionr.setupConfig('data/', self = o_inst) if o_inst._developmentMode: logger.warn('DEVELOPMENT MODE ENABLED (NOT RECOMMENDED)', timestamp = False) net = NetController(o_inst.onionrCore.config.get('client.public.port', 59497), apiServerIP=apiHost) logger.debug('Tor is starting...') if not net.startTor(): o_inst.onionrUtils.localCommand('shutdown') sys.exit(1) if len(net.myID) > 0 and o_inst.onionrCore.config.get('general.security_level', 1) == 0: logger.debug('Started .onion service: %s' % (logger.colors.underline + net.myID)) else: logger.debug('.onion service disabled') logger.debug('Using public key: %s' % (logger.colors.underline + o_inst.onionrCore._crypto.pubKey)) try: time.sleep(1) except KeyboardInterrupt: _proper_shutdown(o_inst) o_inst.onionrCore.torPort = net.socksPort communicatorThread = Thread(target=communicator.startCommunicator, args=(o_inst, str(net.socksPort))) communicatorThread.start() while o_inst.communicatorInst is None: time.sleep(0.1) # print nice header thing :) if o_inst.onionrCore.config.get('general.display_header', True): o_inst.header() # print out debug info o_inst.version(verbosity = 5, function = logger.debug) logger.debug('Python version %s' % platform.python_version()) logger.debug('Started communicator.') events.event('daemon_start', onionr = o_inst) while True: try: time.sleep(3) except KeyboardInterrupt: o_inst.communicatorInst.shutdown = True finally: # Debug to print out used FDs (regular and net) #proc = psutil.Process() #print('api-files:',proc.open_files(), len(psutil.net_connections())) # Break if communicator process ends, so we don't have left over processes if o_inst.communicatorInst.shutdown: break if o_inst.killed: break # Break out if sigterm for clean exit signal.signal(signal.SIGINT, _ignore_sigint) o_inst.onionrCore.daemonQueueAdd('shutdown') o_inst.onionrUtils.localCommand('shutdown') net.killTor() time.sleep(3) o_inst.deleteRunFiles() return
def daemon(): """Start Onionr's primary threads for communicator, API server, node, and LAN.""" def _handle_sig_term(signum, frame): pid = str(os.getpid()) main_pid = localcommand.local_command('/getpid') #logger.info(main_pid, terminal=True) if main_pid and main_pid == pid: logger.info( f"Received sigterm, shutting down gracefully. PID: {pid}", terminal=True) localcommand.local_command('/shutdownclean') else: logger.info( f"Recieved sigterm in child process or fork, exiting. PID: {pid}") sys.exit(0) signal.signal(signal.SIGTERM, _handle_sig_term) # Determine if Onionr is in offline mode. # When offline, Onionr can only use LAN and disk transport offline_mode = config.get('general.offline_mode', False) if not hastor.has_tor(): offline_mode = True logger.error("Tor is not present in system path or Onionr directory", terminal=True) # Create shared objects shared_state = toomanyobjs.TooMany() # Add DeadSimpleKV for quasi-global variables (ephemeral key-value) shared_state.get(DeadSimpleKV) # Initialize the quasi-global variables setup_kv(shared_state.get(DeadSimpleKV)) shared_state.get(daemoneventsapi.DaemonEventsBP) Thread(target=shared_state.get(apiservers.ClientAPI).start, daemon=True, name='client HTTP API').start() if not offline_mode: Thread(target=shared_state.get(apiservers.PublicAPI).start, daemon=True, name='public HTTP API').start() # Init run time tester # (ensures Onionr is running right, for testing purposes) # Run time tests are not normally run shared_state.get(runtests.OnionrRunTestManager) # Create singleton shared_state.get(serializeddata.SerializedData) shared_state.share_object() # share the parent object to the threads show_logo() # since we randomize loopback API server hostname to protect against attacks, # we have to wait for it to become set apiHost = '' if not offline_mode: apiHost = get_api_host_until_available() net = NetController(config.get('client.public.port', 59497), apiServerIP=apiHost) shared_state.add(net) shared_state.get(onionrstatistics.tor.TorStats) security_level = config.get('general.security_level', 1) use_existing_tor = config.get('tor.use_existing_tor', False) if not offline_mode: # we need to setup tor for use _setup_online_mode(use_existing_tor, net, security_level) _show_info_messages() logger.info( "Onionr daemon is running under " + str(os.getpid()), terminal=True) events.event('init', threaded=False) events.event('daemon_start') if config.get('transports.lan', True): if not onionrvalues.IS_QUBES: Thread(target=LANServer(shared_state).start_server, daemon=True).start() LANManager(shared_state).start() else: logger.warn('LAN not supported on Qubes', terminal=True) if config.get('transports.sneakernet', True): Thread(target=sneakernet_import_thread, daemon=True).start() Thread(target=statistics_reporter, args=[shared_state], daemon=True).start() shared_state.get(DeadSimpleKV).put( 'proxyPort', net.socksPort) spawn_client_threads(shared_state) clean_blocks_not_meeting_pow(shared_state) communicator.startCommunicator(shared_state) clean_ephemeral_services() if not offline_mode and not use_existing_tor: net.killTor() else: try: os.remove(filepaths.tor_hs_address_file) except FileNotFoundError: pass better_sleep(5) cleanup.delete_run_files() if security_level >= 2: filenuke.nuke.clean_tree(identifyhome.identify_home())
def daemon(): ''' Starts the Onionr communication daemon ''' if not hastor.has_tor(): logger.error("Tor is not present in system path or Onionr directory", terminal=True) cleanup.delete_run_files() sys.exit(1) # remove runcheck if it exists if os.path.isfile(filepaths.run_check_file): logger.debug( 'Runcheck file found on daemon start, deleting in advance.') os.remove(filepaths.run_check_file) # Create shared objects shared_state = toomanyobjs.TooMany() Thread(target=shared_state.get(apiservers.ClientAPI).start, daemon=True, name='client HTTP API').start() Thread(target=shared_state.get(apiservers.PublicAPI).start, daemon=True, name='public HTTP API').start() # Init run time tester (ensures Onionr is running right, for testing purposes) shared_state.get(runtests.OnionrRunTestManager) shared_state.get(serializeddata.SerializedData) shared_state.share_object() # share the parent object to the threads apiHost = '' while apiHost == '': try: with open(filepaths.public_API_host_file, 'r') as hostFile: apiHost = hostFile.read() except FileNotFoundError: pass time.sleep(0.5) logger.raw('', terminal=True) # print nice header thing :) if config.get('general.display_header', True): logoheader.header() version.version(verbosity=5, function=logger.info) logger.debug('Python version %s' % platform.python_version()) if onionrvalues.DEVELOPMENT_MODE: logger.warn('Development mode enabled', timestamp=False, terminal=True) net = NetController(config.get('client.public.port', 59497), apiServerIP=apiHost) shared_state.add(net) logger.info('Tor is starting...', terminal=True) if not net.startTor(): localcommand.local_command('shutdown') cleanup.delete_run_files() sys.exit(1) if len(net.myID) > 0 and config.get('general.security_level', 1) == 0: logger.debug('Started .onion service: %s' % (logger.colors.underline + net.myID)) else: logger.debug('.onion service disabled') logger.info( 'Using public key: %s' % (logger.colors.underline + getourkeypair.get_keypair()[0][:52])) try: time.sleep(1) except KeyboardInterrupt: pass events.event('init', threaded=False) events.event('daemon_start') communicator.startCommunicator(shared_state) localcommand.local_command('shutdown') net.killTor() try: time.sleep( 5 ) # Time to allow threads to finish, if not any "daemon" threads will be slaughtered http://docs.python.org/library/threading.html#threading.Thread.daemon except KeyboardInterrupt: pass cleanup.delete_run_files()
def daemon(): """Start Onionr's primary threads for communicator, API server, node, and LAN.""" # Determine if Onionr is in offline mode. # When offline, Onionr can only use LAN and disk transport offline_mode = config.get('general.offline_mode', False) if not hastor.has_tor(): offline_mode = True logger.error("Tor is not present in system path or Onionr directory", terminal=True) # remove runcheck if it exists if os.path.isfile(filepaths.run_check_file): logger.debug('Runcheck file found on daemon start, deleting.') os.remove(filepaths.run_check_file) # Create shared objects shared_state = toomanyobjs.TooMany() # Add DeadSimpleKV for quasi-global variables (ephemeral key-value) shared_state.get(DeadSimpleKV) # Initialize the quasi-global variables setup_kv(shared_state.get(DeadSimpleKV)) spawn_client_threads(shared_state) shared_state.get(daemoneventsapi.DaemonEventsBP) Thread(target=shared_state.get(apiservers.ClientAPI).start, daemon=True, name='client HTTP API').start() if not offline_mode: Thread(target=shared_state.get(apiservers.PublicAPI).start, daemon=True, name='public HTTP API').start() # Init run time tester # (ensures Onionr is running right, for testing purposes) # Run time tests are not normally run shared_state.get(runtests.OnionrRunTestManager) # Create singleton shared_state.get(serializeddata.SerializedData) shared_state.share_object() # share the parent object to the threads show_logo() # since we randomize loopback API server hostname to protect against attacks, # we have to wait for it to become set apiHost = '' if not offline_mode: apiHost = get_api_host_until_available() net = NetController(config.get('client.public.port', 59497), apiServerIP=apiHost) shared_state.add(net) shared_state.get(onionrstatistics.tor.TorStats) security_level = config.get('general.security_level', 1) use_existing_tor = config.get('tor.use_existing_tor', False) if not offline_mode: # we need to setup tor for use _setup_online_mode(use_existing_tor, net, security_level) _show_info_messages() events.event('init', threaded=False) events.event('daemon_start') if config.get('transports.lan', True): Thread(target=LANServer(shared_state).start_server, daemon=True).start() LANManager(shared_state).start() if config.get('transports.sneakernet', True): Thread(target=sneakernet_import_thread, daemon=True).start() Thread(target=statistics_reporter, args=[shared_state], daemon=True).start() communicator.startCommunicator(shared_state) clean_ephemeral_services() if not offline_mode and not use_existing_tor: net.killTor() else: try: os.remove(filepaths.tor_hs_address_file) except FileNotFoundError: pass better_sleep(5) cleanup.delete_run_files() if security_level >= 2: filenuke.nuke.clean_tree(identifyhome.identify_home())