From 906219fe30a9a18a9ccdb537af96789adad79191 Mon Sep 17 00:00:00 2001 From: Kevin Froman Date: Thu, 19 Dec 2019 04:34:19 -0600 Subject: [PATCH] * Refactored onionrcommands py to be linting compliant (started using mypy) + git ignore mypy cache --- .gitignore | 2 + src/onionrcommands/banblocks.py | 37 ++++--- src/onionrcommands/daemonlaunch.py | 71 ++++++------- src/onionrcommands/exportblocks.py | 49 +++++---- src/onionrcommands/filecommands.py | 109 +++++++++++--------- src/onionrcommands/keyadders.py | 9 +- src/onionrcommands/motdcreator.py | 27 ++++- src/onionrcommands/onionrstatistics.py | 137 ++++++++++++++++--------- src/onionrcommands/openwebinterface.py | 45 +++++--- src/onionrcommands/parser/__init__.py | 23 +++-- src/onionrcommands/parser/arguments.py | 16 +-- src/onionrcommands/parser/recommend.py | 23 ++++- src/onionrcommands/pubkeymanager.py | 120 +++++++++++++++------- src/onionrcommands/resetplugins.py | 34 +++--- src/onionrcommands/resettor.py | 45 +++++--- src/onionrcommands/restartonionr.py | 44 ++++---- src/onionrcommands/runtimetestcmd.py | 24 ++++- src/onionrcommands/sitecreator.py | 47 +++++++-- src/onionrcommands/softreset.py | 35 ++++--- src/onionrcommands/version.py | 42 ++++++-- 20 files changed, 617 insertions(+), 322 deletions(-) diff --git a/.gitignore b/.gitignore index db0720a0..b36a1f98 100755 --- a/.gitignore +++ b/.gitignore @@ -21,6 +21,8 @@ testdata/* *.dll *.exe +.mypy_cache/ + dist/* # log files diff --git a/src/onionrcommands/banblocks.py b/src/onionrcommands/banblocks.py index c5aadd61..49fa21f8 100755 --- a/src/onionrcommands/banblocks.py +++ b/src/onionrcommands/banblocks.py @@ -1,9 +1,15 @@ -''' - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - This file contains the command for banning blocks from the node -''' -''' +This file contains the command for banning blocks from the node +""" +import sys +import logger +from onionrutils import stringvalidators +from onionrstorage import removeblock +from onionrstorage import deleteBlock +from onionrblocks import onionrblacklist +from utils import reconstructhash +""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,17 +22,11 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -''' -import sys -import logger -from onionrutils import stringvalidators -from onionrstorage import removeblock -from onionrstorage import deleteBlock -from onionrblocks import onionrblacklist -from utils import reconstructhash +""" + def ban_block(): - """Deletes a block, permanently blacklisting it""" + """Delete a block, permanently blacklisting it.""" blacklist = onionrblacklist.OnionrBlackList() try: ban = sys.argv[2] @@ -41,8 +41,9 @@ def ban_block(): blacklist.addToDB(ban) removeblock.remove_block(ban) deleteBlock(ban) - except Exception as error: - logger.error('Could not blacklist block', error=error, terminal=True) + except Exception as error: # pylint: disable=W0703 + logger.error('Could not blacklist block', + error=error, terminal=True) else: logger.info('Block blacklisted', terminal=True) else: @@ -50,4 +51,6 @@ def ban_block(): else: logger.error('Invalid block hash', terminal=True) -ban_block.onionr_help = ": deletes and blacklists a block" + +ban_block.onionr_help = ": " # type: ignore +ban_block.onionr_help += "deletes and blacklists a block" # type: ignore diff --git a/src/onionrcommands/daemonlaunch.py b/src/onionrcommands/daemonlaunch.py index 3c430bfa..d2e124ea 100755 --- a/src/onionrcommands/daemonlaunch.py +++ b/src/onionrcommands/daemonlaunch.py @@ -1,5 +1,6 @@ -""" Onionr - Private P2P Communication - launch the api servers and communicator +"""Onionr - Private P2P Communication. + +launch the api servers and communicator """ import os import sys @@ -47,10 +48,7 @@ def _proper_shutdown(): def daemon(): - """ - Starts the Onionr communication daemon - """ - + """Start the Onionr communication daemon.""" offline_mode = config.get('general.offline_mode', False) if not hastor.has_tor(): @@ -143,44 +141,43 @@ def daemon(): cleanup.delete_run_files() -def _ignore_sigint(sig, frame): - """This space intentionally left blank""" +def _ignore_sigint(sig, frame): # pylint: disable=W0612,W0613 + """Space intentionally left blank.""" return def kill_daemon(): - """ - Shutdown the Onionr daemon (communicator) - """ + """Shutdown the Onionr daemon (communicator).""" logger.warn('Stopping the running daemon...', timestamp=False, terminal=True) + + # On platforms where we can, fork out to prevent locking try: - # On platforms where we can, fork out to prevent locking - try: - pid = os.fork() - if pid != 0: return - except (AttributeError, OSError): pass + pid = os.fork() + if pid != 0: + return + except (AttributeError, OSError): + pass - events.event('daemon_stop') - net = NetController(config.get('client.port', 59496)) - try: - daemonqueue.daemon_queue_add('shutdown') - except sqlite3.OperationalError: - 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 + net.killTor() -kill_daemon.onionr_help = "Gracefully stops the Onionr API servers" +kill_daemon.onionr_help = "Gracefully stops the " # type: ignore +kill_daemon.onionr_help += "Onionr API servers" # type: ignore -def start(input: bool = False, override: bool = False): - """If no lock file, make one and start onionr, - error if there is and its not overridden""" +def start(override: bool = False): + """If no lock file, make one and start onionr. + + Error exit if there is and its not overridden + """ if os.path.exists(filepaths.lock_file) and not override: logger.fatal('Cannot start. Daemon is already running,' + ' or it did not exit cleanly.\n' @@ -188,14 +185,18 @@ def start(input: bool = False, override: bool = False): + ' delete onionr.lock & try again).', terminal=True) else: if not onionrvalues.DEVELOPMENT_MODE: - lockFile = open(filepaths.lock_file, 'w') - lockFile.write('delete at your own risk') - lockFile.close() + lock_file = open(filepaths.lock_file, 'w') + lock_file.write('delete at your own risk') + lock_file.close() + + # Start Onionr daemon daemon() + try: os.remove(filepaths.lock_file) except FileNotFoundError: pass -start.onionr_help = "Start Onionr node (public and clients API servers)" +start.onionr_help = "Start Onionr node " # type: ignore +start.onionr_help += "(public and clients API servers)" # type: ignore diff --git a/src/onionrcommands/exportblocks.py b/src/onionrcommands/exportblocks.py index 72564e00..775537e9 100755 --- a/src/onionrcommands/exportblocks.py +++ b/src/onionrcommands/exportblocks.py @@ -1,9 +1,15 @@ -''' - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - This file handles the command for exporting blocks to disk -''' -''' +This file handles the command for exporting blocks to disk +""" +import sys + +import logger +import onionrstorage +from utils import createdirs +from onionrutils import stringvalidators +import filepaths +""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,28 +22,31 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -''' -import sys, os -import logger, onionrstorage -from utils import createdirs -from onionrutils import stringvalidators -import filepaths -def doExport(bHash): +""" + + +def _do_export(b_hash): createdirs.create_dirs() - data = onionrstorage.getData(bHash) - with open('%s/%s.dat' % (filepaths.export_location, bHash), 'wb') as exportFile: - exportFile.write(data) + data = onionrstorage.getData(b_hash) + with open('%s/%s.dat' % (filepaths.export_location, + b_hash), 'wb') as export: + export.write(data) logger.info('Block exported as file', terminal=True) + def export_block(): - exportDir = filepaths.export_location + """Export block based on hash from stdin or argv.""" try: - if not stringvalidators.validate_hash(sys.argv[2]): raise ValueError + if not stringvalidators.validate_hash(sys.argv[2]): + raise ValueError except (IndexError, ValueError): logger.error('No valid block hash specified.', terminal=True) sys.exit(1) else: - bHash = sys.argv[2] - doExport(bHash) + b_hash = sys.argv[2] + _do_export(b_hash) -export_block.onionr_help = ": Export an Onionr block to a file. Export directory is in the Onionr data directory under block-export/" + +export_block.onionr_help = ": Export block to " # type: ignore +export_block.onionr_help += "a file. Export directory is in " # type: ignore +export_block.onionr_help += "Onionr home under block-export" # type: ignore diff --git a/src/onionrcommands/filecommands.py b/src/onionrcommands/filecommands.py index c475370a..315441df 100755 --- a/src/onionrcommands/filecommands.py +++ b/src/onionrcommands/filecommands.py @@ -1,8 +1,16 @@ -""" - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - This file handles the commands for adding and getting files from the Onionr network +This file handles the commands for adding +and getting files from the Onionr network """ +import sys +import os +import logger +from onionrblocks.onionrblockapi import Block +import onionrexceptions +from onionrutils import stringvalidators +from etc import onionrvalues +from onionrblocks import insert """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,62 +26,67 @@ along with this program. If not, see . """ -import base64, sys, os -import logger -from onionrblocks.onionrblockapi import Block -import onionrexceptions -from onionrutils import stringvalidators -from etc import onionrvalues -from onionrblocks import insert _ORIG_DIR = onionrvalues.ORIG_RUN_DIR_ENV_VAR -def _get_dir(path: str)->str: - if not os.getenv(_ORIG_DIR) is None: return os.getenv(_ORIG_DIR) + '/' + path - else: return path + +def _get_dir(path: str) -> str: + if not os.getenv(_ORIG_DIR) is None: + return os.getenv(_ORIG_DIR) + '/' + path # type: ignore + else: + return path + def add_html(singleBlock=True, blockType='html'): - add_file(singleBlock, blockType) + """Create one-off web page from HTML file, no ext resources.""" + add_file(blockType=blockType) -add_html.onionr_help = "Adds an HTML file into Onionr. Does not currently include dependant resources" -def add_file(singleBlock=False, blockType='bin'): - """ - Adds a file to the onionr network - """ +add_html.onionr_help = "Adds an HTML file into Onionr. Does " # type: ignore +add_html.onionr_help += "not include dependant resources" # type: ignore + +def add_file(blockType='bin'): + """Add a file to the onionr network.""" if len(sys.argv) >= 3: filename = sys.argv[2] - contents = None - if not os.path.exists(_get_dir(filename)): - logger.error('That file does not exist. Improper path (specify full path)?', terminal=True) - return - logger.info('Adding file... this might take a long time.', terminal=True) - try: - with open(_get_dir(filename), 'rb') as singleFile: - blockhash = insert(singleFile.read(), header=blockType) - if len(blockhash) > 0: - logger.info('File %s saved in block %s' % (filename, blockhash), terminal=True) - except Exception as e: - logger.error('Failed to save file in block ' + str(e), timestamp = False, terminal=True) - else: - logger.error('%s add-file ' % sys.argv[0], timestamp = False, terminal=True) -add_file.onionr_help = " Add a file into the Onionr network" + if not os.path.exists(_get_dir(filename)): + logger.error( + 'That file does not exist. Improper path (specify full path)?', + terminal=True) + return + logger.info('Adding file, this might take a long time.', + terminal=True) + try: + with open(_get_dir(filename), 'rb') as single_file: + blockhash = insert(single_file.read(), header=blockType) + if len(blockhash) > 0: + logger.info('File %s saved in block %s' % + (filename, blockhash), terminal=True) + except Exception as err: # pylint: disable=W0703 + logger.error('Failed to save file in block ' + + str(err), timestamp=False, terminal=True) + else: + logger.error('%s add-file ' % + sys.argv[0], timestamp=False, terminal=True) + + +add_file.onionr_help = " Add a file into " # type: ignore +add_file.onionr_help += "the Onionr network" # type: ignore + def get_file(): - """ - Get a file from onionr blocks - """ + """Get a file from onionr blocks.""" try: - fileName = _get_dir(sys.argv[2]) + file_name = _get_dir(sys.argv[2]) bHash = sys.argv[3] except IndexError: - logger.error("Syntax %s %s" % (sys.argv[0], '/path/to/filename '), terminal=True) + logger.error("Syntax %s %s" % ( + sys.argv[0], '/path/to/filename '), terminal=True) else: - logger.info(fileName, terminal=True) + logger.info(file_name, terminal=True) - contents = None - if os.path.exists(fileName): + if os.path.exists(file_name): logger.error("File already exists", terminal=True) return if not stringvalidators.validate_hash(bHash): @@ -81,9 +94,13 @@ def get_file(): return try: - with open(fileName, 'wb') as myFile: - myFile.write(Block(bHash).bcontent) + with open(file_name, 'wb') as my_file: + my_file.write(Block(bHash).bcontent) except onionrexceptions.NoDataAvailable: - logger.error('That block is not available. Trying again later may work.', terminal=True) + logger.error( + 'That block is not available. Trying again later may work.', + terminal=True) -get_file.onionr_help = " : Download a file from the onionr network." + +get_file.onionr_help = " : Download " # type: ignore +get_file.onionr_help += "a file from the onionr network." # type: ignore diff --git a/src/onionrcommands/keyadders.py b/src/onionrcommands/keyadders.py index a76e275c..795dd2c7 100755 --- a/src/onionrcommands/keyadders.py +++ b/src/onionrcommands/keyadders.py @@ -1,7 +1,6 @@ -""" - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - add keys (transport and pubkey) +add keys (transport and pubkey) """ import sys import logger @@ -23,7 +22,7 @@ from coredb import keydb def add_address(): - """Command to add a peer address from either an arg or stdin""" + """Command to add a peer address from either an arg or stdin.""" try: newAddress = sys.argv[2] newAddress = newAddress.replace('http:', '').replace('/', '') @@ -38,4 +37,4 @@ def add_address(): logger.warn("Unable to add address.", terminal=True) -add_address.onionr_help = "Adds a node transport address to the node list" +add_address.onionr_help = "Adds a node transport address" # type: ignore diff --git a/src/onionrcommands/motdcreator.py b/src/onionrcommands/motdcreator.py index 93586f74..85e69e8c 100644 --- a/src/onionrcommands/motdcreator.py +++ b/src/onionrcommands/motdcreator.py @@ -1,15 +1,36 @@ +"""Onionr - Private P2P Communication. + +Command to make new network-wide MOTD message. Only network admin can do this +The key is set in onionrvalues +""" import onionrblocks +""" + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +""" + def motd_creator(): - """Create a new MOTD message for the Onionr network""" + """Create a new MOTD message for the Onionr network.""" motd = '' new = '' print('Enter a new MOTD, quit on a new line:') while new != 'quit': - new = input() + new = input() # nosec B323 if new != 'quit': motd += new bl = onionrblocks.insert(motd, header='motd', sign=True) print(f"inserted in {bl}") -motd_creator.onionr_help = "Create a new MOTD message for the onionr network" + +motd_creator.onionr_help = "Create a new MOTD for the network" # type: ignore diff --git a/src/onionrcommands/onionrstatistics.py b/src/onionrcommands/onionrstatistics.py index 45154bc2..38434e28 100755 --- a/src/onionrcommands/onionrstatistics.py +++ b/src/onionrcommands/onionrstatistics.py @@ -1,9 +1,21 @@ -''' - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - This module defines commands to show stats/details about the local node -''' -''' +This module defines commands to show stats/details about the local node +""" +import os +import logger +from onionrblocks import onionrblockapi +from onionrblocks import onionrblacklist +from onionrutils import checkcommunicator, mnemonickeys +from utils import sizeutils, gethostname, getconsolewidth, identifyhome +from coredb import blockmetadb, keydb +import onionrcrypto +import config +from etc import onionrvalues + +check_communicator = checkcommunicator.is_communicator_running + +""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,51 +28,55 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -''' -import os, uuid, time -import logger -from onionrblocks import onionrblockapi -from onionrblocks import onionrblacklist -from onionrutils import checkcommunicator, mnemonickeys -from utils import sizeutils, gethostname, getconsolewidth, identifyhome -from coredb import blockmetadb, daemonqueue, keydb -import onionrcrypto, config -from etc import onionrvalues +""" + + def show_stats(): + """Print/log statistic info about our Onionr install.""" try: # define stats messages here totalBlocks = len(blockmetadb.get_block_list()) home = identifyhome.identify_home() - signedBlocks = len(onionrblockapi.Block.getBlocks(signed = True)) + signedBlocks = len(onionrblockapi.Block.getBlocks(signed=True)) totalBanned = len(onionrblacklist.OnionrBlackList().getList()) messages = { # info about local client - 'Onionr Daemon Status' : ((logger.colors.fg.green + 'Online') if checkcommunicator.is_communicator_running(timeout = 9) else logger.colors.fg.red + 'Offline'), + 'Onionr Daemon Status': + ((logger.colors.fg.green + 'Online') + if check_communicator(timeout=9) + else logger.colors.fg.red + 'Offline'), # file and folder size stats - 'div1' : True, # this creates a solid line across the screen, a div - 'Total Block Size' : sizeutils.human_size(sizeutils.size(home + 'blocks/')), - 'Total Plugin Size' : sizeutils.human_size(sizeutils.size(home + 'plugins/')), - 'Log File Size' : sizeutils.human_size(sizeutils.size(home + 'output.log')), + 'div1': True, # this creates a solid line across the screen, a div + 'Total Block Size': + sizeutils.human_size(sizeutils.size(home + 'blocks/')), + 'Total Plugin Size': + sizeutils.human_size(sizeutils.size(home + 'plugins/')), + 'Log File Size': + sizeutils.human_size(sizeutils.size(home + 'output.log')), # count stats - 'div2' : True, - 'Known Peers (nodes)' : str(max(len(keydb.listkeys.list_adders()) - 1, 0)), - 'Enabled Plugins' : str(len(config.get('plugins.enabled', list()))) + ' / ' + str(len(os.listdir(home + 'plugins/'))), - 'Stored Blocks' : str(totalBlocks), - 'Deleted Blocks' : str(totalBanned), - 'Percent Blocks Signed' : str(round(100 * signedBlocks / max(totalBlocks, 1), 2)) + '%' + 'div2': True, + 'Known Peers (nodes)': + str(max(len(keydb.listkeys.list_adders()) - 1, 0)), + 'Enabled Plugins': + str(len(config.get('plugins.enabled', list()))) + ' / ' + + str(len(os.listdir(home + 'plugins/'))), + 'Stored Blocks': str(totalBlocks), + 'Deleted Blocks': str(totalBanned), + 'Percent Blocks Signed': + str(round(100 * signedBlocks / max(totalBlocks, 1), 2)) + '%' } # color configuration colors = { - 'title' : logger.colors.bold, - 'key' : logger.colors.fg.lightgreen, - 'val' : logger.colors.fg.green, - 'border' : logger.colors.fg.lightblue, + 'title': logger.colors.bold, + 'key': logger.colors.fg.lightgreen, + 'val': logger.colors.fg.green, + 'border': logger.colors.fg.lightblue, - 'reset' : logger.colors.reset + 'reset': logger.colors.reset } # pre-processing @@ -73,31 +89,58 @@ def show_stats(): groupsize = width - prewidth - len('[+] ') # generate stats table - logger.info(colors['title'] + 'Onionr v%s Statistics' % onionrvalues.ONIONR_VERSION + colors['reset'], terminal=True) - logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True) + logger.info(colors['title'] + 'Onionr v%s Statistics' % + onionrvalues.ONIONR_VERSION + colors['reset'], + terminal=True) + logger.info(colors['border'] + '-' * (maxlength + 1) + + '+' + colors['reset'], terminal=True) for key, val in messages.items(): if not (type(val) is bool and val is True): - val = [str(val)[i:i + groupsize] for i in range(0, len(str(val)), groupsize)] + val = [str(val)[i:i + groupsize] + for i in range(0, len(str(val)), groupsize)] - logger.info(colors['key'] + str(key).rjust(maxlength) + colors['reset'] + colors['border'] + ' | ' + colors['reset'] + colors['val'] + str(val.pop(0)) + colors['reset'], terminal=True) + logger.info(colors['key'] + str(key).rjust(maxlength) + + colors['reset'] + colors['border'] + + ' | ' + colors['reset'] + colors['val'] + + str(val.pop(0)) + colors['reset'], terminal=True) for value in val: - logger.info(' ' * maxlength + colors['border'] + ' | ' + colors['reset'] + colors['val'] + str(value) + colors['reset'], terminal=True) + logger.info(' ' * maxlength + colors['border'] + ' | ' + + colors['reset'] + colors['val'] + str( + value) + colors['reset'], terminal=True) else: - logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True) - logger.info(colors['border'] + '-' * (maxlength + 1) + '+' + colors['reset'], terminal=True) - except Exception as e: - logger.error('Failed to generate statistics table. ' + str(e), error = e, timestamp = False, terminal=True) + logger.info(colors['border'] + '-' * (maxlength + + 1) + '+' + + colors['reset'], terminal=True) + logger.info(colors['border'] + '-' * (maxlength + 1) + + '+' + colors['reset'], terminal=True) + except Exception as e: # pylint: disable=W0703 + logger.error('Failed to generate statistics table. ' + + str(e), error=e, timestamp=False, terminal=True) + def show_details(): + """Print out details. + + node transport address(es) + active user ID + active user ID in mnemonic form + """ details = { - 'Node Address' : gethostname.get_hostname(), - 'Public Key' : onionrcrypto.pub_key.replace('=', ''), - 'Human-readable Public Key' : mnemonickeys.get_human_readable_ID() + 'Node Address': gethostname.get_hostname(), + 'Public Key': onionrcrypto.pub_key.replace('=', ''), + 'Human-readable Public Key': mnemonickeys.get_human_readable_ID() } for detail in details: - logger.info('%s%s: \n%s%s\n' % (logger.colors.fg.lightgreen, detail, logger.colors.fg.green, details[detail]), terminal = True) + logger.info('%s%s: \n%s%s\n' % (logger.colors.fg.lightgreen, + detail, logger.colors.fg.green, + details[detail]), terminal=True) -show_details.onionr_help = "Shows relevant information for your Onionr install: node address, and active public key." -show_stats.onionr_help = "Shows statistics for your Onionr node. Slow if Onionr is not running" + +show_details.onionr_help = "Shows relevant information " # type: ignore +show_details.onionr_help += "for your Onionr install: node " # type: ignore +show_details.onionr_help += "address, and active public key." # type: ignore + +show_stats.onionr_help = "Shows statistics for your Onionr " # type: ignore +show_stats.onionr_help += "node. Slow if Onionr is not running" # type: ignore diff --git a/src/onionrcommands/openwebinterface.py b/src/onionrcommands/openwebinterface.py index 20bf2356..4147aaeb 100755 --- a/src/onionrcommands/openwebinterface.py +++ b/src/onionrcommands/openwebinterface.py @@ -1,9 +1,12 @@ -''' - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - Open the web interface properly into a web browser -''' -''' +Open the web interface properly into a web browser +""" +import webbrowser +import logger +from onionrutils import getclientapiserver +import config +""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,33 +19,43 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -''' -import webbrowser -import logger -from onionrutils import getclientapiserver -import config +""" -def get_url(): + +def get_url() -> str: + """Build UI URL string and return it.""" try: url = getclientapiserver.get_client_API_server() except FileNotFoundError: url = "" - logger.error('Onionr seems to not be running (could not get api host)', terminal=True) + logger.error( + 'Onionr seems to not be running (could not get api host)', + terminal=True) else: url = 'http://%s/#%s' % (url, config.get('client.webpassword')) logger.info('Onionr web interface URL: ' + url, terminal=True) return url -get_url.onionr_help = "Shows the Onionr web interface URL with API key" + +get_url.onionr_help = "Shows the Onionr " # type: ignore +get_url.onionr_help += "web interface URL with API key" # type: ignore + def open_home(): + """Command to open web interface URL in default browser.""" try: url = getclientapiserver.get_client_API_server() except FileNotFoundError: - logger.error('Onionr seems to not be running (could not get api host)', terminal=True) + logger.error( + 'Onionr seems to not be running (could not get api host)', + terminal=True) else: url = 'http://%s/#%s' % (url, config.get('client.webpassword')) - logger.info('If Onionr does not open automatically, use this URL: ' + url, terminal=True) + logger.info( + 'If Onionr does not open automatically, use this URL: ' + url, + terminal=True) webbrowser.open_new_tab(url) -open_home.onionr_help = "Opens the Onionr web UI in the default browser. Node must be running." + +open_home.onionr_help = "Opens the Onionr UI in the default " # type: ignore +open_home.onionr_help += "browser. Node must be running." # type: ignore diff --git a/src/onionrcommands/parser/__init__.py b/src/onionrcommands/parser/__init__.py index 62855519..287e028d 100644 --- a/src/onionrcommands/parser/__init__.py +++ b/src/onionrcommands/parser/__init__.py @@ -1,7 +1,6 @@ -""" - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - This module loads in the Onionr arguments and their help messages +This module loads in the Onionr arguments and their help messages """ import sys import os @@ -28,10 +27,12 @@ from . import arguments, recommend def plugin_command(cmd): + """Build a plugin command function name.""" return f'on_{cmd}_cmd' def register_plugin_commands(cmd) -> bool: + """Find a plugin command hook and execute it for a given cmd.""" plugin_cmd = plugin_command(cmd) for pl in onionrplugins.get_enabled_plugins(): pl = onionrplugins.get_plugin(pl) @@ -46,11 +47,10 @@ def _show_term(msg: str): def register(): - """Registers commands and handles help command processing""" + """Register commands and handles help command processing.""" def get_help_message(cmd: str, default: str = 'No help available for this command'): - """Return help message for a given command, supports plugin commands""" - + """Print help message for a given command, supports plugin commands.""" pl_cmd = plugin_command(cmd) for pl in onionrplugins.get_enabled_plugins(): pl = onionrplugins.get_plugin(pl) @@ -61,7 +61,7 @@ def register(): pass for i in arguments.get_arguments(): - for alias in i: + for _ in i: try: return arguments.get_help(cmd) except AttributeError: @@ -78,16 +78,19 @@ def register(): return is_help_cmd = False - if cmd.replace('--', '').lower() == 'help': is_help_cmd = True + if cmd.replace('--', '').lower() == 'help': + is_help_cmd = True try: try: if cmd not in ('start', 'details', 'show-details'): os.chdir(os.environ['ORIG_ONIONR_RUN_DIR']) - except KeyError: pass + except KeyError: + pass try: arguments.get_func(cmd)() - except KeyboardInterrupt: pass + except KeyboardInterrupt: + pass except onionrexceptions.NotFound: if not register_plugin_commands(cmd) and not is_help_cmd: recommend.recommend() diff --git a/src/onionrcommands/parser/arguments.py b/src/onionrcommands/parser/arguments.py index 8f85fd0f..45180f1d 100644 --- a/src/onionrcommands/parser/arguments.py +++ b/src/onionrcommands/parser/arguments.py @@ -1,7 +1,6 @@ -""" - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - Sets CLI arguments for Onionr +Sets CLI arguments for Onionr """ from typing import Callable @@ -38,8 +37,11 @@ from onionrutils import importnewblocks # func to import new blocks def get_arguments() -> dict: - """This is a function because we need to be able - to dynamically modify them with plugins""" + """Return command argument dict, minus plugin cmds. + + This is a function because we need to be able to + dynamically modify them with plugins + """ args = { ('blacklist', 'blacklist-block', 'remove-block', 'removeblock', 'banblock', 'ban-block'): banblocks.ban_block, @@ -76,7 +78,7 @@ def get_arguments() -> dict: def get_help(arg: str) -> str: - """Returns the help info string from a given command""" + """Return the help info string from a given command.""" arguments = get_arguments() # Iterate the command alias tuples for argument in arguments: @@ -87,7 +89,7 @@ def get_help(arg: str) -> str: def get_func(argument: str) -> Callable: - """Returns the function for a given command argument""" + """Return the function for a given command argument.""" argument = argument.lower() args = get_arguments() diff --git a/src/onionrcommands/parser/recommend.py b/src/onionrcommands/parser/recommend.py index 7e23e342..f90ecd5a 100644 --- a/src/onionrcommands/parser/recommend.py +++ b/src/onionrcommands/parser/recommend.py @@ -1,10 +1,29 @@ +"""Onionr - Private P2P Communication. + +Try to provide recommendations for invalid Onionr commands +""" import sys from difflib import SequenceMatcher import logger from . import arguments +""" + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +""" def recommend(print_default: bool = True): + """Print out a recommendation for argv cmd if one is available.""" tried = sys.argv[1] args = arguments.get_arguments() print_message = 'Command not found:' @@ -15,5 +34,5 @@ def recommend(print_default: bool = True): + 'did you mean "{word}"?', terminal=True) return - if print_default: logger.error('%s "%s"' % - (print_message, tried), terminal=True) + if print_default: + logger.error('%s "%s"' % (print_message, tried), terminal=True) diff --git a/src/onionrcommands/pubkeymanager.py b/src/onionrcommands/pubkeymanager.py index 27873289..4b45d357 100755 --- a/src/onionrcommands/pubkeymanager.py +++ b/src/onionrcommands/pubkeymanager.py @@ -1,9 +1,22 @@ -''' - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - This module defines user ID-related CLI commands -''' -''' +This module defines user ID-related CLI commands +""" +import sys +import getpass + +import unpaddedbase32 +import niceware + +import vanityonionr +import logger +import onionrexceptions +from onionrutils import stringvalidators, bytesconverter +import config +import keymanager +import onionrcrypto +from etc import onionrvalues +""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,60 +29,72 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -''' +""" -import sys, getpass - -import unpaddedbase32 -import niceware - -import vanityonionr -import logger, onionrexceptions -from onionrutils import stringvalidators, bytesconverter -from onionrusers import onionrusers, contactmanager -import config -from coredb import keydb -import keymanager, onionrcrypto -from etc import onionrvalues DETERMINISTIC_REQUIREMENT = onionrvalues.PASSWORD_LENGTH + + def add_ID(): + """Command to create a new user ID key pair.""" key_manager = keymanager.KeyManager() try: - sys.argv[2] - if not sys.argv[2].lower() == 'true': raise ValueError - except (IndexError, ValueError) as e: + sys.argv[2] # pylint: disable=W0104 + if not sys.argv[2].lower() == 'true': + raise ValueError + except (IndexError, ValueError): newID = key_manager.addKey()[0] else: - logger.warn('Deterministic keys require random and long passphrases.', terminal=True) - logger.warn('If a good passphrase is not used, your key can be easily stolen.', terminal=True) - logger.warn('You should use a series of hard to guess words, see this for reference: https://www.xkcd.com/936/', terminal=True) + logger.warn( + 'Deterministic keys require random and long passphrases.', + terminal=True) + logger.warn( + 'If a good passphrase is not used, your key can be easily stolen.', + terminal=True) + logger.warn( + 'You should use a series of hard to guess words, ' + + 'see this for reference: https://www.xkcd.com/936/', + terminal=True) try: - pass1 = getpass.getpass(prompt='Enter at least %s characters: ' % (DETERMINISTIC_REQUIREMENT,)) + pass1 = getpass.getpass( + prompt='Enter at least %s characters: ' % + (DETERMINISTIC_REQUIREMENT,)) pass2 = getpass.getpass(prompt='Confirm entry: ') except KeyboardInterrupt: sys.exit(42) if onionrcrypto.cryptoutils.safe_compare(pass1, pass2): try: - logger.info('Generating deterministic key. This can take a while.', terminal=True) + logger.info( + 'Generating deterministic key. This can take a while.', + terminal=True) newID, privKey = onionrcrypto.generate_deterministic(pass1) except onionrexceptions.PasswordStrengthError: - logger.error('Passphrase must use at least %s characters.' % (DETERMINISTIC_REQUIREMENT,), terminal=True) + logger.error('Passphrase must use at least %s characters.' % ( + DETERMINISTIC_REQUIREMENT,), terminal=True) sys.exit(1) else: logger.error('Passwords do not match.', terminal=True) sys.exit(1) try: - key_manager.addKey(pubKey=newID, - privKey=privKey) + key_manager.addKey(pubKey=newID, + privKey=privKey) except ValueError: - logger.error('That ID is already available, you can change to it with the change-id command.', terminal=True) + logger.error( + 'That ID is already available, you can change to it ' + + 'with the change-id command.', terminal=True) return - logger.info('Added ID: %s' % (bytesconverter.bytes_to_str(newID),), terminal=True) + logger.info('Added ID: %s' % + (bytesconverter.bytes_to_str(newID),), terminal=True) + + +add_ID.onionr_help = "If the first argument is true, " # type: ignore +add_ID.onionr_help += "Onionr will show a deterministic " # type: ignore +add_ID.onionr_help += "generation prompt. Otherwise it will " # type: ignore +add_ID.onionr_help += "generate & save a new random key pair." # type: ignore -add_ID.onionr_help = "If the first argument is true, Onionr will show a deterministic generation prompt. Otherwise it will generate & save a new random key pair." def change_ID(): + """Command to change active ID from argv or stdin.""" key_manager = keymanager.KeyManager() try: key = sys.argv[2] @@ -89,14 +114,24 @@ def change_ID(): else: logger.warn('Invalid key %s' % (key,), terminal=True) -change_ID.onionr_help = ": Switches Onionr to use a different user ID key. You should immediately restart Onionr if it is running." + +change_ID.onionr_help = ": Switches Onionr to " # type: ignore +change_ID.onionr_help += "use a different user ID key. " # type: ignore +change_ID.onionr_help += "You should immediately restart " # type: ignore +change_ID.onionr_help += "Onionr if it is running." # type: ignore + def add_vanity(): + """Command to generate menmonic vanity key pair.""" key_manager = keymanager.KeyManager() - tell = lambda tell: logger.info(tell, terminal=True) + + def tell(tell): + return logger.info(tell, terminal=True) + words = '' length = len(sys.argv) - 2 - if length == 0: return + if length == 0: + return for i in range(2, len(sys.argv)): words += ' ' words += sys.argv[i] @@ -108,12 +143,19 @@ def add_vanity(): try: vanity = vanityonionr.find_multiprocess(words) except ValueError: - logger.warn('Vanity words must be valid english bip39', terminal=True) + logger.warn('Vanity words must be valid english bip39', + terminal=True) else: b32_pub = unpaddedbase32.b32encode(vanity[0]) - tell('Found vanity address:\n' + niceware.bytes_to_passphrase(vanity[0])) + tell('Found vanity address:\n' + + niceware.bytes_to_passphrase(vanity[0])) tell('Base32 Public key: %s' % (b32_pub.decode(),)) key_manager.addKey(b32_pub, unpaddedbase32.b32encode(vanity[1])) except KeyboardInterrupt: pass -add_vanity.onionr_help = " - Generates and stores an Onionr vanity address (see https://github.com/moreati/python-niceware/blob/master/niceware/wordlist.py)" + + +add_vanity.onionr_help = " - " # type: ignore +add_vanity.onionr_help += "Generates and stores an " # type: ignore +add_vanity.onionr_help += "Onionr vanity address " # type: ignore +add_vanity.onionr_help += "(see is.gd/YklHGe)" # type: ignore diff --git a/src/onionrcommands/resetplugins.py b/src/onionrcommands/resetplugins.py index 202b1ae7..980ab385 100644 --- a/src/onionrcommands/resetplugins.py +++ b/src/onionrcommands/resetplugins.py @@ -1,9 +1,13 @@ -''' - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - Reset default plugins from source -''' -''' +Reset default plugins from source +""" +import os +import shutil + +from utils import identifyhome +import logger +""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,21 +20,21 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -''' -import os -import shutil +""" -from utils import identifyhome -from onionrsetup import setup_default_plugins -import logger def reset(): - """Reinstalls Onionr default plugins""" + """Reinstalls Onionr default plugins.""" home = identifyhome.identify_home() plugin_dir = home + '/plugins/' - if not os.path.exists(home): return - if os.path.exists(plugin_dir): shutil.rmtree(plugin_dir) + if not os.path.exists(home): + return + if os.path.exists(plugin_dir): + shutil.rmtree(plugin_dir) logger.info('Default plugins have been reset.', terminal=True) -reset.onionr_help = "reinstalls default Onionr plugins (e.g. mail). Should be done after git pulls or plugin modification." + +reset.onionr_help = "reinstalls default Onionr plugins" # type: ignore +reset.onionr_help += "(e.g. mail). Should be done after " # type: ignore +reset.onionr_help += "git pulls or plugin modification." # type: ignore diff --git a/src/onionrcommands/resettor.py b/src/onionrcommands/resettor.py index e125d379..3554151f 100755 --- a/src/onionrcommands/resettor.py +++ b/src/onionrcommands/resettor.py @@ -1,9 +1,13 @@ -''' - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - Command to delete the Tor data directory if its safe to do so -''' -''' +Command to delete the Tor data directory if its safe to do so +""" +import os +import shutil +import logger +from onionrutils import localcommand +from utils import identifyhome +""" This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -16,27 +20,42 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . -''' -import os, shutil -import logger -from onionrutils import localcommand -from utils import identifyhome +""" + def __delete(directory): tor_dir = '%s/%s/' % (identifyhome.identify_home(), directory) if os.path.exists(tor_dir): if localcommand.local_command('/ping') == 'pong!': - logger.warn('Cannot delete Tor data while Onionr is running', terminal=True) + logger.warn( + 'Cannot delete Tor data while Onionr is running', + terminal=True) else: shutil.rmtree(tor_dir) logger.info('Tor reset', terminal=True) + def reset_tor(): + """Delete tor data directory.""" __delete('tordata') -reset_tor.onionr_help = "Deletes Onionr's Tor data directory. Only do this as a last resort if you have serious Tor issues." + +reset_tor.onionr_help = "Deletes Onionr's Tor data directory. " # type: ignore +reset_tor.onionr_help += "Only do this as a last resort if " # type: ignore +reset_tor.onionr_help += "you have serious Tor issues." # type: ignore + def reset_tor_key_pair(): + """Delete Tor HS key pair for our node.""" __delete('hs') -reset_tor_key_pair.onionr_help = "Delete's your Tor node address permanently. Note that through fingerprinting attackers may be able to know that your new generated node address belongs to the same node as the deleted one." + +reset_tor_key_pair.onionr_help = "Delete's your Tor " # type: ignore +reset_tor_key_pair.onionr_help += "node address permanently. " # type: ignore +reset_tor_key_pair.onionr_help += "Note that through " # type: ignore +reset_tor_key_pair.onionr_help += "fingerprinting attackers " # type: ignore +reset_tor_key_pair.onionr_help += "may be able to know that " # type: ignore +reset_tor_key_pair.onionr_help += "your new generated node " # type: ignore +reset_tor_key_pair.onionr_help += "address belongs to " # type: ignore +reset_tor_key_pair.onionr_help += "the same node " # type: ignore +reset_tor_key_pair.onionr_help += "as the deleted one." # type: ignore diff --git a/src/onionrcommands/restartonionr.py b/src/onionrcommands/restartonionr.py index 3514896c..2785d193 100644 --- a/src/onionrcommands/restartonionr.py +++ b/src/onionrcommands/restartonionr.py @@ -1,8 +1,19 @@ -""" - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - Command to restart Onionr +Command to restart Onionr """ +import time +import os +import subprocess # nosec +import platform + +from etc import onionrvalues +from etc import cleanup +from onionrutils import localcommand +import logger +import filepaths + +from . import daemonlaunch """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,29 +28,22 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . """ -import time -import os -import subprocess -import platform -from etc import onionrvalues -from etc import cleanup -from onionrutils import localcommand -import logger -import filepaths -from . import daemonlaunch +SCRIPT_NAME = os.path.dirname(os.path.realpath( + __file__)) + f'/../../{onionrvalues.SCRIPT_NAME}' -SCRIPT_NAME = os.path.dirname(os.path.realpath(__file__)) + f'/../../{onionrvalues.SCRIPT_NAME}' def restart(): + """Tell the Onionr daemon to restart.""" logger.info('Restarting Onionr', terminal=True) # On platforms where we can, fork out to prevent locking try: pid = os.fork() - if pid != 0: return - except (AttributeError, OSError) as e: + if pid != 0: + return + except (AttributeError, OSError): if platform.platform() != 'Windows': logger.warn('Could not fork on restart') @@ -47,10 +51,12 @@ def restart(): while localcommand.local_command('ping', maxWait=8) == 'pong!': time.sleep(0.3) time.sleep(15) - while os.path.exists(filepaths.private_API_host_file) or os.path.exists(filepaths.daemon_mark_file): + while (os.path.exists(filepaths.private_API_host_file) or + (os.path.exists(filepaths.daemon_mark_file))): time.sleep(1) - + cleanup.delete_run_files() subprocess.Popen([SCRIPT_NAME, 'start']) -restart.onionr_help = 'Gracefully restart Onionr' + +restart.onionr_help = 'Gracefully restart Onionr' # type: ignore diff --git a/src/onionrcommands/runtimetestcmd.py b/src/onionrcommands/runtimetestcmd.py index 412b7d64..7af3bbec 100644 --- a/src/onionrcommands/runtimetestcmd.py +++ b/src/onionrcommands/runtimetestcmd.py @@ -1,6 +1,28 @@ +"""Onionr - Private P2P Communication. + +Command to tell daemon to do run time tests +""" from coredb import daemonqueue +""" + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +""" + def do_runtime_test(): + """Send runtime test daemon queue command.""" daemonqueue.daemon_queue_add("runtimeTest") -do_runtime_test.onionr_help = "If Onionr is running, initialize run time tests (check logs)" + +do_runtime_test.onionr_help = "If Onionr is running, " # type: ignore +do_runtime_test.onionr_help += "run runtime tests (check logs)" # type: ignore diff --git a/src/onionrcommands/sitecreator.py b/src/onionrcommands/sitecreator.py index 907bef98..b743aaae 100644 --- a/src/onionrcommands/sitecreator.py +++ b/src/onionrcommands/sitecreator.py @@ -1,12 +1,31 @@ +"""Onionr - Private P2P Communication. + +Command to create Onionr mutli-page sites +""" import sys import getpass from httpapi import onionrsitesapi -import onionrexceptions import logger from etc import onionrvalues +""" + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +""" + def create_multipage_site(): + """Command to create mutlipage sites with specified dir and password.""" error_encountered = False try: directory = sys.argv[2] @@ -16,8 +35,13 @@ def create_multipage_site(): passphrase = sys.argv[3] except IndexError: logger.warn('''It is critical that this passphrase is long. -If you want to update your site later you must remember the passphrase.''', terminal=True) - passphrase = getpass.getpass(f'Please enter a site passphrase of at least {onionrvalues.PASSWORD_LENGTH} characters.') +If you want to update your site later you must remember the passphrase.''', + terminal=True) + + passphrase = getpass.getpass( + 'Please enter a site passphrase of at least ' + + onionrvalues.PASSWORD_LENGTH + ' characters.') + confirm = getpass.getpass('Confirm passphrase:') if passphrase != confirm: logger.error('Passphrases do not match', terminal=True) @@ -25,14 +49,23 @@ If you want to update your site later you must remember the passphrase.''', term if len(passphrase) < onionrvalues.PASSWORD_LENGTH: error_encountered = True - logger.error(f'Passphrase must be at least {onionrvalues.PASSWORD_LENGTH} characters.', terminal=True) + logger.error( + f'Passphrase must be at least {onionrvalues.PASSWORD_LENGTH}' + + 'characters.', terminal=True) - if error_encountered: + if error_encountered: sys.exit(1) - results = onionrsitesapi.sitefiles.create_site(passphrase, directory=directory) + results = onionrsitesapi.sitefiles.create_site( + passphrase, directory=directory) results = (results[0].replace('=', ''), results[1]) logger.info(f'Site address {results[0]}', terminal=True) logger.info(f'Block for this version {results[1]}', terminal=True) -create_multipage_site.onionr_help = "[directory path (default relative)] - packages a whole directory and makes it available as an Onionr site." + +create_multipage_site.onionr_help = "[directory path " # type: ignore +create_multipage_site.onionr_help += "(default relative)] " # type: ignore +create_multipage_site.onionr_help += "- packages a whole " # type: ignore +create_multipage_site.onionr_help += "directory and makes " # type: ignore +create_multipage_site.onionr_help += "it available as " # type: ignore +create_multipage_site.onionr_help += "an Onionr site." # type: ignore diff --git a/src/onionrcommands/softreset.py b/src/onionrcommands/softreset.py index abdf1c84..ad4f899b 100644 --- a/src/onionrcommands/softreset.py +++ b/src/onionrcommands/softreset.py @@ -1,8 +1,15 @@ -""" - Onionr - Private P2P Communication +"""Onionr - Private P2P Communication. - Command to soft-reset Onionr (deletes blocks) +Command to soft-reset Onionr (deletes blocks) """ +import os +import shutil + +from onionrutils import localcommand +from coredb import dbfiles +import filepaths +from onionrplugins import onionrevents +import logger """ This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,14 +24,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . """ -import os -import shutil -from onionrutils import localcommand -from coredb import dbfiles -import filepaths -from onionrplugins import onionrevents -import logger def _ignore_not_found_delete(path): try: @@ -32,9 +32,15 @@ def _ignore_not_found_delete(path): except FileNotFoundError: pass + def soft_reset(): + """Command to soft reset Onionr home data. + + Onionr must not be running + """ if localcommand.local_command('/ping') == 'pong!': - logger.warn('Cannot soft reset while Onionr is running', terminal=True) + logger.warn('Cannot soft reset while Onionr is running', + terminal=True) return path = filepaths.block_data_location shutil.rmtree(path) @@ -43,4 +49,9 @@ def soft_reset(): onionrevents.event('softreset') logger.info("Soft reset Onionr", terminal=True) -soft_reset.onionr_help = "Deletes Onionr blocks and their associated metadata, except for any exported block files. Does NOT delete data on other nodes in the network." + +soft_reset.onionr_help = "Deletes Onionr blocks and their " # type: ignore +soft_reset.onionr_help += "associated metadata, except for " # type: ignore +soft_reset.onionr_help += "any exported block files. Does NOT " # type: ignore +soft_reset.onionr_help += "delete data on " # type: ignore +soft_reset.onionr_help += "other nodes in the network." # type: ignore diff --git a/src/onionrcommands/version.py b/src/onionrcommands/version.py index f2141352..9d60d6ea 100644 --- a/src/onionrcommands/version.py +++ b/src/onionrcommands/version.py @@ -1,13 +1,33 @@ +"""Onionr - Private P2P Communication. + +Command to show version info +""" import platform from utils import identifyhome from etc import onionrvalues import logger -def version(verbosity = 5, function = logger.info): - ''' - Displays the Onionr version - ''' +""" + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - function('Onionr v%s (%s) (API v%s)' % (onionrvalues.ONIONR_VERSION, platform.machine(), onionrvalues.API_VERSION), terminal=True) + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +""" + + +def version(verbosity=5, function=logger.info): + """Display the Onionr version.""" + function('Onionr v%s (%s) (API v%s)' % (onionrvalues.ONIONR_VERSION, + platform.machine(), + onionrvalues.API_VERSION), + terminal=True) if verbosity >= 1: function(onionrvalues.ONIONR_TAGLINE, terminal=True) if verbosity >= 2: @@ -15,7 +35,13 @@ def version(verbosity = 5, function = logger.info): release = platform.release() python_imp = platform.python_implementation() python_version = platform.python_version() - function(f'{python_imp} {python_version} on {pf} {release}', terminal=True) - function('Onionr data dir: %s' % identifyhome.identify_home(), terminal=True) + function( + f'{python_imp} {python_version} on {pf} {release}', + terminal=True) + function('Onionr data dir: %s' % + identifyhome.identify_home(), terminal=True) -version.onionr_help = 'Shows environment details including Onionr version & data directory, OS and Python version' + +version.onionr_help = 'Shows environment details including ' # type: ignore +version.onionr_help += 'Onionr version & data directory, ' # type: ignore +version.onionr_help += 'OS and Python version' # type: ignore