improved documentation + refactored daemonlaunch
parent
88824b7913
commit
a10a32fafb
|
@ -26,6 +26,7 @@ from communicatorutils import housekeeping
|
||||||
from communicatorutils import netcheck
|
from communicatorutils import netcheck
|
||||||
from onionrutils import localcommand
|
from onionrutils import localcommand
|
||||||
from onionrutils import epoch
|
from onionrutils import epoch
|
||||||
|
from onionrcommands.openwebinterface import get_url
|
||||||
from etc import humanreadabletime
|
from etc import humanreadabletime
|
||||||
import onionrservices
|
import onionrservices
|
||||||
import filepaths
|
import filepaths
|
||||||
|
@ -241,6 +242,8 @@ class OnionrCommunicatorDaemon:
|
||||||
logger.info(
|
logger.info(
|
||||||
'First run detected. Run openhome to get setup.',
|
'First run detected. Run openhome to get setup.',
|
||||||
terminal=True)
|
terminal=True)
|
||||||
|
get_url()
|
||||||
|
|
||||||
|
|
||||||
while not config.get('onboarding.done', True) and \
|
while not config.get('onboarding.done', True) and \
|
||||||
not self.shutdown:
|
not self.shutdown:
|
||||||
|
|
|
@ -42,7 +42,8 @@ def net_check(comm_inst):
|
||||||
if not comm_inst.shutdown:
|
if not comm_inst.shutdown:
|
||||||
if not comm_inst.config.get('general.offline_mode', False):
|
if not comm_inst.config.get('general.offline_mode', False):
|
||||||
logger.warn('Network check failed, are you connected to ' +
|
logger.warn('Network check failed, are you connected to ' +
|
||||||
'the Internet, and is Tor working?',
|
'the Internet, and is Tor working? ' +
|
||||||
|
'This is usually temporary, but bugs and censorship can cause this to persist, in which case you should report it to beardog [at] mailbox.org',
|
||||||
terminal=True)
|
terminal=True)
|
||||||
restarttor.restart(comm_inst)
|
restarttor.restart(comm_inst)
|
||||||
comm_inst.offlinePeers = []
|
comm_inst.offlinePeers = []
|
||||||
|
|
|
@ -25,16 +25,15 @@ from utils import identifyhome
|
||||||
import filepaths
|
import filepaths
|
||||||
from etc import onionrvalues, cleanup
|
from etc import onionrvalues, cleanup
|
||||||
from onionrcrypto import getourkeypair
|
from onionrcrypto import getourkeypair
|
||||||
from utils import hastor, logoheader
|
from utils import hastor
|
||||||
import runtests
|
import runtests
|
||||||
from httpapi import daemoneventsapi
|
from httpapi import daemoneventsapi
|
||||||
from .. import version
|
from .. import version
|
||||||
from .getapihost import get_api_host_until_available
|
from .getapihost import get_api_host_until_available
|
||||||
from utils.bettersleep import better_sleep
|
from utils.bettersleep import better_sleep
|
||||||
from netcontroller.torcontrol.onionservicecreator import create_onion_service
|
from netcontroller.torcontrol.onionservicecreator import create_onion_service
|
||||||
from .quotes import QUOTE
|
|
||||||
from .killdaemon import kill_daemon # noqa
|
from .killdaemon import kill_daemon # noqa
|
||||||
from utils.boxprint import bordered
|
from .showlogo import show_logo
|
||||||
from lan import LANManager
|
from lan import LANManager
|
||||||
from lan.server import LANServer
|
from lan.server import LANServer
|
||||||
from sneakernet import sneakernet_import_thread
|
from sneakernet import sneakernet_import_thread
|
||||||
|
@ -60,8 +59,60 @@ def _proper_shutdown():
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
|
|
||||||
|
def _show_info_messages():
|
||||||
|
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)
|
||||||
|
|
||||||
|
logger.info('Using public key: %s' %
|
||||||
|
(logger.colors.underline +
|
||||||
|
getourkeypair.get_keypair()[0][:52]))
|
||||||
|
|
||||||
|
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 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 daemon():
|
def daemon():
|
||||||
"""Start the Onionr communication daemon."""
|
"""Start Onionr's primary threads for communicator, API server, node, and LAN."""
|
||||||
# Determine if Onionr is in offline mode.
|
# Determine if Onionr is in offline mode.
|
||||||
# When offline, Onionr can only use LAN and disk transport
|
# When offline, Onionr can only use LAN and disk transport
|
||||||
offline_mode = config.get('general.offline_mode', False)
|
offline_mode = config.get('general.offline_mode', False)
|
||||||
|
@ -90,33 +141,22 @@ def daemon():
|
||||||
|
|
||||||
# Init run time tester
|
# Init run time tester
|
||||||
# (ensures Onionr is running right, for testing purposes)
|
# (ensures Onionr is running right, for testing purposes)
|
||||||
|
# Run time tests are not normally run
|
||||||
shared_state.get(runtests.OnionrRunTestManager)
|
shared_state.get(runtests.OnionrRunTestManager)
|
||||||
|
|
||||||
|
# Create singleton
|
||||||
shared_state.get(serializeddata.SerializedData)
|
shared_state.get(serializeddata.SerializedData)
|
||||||
|
|
||||||
shared_state.share_object() # share the parent object to the threads
|
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 = ''
|
apiHost = ''
|
||||||
if not offline_mode:
|
if not offline_mode:
|
||||||
apiHost = get_api_host_until_available()
|
apiHost = get_api_host_until_available()
|
||||||
|
|
||||||
logger.raw('', terminal=True)
|
|
||||||
# print nice header thing :)
|
|
||||||
if config.get('general.display_header', True):
|
|
||||||
logoheader.header("")
|
|
||||||
if QUOTE[1]:
|
|
||||||
logger.info(
|
|
||||||
"\u001b[33m\033[F" + bordered(QUOTE[0] + '\n -' + QUOTE[1]),
|
|
||||||
terminal=True)
|
|
||||||
else:
|
|
||||||
logger.info("\u001b[33m\033[F" + bordered(QUOTE[0]), terminal=True)
|
|
||||||
|
|
||||||
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),
|
net = NetController(config.get('client.public.port', 59497),
|
||||||
apiServerIP=apiHost)
|
apiServerIP=apiHost)
|
||||||
shared_state.add(net)
|
shared_state.add(net)
|
||||||
|
@ -126,44 +166,11 @@ def daemon():
|
||||||
security_level = config.get('general.security_level', 1)
|
security_level = config.get('general.security_level', 1)
|
||||||
use_existing_tor = config.get('tor.use_existing_tor', False)
|
use_existing_tor = config.get('tor.use_existing_tor', False)
|
||||||
|
|
||||||
if not offline_mode:
|
if offline_mode:
|
||||||
if config.get('transports.tor', True):
|
_setup_online_mode(offline_mode, use_existing_tor, net, security_level)
|
||||||
if use_existing_tor:
|
|
||||||
try:
|
|
||||||
os.mkdir(filepaths.tor_hs_loc)
|
_show_info_messages()
|
||||||
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 IncorrectPassword:
|
|
||||||
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():
|
|
||||||
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')
|
|
||||||
|
|
||||||
logger.info('Using public key: %s' %
|
|
||||||
(logger.colors.underline +
|
|
||||||
getourkeypair.get_keypair()[0][:52]))
|
|
||||||
|
|
||||||
better_sleep(1)
|
|
||||||
|
|
||||||
events.event('init', threaded=False)
|
events.event('init', threaded=False)
|
||||||
events.event('daemon_start')
|
events.event('daemon_start')
|
||||||
|
@ -175,6 +182,7 @@ def daemon():
|
||||||
Thread(target=sneakernet_import_thread, daemon=True).start()
|
Thread(target=sneakernet_import_thread, daemon=True).start()
|
||||||
|
|
||||||
Thread(target=statistics_reporter, args=[shared_state], daemon=True).start()
|
Thread(target=statistics_reporter, args=[shared_state], daemon=True).start()
|
||||||
|
|
||||||
communicator.startCommunicator(shared_state)
|
communicator.startCommunicator(shared_state)
|
||||||
|
|
||||||
clean_ephemeral_services()
|
clean_ephemeral_services()
|
||||||
|
@ -190,7 +198,7 @@ def daemon():
|
||||||
better_sleep(5)
|
better_sleep(5)
|
||||||
|
|
||||||
cleanup.delete_run_files()
|
cleanup.delete_run_files()
|
||||||
if config.get('general.security_level', 1) >= 2:
|
if security_level >= 2:
|
||||||
filenuke.nuke.clean_tree(identifyhome.identify_home())
|
filenuke.nuke.clean_tree(identifyhome.identify_home())
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
"""Onionr - Private P2P Communication.
|
||||||
|
|
||||||
|
Show nice logo
|
||||||
|
"""
|
||||||
|
import config
|
||||||
|
import logger
|
||||||
|
|
||||||
|
from .quotes import QUOTE
|
||||||
|
from utils.boxprint import bordered
|
||||||
|
from utils import logoheader
|
||||||
|
|
||||||
|
def show_logo():
|
||||||
|
logger.raw('', terminal=True)
|
||||||
|
# print nice header thing :)
|
||||||
|
if config.get('general.display_header', True):
|
||||||
|
logoheader.header("")
|
||||||
|
if QUOTE[1]:
|
||||||
|
logger.info(
|
||||||
|
"\u001b[33m\033[F" + bordered(QUOTE[0] + '\n -' + QUOTE[1]),
|
||||||
|
terminal=True)
|
||||||
|
else:
|
||||||
|
logger.info("\u001b[33m\033[F" + bordered(QUOTE[0]), terminal=True)
|
|
@ -7,16 +7,16 @@
|
||||||
},
|
},
|
||||||
"general": {
|
"general": {
|
||||||
"announce_node": true,
|
"announce_node": true,
|
||||||
"dev_mode": true,
|
"dev_mode": false,
|
||||||
"display_header": true,
|
"display_header": true,
|
||||||
"ephemeral_tunnels": false,
|
"ephemeral_tunnels": false,
|
||||||
"hide_created_blocks": true,
|
"hide_created_blocks": true,
|
||||||
"insert_deniable_blocks": false,
|
"insert_deniable_blocks": true,
|
||||||
"max_block_age": 2678400,
|
"max_block_age": 2678400,
|
||||||
"minimum_block_pow": 1,
|
"minimum_block_pow": 5,
|
||||||
"minimum_send_pow": 1,
|
"minimum_send_pow": 5,
|
||||||
"public_key": "",
|
"public_key": "",
|
||||||
"random_bind_ip": false,
|
"random_bind_ip": true,
|
||||||
"security_level": 0,
|
"security_level": 0,
|
||||||
"show_notifications": true,
|
"show_notifications": true,
|
||||||
"store_plaintext_blocks": true,
|
"store_plaintext_blocks": true,
|
||||||
|
@ -30,12 +30,12 @@
|
||||||
},
|
},
|
||||||
"file": {
|
"file": {
|
||||||
"output": true,
|
"output": true,
|
||||||
"remove_on_exit": false
|
"remove_on_exit": true
|
||||||
},
|
},
|
||||||
"verbosity": "default"
|
"verbosity": "default"
|
||||||
},
|
},
|
||||||
"onboarding": {
|
"onboarding": {
|
||||||
"done": true
|
"done": false
|
||||||
},
|
},
|
||||||
"peers": {
|
"peers": {
|
||||||
"max_connect": 1000,
|
"max_connect": 1000,
|
||||||
|
@ -68,7 +68,7 @@
|
||||||
"transports": {
|
"transports": {
|
||||||
"lan": true,
|
"lan": true,
|
||||||
"sneakernet": true,
|
"sneakernet": true,
|
||||||
"tor": false
|
"tor": true
|
||||||
},
|
},
|
||||||
"ui": {
|
"ui": {
|
||||||
"theme": "dark"
|
"theme": "dark"
|
||||||
|
|
Loading…
Reference in New Issue