[tor-commits] [ooni-probe/master] Code refactoring, restructure directory tree.

art at torproject.org art at torproject.org
Tue Jul 10 15:30:00 UTC 2012


commit a129f69242588fdc679eb33cfcc38288b09d07e5
Author: Arturo Filastò <art at torproject.org>
Date:   Tue Jul 10 10:07:47 2012 +0200

    Code refactoring, restructure directory tree.
---
 ooni/config.py                       |   53 ---------
 ooni/date.py                         |   22 ----
 ooni/example_plugins/examplescapy.py |    2 +-
 ooni/example_plugins/skel.py         |    2 +-
 ooni/log.py                          |   43 -------
 ooni/logo.py                         |  214 ----------------------------------
 ooni/ooniprobe.py                    |   11 +-
 ooni/plugins/bridget.py              |    2 +-
 ooni/plugins/captiveportal.py        |    2 +-
 ooni/plugins/chinatrigger.py         |    2 +-
 ooni/plugins/httpt.py                |    2 +-
 ooni/plugins/tcpconnect.py           |    2 +-
 ooni/plugoo/nodes.py                 |    2 +-
 ooni/plugoo/reports.py               |    2 +-
 ooni/plugoo/tests.py                 |    4 +-
 ooni/protocols/http.py               |    2 +-
 ooni/protocols/scapy.py              |    2 +-
 ooni/scaffolding.py                  |    4 +-
 ooni/utils.py                        |  146 -----------------------
 ooni/utils/__init__.py               |  146 +++++++++++++++++++++++
 ooni/utils/config.py                 |   53 +++++++++
 ooni/utils/date.py                   |   22 ++++
 ooni/utils/log.py                    |   43 +++++++
 ooni/utils/logo.py                   |  214 ++++++++++++++++++++++++++++++++++
 24 files changed, 499 insertions(+), 498 deletions(-)

diff --git a/ooni/config.py b/ooni/config.py
deleted file mode 100644
index 42a14f6..0000000
--- a/ooni/config.py
+++ /dev/null
@@ -1,53 +0,0 @@
-import ConfigParser
-from utils import Storage
-
-class Config(Storage):
-    """
-    A Storage-like class which loads and store each attribute into a portable
-    conf file.
-    """
-    def __init__(self, section, cfgfile="ooni-probe.conf"):
-        super(Config, self).__init__()
-
-        self._cfgfile = cfgfile
-        # setting up confgiparser
-        self._cfgparser = ConfigParser.ConfigParser()
-        self._cfgparser.read([self._cfgfile])
-        self._section = section
-
-    def __getattr__(self, name):
-        if name.startswith('_'):
-            return self.__dict__.get(name, None)
-
-        try:
-            value = self._cfgparser.get(self._section, name)
-            if value.isdigit():
-                return int(value)
-            elif value.lower() in ('true', 'false'):
-                return value.lower() == 'true'
-            else:
-                return value
-        except ConfigParser.NoOptionError:
-            return ''  # if option doesn't exists return an empty string
-
-    def __setattr__(self, name, value):
-        # keep an open port with private attributes
-        if name.startswith('_'):
-            self.__dict__[name] = value
-            return
-
-        try:
-            # XXX: Automagically discover variable type
-            self._cfgparser.set(self._section, name, value)
-        except ConfigParser.NoOptionError:
-            raise NameError(name)
-
-    def commit(self):
-        """
-        Commit changes in config file.
-        """
-        cfgfile = open(self._cfgfile, 'w')
-        try:
-            self._cfgparser.write(cfgfile)
-        finally:
-            cfgfile.close()
diff --git a/ooni/date.py b/ooni/date.py
deleted file mode 100644
index 59ec1f8..0000000
--- a/ooni/date.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from ooni.lib.rfc3339 import rfc3339
-from datetime import datetime
-
-class odate(datetime):
-    def __str__(self):
-        return rfc3339(self)
-
-    def __repr__(self):
-        return "'%s'" % rfc3339(self)
-
-    def from_rfc(self, datestr):
-        pass
-
-def now():
-    return odate.utcnow()
-
-def pretty_date():
-    cur_time = datetime.utcnow()
-    d_format = "%d %B %Y %H:%M:%S"
-    pretty = cur_time.strftime(d_format)
-    return pretty
-
diff --git a/ooni/example_plugins/examplescapy.py b/ooni/example_plugins/examplescapy.py
index aa6d81b..144afee 100644
--- a/ooni/example_plugins/examplescapy.py
+++ b/ooni/example_plugins/examplescapy.py
@@ -5,7 +5,7 @@ from twisted.plugin import IPlugin
 from twisted.internet import protocol, defer
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
-from ooni import log
+from ooni.utils import log
 from ooni.protocols.scapy import ScapyTest
 
 from ooni.lib.txscapy import txsr, txsend
diff --git a/ooni/example_plugins/skel.py b/ooni/example_plugins/skel.py
index de95b48..52c7d4f 100644
--- a/ooni/example_plugins/skel.py
+++ b/ooni/example_plugins/skel.py
@@ -2,7 +2,7 @@ from zope.interface import implements
 from twisted.python import usage
 from twisted.plugin import IPlugin
 from plugoo.tests import ITest, OONITest
-from ooni import log
+from ooni.utils import log
 
 class SkelArgs(usage.Options):
     optParameters = [['asset', 'a', None, 'Asset file'],
diff --git a/ooni/log.py b/ooni/log.py
deleted file mode 100644
index 3dc52dd..0000000
--- a/ooni/log.py
+++ /dev/null
@@ -1,43 +0,0 @@
-"""
-OONI logging facility.
-"""
-import sys
-import logging
-import warnings
-
-from twisted.python import log
-
-# Logging levels
-DEBUG = logging.DEBUG
-INFO = logging.INFO
-WARNING = logging.WARNING
-ERROR = logging.ERROR
-CRITICAL = logging.CRITICAL
-
-def _get_log_level(level):
-    if not level:
-        return INFO
-    else:
-        return level
-
-def start(logfile=None, loglevel=None, logstdout=True):
-    if log.defaultObserver:
-        print "%s" % logstdout
-        loglevel = _get_log_level(loglevel)
-        file = open(logfile, 'a') if logfile else sys.stderr
-        observer = log.FileLogObserver(file)
-        if logstdout:
-            log.startLogging(sys.stdout)
-        else:
-            log.startLogging()
-        log.addObserver(observer.emit)
-        msg("Started OONI")
-
-def msg(message, level=INFO, **kw):
-    log.msg(message, logLevel=level, **kw)
-
-def err(message, **kw):
-    log.err(message, **kw)
-
-def debug(message, **kw):
-    log.msg(message, logLevel=DEBUG, **kw)
diff --git a/ooni/logo.py b/ooni/logo.py
deleted file mode 100644
index 8924462..0000000
--- a/ooni/logo.py
+++ /dev/null
@@ -1,214 +0,0 @@
-import random
-def getlogo():
-    logo = []
-    logo.append("""
-  _____   _____  __   _ _____  _____   ______  _____  ______  _______
- |     | |     | | \  |   |   |_____] |_____/ |     | |_____] |______
- |_____| |_____| |  \_| __|__ |       |    \_ |_____| |_____] |______""")
-
-    logo.append("""
-                   _                 _
-                  (_)               | |
-  ___   ___  _ __  _ _ __  _ __ ___ | |__   ___
- / _ \ / _ \| '_ \| | '_ \| '__/ _ \| '_ \ / _ \\
-| (_) | (_) | | | | | |_) | | | (_) | |_) |  __/
- \___/ \___/|_| |_|_| .__/|_|  \___/|_.__/ \___|
-                    | |
-                    |_|""")
-
-
-    logo.append("""
-                     .__                    ___.
-  ____   ____   ____ |__|_____________  ____\_ |__   ____
- /  _ \ /  _ \ /    \|  |\____ \_  __ \/  _ \| __ \_/ __ \\
-(  <_> |  <_> )   |  \  ||  |_> >  | \(  <_> ) \_\ \  ___/
- \____/ \____/|___|  /__||   __/|__|   \____/|___  /\___  >
-                   \/    |__|                    \/     \/""")
-
-
-    logo.append("""
- __   __          __   __   __   __   ___
-/  \ /  \ |\ | | |__) |__) /  \ |__) |__
-\__/ \__/ | \| | |    |  \ \__/ |__) |___ """)
-
-
-    logo.append("""
-  _   _  ._  o ._  ._ _  |_   _
- (_) (_) | | | |_) | (_) |_) (/_
-               |
-""")
-
-    logo.append("""
- _______  _______  __    _  ___   _______  ______   _______  _______  _______
-|       ||       ||  |  | ||   | |       ||    _ | |       ||  _    ||       |
-|   _   ||   _   ||   |_| ||   | |    _  ||   | || |   _   || |_|   ||    ___|
-|  | |  ||  | |  ||       ||   | |   |_| ||   |_|| |  | |  ||       ||   |___
-|  |_|  ||  |_|  ||  _    ||   | |    ___||    __ ||  |_|  ||  _   | |    ___|
-|       ||       || | |   ||   | |   |    |   |  |||       || |_|   ||   |___
-|_______||_______||_|  |__||___| |___|    |___|  |||_______||_______||_______|
-""")
-
-
-    logo.append("""
-                   _                 _
-  ___   ___  _ __ (_)_ __  _ __ ___ | |__   ___
- / _ \ / _ \| '_ \| | '_ \| '__/ _ \| '_ \ / _ \\
-| (_) | (_) | | | | | |_) | | | (_) | |_) |  __/
- \___/ \___/|_| |_|_| .__/|_|  \___/|_.__/ \___|
-                    |_|
-""")
-
-    logo.append("""
-                                          o
-                   o                     O
-                                         O
-                                         o
-.oOo. .oOo. 'OoOo. O  .oOo. `OoOo. .oOo. OoOo. .oOo.
-O   o O   o  o   O o  O   o  o     O   o O   o OooO'
-o   O o   O  O   o O  o   O  O     o   O o   O O
-`OoO' `OoO'  o   O o' oOoO'  o     `OoO' `OoO' `OoO'
-                      O
-                      o'
-""")
-
-
-    logo.append("""
-  _____  _____  ____   _  ____  _____  _____   _____  ______  ______
- /     \/     \|    \ | ||    ||     ||     | /     \|      >|   ___|
- |     ||     ||     \| ||    ||    _||     \ |     ||     < |   ___|
- \_____/\_____/|__/\____||____||___|  |__|\__\\\\_____/|______>|______|
-""")
-
-    logo.append("""
-             _             _
- ___ ___ ___|_|___ ___ ___| |_ ___
-| . | . |   | | . |  _| . | . | -_|
-|___|___|_|_|_|  _|_| |___|___|___|
-              |_|
-""")
-
-    logo.append("""
-                   _                  _
-                  (_)                | |
-  ___   ___  ____  _ ____   ____ ___ | |__  _____
- / _ \ / _ \|  _ \| |  _ \ / ___) _ \|  _ \| ___ |
-| |_| | |_| | | | | | |_| | |  | |_| | |_) ) ____|
- \___/ \___/|_| |_|_|  __/|_|   \___/|____/|_____)
-                    |_|
-""")
-    logo.append("""
-                     _                   __
-  ____  ____  ____  (_)____  _________  / /_  ___
- / __ \/ __ \/ __ \/ // __ \/ ___/ __ \/ __ \/ _ \\
-/ /_/ / /_/ / / / / // /_/ / /  / /_/ / /_/ /  __/
-\____/\____/_/ /_/_// .___/_/   \____/_.___/\___/
-                   /_/
-""")
-    logo.append("""
-                   _)                |
-   _ \   _ \    \   |  _ \   _| _ \   _ \   -_)
- \___/ \___/ _| _| _| .__/ _| \___/ _.__/ \___|
-                     _|
-""")
-    logo.append("""
-                    _                 _
-   ___   ___  _ __ (_)_ __  _ __ ___ | |__   ___
-  / _ \ / _ \| '_ \| | '_ \| '__/ _ \| '_ \ / _ \\
- | (_) | (_) | | | | | |_) | | | (_) | |_) |  __/
-  \___/ \___/|_| |_|_| .__/|_|  \___/|_.__/ \___|
-                     |_|
-""")
-    logo.append("""
-                              .-.                                 (   )
-  .--.     .--.    ___ .-.   ( __)    .-..    ___ .-.      .--.    | |.-.     .--.
- /    \   /    \  (   )   \  (''")   /    \  (   )   \    /    \   | /   \   /    \\
-|  .-. ; |  .-. ;  |  .-. .   | |   ' .-,  ;  | ' .-. ;  |  .-. ;  |  .-. | |  .-. ;
-| |  | | | |  | |  | |  | |   | |   | |  . |  |  / (___) | |  | |  | |  | | |  | | |
-| |  | | | |  | |  | |  | |   | |   | |  | |  | |        | |  | |  | |  | | |  |/  |
-| |  | | | |  | |  | |  | |   | |   | |  | |  | |        | |  | |  | |  | | |  ' _.'
-| '  | | | '  | |  | |  | |   | |   | |  ' |  | |        | '  | |  | '  | | |  .'.-.
-'  `-' / '  `-' /  | |  | |   | |   | `-'  '  | |        '  `-' /  ' `-' ;  '  `-' /
- `.__.'   `.__.'  (___)(___) (___)  | \__.'  (___)        `.__.'    `.__.    `.__.'
-                                    | |
-                                   (___)
-""")
-    logo.append("""
-               o               |
-,---.,---.,---..,---.,---.,---.|---.,---.
-|   ||   ||   |||   ||    |   ||   ||---'
-`---'`---'`   '`|---'`    `---'`---'`---'
-                |
-""")
-    logo.append("""
- ________________________________________
-/ OONI-PROBE -- WE FIGHT CENSORSHIP LIKE \\
-\        DRAGONS EAT KNIGHTS!            /
- ----------------------------------------
-                       \                    ^    /^
-                        \                  / \  // \\
-                         \   |\___/|      /   \//  .\\
-                          \  /O  O  \__  /    //  | \ \           *----*
-                            /     /  \/_/    //   |  \  \          \   |
-                            @___@`    \/_   //    |   \   \         \/\ \\
-                           0/0/|       \/_ //     |    \    \         \  \\
-                       0/0/0/0/|        \///      |     \     \       |  |
-                    0/0/0/0/0/_|_ /   (  //       |      \     _\     |  /
-                 0/0/0/0/0/0/`/,_ _ _/  ) ; -.    |    _ _\.-~       /   /
-                             ,-}        _      *-.|.-~-.           .~    ~
-            \     \__/        `/\      /                 ~-. _ .-~      /
-             \____(oo)           *.   }            {                   /
-             (    (--)          .----~-.\        \-`                 .~
-             //__\\\\  \__ Ack!   ///.----..<        \             _ -~
-            //    \\\\               ///-._ _ _ _ _ _ _{^ - - - - ~
-""")
-    logo.append("""
- _________________
-|   OONI-PROBE    |
-| DON'T CENSOR ME |
-|_________________|
-\                             .       .
- \                           / `.   .' "
-  \                  .---.  <    > <    >  .---.
-   \                 |    \  \ - ~ ~ - /  /    |
-         _____          ..-~             ~-..-~
-        |  (A)|   \~~~\.'                    `./~~~/
-       ---------   \__/                        \__/
-      .'  O    \     /               /       \  "
-     (_____,    `._.'               |         }  \/~~~/
-      `----.          /       }     |        /    \__/
-            `-.      |       /      |       /      `. ,~~|
-                ~-.__|      /_ - ~ ^|      /- _      `..-'
-                     |     /        |     /     ~-.     `-. _  _  _
-                     |_____|        |_____|         ~ - . _ _ _ _ _>
-""")
-    logo.append("""
-                  _________________
-        ,/~~,    |                 |
-       /``   \  /|  OONI-PROBE...  |
-      `( O^O ) / |                 |
-       `\_-_/`   |  ...DOES THIS   |
-         ~~~     |  EXCITE YOU?    |
-       __| |__   |_________________|
-      |       |
-      |   af  |
-      | |   | |
-      | |   | \\
-      | |   |\ \\
-      | |   | \ \\
-      | |   |  \ \\
-      | |___|   (((
-     (((|/*\|
-        | | |
-        | | |
-        | | |
-        | | |
-        | | |
-        | | |
-        | | |
-        | | |
-        | | |
-        | | |
-       _| | |_
-      (___|___)
-""")
-    return random.choice(logo)
diff --git a/ooni/ooniprobe.py b/ooni/ooniprobe.py
index 22299ac..261eb74 100755
--- a/ooni/ooniprobe.py
+++ b/ooni/ooniprobe.py
@@ -17,19 +17,20 @@
 #
 
 import sys
+from pprint import pprint
 
 from twisted.python import usage
-from twisted.plugin import getPlugins
 from twisted.internet import reactor
+from twisted.plugin import getPlugins
 
+from zope.interface.verify import verifyObject
 from zope.interface.exceptions import BrokenImplementation
 from zope.interface.exceptions import BrokenMethodImplementation
-from zope.interface.verify import verifyObject
-from pprint import pprint
 
 from ooni.plugoo import tests, work, assets, reports
-from ooni.logo import getlogo
-from ooni import plugins, log
+from ooni.utils.logo import getlogo
+from ooni.utils import log
+from ooni import plugins
 
 __version__ = "0.0.1-prealpha"
 
diff --git a/ooni/plugins/bridget.py b/ooni/plugins/bridget.py
index 0614d5d..fa3cb67 100644
--- a/ooni/plugins/bridget.py
+++ b/ooni/plugins/bridget.py
@@ -8,7 +8,7 @@ from twisted.python import usage
 from twisted.plugin import IPlugin
 from twisted.internet import reactor
 
-from ooni import log
+from ooni.utils import log
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
 
diff --git a/ooni/plugins/captiveportal.py b/ooni/plugins/captiveportal.py
index 4ed00b3..b48f70b 100644
--- a/ooni/plugins/captiveportal.py
+++ b/ooni/plugins/captiveportal.py
@@ -25,7 +25,7 @@ from twisted.plugin import IPlugin
 from ooni.plugoo.assets import Asset
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.protocols import http
-from ooni import log
+from ooni.utils import log
 
 try:
     from dns import resolver
diff --git a/ooni/plugins/chinatrigger.py b/ooni/plugins/chinatrigger.py
index 4f2dc8c..538ef0b 100644
--- a/ooni/plugins/chinatrigger.py
+++ b/ooni/plugins/chinatrigger.py
@@ -9,7 +9,7 @@ from twisted.plugin import IPlugin
 from twisted.internet import protocol, defer
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
-from ooni import log
+from ooni.utils import log
 from ooni.protocols.scapy import ScapyTest
 
 from ooni.lib.txscapy import txsr, txsend
diff --git a/ooni/plugins/httpt.py b/ooni/plugins/httpt.py
index d0ede0f..4113aef 100644
--- a/ooni/plugins/httpt.py
+++ b/ooni/plugins/httpt.py
@@ -9,7 +9,7 @@ from twisted.plugin import IPlugin
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
 from ooni.protocols import http
-from ooni import log
+from ooni.utils import log
 
 class httptArgs(usage.Options):
     optParameters = [['urls', 'f', None, 'Urls file'],
diff --git a/ooni/plugins/tcpconnect.py b/ooni/plugins/tcpconnect.py
index 7c04994..db3d969 100644
--- a/ooni/plugins/tcpconnect.py
+++ b/ooni/plugins/tcpconnect.py
@@ -11,7 +11,7 @@ from twisted.internet.endpoints import TCP4ClientEndpoint
 
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
-from ooni import log
+from ooni.utils import log
 
 class tcpconnectArgs(usage.Options):
     optParameters = [['asset', 'a', None, 'File containing IP:PORT combinations, one per line.'],
diff --git a/ooni/plugoo/nodes.py b/ooni/plugoo/nodes.py
index 6cdba65..0d01348 100644
--- a/ooni/plugoo/nodes.py
+++ b/ooni/plugoo/nodes.py
@@ -99,7 +99,7 @@ class PlanetLab(CodeExecNode):
     def __init__(self, address, auth_creds, ooni):
         self.auth_creds = auth_creds
 
-        self.config = ooni.config
+        self.config = ooni.utils.config
         self.logger = ooni.logger
         self.name = "PlanetLab"
 
diff --git a/ooni/plugoo/reports.py b/ooni/plugoo/reports.py
index a963f1c..3a9c5d2 100644
--- a/ooni/plugoo/reports.py
+++ b/ooni/plugoo/reports.py
@@ -4,7 +4,7 @@ import os
 import yaml
 
 import itertools
-from ooni import log, date
+from ooni.utils import log, date
 
 class Report:
     """This is the ooni-probe reporting mechanism. It allows
diff --git a/ooni/plugoo/tests.py b/ooni/plugoo/tests.py
index 42294d6..a99a144 100644
--- a/ooni/plugoo/tests.py
+++ b/ooni/plugoo/tests.py
@@ -7,8 +7,8 @@ import itertools
 from twisted.internet import reactor, defer, threads
 from twisted.python import failure
 
-from ooni import log
-from ooni import date
+from ooni.utils import log
+from ooni.utils import date
 from ooni.plugoo import assets, work
 from ooni.plugoo.reports import Report
 from ooni.plugoo.interface import ITest
diff --git a/ooni/protocols/http.py b/ooni/protocols/http.py
index 1dd2261..100db88 100644
--- a/ooni/protocols/http.py
+++ b/ooni/protocols/http.py
@@ -5,7 +5,7 @@ from twisted.plugin import IPlugin
 from twisted.internet import protocol, defer
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
-from ooni import log
+from ooni.utils import log
 
 useragents = [("Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6", "Firefox 2.0, Windows XP"),
               ("Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", "Internet Explorer 7, Windows Vista"),
diff --git a/ooni/protocols/scapy.py b/ooni/protocols/scapy.py
index bacc163..4166146 100644
--- a/ooni/protocols/scapy.py
+++ b/ooni/protocols/scapy.py
@@ -5,7 +5,7 @@ from twisted.plugin import IPlugin
 from twisted.internet import protocol, defer
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
-from ooni import log
+from ooni.utils import log
 
 from ooni.lib.txscapy import txsr, txsend
 
diff --git a/ooni/scaffolding.py b/ooni/scaffolding.py
index b4c5645..0a832aa 100755
--- a/ooni/scaffolding.py
+++ b/ooni/scaffolding.py
@@ -5,7 +5,7 @@ This script should be used for creating the scaffolding for a test.
 """
 import os
 import sys
-from ooni import log
+from ooni.utils import log
 
 test_template = """\"\"\"
 This is a self genrated test created by scaffolding.py.
@@ -17,7 +17,7 @@ from twisted.python import usage
 from twisted.plugin import IPlugin
 from ooni.plugoo.tests import ITest, OONITest
 from ooni.plugoo.assets import Asset
-from ooni import log
+from ooni.utils import log
 
 class %(testShortname)sArgs(usage.Options):
     optParameters = [['asset', 'a', None, 'Asset file'],
diff --git a/ooni/utils.py b/ooni/utils.py
deleted file mode 100644
index e9c55f1..0000000
--- a/ooni/utils.py
+++ /dev/null
@@ -1,146 +0,0 @@
-"""
-
-"""
-
-import imp
-import logging
-try:
-    import yaml
-except:
-    print "Error in importing YAML"
-
-class Storage(dict):
-    """
-    A Storage object is like a dictionary except `obj.foo` can be used
-    in addition to `obj['foo']`.
-
-        >>> o = Storage(a=1)
-        >>> o.a
-        1
-        >>> o['a']
-        1
-        >>> o.a = 2
-        >>> o['a']
-        2
-        >>> del o.a
-        >>> o.a
-        None
-    """
-
-    def __getattr__(self, key):
-        try:
-            return self[key]
-        except KeyError, k:
-            return None
-
-    def __setattr__(self, key, value):
-        self[key] = value
-
-    def __delattr__(self, key):
-        try:
-            del self[key]
-        except KeyError, k:
-            raise AttributeError, k
-
-    def __repr__(self):
-        return '<Storage ' + dict.__repr__(self) + '>'
-
-    def __getstate__(self):
-        return dict(self)
-
-    def __setstate__(self, value):
-        for (k, v) in value.items():
-            self[k] = v
-
-
-def get_logger(config):
-    loglevel = getattr(logging, config.loglevel.upper())
-    logging.basicConfig(level=loglevel,
-                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
-                    filename=config.logfile,
-                    filemode='w')
-
-    console = logging.StreamHandler()
-    console.setLevel(getattr(logging, config.consoleloglevel.upper()))
-    # Set the console logger to a different format
-    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
-    console.setFormatter(formatter)
-    logging.getLogger('').addHandler(console)
-
-    return logging.getLogger('ooniprobe')
-
-def parse_asset(asset):
-    parsed = Storage()
-    try:
-        with open(asset, 'r') as f:
-            for line in f.readlines():
-            # XXX This should be rewritten, if the values contain
-            #     #: they will be rewritten with blank.
-            # should not be an issue but this is not a very good parser
-                if line.startswith("#:"):
-                    n = line.split(' ')[0].replace('#:','')
-                    v = line.replace('#:'+n+' ', '').strip()
-                    if n in ('tests', 'files'):
-                        parsed[n] = v.split(",")
-                    else:
-                        parsed[n] = v
-
-                elif line.startswith("#"):
-                    continue
-                else:
-                        break
-    finally:
-        if not parsed.name:
-            parsed.name = asset
-        if not parsed.files:
-            parsed.files = asset
-        return parsed
-
-def import_test(name, config):
-    if name.endswith(".py"):
-        test = Storage()
-        test_name = name.split(".")[0]
-        fp, pathname, description = imp.find_module(test_name,
-                                            [config.main.testdir])
-        module = imp.load_module(name, fp, pathname, description)
-
-        try:
-            test.name = module.__name__
-            test.desc = module.__desc__
-            test.module = module
-        except:
-            test.name = test_name
-            test.desc = ""
-            test.module = module
-
-        return test_name, test
-
-    return None, None
-
-class Log():
-    """
-    This is a class necessary for parsing YAML log files.
-    It is required because pyYaml has a bug in parsing
-    log format YAML files.
-    """
-    def __init__(self, file=None):
-        if file:
-            self.fh = open(file)
-
-    def __iter__(self):
-        return self
-
-    def next(self):
-        lines = []
-        try:
-            line = self.fh.readline()
-            if not line:
-                raise StopIteration
-            while not line.startswith("---"):
-                lines.append(line)
-                line = self.fh.readline()
-            return lines
-        except:
-            raise StopIteration
-
-
diff --git a/ooni/utils/__init__.py b/ooni/utils/__init__.py
new file mode 100644
index 0000000..e9c55f1
--- /dev/null
+++ b/ooni/utils/__init__.py
@@ -0,0 +1,146 @@
+"""
+
+"""
+
+import imp
+import logging
+try:
+    import yaml
+except:
+    print "Error in importing YAML"
+
+class Storage(dict):
+    """
+    A Storage object is like a dictionary except `obj.foo` can be used
+    in addition to `obj['foo']`.
+
+        >>> o = Storage(a=1)
+        >>> o.a
+        1
+        >>> o['a']
+        1
+        >>> o.a = 2
+        >>> o['a']
+        2
+        >>> del o.a
+        >>> o.a
+        None
+    """
+
+    def __getattr__(self, key):
+        try:
+            return self[key]
+        except KeyError, k:
+            return None
+
+    def __setattr__(self, key, value):
+        self[key] = value
+
+    def __delattr__(self, key):
+        try:
+            del self[key]
+        except KeyError, k:
+            raise AttributeError, k
+
+    def __repr__(self):
+        return '<Storage ' + dict.__repr__(self) + '>'
+
+    def __getstate__(self):
+        return dict(self)
+
+    def __setstate__(self, value):
+        for (k, v) in value.items():
+            self[k] = v
+
+
+def get_logger(config):
+    loglevel = getattr(logging, config.loglevel.upper())
+    logging.basicConfig(level=loglevel,
+                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
+                    filename=config.logfile,
+                    filemode='w')
+
+    console = logging.StreamHandler()
+    console.setLevel(getattr(logging, config.consoleloglevel.upper()))
+    # Set the console logger to a different format
+    formatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
+    console.setFormatter(formatter)
+    logging.getLogger('').addHandler(console)
+
+    return logging.getLogger('ooniprobe')
+
+def parse_asset(asset):
+    parsed = Storage()
+    try:
+        with open(asset, 'r') as f:
+            for line in f.readlines():
+            # XXX This should be rewritten, if the values contain
+            #     #: they will be rewritten with blank.
+            # should not be an issue but this is not a very good parser
+                if line.startswith("#:"):
+                    n = line.split(' ')[0].replace('#:','')
+                    v = line.replace('#:'+n+' ', '').strip()
+                    if n in ('tests', 'files'):
+                        parsed[n] = v.split(",")
+                    else:
+                        parsed[n] = v
+
+                elif line.startswith("#"):
+                    continue
+                else:
+                        break
+    finally:
+        if not parsed.name:
+            parsed.name = asset
+        if not parsed.files:
+            parsed.files = asset
+        return parsed
+
+def import_test(name, config):
+    if name.endswith(".py"):
+        test = Storage()
+        test_name = name.split(".")[0]
+        fp, pathname, description = imp.find_module(test_name,
+                                            [config.main.testdir])
+        module = imp.load_module(name, fp, pathname, description)
+
+        try:
+            test.name = module.__name__
+            test.desc = module.__desc__
+            test.module = module
+        except:
+            test.name = test_name
+            test.desc = ""
+            test.module = module
+
+        return test_name, test
+
+    return None, None
+
+class Log():
+    """
+    This is a class necessary for parsing YAML log files.
+    It is required because pyYaml has a bug in parsing
+    log format YAML files.
+    """
+    def __init__(self, file=None):
+        if file:
+            self.fh = open(file)
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        lines = []
+        try:
+            line = self.fh.readline()
+            if not line:
+                raise StopIteration
+            while not line.startswith("---"):
+                lines.append(line)
+                line = self.fh.readline()
+            return lines
+        except:
+            raise StopIteration
+
+
diff --git a/ooni/utils/config.py b/ooni/utils/config.py
new file mode 100644
index 0000000..42a14f6
--- /dev/null
+++ b/ooni/utils/config.py
@@ -0,0 +1,53 @@
+import ConfigParser
+from utils import Storage
+
+class Config(Storage):
+    """
+    A Storage-like class which loads and store each attribute into a portable
+    conf file.
+    """
+    def __init__(self, section, cfgfile="ooni-probe.conf"):
+        super(Config, self).__init__()
+
+        self._cfgfile = cfgfile
+        # setting up confgiparser
+        self._cfgparser = ConfigParser.ConfigParser()
+        self._cfgparser.read([self._cfgfile])
+        self._section = section
+
+    def __getattr__(self, name):
+        if name.startswith('_'):
+            return self.__dict__.get(name, None)
+
+        try:
+            value = self._cfgparser.get(self._section, name)
+            if value.isdigit():
+                return int(value)
+            elif value.lower() in ('true', 'false'):
+                return value.lower() == 'true'
+            else:
+                return value
+        except ConfigParser.NoOptionError:
+            return ''  # if option doesn't exists return an empty string
+
+    def __setattr__(self, name, value):
+        # keep an open port with private attributes
+        if name.startswith('_'):
+            self.__dict__[name] = value
+            return
+
+        try:
+            # XXX: Automagically discover variable type
+            self._cfgparser.set(self._section, name, value)
+        except ConfigParser.NoOptionError:
+            raise NameError(name)
+
+    def commit(self):
+        """
+        Commit changes in config file.
+        """
+        cfgfile = open(self._cfgfile, 'w')
+        try:
+            self._cfgparser.write(cfgfile)
+        finally:
+            cfgfile.close()
diff --git a/ooni/utils/date.py b/ooni/utils/date.py
new file mode 100644
index 0000000..59ec1f8
--- /dev/null
+++ b/ooni/utils/date.py
@@ -0,0 +1,22 @@
+from ooni.lib.rfc3339 import rfc3339
+from datetime import datetime
+
+class odate(datetime):
+    def __str__(self):
+        return rfc3339(self)
+
+    def __repr__(self):
+        return "'%s'" % rfc3339(self)
+
+    def from_rfc(self, datestr):
+        pass
+
+def now():
+    return odate.utcnow()
+
+def pretty_date():
+    cur_time = datetime.utcnow()
+    d_format = "%d %B %Y %H:%M:%S"
+    pretty = cur_time.strftime(d_format)
+    return pretty
+
diff --git a/ooni/utils/log.py b/ooni/utils/log.py
new file mode 100644
index 0000000..3dc52dd
--- /dev/null
+++ b/ooni/utils/log.py
@@ -0,0 +1,43 @@
+"""
+OONI logging facility.
+"""
+import sys
+import logging
+import warnings
+
+from twisted.python import log
+
+# Logging levels
+DEBUG = logging.DEBUG
+INFO = logging.INFO
+WARNING = logging.WARNING
+ERROR = logging.ERROR
+CRITICAL = logging.CRITICAL
+
+def _get_log_level(level):
+    if not level:
+        return INFO
+    else:
+        return level
+
+def start(logfile=None, loglevel=None, logstdout=True):
+    if log.defaultObserver:
+        print "%s" % logstdout
+        loglevel = _get_log_level(loglevel)
+        file = open(logfile, 'a') if logfile else sys.stderr
+        observer = log.FileLogObserver(file)
+        if logstdout:
+            log.startLogging(sys.stdout)
+        else:
+            log.startLogging()
+        log.addObserver(observer.emit)
+        msg("Started OONI")
+
+def msg(message, level=INFO, **kw):
+    log.msg(message, logLevel=level, **kw)
+
+def err(message, **kw):
+    log.err(message, **kw)
+
+def debug(message, **kw):
+    log.msg(message, logLevel=DEBUG, **kw)
diff --git a/ooni/utils/logo.py b/ooni/utils/logo.py
new file mode 100644
index 0000000..8924462
--- /dev/null
+++ b/ooni/utils/logo.py
@@ -0,0 +1,214 @@
+import random
+def getlogo():
+    logo = []
+    logo.append("""
+  _____   _____  __   _ _____  _____   ______  _____  ______  _______
+ |     | |     | | \  |   |   |_____] |_____/ |     | |_____] |______
+ |_____| |_____| |  \_| __|__ |       |    \_ |_____| |_____] |______""")
+
+    logo.append("""
+                   _                 _
+                  (_)               | |
+  ___   ___  _ __  _ _ __  _ __ ___ | |__   ___
+ / _ \ / _ \| '_ \| | '_ \| '__/ _ \| '_ \ / _ \\
+| (_) | (_) | | | | | |_) | | | (_) | |_) |  __/
+ \___/ \___/|_| |_|_| .__/|_|  \___/|_.__/ \___|
+                    | |
+                    |_|""")
+
+
+    logo.append("""
+                     .__                    ___.
+  ____   ____   ____ |__|_____________  ____\_ |__   ____
+ /  _ \ /  _ \ /    \|  |\____ \_  __ \/  _ \| __ \_/ __ \\
+(  <_> |  <_> )   |  \  ||  |_> >  | \(  <_> ) \_\ \  ___/
+ \____/ \____/|___|  /__||   __/|__|   \____/|___  /\___  >
+                   \/    |__|                    \/     \/""")
+
+
+    logo.append("""
+ __   __          __   __   __   __   ___
+/  \ /  \ |\ | | |__) |__) /  \ |__) |__
+\__/ \__/ | \| | |    |  \ \__/ |__) |___ """)
+
+
+    logo.append("""
+  _   _  ._  o ._  ._ _  |_   _
+ (_) (_) | | | |_) | (_) |_) (/_
+               |
+""")
+
+    logo.append("""
+ _______  _______  __    _  ___   _______  ______   _______  _______  _______
+|       ||       ||  |  | ||   | |       ||    _ | |       ||  _    ||       |
+|   _   ||   _   ||   |_| ||   | |    _  ||   | || |   _   || |_|   ||    ___|
+|  | |  ||  | |  ||       ||   | |   |_| ||   |_|| |  | |  ||       ||   |___
+|  |_|  ||  |_|  ||  _    ||   | |    ___||    __ ||  |_|  ||  _   | |    ___|
+|       ||       || | |   ||   | |   |    |   |  |||       || |_|   ||   |___
+|_______||_______||_|  |__||___| |___|    |___|  |||_______||_______||_______|
+""")
+
+
+    logo.append("""
+                   _                 _
+  ___   ___  _ __ (_)_ __  _ __ ___ | |__   ___
+ / _ \ / _ \| '_ \| | '_ \| '__/ _ \| '_ \ / _ \\
+| (_) | (_) | | | | | |_) | | | (_) | |_) |  __/
+ \___/ \___/|_| |_|_| .__/|_|  \___/|_.__/ \___|
+                    |_|
+""")
+
+    logo.append("""
+                                          o
+                   o                     O
+                                         O
+                                         o
+.oOo. .oOo. 'OoOo. O  .oOo. `OoOo. .oOo. OoOo. .oOo.
+O   o O   o  o   O o  O   o  o     O   o O   o OooO'
+o   O o   O  O   o O  o   O  O     o   O o   O O
+`OoO' `OoO'  o   O o' oOoO'  o     `OoO' `OoO' `OoO'
+                      O
+                      o'
+""")
+
+
+    logo.append("""
+  _____  _____  ____   _  ____  _____  _____   _____  ______  ______
+ /     \/     \|    \ | ||    ||     ||     | /     \|      >|   ___|
+ |     ||     ||     \| ||    ||    _||     \ |     ||     < |   ___|
+ \_____/\_____/|__/\____||____||___|  |__|\__\\\\_____/|______>|______|
+""")
+
+    logo.append("""
+             _             _
+ ___ ___ ___|_|___ ___ ___| |_ ___
+| . | . |   | | . |  _| . | . | -_|
+|___|___|_|_|_|  _|_| |___|___|___|
+              |_|
+""")
+
+    logo.append("""
+                   _                  _
+                  (_)                | |
+  ___   ___  ____  _ ____   ____ ___ | |__  _____
+ / _ \ / _ \|  _ \| |  _ \ / ___) _ \|  _ \| ___ |
+| |_| | |_| | | | | | |_| | |  | |_| | |_) ) ____|
+ \___/ \___/|_| |_|_|  __/|_|   \___/|____/|_____)
+                    |_|
+""")
+    logo.append("""
+                     _                   __
+  ____  ____  ____  (_)____  _________  / /_  ___
+ / __ \/ __ \/ __ \/ // __ \/ ___/ __ \/ __ \/ _ \\
+/ /_/ / /_/ / / / / // /_/ / /  / /_/ / /_/ /  __/
+\____/\____/_/ /_/_// .___/_/   \____/_.___/\___/
+                   /_/
+""")
+    logo.append("""
+                   _)                |
+   _ \   _ \    \   |  _ \   _| _ \   _ \   -_)
+ \___/ \___/ _| _| _| .__/ _| \___/ _.__/ \___|
+                     _|
+""")
+    logo.append("""
+                    _                 _
+   ___   ___  _ __ (_)_ __  _ __ ___ | |__   ___
+  / _ \ / _ \| '_ \| | '_ \| '__/ _ \| '_ \ / _ \\
+ | (_) | (_) | | | | | |_) | | | (_) | |_) |  __/
+  \___/ \___/|_| |_|_| .__/|_|  \___/|_.__/ \___|
+                     |_|
+""")
+    logo.append("""
+                              .-.                                 (   )
+  .--.     .--.    ___ .-.   ( __)    .-..    ___ .-.      .--.    | |.-.     .--.
+ /    \   /    \  (   )   \  (''")   /    \  (   )   \    /    \   | /   \   /    \\
+|  .-. ; |  .-. ;  |  .-. .   | |   ' .-,  ;  | ' .-. ;  |  .-. ;  |  .-. | |  .-. ;
+| |  | | | |  | |  | |  | |   | |   | |  . |  |  / (___) | |  | |  | |  | | |  | | |
+| |  | | | |  | |  | |  | |   | |   | |  | |  | |        | |  | |  | |  | | |  |/  |
+| |  | | | |  | |  | |  | |   | |   | |  | |  | |        | |  | |  | |  | | |  ' _.'
+| '  | | | '  | |  | |  | |   | |   | |  ' |  | |        | '  | |  | '  | | |  .'.-.
+'  `-' / '  `-' /  | |  | |   | |   | `-'  '  | |        '  `-' /  ' `-' ;  '  `-' /
+ `.__.'   `.__.'  (___)(___) (___)  | \__.'  (___)        `.__.'    `.__.    `.__.'
+                                    | |
+                                   (___)
+""")
+    logo.append("""
+               o               |
+,---.,---.,---..,---.,---.,---.|---.,---.
+|   ||   ||   |||   ||    |   ||   ||---'
+`---'`---'`   '`|---'`    `---'`---'`---'
+                |
+""")
+    logo.append("""
+ ________________________________________
+/ OONI-PROBE -- WE FIGHT CENSORSHIP LIKE \\
+\        DRAGONS EAT KNIGHTS!            /
+ ----------------------------------------
+                       \                    ^    /^
+                        \                  / \  // \\
+                         \   |\___/|      /   \//  .\\
+                          \  /O  O  \__  /    //  | \ \           *----*
+                            /     /  \/_/    //   |  \  \          \   |
+                            @___@`    \/_   //    |   \   \         \/\ \\
+                           0/0/|       \/_ //     |    \    \         \  \\
+                       0/0/0/0/|        \///      |     \     \       |  |
+                    0/0/0/0/0/_|_ /   (  //       |      \     _\     |  /
+                 0/0/0/0/0/0/`/,_ _ _/  ) ; -.    |    _ _\.-~       /   /
+                             ,-}        _      *-.|.-~-.           .~    ~
+            \     \__/        `/\      /                 ~-. _ .-~      /
+             \____(oo)           *.   }            {                   /
+             (    (--)          .----~-.\        \-`                 .~
+             //__\\\\  \__ Ack!   ///.----..<        \             _ -~
+            //    \\\\               ///-._ _ _ _ _ _ _{^ - - - - ~
+""")
+    logo.append("""
+ _________________
+|   OONI-PROBE    |
+| DON'T CENSOR ME |
+|_________________|
+\                             .       .
+ \                           / `.   .' "
+  \                  .---.  <    > <    >  .---.
+   \                 |    \  \ - ~ ~ - /  /    |
+         _____          ..-~             ~-..-~
+        |  (A)|   \~~~\.'                    `./~~~/
+       ---------   \__/                        \__/
+      .'  O    \     /               /       \  "
+     (_____,    `._.'               |         }  \/~~~/
+      `----.          /       }     |        /    \__/
+            `-.      |       /      |       /      `. ,~~|
+                ~-.__|      /_ - ~ ^|      /- _      `..-'
+                     |     /        |     /     ~-.     `-. _  _  _
+                     |_____|        |_____|         ~ - . _ _ _ _ _>
+""")
+    logo.append("""
+                  _________________
+        ,/~~,    |                 |
+       /``   \  /|  OONI-PROBE...  |
+      `( O^O ) / |                 |
+       `\_-_/`   |  ...DOES THIS   |
+         ~~~     |  EXCITE YOU?    |
+       __| |__   |_________________|
+      |       |
+      |   af  |
+      | |   | |
+      | |   | \\
+      | |   |\ \\
+      | |   | \ \\
+      | |   |  \ \\
+      | |___|   (((
+     (((|/*\|
+        | | |
+        | | |
+        | | |
+        | | |
+        | | |
+        | | |
+        | | |
+        | | |
+        | | |
+        | | |
+       _| | |_
+      (___|___)
+""")
+    return random.choice(logo)



More information about the tor-commits mailing list