Пример #1
0
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
Пример #2
0
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()
Пример #3
0
    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
Пример #4
0
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')
Пример #5
0
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
Пример #6
0
    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
Пример #7
0
    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
Пример #8
0
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"])
Пример #9
0
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
Пример #10
0
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())
Пример #11
0
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()
Пример #12
0
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())
Пример #13
0
from netcontroller import NetController
net = NetController()

print(net.get_ports('hello'))