[tor-commits] [gettor/master] Adapted to new format for links files. Read config from file with ConfigParser. Added logging
ilv at torproject.org
ilv at torproject.org
Tue Sep 22 23:39:10 UTC 2015
commit 7a4c1c507682fb2d468ac7f2d4bc56402a21e23b
Author: ilv <ilv at users.noreply.github.com>
Date: Fri Jun 6 13:02:52 2014 -0400
Adapted to new format for links files. Read config from file with ConfigParser. Added logging
---
src/gettor.py | 101 ++++++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 72 insertions(+), 29 deletions(-)
diff --git a/src/gettor.py b/src/gettor.py
index 02f5eb2..2157898 100644
--- a/src/gettor.py
+++ b/src/gettor.py
@@ -2,6 +2,22 @@ import os
import re
import inspect
import logging
+import ConfigParser
+
+"""
+ GetTor main module.
+
+ Classes:
+ Core: Get links from providers.
+
+ Methods:
+ Core.get_links(): Get the links. It throws ValueError and
+ RuntimeError on failure.
+
+ Exceptions:
+ ValueError: Request for an unsupported locale/operating system.
+ RuntimeError: Something went wrong internally.
+"""
class Core:
@@ -13,19 +29,39 @@ class Core:
get_links(operating_system, locale)
"""
- def __init__(self):
+ def __init__(self, config_file):
"""
Initialize a Core object by reading a configuration file.
+ Raises a RuntimeError if the configuration file doesn't exists.
+
Parameters: none
"""
- # Read configuration file
+ logging.basicConfig()
+ logger = logging.getLogger(__name__)
+
+ config = ConfigParser.ConfigParser()
- # Dummy info. This should be read from a configuration file.
- self.basedir = './providers/'
- self.supported_locales = ['en', 'es']
- self.supported_os = ['windows', 'linux', 'osx']
+ if os.path.isfile(config_file):
+ logger.debug("Reading configuration from %s" % config_file)
+ config.read(config_file)
+ else:
+ logger.error("Error while trying to read %s" % config_file)
+ raise RuntimeError("Couldn't read the configuration file %s"
+ % config_file)
+
+ # To do: check for unspecified sections and/or options
+ self.basedir = config.get('general', 'basedir')
+ self.linksdir = config.get('links', 'linksdir')
+ self.supported_locales = config.get('links', 'locales').split(', ')
+ self.supported_os = config.get('links', 'os').split(', ')
+ self.loglevel = config.get('log', 'loglevel')
+ self.logdir = config.get('log', 'logdir')
+ self.logger = logger
+ self.logger.setLevel(logging.getLevelName(self.loglevel))
+
+ self.logger.debug("New core object created")
def get_links(self, operating_system, locale):
"""
@@ -39,13 +75,15 @@ class Core:
(e.g. SMTP).
"""
- # Log requests
self._log_request(operating_system, locale)
if locale not in self.supported_locales:
+ self.logger.warning("Request for unsupported locale: %s" % locale)
raise ValueError("Locale %s not supported at the moment" % locale)
if operating_system not in self.supported_os:
+ self.logger.warning("Request for unsupported operating system: %s"
+ % operating_system)
raise ValueError("Operating system %s not supported at the moment"
% operating_system)
@@ -53,8 +91,10 @@ class Core:
links = self._get_links(operating_system, locale)
if links is None:
+ self.logger.error("Couldn't get the links", exc_info=True)
raise RuntimeError("Something went wrong with GetTor's core")
+ self.logger.info("Returning the links")
return links
def _get_links(self, operating_system, locale):
@@ -70,18 +110,29 @@ class Core:
locale: string describing the locale
"""
- # There should be a 'providers' directory inside self.basedir
+ # We read the links files from the 'linksdir' inside 'basedir'
+ #
+ # Each .links file uses the ConfigParser's format.
+ # There should be a section [provider] with the option 'name' for
+ # the provider's name (e.g. Dropbox)
#
- # Each .links file begins with a string describing the provider.
- # After that, every line should have the following format:
+ # Following sections should specify the operating system and its
+ # options should be the locale. When more than one link is available
+ # per operating system and locale (always) the links should be
+ # specified as a multiline value. Each link has the format:
#
- # operating_system locale link package_signature key_fingerprint
+ # link link_signature key_fingerprint
#
# e.g.
#
- # Dropbox
- # linux en https://foo.bar https://foo.bar.asc 111-222-333-444
- # osx es https://bar.baz https://bar.baz.asc 555-666-777-888
+ # [provider]
+ # name: Dropbox
+ #
+ # [linux]
+ # en: https://foo.bar https://foo.bar.asc 111-222-333-444,
+ # https://foo.bar https://foo.bar.asc 555-666-777-888
+ #
+ # es: https://bar.baz https://bar.baz.asc 555-666-777-888
#
links = []
@@ -98,20 +149,13 @@ class Core:
# to check if no links were found.
providers = {}
+ self.logger.info("Reading links from providers directory")
# We trust links have been generated properly
+ config = ConfigParser.ConfigParser()
for name in links:
- link_file = open(name, 'r')
- provider_name = link_file.readline()
-
- for line in link_file:
- words = line.split(' ')
- if words[0] == operating_system and words[1] == locale:
- providers.setdefault(provider_name, []).append(
- "%s %s %s" %
- (words[2], words[3], words[4].replace('-', ' '))
- )
-
- link_file.close()
+ config.read(name)
+ provider_name = config.get('provider', 'name')
+ providers[provider_name] = config.get(operating_system, locale)
# Create the final links list with all providers
all_links = []
@@ -136,6 +180,5 @@ class Core:
caller = inspect.stack()[2]
module = inspect.getmodule(caller[0])
- # Dummy print for now. Should be done with logging
- print "\nCalled by %s\nOS: %s\nLocale: %s\n" % \
- (str(module), operating_system, locale)
+ self.logger.info("\n%s did a request for %s, %s\n" %
+ (str(module), operating_system, locale))
More information about the tor-commits
mailing list