+"""Loading of configuration files and parameters.
+
+@type version: L{twisted.python.versions.Version}
+@var version: the version of this program
+@type DEFAULT_CONFIG_FILES: C{list} of C{string}
+@var DEFAULT_CONFIG_FILES: the default config files to load (in order)
+@var DEFAULTS: the default config parameter values for the main program
+@var DHT_DEFAULTS: the default config parameter values for the default DHT
+
+"""
+
import os, sys
from ConfigParser import SafeConfigParser
from twisted.python import log, versions
class ConfigError(Exception):
+ """Errors that occur in the loading of configuration variables."""
def __init__(self, message):
self.message = message
def __str__(self):
return repr(self.message)
-version = versions.Version('apt-dht', 0, 0, 0)
+version = versions.Version('apt-p2p', 0, 0, 0)
+
+# Set the home parameter
home = os.path.expandvars('${HOME}')
if home == '${HOME}' or not os.path.isdir(home):
home = os.path.expanduser('~')
if not os.path.isdir(home):
home = os.path.abspath(os.path.dirname(sys.argv[0]))
-DEFAULT_CONFIG_FILES=['/etc/apt-dht/apt-dht.conf',
- home + '/.apt-dht/apt-dht.conf']
+
+DEFAULT_CONFIG_FILES=['/etc/apt-p2p/apt-p2p.conf',
+ home + '/.apt-p2p/apt-p2p.conf']
DEFAULTS = {
'PORT': '9977',
# Directory to store the downloaded files in
- 'CACHE_DIR': home + '/.apt-dht/cache',
+ 'CACHE_DIR': home + '/.apt-p2p/cache',
# Other directories containing packages to share with others
# WARNING: all files in these directories will be hashed and available
# Which DHT implementation to use.
# It must be possile to do "from <DHT>.DHT import DHT" to get a class that
# implements the IDHT interface.
- 'DHT': 'apt_dht_Khashmir',
+ 'DHT': 'apt_p2p_Khashmir',
# Whether to only run the DHT (for providing only a bootstrap node)
'DHT-ONLY': 'no',
# how many hosts to post to
'STORE_REDUNDANCY': '3',
+ # How many values to attempt to retrieve from the DHT.
+ # Setting this to 0 will try and get all values (which could take a while if
+ # a lot of nodes have values). Setting it negative will try to get that
+ # number of results from only the closest STORE_REDUNDANCY nodes to the hash.
+ # The default is a large negative number so all values from the closest
+ # STORE_REDUNDANCY nodes will be retrieved.
+ 'RETRIEVE_VALUES': '-10000',
+
### ROUTING TABLE STUFF
# how many times in a row a node can fail to respond before it's booted from the routing table
'MAX_FAILURES': '3',
'SPEW': 'yes',
}
-class AptDHTConfigParser(SafeConfigParser):
- """
- Adds 'gettime' to ConfigParser to interpret the suffixes.
+class AptP2PConfigParser(SafeConfigParser):
+ """Adds 'gettime' and 'getstringlist' to ConfigParser objects.
+
+ @ivar time_multipliers: the 'gettime' suffixes and the multipliers needed
+ to convert them to seconds
"""
+
time_multipliers={
's': 1, #seconds
'm': 60, #minutes
}
def gettime(self, section, option):
+ """Read the config parameter as a time value."""
mult = 1
value = self.get(section, option)
if len(value) == 0:
mult = self.time_multipliers[suffix]
value = value[:-1]
return int(value)*mult
+
def getstring(self, section, option):
+ """Read the config parameter as a string."""
return self.get(section,option)
+
def getstringlist(self, section, option):
+ """Read the multi-line config parameter as a list of strings."""
return self.get(section,option).split()
+
def optionxform(self, option):
+ """Use all uppercase in the config parameters names."""
return option.upper()
-config = AptDHTConfigParser(DEFAULTS)
+# Initialize the default config parameters
+config = AptP2PConfigParser(DEFAULTS)
config.add_section(config.get('DEFAULT', 'DHT'))
for k in DHT_DEFAULTS:
config.set(config.get('DEFAULT', 'DHT'), k, DHT_DEFAULTS[k])