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 _setup_online_mode( use_existing_tor: bool, net: NetController, security_level: int): if config.get('transports.tor', True): # If we are using tor, check if we are using an existing tor instance # if we are, we need to create an onion service on it and set attrs on our NetController # if not, we need to tell netcontroller to start one if use_existing_tor: try: os.mkdir(filepaths.tor_hs_loc) except FileExistsError: pass net.socksPort = config.get('tor.existing_socks_port') try: net.myID = create_onion_service( port=net.apiServerIP + ':' + str(net.hsPort))[0] except stem.SocketError: logger.error( "Could not connect to existing Tor service", terminal=True) localcommand.local_command('shutdown') cleanup.delete_run_files() sys.exit(1) except IncorrectPassword: # Exit if we cannot connect to the existing Tor instance logger.error('Invalid Tor control password', terminal=True) localcommand.local_command('shutdown') cleanup.delete_run_files() sys.exit(1) if not net.myID.endswith('.onion'): net.myID += '.onion' with open(filepaths.tor_hs_address_file, 'w') as tor_file: tor_file.write(net.myID) else: logger.info('Tor is starting...', terminal=True) if not net.startTor(): # Exit if we cannot start Tor. localcommand.local_command('shutdown') cleanup.delete_run_files() sys.exit(1) if len(net.myID) > 0 and security_level == 0: logger.debug( 'Started .onion service: %s' % (logger.colors.underline + net.myID)) else: logger.debug('.onion service disabled')
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(self): ''' Starts the Onionr communication daemon ''' if not os.environ.get("WERKZEUG_RUN_MAIN") == "true": if self._developmentMode: logger.warn('DEVELOPMENT MODE ENABLED (THIS IS LESS SECURE!)') net = NetController(config.get('client')['port']) logger.info('Tor is starting...') if not net.startTor(): sys.exit(1) logger.info('Started Tor .onion service: ' + logger.colors.underline + net.myID) logger.info('Our Public key: ' + self.onionrCore._crypto.pubKey) time.sleep(1) subprocess.Popen(["./communicator.py", "run", str(net.socksPort)]) logger.debug('Started communicator') api.API(self.debug) return
from netcontroller import NetController from flask import Flask from flask_mail import Mail, Message import pickledb import json def render_template(argss,filename): htmlfile = open('templates/'+filename,'r').read() for me in argss: htmlfile = htmlfile.replace('%'+me+'%',argss[me]) return htmlfile db = pickledb.load('log.db', False) net = NetController() net.load_config('config.json') app = Flask(__name__) app.debug = True try: conf = open('email.json').read() pass except Exception as e: print('Can not open config file: '+str(e)) conf = '' pass if conf != '': jsconf = json.loads(conf) app.config['MAIL_SERVER'] = jsconf["smtp"] app.config['MAIL_PORT'] = int(jsconf["port"])
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())
from netcontroller import NetController net = NetController() print(net.get_ports('hello'))