[tor-commits] [ooni-probe/master] Use twisted fdesc when writing to files

art at torproject.org art at torproject.org
Thu Dec 6 21:39:18 UTC 2012


commit 9dcd60b51dc692c6e3d042a0ea9b2c580aa803d8
Author: Arturo Filastò <art at fuffa.org>
Date:   Thu Dec 6 22:37:15 2012 +0100

    Use twisted fdesc when writing to files
    * Add support for processing the ASN number of the probe
      Test reports shall follow the specification detailed inside of docs/reports.rst
---
 oonib/report/__init__.py       |    3 --
 oonib/report/file_collector.py |   61 +++++++++++++++++++++++++--------------
 2 files changed, 39 insertions(+), 25 deletions(-)

diff --git a/oonib/report/__init__.py b/oonib/report/__init__.py
index 96667b4..fcbf220 100644
--- a/oonib/report/__init__.py
+++ b/oonib/report/__init__.py
@@ -1,6 +1,3 @@
-def generateReportID():
-    return otime.timestamp() + '_' + randomStr(20)
-
 class MissingField(Exception):
     pass
 
diff --git a/oonib/report/file_collector.py b/oonib/report/file_collector.py
index 9896784..584a11d 100644
--- a/oonib/report/file_collector.py
+++ b/oonib/report/file_collector.py
@@ -4,8 +4,10 @@ import json
 import re
 import os
 
-from oonib.report import generateReportID
+from twisted.internet import fdesc
+
 from oonib.report import MissingField, InvalidRequestField
+from ooni.utils import randomStr
 
 from cyclone import web
 
@@ -15,11 +17,14 @@ def parseNewReportRequest(request):
     """
     version_string = re.compile("[0-9A-Za-z_\-\.]+$")
     name = re.compile("[a-zA-Z0-9_\- ]+$")
+    probe_asn = re.compile("AS[0-9]+$")
 
-    expected_request = {'software_name': name,
+    expected_request = {
+     'software_name': name,
      'software_version': version_string,
      'test_name': name,
-     'test_version': version_string
+     'test_version': version_string,
+     'probe_asn': probe_asn
     }
 
     parsed_request = json.loads(request)
@@ -28,17 +33,20 @@ def parseNewReportRequest(request):
             value_to_check = parsed_request[k]
         except KeyError:
             raise MissingField(k)
+
         print "Matching %s with %s | %s" % (regexp, value_to_check, k)
         if re.match(regexp, str(value_to_check)):
             continue
         else:
             raise InvalidRequestField(k)
+
     return parsed_request
 
 class NewReportHandlerFile(web.RequestHandler):
     """
     Responsible for creating and updating reports by writing to flat file.
     """
+
     def post(self):
         """
         Creates a new report with the input
@@ -49,7 +57,7 @@ class NewReportHandlerFile(web.RequestHandler):
            'software_version': 'XXX',
            'test_name': 'XXX',
            'test_version': 'XXX',
-           'progress': 'XXX',
+           'probe_asn': 'XXX'
            'content': 'XXX'
            }
 
@@ -91,49 +99,58 @@ class NewReportHandlerFile(web.RequestHandler):
         software_version = report_data['software_version']
         test_name = report_data['test_name']
         test_version = report_data['test_version']
+        probe_asn = report_data['test_version']
         content = report_data['content']
 
-        report_id = generateReportID()
+        if not probe_asn:
+            probe_asn = "AS0"
 
-        #report_filename = '_'.join((report_id,
-        #    report_data['software_name'],
-        #    report_data['software_version'],
-        #    report_data['test_name'],
-        #    report_data['test_version']))
+        report_id = otime.timestamp() + '_' \
+                + probe_asn + '_' \
+                + randomStr(50)
 
         # The report filename contains the timestamp of the report plus a
         # random nonce
         report_filename = os.path.join(config.main.report_dir, report_id)
-        report_filename += '.yamloo'
 
         response = {'backend_version': backend_version,
                 'report_id': report_id
-                }
+        }
+
+        self.writeToReport(report_filename,
+                report_data['content'])
 
-        fp = open(report_filename, 'w+')
-        fp.write(report_data['content'])
-        fp.close()
         self.write(response)
 
+    def writeToReport(report_filename, data):
+        with open(report_filename, 'w+') as fd:
+            fdesc.setNonBlocking(fd)
+            fdesc.writeToFD(data)
+
     def put(self):
         """
         Update an already existing report.
 
-          {'report_id': 'XXX',
+          {
+           'report_id': 'XXX',
            'content': 'XXX'
           }
         """
         parsed_request = parseUpdateReportRequest(self.request.body)
+
         report_id = parsed_request['report_id']
+
         print "Got this request %s" % parsed_request
+        report_filename = os.path.join(config.main.report_dir,
+                report_id)
 
-        report_filename = os.path.join(config.main.report_dir, report_id)
-        report_filename += '.yamloo'
+        self.updateReport(report_filename, parsed_request['content'])
+
+    def updateReport(report_filename, data):
         try:
-            with open(report_filename, 'a+') as f:
-                # XXX-Twisted change this to use t.i.a.fdesc and perhaps make a
-                # nice little object for it.
-                f.write(parsed_request['content'])
+            with open(report_filename, 'a+') as fd:
+                fdesc.setNonBlocking(fd)
+                fdesc.writeToFD(data)
         except IOError as e:
             web.HTTPError(404, "Report not found")
 



More information about the tor-commits mailing list