summaryrefslogtreecommitdiffstats
path: root/pyload/config
diff options
context:
space:
mode:
Diffstat (limited to 'pyload/config')
-rw-r--r--pyload/config/ConfigManager.py7
-rw-r--r--pyload/config/ConfigParser.py80
-rw-r--r--pyload/config/convert.py38
-rw-r--r--pyload/config/default.py150
4 files changed, 159 insertions, 116 deletions
diff --git a/pyload/config/ConfigManager.py b/pyload/config/ConfigManager.py
index f9dc3795b..33bd151c3 100644
--- a/pyload/config/ConfigManager.py
+++ b/pyload/config/ConfigManager.py
@@ -4,10 +4,11 @@
from new_collections import OrderedDict
from pyload.Api import InvalidConfigSection
-from pyload.utils import from_string, json
+from pyload.utils import json
from ConfigParser import ConfigParser
+from convert import to_input, from_string
def convertKeyError(func):
""" converts KeyError into InvalidConfigSection """
@@ -64,7 +65,7 @@ class ConfigManager(ConfigParser):
except KeyError:
pass # Returns default value later
- return self.config[section].config[option].default
+ return self.config[section].config[option].input.default_value
def loadValues(self, user, section):
if (user, section) not in self.values:
@@ -86,7 +87,7 @@ class ConfigManager(ConfigParser):
changed = self.parser.set(section, option, value, sync)
else:
data = self.config[section].config[option]
- value = from_string(value, data.type)
+ value = from_string(value, data.input.type)
old_value = self.get(section, option)
# Values will always be saved to db, sync is ignored
diff --git a/pyload/config/ConfigParser.py b/pyload/config/ConfigParser.py
index fd22e93b9..bda3f7bd4 100644
--- a/pyload/config/ConfigParser.py
+++ b/pyload/config/ConfigParser.py
@@ -6,14 +6,16 @@ from os.path import exists
from gettext import gettext
from new_collections import namedtuple, OrderedDict
-from pyload.utils import from_string
+
+from pyload.Api import Input, InputType
from pyload.utils.fs import chmod
from default import make_config
+from convert import to_input, from_string
CONF_VERSION = 2
-SectionTuple = namedtuple("SectionTuple", "name description long_desc config")
-ConfigData = namedtuple("ConfigData", "name type description default")
+SectionTuple = namedtuple("SectionTuple", "label description explanation config")
+ConfigData = namedtuple("ConfigData", "label description input")
class ConfigParser:
"""
@@ -41,31 +43,21 @@ class ConfigParser:
def checkVersion(self):
"""Determines if config needs to be deleted"""
- e = None
- # workaround conflict, with GUI (which also accesses the config) so try read in 3 times
- for i in range(0, 3):
- try:
- if exists(self.CONFIG):
- f = open(self.CONFIG, "rb")
- v = f.readline()
- f.close()
- v = v[v.find(":") + 1:].strip()
-
- if not v or int(v) < CONF_VERSION:
- f = open(self.CONFIG, "wb")
- f.write("version: " + str(CONF_VERSION))
- f.close()
- print "Old version of %s deleted" % self.CONFIG
- else:
- f = open(self.CONFIG, "wb")
- f.write("version:" + str(CONF_VERSION))
- f.close()
-
- except Exception, ex:
- e = ex
- sleep(0.3)
- if e: raise e
-
+ if exists(self.CONFIG):
+ f = open(self.CONFIG, "rb")
+ v = f.readline()
+ f.close()
+ v = v[v.find(":") + 1:].strip()
+
+ if not v or int(v) < CONF_VERSION:
+ f = open(self.CONFIG, "wb")
+ f.write("version: " + str(CONF_VERSION))
+ f.close()
+ print "Old version of %s deleted" % self.CONFIG
+ else:
+ f = open(self.CONFIG, "wb")
+ f.write("version:" + str(CONF_VERSION))
+ f.close()
def parseValues(self, filename):
"""read config values from file"""
@@ -139,13 +131,13 @@ class ConfigParser:
try:
return self.values[section][option]
except KeyError:
- return self.config[section].config[option].default
+ return self.config[section].config[option].input.default_value
def set(self, section, option, value, sync=True):
"""set value"""
data = self.config[section].config[option]
- value = from_string(value, data.type)
+ value = from_string(value, data.input.type)
old_value = self.get(section, option)
# only save when different values
@@ -172,22 +164,34 @@ class ConfigParser:
""" Retrieves single config as tuple (section, values) """
return self.config[section], self.values[section] if section in self.values else {}
- def addConfigSection(self, section, name, desc, long_desc, config):
+ def addConfigSection(self, section, label, desc, expl, config):
"""Adds a section to the config. `config` is a list of config tuples as used in plugin api defined as:
The order of the config elements is preserved with OrderedDict
"""
d = OrderedDict()
for entry in config:
- if len(entry) == 5:
- conf_name, type, conf_desc, conf_verbose, default = entry
- else: # config options without description
- conf_name, type, conf_desc, default = entry
- conf_verbose = ""
+ if len(entry) != 4:
+ raise ValueError("Config entry must be of length 4")
+
+ # Values can have different roles depending on the two config formats
+ conf_name, type_label, label_desc, default_input = entry
+
+ # name, label, desc, input
+ if isinstance(default_input, Input):
+ input = default_input
+ conf_label = type_label
+ conf_desc = label_desc
+ # name, type, label, default
+ else:
+ input = Input(to_input(type_label))
+ input.default_value = from_string(default_input, input.type)
+ conf_label = label_desc
+ conf_desc = ""
- d[conf_name] = ConfigData(gettext(conf_desc), type, gettext(conf_verbose), from_string(default, type))
+ d[conf_name] = ConfigData(gettext(conf_label), gettext(conf_desc), input)
- data = SectionTuple(gettext(name), gettext(desc), gettext(long_desc), d)
+ data = SectionTuple(gettext(label), gettext(desc), gettext(expl), d)
self.config[section] = data
class Section:
diff --git a/pyload/config/convert.py b/pyload/config/convert.py
new file mode 100644
index 000000000..f25f6a7ba
--- /dev/null
+++ b/pyload/config/convert.py
@@ -0,0 +1,38 @@
+
+from pyload.Api import Input, InputType
+from pyload.utils import decode, to_bool
+
+# Maps old config formats to new values
+input_dict = {
+ "int": InputType.Int,
+ "bool": InputType.Bool,
+ "time": InputType.Time,
+ "file": InputType.File,
+ "folder": InputType.Folder
+}
+
+
+def to_input(typ):
+ """ Converts old config format to input type"""
+ return input_dict.get(typ, InputType.Text)
+
+
+def from_string(value, typ=None):
+ """ cast value to given type, unicode for strings """
+
+ # value is no string
+ if not isinstance(value, basestring):
+ return value
+
+ value = decode(value)
+
+ if typ == InputType.Int:
+ return int(value)
+ elif typ == InputType.Bool:
+ return to_bool(value)
+ elif typ == InputType.Time:
+ if not value: value = "0:00"
+ if not ":" in value: value += ":00"
+ return value
+ else:
+ return value \ No newline at end of file
diff --git a/pyload/config/default.py b/pyload/config/default.py
index 8388d32df..9fad814d3 100644
--- a/pyload/config/default.py
+++ b/pyload/config/default.py
@@ -12,96 +12,96 @@ def make_config(config):
_ = lambda x: x
config.addConfigSection("remote", _("Remote"), _("Description"), _("Long description"),
- [
- ("activated", "bool", _("Activated"), _("Tooltip"), True),
- ("port", "int", _("Port"), _("Tooltip"), 7227),
- ("listenaddr", "ip", _("Adress"), _("Tooltip"), "0.0.0.0"),
- ])
+ [
+ ("activated", "bool", _("Activated"), True),
+ ("port", "int", _("Port"), 7227),
+ ("listenaddr", "ip", _("Adress"), "0.0.0.0"),
+ ])
config.addConfigSection("log", _("Log"), _("Description"), _("Long description"),
- [
- ("log_size", "int", _("Size in kb"), _("Tooltip"), 100),
- ("log_folder", "folder", _("Folder"), _("Tooltip"), "Logs"),
- ("file_log", "bool", _("File Log"), _("Tooltip"), True),
- ("log_count", "int", _("Count"), _("Tooltip"), 5),
- ("log_rotate", "bool", _("Log Rotate"), _("Tooltip"), True),
- ])
+ [
+ ("log_size", "int", _("Size in kb"), 100),
+ ("log_folder", "folder", _("Folder"), "Logs"),
+ ("file_log", "bool", _("File Log"), True),
+ ("log_count", "int", _("Count"), 5),
+ ("log_rotate", "bool", _("Log Rotate"), True),
+ ])
config.addConfigSection("permission", _("Permissions"), _("Description"), _("Long description"),
- [
- ("group", "str", _("Groupname"), _("Tooltip"), "users"),
- ("change_dl", "bool", _("Change Group and User of Downloads"), _("Tooltip"), False),
- ("change_file", "bool", _("Change file mode of downloads"), _("Tooltip"), False),
- ("user", "str", _("Username"), _("Tooltip"), "user"),
- ("file", "str", _("Filemode for Downloads"), _("Tooltip"), "0644"),
- ("change_group", "bool", _("Change group of running process"), _("Tooltip"), False),
- ("folder", "str", _("Folder Permission mode"), _("Tooltip"), "0755"),
- ("change_user", "bool", _("Change user of running process"), _("Tooltip"), False),
- ])
+ [
+ ("group", "str", _("Groupname"), "users"),
+ ("change_dl", "bool", _("Change Group and User of Downloads"), False),
+ ("change_file", "bool", _("Change file mode of downloads"), False),
+ ("user", "str", _("Username"), "user"),
+ ("file", "str", _("Filemode for Downloads"), "0644"),
+ ("change_group", "bool", _("Change group of running process"), False),
+ ("folder", "str", _("Folder Permission mode"), "0755"),
+ ("change_user", "bool", _("Change user of running process"), False),
+ ])
config.addConfigSection("general", _("General"), _("Description"), _("Long description"),
- [
- ("language", "en;de;fr;it;es;nl;sv;ru;pl;cs;sr;pt_BR", _("Language"), _("Tooltip"), "en"),
- ("download_folder", "folder", _("Download Folder"), _("Tooltip"), "Downloads"),
- ("checksum", "bool", _("Use Checksum"), _("Tooltip"), False),
- ("folder_per_package", "bool", _("Create folder for each package"), _("Tooltip"), True),
- ("debug_mode", "bool", _("Debug Mode"), _("Tooltip"), False),
- ("min_free_space", "int", _("Min Free Space (MB)"), _("Tooltip"), 200),
- ("renice", "int", _("CPU Priority"), _("Tooltip"), 0),
- ])
+ [
+ ("language", "en;de;fr;it;es;nl;sv;ru;pl;cs;sr;pt_BR", _("Language"), "en"),
+ ("download_folder", "folder", _("Download Folder"), "Downloads"),
+ ("checksum", "bool", _("Use Checksum"), False),
+ ("folder_per_package", "bool", _("Create folder for each package"), True),
+ ("debug_mode", "bool", _("Debug Mode"), False),
+ ("min_free_space", "int", _("Min Free Space (MB)"), 200),
+ ("renice", "int", _("CPU Priority"), 0),
+ ])
config.addConfigSection("ssl", _("SSL"), _("Description"), _("Long description"),
- [
- ("cert", "file", _("SSL Certificate"), _("Tooltip"), "ssl.crt"),
- ("activated", "bool", _("Activated"), _("Tooltip"), False),
- ("key", "file", _("SSL Key"), _("Tooltip"), "ssl.key"),
- ])
+ [
+ ("cert", "file", _("SSL Certificate"), "ssl.crt"),
+ ("activated", "bool", _("Activated"), False),
+ ("key", "file", _("SSL Key"), "ssl.key"),
+ ])
config.addConfigSection("webinterface", _("Webinterface"), _("Description"), _("Long description"),
- [
- ("template", "str", _("Template"), _("Tooltip"), "default"),
- ("activated", "bool", _("Activated"), _("Tooltip"), True),
- ("prefix", "str", _("Path Prefix"), _("Tooltip"), ""),
- ("server", "auto;threaded;fallback;fastcgi", _("Server"), _("Tooltip"), "auto"),
- ("force_server", "str", _("Favor specific server"), _("Tooltip"), ""),
- ("host", "ip", _("IP"), _("Tooltip"), "0.0.0.0"),
- ("https", "bool", _("Use HTTPS"), _("Tooltip"), False),
- ("port", "int", _("Port"), _("Tooltip"), 8001),
- ("develop", "str", _("Development mode"), _("Tooltip"), False),
- ])
+ [
+ ("template", "str", _("Template"), "default"),
+ ("activated", "bool", _("Activated"), True),
+ ("prefix", "str", _("Path Prefix"), ""),
+ ("server", "auto;threaded;fallback;fastcgi", _("Server"), "auto"),
+ ("force_server", "str", _("Favor specific server"), ""),
+ ("host", "ip", _("IP"), "0.0.0.0"),
+ ("https", "bool", _("Use HTTPS"), False),
+ ("port", "int", _("Port"), 8001),
+ ("develop", "str", _("Development mode"), False),
+ ])
config.addConfigSection("proxy", _("Proxy"), _("Description"), _("Long description"),
- [
- ("username", "str", _("Username"), _("Tooltip"), ""),
- ("proxy", "bool", _("Use Proxy"), _("Tooltip"), False),
- ("address", "str", _("Address"), _("Tooltip"), "localhost"),
- ("password", "password", _("Password"), _("Tooltip"), ""),
- ("type", "http;socks4;socks5", _("Protocol"), _("Tooltip"), "http"),
- ("port", "int", _("Port"), _("Tooltip"), 7070),
- ])
+ [
+ ("username", "str", _("Username"), ""),
+ ("proxy", "bool", _("Use Proxy"), False),
+ ("address", "str", _("Address"), "localhost"),
+ ("password", "password", _("Password"), ""),
+ ("type", "http;socks4;socks5", _("Protocol"), "http"),
+ ("port", "int", _("Port"), 7070),
+ ])
config.addConfigSection("reconnect", _("Reconnect"), _("Description"), _("Long description"),
- [
- ("endTime", "time", _("End"), _("Tooltip"), "0:00"),
- ("activated", "bool", _("Use Reconnect"), _("Tooltip"), False),
- ("method", "str", _("Method"), _("Tooltip"), "./reconnect.sh"),
- ("startTime", "time", _("Start"), _("Tooltip"), "0:00"),
- ])
+ [
+ ("endTime", "time", _("End"), "0:00"),
+ ("activated", "bool", _("Use Reconnect"), False),
+ ("method", "str", _("Method"), "./reconnect.sh"),
+ ("startTime", "time", _("Start"), "0:00"),
+ ])
config.addConfigSection("download", _("Download"), _("Description"), _("Long description"),
- [
- ("max_downloads", "int", _("Max Parallel Downloads"), _("Tooltip"), 3),
- ("limit_speed", "bool", _("Limit Download Speed"), _("Tooltip"), False),
- ("interface", "str", _("Download interface to bind (ip or Name)"), _("Tooltip"), ""),
- ("skip_existing", "bool", _("Skip already existing files"), _("Tooltip"), False),
- ("max_speed", "int", _("Max Download Speed in kb/s"), _("Tooltip"), -1),
- ("ipv6", "bool", _("Allow IPv6"), _("Tooltip"), False),
- ("chunks", "int", _("Max connections for one download"), _("Tooltip"), 3),
- ("restart_failed", "bool", _("Restart failed downloads on startup"), _("Tooltip"), False),
- ])
+ [
+ ("max_downloads", "int", _("Max Parallel Downloads"), 3),
+ ("limit_speed", "bool", _("Limit Download Speed"), False),
+ ("interface", "str", _("Download interface to bind (ip or Name)"), ""),
+ ("skip_existing", "bool", _("Skip already existing files"), False),
+ ("max_speed", "int", _("Max Download Speed in kb/s"), -1),
+ ("ipv6", "bool", _("Allow IPv6"), False),
+ ("chunks", "int", _("Max connections for one download"), 3),
+ ("restart_failed", "bool", _("Restart failed downloads on startup"), False),
+ ])
config.addConfigSection("downloadTime", _("Download Time"), _("Description"), _("Long description"),
- [
- ("start", "time", _("Start"), _("Tooltip"), "0:00"),
- ("end", "time", _("End"), _("Tooltip"), "0:00"),
- ])
+ [
+ ("start", "time", _("Start"), "0:00"),
+ ("end", "time", _("End"), "0:00"),
+ ])