diff options
author | Walter Purcaro <vuolter@gmail.com> | 2015-02-16 10:46:28 +0100 |
---|---|---|
committer | Walter Purcaro <vuolter@gmail.com> | 2015-02-16 10:46:28 +0100 |
commit | ce1c2b6b05c08b669357947e61ae40efce7fc50f (patch) | |
tree | 0b5f7996960cf35c4eface53a89eba18a37519b7 /pyload/config | |
parent | Fix filename case (diff) | |
download | pyload-ce1c2b6b05c08b669357947e61ae40efce7fc50f.tar.xz |
module temp
Diffstat (limited to 'pyload/config')
-rw-r--r-- | pyload/config/Parser.py | 353 | ||||
-rw-r--r-- | pyload/config/Setup.py | 553 | ||||
-rw-r--r-- | pyload/config/__init__.py | 1 | ||||
-rw-r--r-- | pyload/config/default.conf | 65 |
4 files changed, 0 insertions, 972 deletions
diff --git a/pyload/config/Parser.py b/pyload/config/Parser.py deleted file mode 100644 index e21eaba9f..000000000 --- a/pyload/config/Parser.py +++ /dev/null @@ -1,353 +0,0 @@ -# -*- coding: utf-8 -*- - -from __future__ import with_statement - -from time import sleep -from os.path import exists, join -from shutil import copy - -from traceback import print_exc -from pyload.utils import chmod, encode, decode - - -CONF_VERSION = 1 - - -class ConfigParser(object): - """ - holds and manage the configuration - - current dict layout: - - { - - section: { - option: { - value: - type: - desc: - } - desc: - - } - """ - - def __init__(self): - """Constructor""" - self.config = {} #: the config values - self.plugin = {} #: the config for plugins - self.oldRemoteData = {} - - self.pluginCB = None #: callback when plugin config value is changed - - self.checkVersion() - - self.readConfig() - - - def checkVersion(self, n=0): - """determines if config need to be copied""" - try: - if not exists("pyload.conf"): - copy(join(pypath, "pyload", "config", "default.conf"), "pyload.conf") - - if not exists("plugin.conf"): - f = open("plugin.conf", "wb") - f.write("version: " + str(CONF_VERSION)) - f.close() - - f = open("pyload.conf", "rb") - v = f.readline() - f.close() - v = v[v.find(":") + 1:].strip() - - if not v or int(v) < CONF_VERSION: - copy(join(pypath, "pyload", "config", "default.conf"), "pyload.conf") - print "Old version of config was replaced" - - f = open("plugin.conf", "rb") - v = f.readline() - f.close() - v = v[v.find(":") + 1:].strip() - - if not v or int(v) < CONF_VERSION: - f = open("plugin.conf", "wb") - f.write("version: " + str(CONF_VERSION)) - f.close() - print "Old version of plugin-config replaced" - except Exception: - if n >= 3: - raise - sleep(0.3) - self.checkVersion(n + 1) - - - def readConfig(self): - """reads the config file""" - self.config = self.parseConfig(join(pypath, "pyload", "config", "default.conf")) - self.plugin = self.parseConfig("plugin.conf") - - try: - homeconf = self.parseConfig("pyload.conf") - if "username" in homeconf["remote"]: - if "password" in homeconf["remote"]: - self.oldRemoteData = {"username": homeconf["remote"]["username"]["value"], - "password": homeconf["remote"]["username"]["value"]} - del homeconf["remote"]["password"] - del homeconf["remote"]["username"] - self.updateValues(homeconf, self.config) - except Exception: - print "Config Warning" - print_exc() - - - def parseConfig(self, config): - """parses a given configfile""" - - f = open(config) - - config = f.read() - - config = config.splitlines()[1:] - - conf = {} - - section, option, value, typ, desc = "", "", "", "", "" - - listmode = False - - for line in config: - comment = line.rfind("#") - if line.find(":", comment) < 0 > line.find("=", comment) and comment > 0 and line[comment - 1].isspace(): - line = line.rpartition("#") #: removes comments - if line[1]: - line = line[0] - else: - line = line[2] - - line = line.strip() - - try: - if line == "": - continue - elif line.endswith(":"): - section, none, desc = line[:-1].partition('-') - section = section.strip() - desc = desc.replace('"', "").strip() - conf[section] = {"desc": desc} - else: - if listmode: - if line.endswith("]"): - listmode = False - line = line.replace("]", "") - - value += [self.cast(typ, x.strip()) for x in line.split(",") if x] - - if not listmode: - conf[section][option] = {"desc": desc, - "type": typ, - "value": value} - - - else: - content, none, value = line.partition("=") - - content, none, desc = content.partition(":") - - desc = desc.replace('"', "").strip() - - typ, none, option = content.strip().rpartition(" ") - - value = value.strip() - - if value.startswith("["): - if value.endswith("]"): - listmode = False - value = value[:-1] - else: - listmode = True - - value = [self.cast(typ, x.strip()) for x in value[1:].split(",") if x] - else: - value = self.cast(typ, value) - - if not listmode: - conf[section][option] = {"desc": desc, - "type": typ, - "value": value} - - except Exception, e: - print "Config Warning" - print_exc() - - f.close() - return conf - - - def updateValues(self, config, dest): - """sets the config values from a parsed config file to values in destination""" - - for section in config.iterkeys(): - if section in dest: - for option in config[section].iterkeys(): - if option in ("desc", "outline"): - continue - - if option in dest[section]: - dest[section][option]["value"] = config[section][option]["value"] - - # else: - # dest[section][option] = config[section][option] - - - # else: - # dest[section] = config[section] - - - def saveConfig(self, config, filename): - """saves config to filename""" - with open(filename, "wb") as f: - chmod(filename, 0600) - f.write("version: %i \n" % CONF_VERSION) - for section in config.iterkeys(): - f.write('\n%s - "%s":\n' % (section, config[section]["desc"])) - - for option, data in config[section].iteritems(): - if option in ("desc", "outline"): continue - - if isinstance(data["value"], list): - value = "[ \n" - for x in data["value"]: - value += "\t\t" + str(x) + ",\n" - value += "\t\t]\n" - else: - if isinstance(data["value"], basestring): - value = data["value"] + "\n" - else: - value = str(data["value"]) + "\n" - try: - f.write('\t%s %s : "%s" = %s' % (data["type"], option, data["desc"], value)) - except UnicodeEncodeError: - f.write('\t%s %s : "%s" = %s' % (data["type"], option, data["desc"], encode(value))) - - - def cast(self, typ, value): - """cast value to given format""" - if not isinstance(value, basestring): - return value - - elif typ == "int": - return int(value) - elif typ == "bool": - return value.lower() in ("1", "true", "on", "an", "yes") - elif typ == "time": - if not value: - value = "0:00" - if not ":" in value: - value += ":00" - return value - elif typ in ("str", "file", "folder"): - return encode(value) - else: - return value - - - def save(self): - """saves the configs to disk""" - self.saveConfig(self.config, "pyload.conf") - self.saveConfig(self.plugin, "plugin.conf") - - - def __getitem__(self, section): - """provides dictonary like access: c['section']['option']""" - return Section(self, section) - - - def get(self, section, option): - """get value""" - value = self.config[section][option]["value"] - return decode(value) - - - def set(self, section, option, value): - """set value""" - - value = self.cast(self.config[section][option]["type"], value) - - self.config[section][option]["value"] = value - self.save() - - - def getPlugin(self, plugin, option): - """gets a value for a plugin""" - value = self.plugin[plugin][option]["value"] - return encode(value) - - - def setPlugin(self, plugin, option, value): - """sets a value for a plugin""" - - value = self.cast(self.plugin[plugin][option]["type"], value) - - if self.pluginCB: self.pluginCB(plugin, option, value) - - self.plugin[plugin][option]["value"] = value - self.save() - - - def getMetaData(self, section, option): - """ get all config data for an option """ - return self.config[section][option] - - - def addPluginConfig(self, name, config, outline=""): - """adds config options with tuples (name, type, desc, default)""" - if name not in self.plugin: - conf = {"desc": name, - "outline": outline} - self.plugin[name] = conf - else: - conf = self.plugin[name] - conf["outline"] = outline - - for item in config: - if item[0] in conf: - conf[item[0]]["type"] = item[1] - conf[item[0]]["desc"] = item[2] - else: - conf[item[0]] = { - "desc": item[2], - "type": item[1], - "value": self.cast(item[1], item[3]) - } - - values = [x[0] for x in config] + ["desc", "outline"] - # delete old values - for item in conf.keys(): - if item not in values: - del conf[item] - - - def deleteConfig(self, name): - """Removes a plugin config""" - if name in self.plugin: - del self.plugin[name] - - -class Section(object): - """provides dictionary like access for configparser""" - - def __init__(self, parser, section): - """Constructor""" - self.parser = parser - self.section = section - - - def __getitem__(self, item): - """getitem""" - return self.parser.get(self.section, item) - - - def __setitem__(self, item, value): - """setitem""" - self.parser.set(self.section, item, value) diff --git a/pyload/config/Setup.py b/pyload/config/Setup.py deleted file mode 100644 index 8b88daa48..000000000 --- a/pyload/config/Setup.py +++ /dev/null @@ -1,553 +0,0 @@ -# -*- coding: utf-8 -*- -# @author: vuolter - -from __future__ import with_statement - -import __builtin__ - -import os -import sys - -from getpass import getpass -from os import chdir, makedirs, path -from subprocess import PIPE, call - -from pyload.network.JsEngine import JsEngine -from pyload.utils import get_console_encoding, load_translation, safe_join, versiontuple - - -class SetupAssistant(object): - """ pyLoads initial setup configuration assistant """ - - def __init__(self, config): - self.config = config - self.lang = "en" - self.stdin_encoding = get_console_encoding(sys.stdin.encoding) - - - def start(self): - print - langs = sorted(self.config.getMetaData("general", "language")['type'].split(";")) - self.lang = self.ask(u"Choose setup language", "en", langs) - - load_translation("setup", self.lang) - - #Input shorthand for yes - self.yes = _("y") - #Input shorthand for no - self.no = _("n") - - # print - # print _("Would you like to configure pyLoad via Webinterface?") - # print _("You need a Browser and a connection to this PC for it.") - # viaweb = self.ask(_("Start initial webinterface for configuration?"), "y", bool=True) - # ... - - print - print - print _("## Welcome to the pyLoad Configuration Assistant ##") - print - print _("It will check your system and make a basic setup in order to run pyLoad.") - print - print _("The value in brackets [] always is the default value,") - print _("in case you don't want to change it or you are unsure what to choose, just hit enter.") - print _( - "Don't forget: You can always rerun this assistant with --setup or -s parameter, when you start pyload.py .") - print _("If you have any problems with this assistant hit STRG-C,") - print _("to abort and don't let him start with pyload.py automatically anymore.") - print - print - raw_input(_("When you are ready for system check, hit enter.")) - print - print - - basic, ssl, captcha, web, js = self.system_check() - print - print - - if not basic: - print _("You need pycurl, sqlite and python 2.5, 2.6 or 2.7 to run pyLoad.") - print _("Please correct this and re-run pyLoad.") - print - print _("Setup will now close.") - print - print - raw_input(_("Press Enter to exit.")) - return False - - raw_input(_("System check finished, hit enter to see your status report.")) - print - print - print _("## Status ##") - print - - avail = [] - if self.check_module("Crypto"): - avail.append(_("- container decrypting")) - if ssl: - avail.append(_("- ssl connection")) - if captcha: - avail.append(_("- automatic captcha decryption")) - if web: - avail.append(_("- webinterface")) - if js: - avail.append(_("- extended Click'N'Load")) - - if avail: - print _("AVAILABLE FEATURES:") - for feature in avail: - print feature - print - - if len(avail) < 5: - print _("MISSING FEATURES:") - - if not self.check_module("Crypto"): - print _("- no py-crypto available") - print _("You need this if you want to decrypt container files.") - print - - if not ssl: - print _("- no SSL available") - print _("This is needed if you want to establish a secure connection to core or webinterface.") - print _("If you only want to access locally to pyLoad ssl is not usefull.") - print - - if not captcha: - print _("- no Captcha Recognition available") - print _("Only needed for some hosters and as freeuser.") - print - - if not js: - print _("- no JavaScript engine found") - print _("You will need this for some Click'N'Load links. Install Spidermonkey, ossp-js, pyv8 or rhino") - print - - print - print _("You can abort the setup now and fix some dependicies if you want.") - else: - print _("NO MISSING FEATURES!") - - print - print - con = self.ask(_("Continue with setup?"), self.yes, bool=True) - - if not con: - return False - - print - print - print _("CURRENT CONFIG PATH: %s") % configdir - print - print _("NOTE: If you use pyLoad on a server or the home partition lives on an iternal flash it may be a good idea to change it.") - confpath = self.ask(_("Do you want to change the config path?"), self.no, bool=True) - if confpath: - print - self.conf_path() - print - - print - print _("Do you want to configure login data and basic settings?") - print _("This is recommend for first run.") - con = self.ask(_("Make basic setup?"), self.yes, bool=True) - - if con: - print - print - self.conf_basic() - - if ssl: - print - print _("Do you want to configure ssl?") - ssl = self.ask(_("Configure ssl?"), self.no, bool=True) - if ssl: - print - print - self.conf_ssl() - - if web: - print - print _("Do you want to configure webinterface?") - web = self.ask(_("Configure webinterface?"), self.yes, bool=True) - if web: - print - print - self.conf_web() - - print - print - print _("Setup finished successfully!") - print - print - raw_input(_("Hit enter to exit and restart pyLoad.")) - return True - - - def system_check(self): - """ make a systemcheck and return the results """ - import platform - - print _("## System Information ##") - print - print _("Platform: ") + platform.platform(aliased=True) - print _("OS: ") + platform.system() or "Unknown" - print _("Python: ") + sys.version.replace("\n", "") - print - print - - print _("## System Check ##") - print - - if (2, 5) > sys.version_info > (2, 7): - python = False - else: - python = True - - self.print_dep("python", python, false="NOT OK") - - curl = self.check_module("pycurl") - self.print_dep("pycurl", curl) - - sqlite = self.check_module("sqlite3") - self.print_dep("sqlite3", sqlite) - - basic = python and curl and sqlite - - print - - crypto = self.check_module("Crypto") - self.print_dep("pycrypto", crypto) - - ssl = self.check_module("OpenSSL") - self.print_dep("py-OpenSSL", ssl) - - print - - pil = self.check_module("Image") - self.print_dep("py-imaging", pil) - - if os.name == "nt": - tesser = self.check_prog([path.join(pypath, "tesseract", "tesseract.exe"), "-v"]) - else: - tesser = self.check_prog(["tesseract", "-v"]) - - self.print_dep("tesseract", tesser) - - captcha = pil and tesser - - print - - try: - import jinja2 - - v = jinja2.__version__ - if v and versiontuple(v) < (2, 5, 0): - jinja = False - else: - jinja = True - except Exception: - jinja = False - jinja_error = "MISSING" - else: - jinja_error = "NOT OK" - - self.print_dep("jinja2", jinja, false=jinja_error) - - beaker = self.check_module("beaker") - self.print_dep("beaker", beaker) - - bjoern = self.check_module("bjoern") - self.print_dep("bjoern", bjoern) - - web = sqlite and beaker - - js = True if JsEngine.find() else False - self.print_dep(_("JS engine"), js) - - if not python: - print - print - if sys.version_info > (2, 7): - print _("WARNING: Your python version is too NEW!") - print _("Please use Python version 2.6/2.7 .") - else: - print _("WARNING: Your python version is too OLD!") - print _("Please use at least Python version 2.5 .") - - if not jinja and jinja_error == "NOT OK": - print - print - print _("WARNING: Your installed jinja2 version %s is too OLD!") % jinja2.__version__ - print _("You can safely continue but if the webinterface is not working,") - print _("please upgrade or uninstall it, because pyLoad self-includes jinja2 libary.") - - return basic, ssl, captcha, web, js - - - def conf_basic(self): - print _("## Basic Setup ##") - - print - print _("The following logindata is valid for CLI and webinterface.") - - from pyload.database import DatabaseBackend - - db = DatabaseBackend(None) - db.setup() - print _("NOTE: Consider a password of 10 or more symbols if you expect to access to your local network from outside (ex. internet).") - print - username = self.ask(_("Username"), "User") - password = self.ask("", "", password=True) - db.addUser(username, password) - db.shutdown() - - print - print _("External clients (GUI, CLI or other) need remote access to work over the network.") - print _("However, if you only want to use the webinterface you may disable it to save ram.") - self.config.set("remote", "activated", self.ask(_("Enable remote access"), self.no, bool=True)) - - print - langs = sorted(self.config.getMetaData("general", "language")['type'].split(";")) - self.config.set("general", "language", self.ask(_("Choose system language"), self.lang, langs)) - - print - self.config.set("general", "download_folder", self.ask(_("Download folder"), "Downloads")) - print - self.config.set("download", "max_downloads", self.ask(_("Max parallel downloads"), "3")) - print - reconnect = self.ask(_("Use Reconnect?"), self.no, bool=True) - self.config.set("reconnect", "activated", reconnect) - if reconnect: - self.config.set("reconnect", "method", self.ask(_("Reconnect script location"), "./reconnect.sh")) - - - def conf_web(self): - print _("## Webinterface Setup ##") - - print - print _("Listen address, if you use 127.0.0.1 or localhost, the webinterface will only accessible locally.") - self.config.set("webui", "host", self.ask(_("Address"), "0.0.0.0")) - self.config.set("webui", "port", self.ask(_("Port"), "8000")) - print - print _("pyLoad offers several server backends, now following a short explanation.") - print "- auto:", _("Automatically choose the best webserver for your platform.") - print "- builtin:", _("First choice if you plan to use pyLoad just for you.") - print "- threaded:", _("Support SSL connection and can serve simultaneously more client flawlessly.") - print "- fastcgi:", _( - "Can be used by apache, lighttpd, etc.; needs to be properly configured before.") - if os.name != "nt": - print "- lightweight:", _("Very fast alternative to builtin; requires libev and bjoern packages.") - - print - print _("NOTE: In some rare cases the builtin server not works correctly, so if you have troubles with the web interface") - print _("run this setup assistant again and change the builtin server to the threaded.") - - if os.name == "nt": - servers = ["auto", "builtin", "threaded", "fastcgi"] - else: - servers = ["auto", "builtin", "threaded", "fastcgi", "lightweight"] - - self.config.set("webui", "server", self.ask(_("Choose webserver"), "auto", servers)) - - - def conf_ssl(self): - print _("## SSL Setup ##") - print - print _("Execute these commands from pyLoad config folder to make ssl certificates:") - print - print "openssl genrsa -out ssl.key 1024" - print "openssl req -new -key ssl.key -out ssl.csr" - print "openssl req -days 36500 -x509 -key ssl.key -in ssl.csr > ssl.crt " - print - print _("If you're done and everything went fine, you can activate ssl now.") - - ssl = self.ask(_("Activate SSL?"), self.yes, bool=True) - self.config.set("remote", "ssl", ssl) - self.config.set("webui", "ssl", ssl) - - - def set_user(self): - load_translation("setup", self.config.get("general", "language")) - - from pyload.database import DatabaseBackend - - db = DatabaseBackend(None) - db.setup() - - noaction = True - try: - while True: - print _("Select action") - print _("1 - Create/Edit user") - print _("2 - List users") - print _("3 - Remove user") - print _("4 - Quit") - action = raw_input("[1]/2/3/4: ") - if not action in ("1", "2", "3", "4"): - continue - elif action == "1": - print - username = self.ask(_("Username"), "User") - password = self.ask("", "", password=True) - db.addUser(username, password) - noaction = False - elif action == "2": - print - print _("Users") - print "-----" - users = db.listUsers() - noaction = False - for user in users: - print user - print "-----" - print - elif action == "3": - print - username = self.ask(_("Username"), "") - if username: - db.removeUser(username) - noaction = False - elif action == "4": - break - finally: - if not noaction: - db.shutdown() - - - def set_configdir(self, configdir, persistent=False): - dirname = path.abspath(configdir) - try: - if not path.exists(dirname): - makedirs(dirname, 0700) - - chdir(dirname) - - if persistent: - c = path.join(rootdir, "config", "configdir") - if not path.exists(c): - makedirs(c, 0700) - - with open(c, "wb") as f: - f.write(dirname) - - except IOError: - return False - - else: - __builtin__.configdir = dirname - return dirname #: return always abspath - - - def conf_path(self): - print _("Setting new config path.") - print _("NOTE: Current configuration will not be transfered!") - - while True: - confdir = self.ask(_("CONFIG PATH"), configdir) - confpath = self.set_configdir(confdir) - print - if not confpath: - print _("Failed to change the current config path!") - print - else: - print _("pyLoad config path successfully changed.") - break - - - def print_dep(self, name, value, false="MISSING", true="OK"): - """ Print Status of dependency """ - if value and isinstance(value, basestring): - msg = "%(dep)-12s %(bool)s (%(info)s)" - else: - msg = "%(dep)-12s %(bool)s" - - print msg % {'dep': name + ':', - 'bool': _(true if value else false).upper(), - 'info': ", ".join(value)} - - - def check_module(self, module): - try: - __import__(module) - return True - except Exception: - return False - - - def check_prog(self, command): - pipe = PIPE - try: - call(command, stdout=pipe, stderr=pipe) - return True - except Exception: - return False - - - def ask(self, qst, default, answers=[], bool=False, password=False): - """ produce one line to asking for input """ - if answers: - info = "(" - - for i, answer in enumerate(answers): - info += (", " if i != 0 else "") + str((answer == default and "[%s]" % answer) or answer) - - info += ")" - elif bool: - if default == self.yes: - info = "([%s]/%s)" % (self.yes, self.no) - else: - info = "(%s/[%s])" % (self.yes, self.no) - else: - info = "[%s]" % default - - if password: - p1 = True - p2 = False - pwlen = 8 - while p1 != p2: - sys.stdout.write(_("Password: ")) - p1 = getpass("") - - if len(p1) < pwlen: - print _("Password too short! Use at least %s symbols." % pwlen) - continue - elif not p1.isalnum(): - print _("Password must be alphanumeric.") - continue - - sys.stdout.write(_("Password (again): ")) - p2 = getpass("") - - if p1 == p2: - return p1 - else: - print _("Passwords did not match.") - - while True: - try: - input = raw_input(qst + " %s: " % info) - except KeyboardInterrupt: - print "\nSetup interrupted" - sys.exit() - - input = input.decode(self.stdin_encoding) - - if input.strip() == "": - input = default - - if bool: - # yes, true, t are inputs for booleans with value true - if input.lower().strip() in [self.yes, _("yes"), _("true"), _("t"), "yes"]: - return True - # no, false, f are inputs for booleans with value false - elif input.lower().strip() in [self.no, _("no"), _("false"), _("f"), "no"]: - return False - else: - print _("Invalid Input") - print - continue - - if not answers or input in answers: - return input - else: - print _("Invalid Input") diff --git a/pyload/config/__init__.py b/pyload/config/__init__.py deleted file mode 100644 index 40a96afc6..000000000 --- a/pyload/config/__init__.py +++ /dev/null @@ -1 +0,0 @@ -# -*- coding: utf-8 -*- diff --git a/pyload/config/default.conf b/pyload/config/default.conf deleted file mode 100644 index 6e2fb7749..000000000 --- a/pyload/config/default.conf +++ /dev/null @@ -1,65 +0,0 @@ -version: 1 - -remote - "Remote": - int port : "Port" = 7227 - ip listenaddr : "Address" = 0.0.0.0 - bool nolocalauth : "No authentication on local connections" = True - bool activated : "Activated" = True -ssl - "SSL": - bool activated : "Activated"= False - file cert : "SSL Certificate" = ssl.crt - file key : "SSL Key" = ssl.key -webinterface - "Web UI": - bool activated : "Activated" = True - builtin;threaded;fastcgi;lightweight server : "Server" = builtin - bool https : "Use HTTPS" = False - ip host : "IP" = 0.0.0.0 - int port : "Port" = 8001 - Default;Dark;Flat theme : "Theme" = Default - str prefix: "Path Prefix" = -log - "Log": - bool file_log : "File Log" = True - folder log_folder : "Folder" = Logs - int log_count : "Count" = 5 - int log_size : "Size in kb" = 100 - bool log_rotate : "Log Rotate" = True -general - "General": - en;de;fr;it;es;nl;sv;ru;pl;cs;sr;pt_BR language : "Language" = en - folder download_folder : "Download Folder" = Downloads - bool debug_mode : "Debug Mode" = False - int min_free_space : "Min Free Space (MB)" = 200 - bool folder_per_package : "Create folder for each package" = True - int renice : "CPU Priority" = 0 - auto;common;pyv8;node;rhino;jsc jsengine : "JS Engine" = auto -download - "Download": - int chunks : "Max connections for one download" = 3 - int max_downloads : "Max Parallel Downloads" = 3 - int max_speed : "Max Download Speed in kb/s" = -1 - bool limit_speed : "Limit Download Speed" = False - str interface : "Download interface to bind (ip or Name)" = None - bool ipv6: "Allow IPv6" = False - bool skip_existing : "Skip already existing files" = False -permission - "Permissions": - bool change_user : "Change user of running process" = False - str user : "Username" = user - str folder : "Folder Permission mode" = 0755 - bool change_file : "Change file mode of downloads" = False - str file : "Filemode for Downloads" = 0644 - bool change_group : "Change group of running process" = False - str group : "Groupname" = users - bool change_dl : "Change Group and User of Downloads" = False -reconnect - "Reconnect": - bool activated : "Use Reconnect" = False - str method : "Method" = None - time startTime : "Start" = 0:00 - time endTime : "End" = 0:00 -downloadTime - "Download Time": - time start : "Start" = 0:00 - time end : "End" = 0:00 -proxy - "Proxy": - str address : "Address" = "localhost" - int port : "Port" = 7070 - http;socks4;socks5 type : "Protocol" = http - str username : "Username" = None - password password : "Password" = None - bool proxy : "Use Proxy" = False |