rev307, Plugin for password protected web ui, Faster page load times by yielding wrapper html, Reworked configuration parser to support plugin extensions, Initial site sync bugfix, Test for configuration parsing, Parse posted data function
This commit is contained in:
parent
4c9a677369
commit
a93ca2c3b4
11 changed files with 509 additions and 193 deletions
196
src/Config.py
196
src/Config.py
|
@ -6,14 +6,19 @@ import ConfigParser
|
|||
|
||||
class Config(object):
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, argv):
|
||||
self.version = "0.3.1"
|
||||
self.rev = 281
|
||||
self.parser = self.createArguments()
|
||||
argv = sys.argv[:] # Copy command line arguments
|
||||
argv = self.parseConfig(argv) # Add arguments from config file
|
||||
self.parseCommandline(argv) # Parse argv
|
||||
self.setAttributes()
|
||||
self.rev = 307
|
||||
self.argv = argv
|
||||
self.action = None
|
||||
self.createParser()
|
||||
self.createArguments()
|
||||
|
||||
def createParser(self):
|
||||
# Create parser
|
||||
self.parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
self.parser.register('type', 'bool', self.strToBool)
|
||||
self.subparsers = self.parser.add_subparsers(title="Action to perform", dest="action")
|
||||
|
||||
def __str__(self):
|
||||
return str(self.arguments).replace("Namespace", "Config") # Using argparse str output
|
||||
|
@ -29,28 +34,17 @@ class Config(object):
|
|||
coffeescript = "type %s | tools\\coffee\\coffee.cmd"
|
||||
else:
|
||||
coffeescript = None
|
||||
""" Probably fixed
|
||||
if sys.platform.lower().startswith("darwin"):
|
||||
# For some reasons openssl doesnt works on mac yet (https://github.com/HelloZeroNet/ZeroNet/issues/94)
|
||||
use_openssl = False
|
||||
else:
|
||||
use_openssl = True
|
||||
"""
|
||||
|
||||
use_openssl = True
|
||||
|
||||
# Create parser
|
||||
parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter)
|
||||
parser.register('type', 'bool', self.strToBool)
|
||||
subparsers = parser.add_subparsers(title="Action to perform", dest="action")
|
||||
|
||||
# Main
|
||||
action = subparsers.add_parser("main", help='Start UiServer and FileServer (default)')
|
||||
action = self.subparsers.add_parser("main", help='Start UiServer and FileServer (default)')
|
||||
|
||||
# SiteCreate
|
||||
action = subparsers.add_parser("siteCreate", help='Create a new site')
|
||||
action = self.subparsers.add_parser("siteCreate", help='Create a new site')
|
||||
|
||||
# SiteSign
|
||||
action = subparsers.add_parser("siteSign", help='Update and sign content.json: address [privatekey]')
|
||||
action = self.subparsers.add_parser("siteSign", help='Update and sign content.json: address [privatekey]')
|
||||
action.add_argument('address', help='Site to sign')
|
||||
action.add_argument('privatekey', help='Private key (default: ask on execute)', nargs='?')
|
||||
action.add_argument('--inner_path', help='File you want to sign (default: content.json)',
|
||||
|
@ -58,7 +52,7 @@ class Config(object):
|
|||
action.add_argument('--publish', help='Publish site after the signing', action='store_true')
|
||||
|
||||
# SitePublish
|
||||
action = subparsers.add_parser("sitePublish", help='Publish site to other peers: address')
|
||||
action = self.subparsers.add_parser("sitePublish", help='Publish site to other peers: address')
|
||||
action.add_argument('address', help='Site to publish')
|
||||
action.add_argument('peer_ip', help='Peer ip to publish (default: random peers ip from tracker)',
|
||||
default=None, nargs='?')
|
||||
|
@ -68,76 +62,76 @@ class Config(object):
|
|||
default="content.json", metavar="inner_path")
|
||||
|
||||
# SiteVerify
|
||||
action = subparsers.add_parser("siteVerify", help='Verify site files using sha512: address')
|
||||
action = self.subparsers.add_parser("siteVerify", help='Verify site files using sha512: address')
|
||||
action.add_argument('address', help='Site to verify')
|
||||
|
||||
# dbRebuild
|
||||
action = subparsers.add_parser("dbRebuild", help='Rebuild site database cache')
|
||||
action = self.subparsers.add_parser("dbRebuild", help='Rebuild site database cache')
|
||||
action.add_argument('address', help='Site to rebuild')
|
||||
|
||||
# dbQuery
|
||||
action = subparsers.add_parser("dbQuery", help='Query site sql cache')
|
||||
action = self.subparsers.add_parser("dbQuery", help='Query site sql cache')
|
||||
action.add_argument('address', help='Site to query')
|
||||
action.add_argument('query', help='Sql query')
|
||||
|
||||
# PeerPing
|
||||
action = subparsers.add_parser("peerPing", help='Send Ping command to peer')
|
||||
action = self.subparsers.add_parser("peerPing", help='Send Ping command to peer')
|
||||
action.add_argument('peer_ip', help='Peer ip')
|
||||
action.add_argument('peer_port', help='Peer port', nargs='?')
|
||||
|
||||
# PeerGetFile
|
||||
action = subparsers.add_parser("peerGetFile", help='Request and print a file content from peer')
|
||||
action = self.subparsers.add_parser("peerGetFile", help='Request and print a file content from peer')
|
||||
action.add_argument('peer_ip', help='Peer ip')
|
||||
action.add_argument('peer_port', help='Peer port')
|
||||
action.add_argument('site', help='Site address')
|
||||
action.add_argument('filename', help='File name to request')
|
||||
|
||||
# PeerGetFile
|
||||
action = subparsers.add_parser("peerCmd", help='Request and print a file content from peer')
|
||||
action = self.subparsers.add_parser("peerCmd", help='Request and print a file content from peer')
|
||||
action.add_argument('peer_ip', help='Peer ip')
|
||||
action.add_argument('peer_port', help='Peer port')
|
||||
action.add_argument('cmd', help='Command to execute')
|
||||
action.add_argument('parameters', help='Parameters to command', nargs='?')
|
||||
|
||||
# CryptSign
|
||||
action = subparsers.add_parser("cryptSign", help='Sign message using Bitcoin private key')
|
||||
action = self.subparsers.add_parser("cryptSign", help='Sign message using Bitcoin private key')
|
||||
action.add_argument('message', help='Message to sign')
|
||||
action.add_argument('privatekey', help='Private key')
|
||||
|
||||
# Config parameters
|
||||
parser.add_argument('--debug', help='Debug mode', action='store_true')
|
||||
parser.add_argument('--debug_socket', help='Debug socket connections', action='store_true')
|
||||
self.parser.add_argument('--debug', help='Debug mode', action='store_true')
|
||||
self.parser.add_argument('--debug_socket', help='Debug socket connections', action='store_true')
|
||||
|
||||
parser.add_argument('--config_file', help='Path of config file', default="zeronet.conf", metavar="path")
|
||||
parser.add_argument('--data_dir', help='Path of data directory', default="data", metavar="path")
|
||||
parser.add_argument('--log_dir', help='Path of logging directory', default="log", metavar="path")
|
||||
self.parser.add_argument('--config_file', help='Path of config file', default="zeronet.conf", metavar="path")
|
||||
self.parser.add_argument('--data_dir', help='Path of data directory', default="data", metavar="path")
|
||||
self.parser.add_argument('--log_dir', help='Path of logging directory', default="log", metavar="path")
|
||||
|
||||
parser.add_argument('--ui_ip', help='Web interface bind address', default="127.0.0.1", metavar='ip')
|
||||
parser.add_argument('--ui_port', help='Web interface bind port', default=43110, type=int, metavar='port')
|
||||
parser.add_argument('--ui_restrict', help='Restrict web access', default=False, metavar='ip', nargs='*')
|
||||
parser.add_argument('--open_browser', help='Open homepage in web browser automatically',
|
||||
nargs='?', const="default_browser", metavar='browser_name')
|
||||
parser.add_argument('--homepage', help='Web interface Homepage', default='1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr',
|
||||
metavar='address')
|
||||
parser.add_argument('--size_limit', help='Default site size limit in MB', default=10, metavar='size')
|
||||
self.parser.add_argument('--ui_ip', help='Web interface bind address', default="127.0.0.1", metavar='ip')
|
||||
self.parser.add_argument('--ui_port', help='Web interface bind port', default=43110, type=int, metavar='port')
|
||||
self.parser.add_argument('--ui_restrict', help='Restrict web access', default=False, metavar='ip', nargs='*')
|
||||
self.parser.add_argument('--open_browser', help='Open homepage in web browser automatically',
|
||||
nargs='?', const="default_browser", metavar='browser_name')
|
||||
self.parser.add_argument('--homepage', help='Web interface Homepage', default='1EU1tbG9oC1A8jz2ouVwGZyQ5asrNsE4Vr',
|
||||
metavar='address')
|
||||
self.parser.add_argument('--size_limit', help='Default site size limit in MB', default=10, metavar='size')
|
||||
|
||||
parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip')
|
||||
parser.add_argument('--fileserver_port', help='FileServer bind port', default=15441, type=int, metavar='port')
|
||||
parser.add_argument('--disable_udp', help='Disable UDP connections', action='store_true')
|
||||
parser.add_argument('--proxy', help='Socks proxy address', metavar='ip:port')
|
||||
parser.add_argument('--ip_external', help='External ip (tested on start if None)', metavar='ip')
|
||||
parser.add_argument('--use_openssl', help='Use OpenSSL liblary for speedup',
|
||||
type='bool', choices=[True, False], default=use_openssl)
|
||||
parser.add_argument('--disable_encryption', help='Disable connection encryption', action='store_true')
|
||||
parser.add_argument('--disable_sslcompression', help='Disable SSL compression to save memory',
|
||||
type='bool', choices=[True, False], default=True)
|
||||
self.parser.add_argument('--fileserver_ip', help='FileServer bind address', default="*", metavar='ip')
|
||||
self.parser.add_argument('--fileserver_port', help='FileServer bind port', default=15441, type=int, metavar='port')
|
||||
self.parser.add_argument('--disable_udp', help='Disable UDP connections', action='store_true')
|
||||
self.parser.add_argument('--proxy', help='Socks proxy address', metavar='ip:port')
|
||||
self.parser.add_argument('--ip_external', help='External ip (tested on start if None)', metavar='ip')
|
||||
self.parser.add_argument('--use_openssl', help='Use OpenSSL liblary for speedup',
|
||||
type='bool', choices=[True, False], default=use_openssl)
|
||||
self.parser.add_argument('--disable_encryption', help='Disable connection encryption', action='store_true')
|
||||
self.parser.add_argument('--disable_sslcompression', help='Disable SSL compression to save memory',
|
||||
type='bool', choices=[True, False], default=True)
|
||||
|
||||
parser.add_argument('--coffeescript_compiler', help='Coffeescript compiler for developing', default=coffeescript,
|
||||
metavar='executable_path')
|
||||
self.parser.add_argument('--coffeescript_compiler', help='Coffeescript compiler for developing', default=coffeescript,
|
||||
metavar='executable_path')
|
||||
|
||||
parser.add_argument('--version', action='version', version='ZeroNet %s r%s' % (self.version, self.rev))
|
||||
self.parser.add_argument('--version', action='version', version='ZeroNet %s r%s' % (self.version, self.rev))
|
||||
|
||||
return parser
|
||||
return self.parser
|
||||
|
||||
# Find arguments specificed for current action
|
||||
def getActionArguments(self):
|
||||
|
@ -147,23 +141,78 @@ class Config(object):
|
|||
back[argument.dest] = getattr(self, argument.dest)
|
||||
return back
|
||||
|
||||
# Try to find action from sys.argv
|
||||
# Try to find action from argv
|
||||
def getAction(self, argv):
|
||||
actions = [action.choices.keys() for action in self.parser._actions if action.dest == "action"][0] # Valid actions
|
||||
found_action = False
|
||||
for action in actions: # See if any in sys.argv
|
||||
for action in actions: # See if any in argv
|
||||
if action in argv:
|
||||
found_action = action
|
||||
break
|
||||
return found_action
|
||||
|
||||
# Move plugin parameters to end of argument list
|
||||
def moveUnknownToEnd(self, argv, default_action):
|
||||
valid_actions = sum([action.option_strings for action in self.parser._actions], [])
|
||||
valid_parameters = []
|
||||
plugin_parameters = []
|
||||
plugin = False
|
||||
for arg in argv:
|
||||
if arg.startswith("--"):
|
||||
if arg not in valid_actions:
|
||||
plugin = True
|
||||
else:
|
||||
plugin = False
|
||||
elif arg == default_action:
|
||||
plugin = False
|
||||
|
||||
if plugin:
|
||||
plugin_parameters.append(arg)
|
||||
else:
|
||||
valid_parameters.append(arg)
|
||||
return valid_parameters + plugin_parameters
|
||||
|
||||
# Parse arguments from config file and command line
|
||||
def parse(self, silent=False, parse_config=True):
|
||||
if silent: # Don't display messages or quit on unknown parameter
|
||||
original_print_message = self.parser._print_message
|
||||
original_exit = self.parser.exit
|
||||
|
||||
def silent(parser, function_name):
|
||||
parser.exited = True
|
||||
return None
|
||||
self.parser.exited = False
|
||||
self.parser._print_message = lambda *args, **kwargs: silent(self.parser, "_print_message")
|
||||
self.parser.exit = lambda *args, **kwargs: silent(self.parser, "exit")
|
||||
|
||||
argv = self.argv[:] # Copy command line arguments
|
||||
if parse_config:
|
||||
argv = self.parseConfig(argv) # Add arguments from config file
|
||||
self.parseCommandline(argv, silent) # Parse argv
|
||||
self.setAttributes()
|
||||
|
||||
if silent: # Restore original functions
|
||||
if self.parser.exited and self.action == "main": # Argument parsing halted, don't start ZeroNet with main action
|
||||
self.action = None
|
||||
self.parser._print_message = original_print_message
|
||||
self.parser.exit = original_exit
|
||||
|
||||
# Parse command line arguments
|
||||
def parseCommandline(self, argv):
|
||||
def parseCommandline(self, argv, silent=False):
|
||||
# Find out if action is specificed on start
|
||||
action = self.getAction(argv)
|
||||
if len(argv) == 1 or not action: # If no action specificed set the main action
|
||||
if not action:
|
||||
argv.append("main")
|
||||
self.arguments = self.parser.parse_args(argv[1:])
|
||||
action = "main"
|
||||
argv = self.moveUnknownToEnd(argv, action)
|
||||
if silent:
|
||||
res = self.parser.parse_known_args(argv[1:])
|
||||
if res:
|
||||
self.arguments = res[0]
|
||||
else:
|
||||
self.arguments = {}
|
||||
else:
|
||||
self.arguments = self.parser.parse_args(argv[1:])
|
||||
|
||||
# Parse config file
|
||||
def parseConfig(self, argv):
|
||||
|
@ -187,9 +236,24 @@ class Config(object):
|
|||
# Expose arguments as class attributes
|
||||
def setAttributes(self):
|
||||
# Set attributes from arguments
|
||||
args = vars(self.arguments)
|
||||
for key, val in args.items():
|
||||
setattr(self, key, val)
|
||||
if self.arguments:
|
||||
args = vars(self.arguments)
|
||||
for key, val in args.items():
|
||||
setattr(self, key, val)
|
||||
|
||||
def loadPlugins(self):
|
||||
from Plugin import PluginManager
|
||||
|
||||
@PluginManager.acceptPlugins
|
||||
class ConfigPlugin(object):
|
||||
def __init__(self, config):
|
||||
self.parser = config.parser
|
||||
self.createArguments()
|
||||
|
||||
def createArguments(self):
|
||||
pass
|
||||
|
||||
ConfigPlugin(self)
|
||||
|
||||
|
||||
config = Config()
|
||||
config = Config(sys.argv)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue