commit 8169c927896aaf9b5634c775cd48deb6b6553374 Author: Arturo Filastò art@fuffa.org Date: Sat Dec 8 12:16:38 2012 +0100
Refactor the renaming of old files to a proper util function * Do not require passing of arguments to startSniffing * Add unittest for pushFilenameStack --- ooni/oonicli.py | 6 +++++- ooni/reporter.py | 5 ++--- ooni/runner.py | 16 +++++++--------- ooni/utils/__init__.py | 33 +++++++++++++++++++++++++++++++-- tests/test_utils.py | 20 ++++++++++++++++++++ 5 files changed, 65 insertions(+), 15 deletions(-)
diff --git a/ooni/oonicli.py b/ooni/oonicli.py index 23c4dd5..44334f0 100644 --- a/ooni/oonicli.py +++ b/ooni/oonicli.py @@ -126,9 +126,13 @@ def run():
log.start(cmd_line_options['logfile'])
+ config.cmd_line_options = cmd_line_options + if config.privacy.includepcap: log.msg("Starting") - runner.startSniffing(cmd_line_options) + if not config.reports.pcap: + config.generatePcapFilename() + runner.startSniffing()
resume = cmd_line_options['resume']
diff --git a/ooni/reporter.py b/ooni/reporter.py index 6a8fd3f..e14f64d 100644 --- a/ooni/reporter.py +++ b/ooni/reporter.py @@ -26,7 +26,7 @@ except ImportError:
from ooni import otime -from ooni.utils import geodata +from ooni.utils import geodata, pushFilenameStack from ooni.utils.net import BodyReceiver, StringProducer, userAgents
from ooni import config @@ -208,8 +208,7 @@ class YAMLReporter(OReporter):
if os.path.exists(reportfile): log.msg("Report already exists with filename %s" % reportfile) - log.msg("Renaming it to %s" % reportfile+'.old') - os.rename(reportfile, reportfile+'.old') + pushFilenameStack(reportfile)
log.debug("Creating %s" % reportfile) self._stream = open(reportfile, 'w+') diff --git a/ooni/runner.py b/ooni/runner.py index 4483ce4..b451816 100644 --- a/ooni/runner.py +++ b/ooni/runner.py @@ -4,6 +4,7 @@ import time import inspect import traceback import itertools + import yaml
from twisted.python import reflect, usage @@ -21,7 +22,7 @@ from ooni.reporter import OONIBReporter, YAMLReporter, OONIBReportError from ooni.inputunit import InputUnitFactory from ooni.nettest import NetTestCase, NoPostProcessor
-from ooni.utils import log, checkForRoot +from ooni.utils import log, checkForRoot, pushFilenameStack from ooni.utils import NotRootError, Storage from ooni.utils.net import randomFreePort
@@ -521,7 +522,7 @@ def startTor(): d.addErrback(setup_failed) return d
-def startSniffing(cmd_line_options): +def startSniffing(): """ Start sniffing with Scapy. Exits if required privileges (root) are not available. """ @@ -536,13 +537,10 @@ def startSniffing(cmd_line_options): print "Starting sniffer" config.scapyFactory = ScapyFactory(config.advanced.interface)
- if not config.reports.pcap: - config.cmd_line_options = cmd_line_options - config.generatePcapFilename() - if os.path.exists(config.reports.pcap): - print "Report PCAP already exists with filename %s" % config.reports.pcap - print "Renaming it to %s" % config.reports.pcap+".old" - os.rename(config.reports.pcap, config.reports.pcap+".old") + if os.path.exists(config.reports.pcap): + print "Report PCAP already exists with filename %s" % config.reports.pcap + print "Renaming files with such name..." + pushFilenameStack(config.reports.pcap)
sniffer = ScapySniffer(config.reports.pcap) config.scapyFactory.registerProtocol(sniffer) diff --git a/ooni/utils/__init__.py b/ooni/utils/__init__.py index abcf370..baf3f39 100644 --- a/ooni/utils/__init__.py +++ b/ooni/utils/__init__.py @@ -1,9 +1,10 @@ -import imp -import os import logging import string import random +import glob import yaml +import imp +import os
class Storage(dict): """ @@ -83,3 +84,31 @@ def randomStr(length, num=True): return ''.join(random.choice(chars) for x in range(length))
+def pushFilenameStack(filename): + """ + Takes as input a target filename and checks to see if a file by such name + already exists. If it does exist then it will attempt to rename it to .1, + if .1 exists it will rename .1 to .2 if .2 exists then it will rename it to + .3, etc. + This is similar to pushing into a LIFO stack. + + XXX: This will not work with stacks bigger than 10 elements because + glob.glob(".*") will return them in the wrong order (a.1, a.11, a.2, a.3, + etc.) + This is probably not an issue since the only thing it causes is that files + will be renamed in the wrong order and you shouldn't have the same report + filename for more than 10 reports anyways, because you should be making + ooniprobe generate the filename for you. + + Args: + filename (str): the path to filename that you wish to create. + """ + stack = glob.glob(filename+".*") + for f in reversed(stack): + c_filename, c_idx = f.split(".") + new_idx = int(c_idx) + 1 + new_filename = "%s.%s" % (c_filename, new_idx) + os.rename(f, new_filename) + os.rename(filename, filename+".1") + + diff --git a/tests/test_utils.py b/tests/test_utils.py new file mode 100644 index 0000000..cc648e0 --- /dev/null +++ b/tests/test_utils.py @@ -0,0 +1,20 @@ +import unittest +from ooni.utils import pushFilenameStack + +class TestUtils(unittest.TestCase): + def test_pushFilenameStack(self): + f = open("dummyfile", "w+") + f.write("0\n") + f.close() + for i in xrange(1, 5): + f = open("dummyfile.%s" % i, "w+") + f.write("%s\n" % i) + f.close() + + pushFilenameStack("dummyfile") + for i in xrange(1, 5): + f = open("dummyfile.%s" % i) + c = f.readlines()[0].strip() + self.assertEqual(str(i-1), str(c)) + f.close() +