aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--myrpki.rototill/apnic-to-csv.py7
-rw-r--r--myrpki.rototill/arin-rootcert.py4
-rw-r--r--myrpki.rototill/arin-to-csv.py10
-rw-r--r--myrpki.rototill/convert-from-csv-to-entitydb.py6
-rw-r--r--myrpki.rototill/myrpki.py65
-rw-r--r--myrpki.rototill/ripe-asns-to-csv.py5
-rw-r--r--myrpki.rototill/yamltest.py2
7 files changed, 62 insertions, 37 deletions
diff --git a/myrpki.rototill/apnic-to-csv.py b/myrpki.rototill/apnic-to-csv.py
index af801f23..65b71a36 100644
--- a/myrpki.rototill/apnic-to-csv.py
+++ b/myrpki.rototill/apnic-to-csv.py
@@ -1,10 +1,7 @@
import csv, myrpki, rpki.ipaddrs
-def csvout(fn):
- return csv.writer(open(fn, "w"), dialect = myrpki.csv_dialect)
-
-asns = csvout("asns.csv")
-prefixes = csvout("prefixes.csv")
+asns = myrpki.csv_writer("asns.csv")
+prefixes = myrpki.csv_writer("prefixes.csv")
for line in open("delegated-apnic-extended-latest"):
diff --git a/myrpki.rototill/arin-rootcert.py b/myrpki.rototill/arin-rootcert.py
index 7fdd5e3e..41369056 100644
--- a/myrpki.rototill/arin-rootcert.py
+++ b/myrpki.rototill/arin-rootcert.py
@@ -55,7 +55,7 @@ sbgp-ipAddrBlock = critical,@rfc3997_addrs
''' % { "holder" : holder.lower(),
"HOLDER" : holder.upper() }
-for i, asn in enumerate(asn for handle, asn in myrpki.csv_open("asns.csv")):
+for i, asn in enumerate(asn for handle, asn in myrpki.csv_reader("asns.csv", columns = 2)):
print "AS.%d = %s" % (i, asn)
print '''\
@@ -64,6 +64,6 @@ print '''\
'''
-for i, prefix in enumerate(prefix for handle, prefix in myrpki.csv_open("prefixes.csv")):
+for i, prefix in enumerate(prefix for handle, prefix in myrpki.csv_reader("prefixes.csv", columns = 2)):
v = 6 if ":" in prefix else 4
print "IPv%d.%d = %s" % (v, i, prefix)
diff --git a/myrpki.rototill/arin-to-csv.py b/myrpki.rototill/arin-to-csv.py
index 5b4caae1..55e5762a 100644
--- a/myrpki.rototill/arin-to-csv.py
+++ b/myrpki.rototill/arin-to-csv.py
@@ -94,15 +94,11 @@ class main(object):
assert sep, "Couldn't find separator in %r" % line
return tag.strip(), val.strip()
- @staticmethod
- def csvout(fn):
- return csv.writer(open(fn, "w"), dialect = myrpki.csv_dialect)
-
def __init__(self):
- self.asns = self.csvout("asns.csv")
- self.prefixes = self.csvout("prefixes.csv")
+ self.asns = myrpki.csv_writer("asns.csv")
+ self.prefixes = myrpki.csv_writer("prefixes.csv")
try:
- self.translations = dict((src, dst) for src, dst in myrpki.csv_open("translations.csv"))
+ self.translations = dict((src, dst) for src, dst in myrpki.csv_reader("translations.csv", columns = 2))
except IOError:
pass
f = gzip.open("arin_db.txt.gz")
diff --git a/myrpki.rototill/convert-from-csv-to-entitydb.py b/myrpki.rototill/convert-from-csv-to-entitydb.py
index 92c85180..282d2e75 100644
--- a/myrpki.rototill/convert-from-csv-to-entitydb.py
+++ b/myrpki.rototill/convert-from-csv-to-entitydb.py
@@ -165,7 +165,7 @@ for d in map(entitydb, ("children", "parents", "repositories", "pubclients")):
one_year_from_now = str(rpki.sundial.now() + rpki.sundial.timedelta(days = 365))
if os.path.exists(children_csv):
- for child_handle, valid_until, child_resource_pemfile in myrpki.csv_open(children_csv):
+ for child_handle, valid_until, child_resource_pemfile in myrpki.csv_reader(children_csv, columns = 3):
try:
e = Element("parent",
@@ -182,7 +182,7 @@ if os.path.exists(children_csv):
pass
if os.path.exists(parents_csv):
- for parent_handle, parent_service_uri, parent_cms_pemfile, parent_https_pemfile, parent_myhandle, parent_sia_base in myrpki.csv_open(parents_csv):
+ for parent_handle, parent_service_uri, parent_cms_pemfile, parent_https_pemfile, parent_myhandle, parent_sia_base in myrpki.csv_reader(parents_csv, columns = 6):
try:
e = Element("parent",
@@ -213,7 +213,7 @@ if os.path.exists(parents_csv):
pass
if os.path.exists(pubclients_csv):
- for client_handle, client_resource_pemfile, client_sia_base in myrpki.csv_open(pubclients_csv):
+ for client_handle, client_resource_pemfile, client_sia_base in myrpki.csv_reader(pubclients_csv, columns = 3):
try:
parent_handle = client_handle.split("/")[-2] if "/" in client_handle else handle
diff --git a/myrpki.rototill/myrpki.py b/myrpki.rototill/myrpki.py
index 1a45370f..a618577d 100644
--- a/myrpki.rototill/myrpki.py
+++ b/myrpki.rototill/myrpki.py
@@ -71,13 +71,6 @@ namespace = "http://www.hactrn.net/uris/rpki/myrpki/"
version = "2"
namespaceQName = "{" + namespace + "}"
-# Dialect for our use of CSV files, here to make it easy to change if
-# your site needs to do something different. See doc for the csv
-# module in the Python standard libraries for details if you need to
-# customize this.
-
-csv_dialect = csv.get_dialect("excel-tab")
-
# Whether to include incomplete entries when rendering to XML.
allow_incomplete = False
@@ -180,7 +173,7 @@ class roa_requests(dict):
"""
self = cls()
# format: p/n-m asn group
- for pnm, asn, group in csv_open(roa_csv_file):
+ for pnm, asn, group in csv_reader(roa_csv_file, columns = 3):
self.add(asn = asn, group = group, prefix = pnm)
return self
@@ -283,10 +276,10 @@ class children(dict):
validity = c.get("valid_until"),
bpki_certificate = fxcert(c.findtext("bpki_child_ta")))
# childname p/n
- for handle, pn in csv_open(prefix_csv_file):
+ for handle, pn in csv_reader(prefix_csv_file, columns = 2):
self.add(handle = handle, prefix = pn)
# childname asn
- for handle, asn in csv_open(asn_csv_file):
+ for handle, asn in csv_reader(asn_csv_file, columns = 2):
self.add(handle = handle, asn = asn)
return self
@@ -478,13 +471,55 @@ class repositories(dict):
bpki_certificate = fxcert(r.findtext("bpki_server_ta")))
return self
-def csv_open(filename):
+class csv_reader(object):
"""
- Open a CSV file, with settings that make it a tab-delimited file.
- You may need to tweak this function for your environment, see the
- csv module in the Python standard libraries for details.
+ Reader for tab-delimited text that's (slightly) friendlier than the
+ stock Python csv module (which isn't intended for direct use by
+ humans anyway, and neither was this package originally, but that
+ seems to be the way that it has evolved...).
+
+ Columns parameter specifies how many columns users of the reader
+ expect to see; lines with fewer columns will be padded with None
+ values.
+
+ Original API design for this class courtesy of Warren Kumari, but
+ don't blame him if you don't like what I did with his ideas.
"""
- return csv.reader(open(filename, "rb"), dialect = csv_dialect)
+
+ def __init__(self, filename, columns = None, min_columns = None, comment_characters = "#;"):
+ assert columns is None or isinstance(columns, int)
+ assert min_columns is None or isinstance(min_columns, int)
+ if columns is not None and min_columns is None:
+ min_columns = columns
+ self.filename = filename
+ self.columns = columns
+ self.min_columns = min_columns
+ self.comment_characters = comment_characters
+ self.file = open(filename, "r")
+
+ def __iter__(self):
+ line_number = 0
+ for line in self.file:
+ line_number += 1
+ line = line.strip()
+ if not line or line[0] in self.comment_characters:
+ continue
+ fields = line.split()
+ if self.min_columns is not None and len(fields) < self.min_columns:
+ raise RuntimeError, "%s:%d: Not enough columns in line %r" % (self.filename, line_number, line)
+ if self.columns is not None and len(fields) > self.columns:
+ raise RuntimeError, "%s:%d: Too many columns in line %r" % (self.filename, line_number, line)
+ if self.columns is not None and len(fields) < self.columns:
+ fields += tuple(None for i in xrange(self.columns - len(fields)))
+ yield fields
+
+def csv_writer(filename):
+ """
+ Writer object for tab delimited text. We just use the stock CSV
+ module in excel-tab mode for this.
+ """
+ return csv.writer(open(filename, "w"), dialect = csv.get_dialect("excel-tab"))
+
def PEMElement(e, tag, filename, **kwargs):
"""
diff --git a/myrpki.rototill/ripe-asns-to-csv.py b/myrpki.rototill/ripe-asns-to-csv.py
index 01c0f82a..04a92627 100644
--- a/myrpki.rototill/ripe-asns-to-csv.py
+++ b/myrpki.rototill/ripe-asns-to-csv.py
@@ -70,9 +70,6 @@ class main(object):
types = dict((x.want_tags[0], x) for x in (aut_num,))
- @staticmethod
- def csvout(fn):
- return csv.writer(open(fn, "w"), dialect = myrpki.csv_dialect)
def finish_statement(self, done):
if self.statement:
@@ -91,7 +88,7 @@ class main(object):
filenames = ("ripe.db.aut-num.gz",)
def __init__(self):
- self.asns = self.csvout("asns.csv")
+ self.asns = myrpki.csv_writer("asns.csv")
for fn in self.filenames:
f = gzip.open(fn)
self.statement = ""
diff --git a/myrpki.rototill/yamltest.py b/myrpki.rototill/yamltest.py
index 1e34abb5..360f6ad7 100644
--- a/myrpki.rototill/yamltest.py
+++ b/myrpki.rototill/yamltest.py
@@ -293,7 +293,7 @@ class allocation(object):
"""
path = self.path(fn)
print "Writing", path
- return csv.writer(open(path, "w"), dialect = myrpki.csv_dialect)
+ return myrpki.csv_writer(path)
def up_down_url(self):
"""