Mercurial > hg > freeDiameter
annotate contrib/tools/csv_to_fd @ 1461:a86eb3375b95
add csv_to_fd, org_to_csv tools
csv_to_fd converts CSV files containing RADIUS or Diameter AVP tables
into various formats, including freeDiameter C code and JSON documents.
org_to_csv converts org files into CSV files, suitable for csv_to_fd.
author | Luke Mewburn <luke@mewburn.net> |
---|---|
date | Mon, 09 Mar 2020 21:24:24 +1100 |
parents | |
children | 8f6c77f24b1a |
rev | line source |
---|---|
1461
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
1 #!/usr/bin/env python |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
2 # vim: set fileencoding=utf-8 : |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
3 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
4 """ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
5 Convert CSV files containing RADIUS or Diameter AVP tables |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
6 into various formats. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
7 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
8 Format of the CSV files is one of: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
9 - Row per 3GPP AVP tables: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
10 Name, Code, Section, DataType, Must, May, ShouldNot, MustNot [, ...] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
11 - Name: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
12 AVP Name. String, validated as ALPHA *(ALPHA / DIGIT / "-") |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
13 - Code: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
14 AVP Code. Integer, 0..4294967295. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
15 - Section: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
16 Section in relevant standard. String. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
17 - DataType: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
18 AVP Data Type. String, validated per Per RFC 6733 ?? 4.2 and ?? 4.3. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
19 - Must, May, ShouldNot, MustNot: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
20 Flags, possibly comma or space separated: M, V |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
21 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
22 - Comment row. First cell: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
23 # Comment text Comment text |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
24 #= Header row of ==== |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
25 # Blank line |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
26 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
27 - Parameter row: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
28 @Parameter,Value [, ...] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
29 Supported Parameter terms: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
30 standard Standard name. E.g. '3GPP TS 29.272', 'RFC 6733'. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
31 vendor Vendor number. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
32 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
33 """ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
34 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
35 from __future__ import print_function |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
36 from __future__ import with_statement |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
37 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
38 import abc |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
39 import csv |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
40 import collections |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
41 import json |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
42 import re |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
43 import optparse |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
44 import sys |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
45 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
46 CSV_COLUMN_NAMES = [ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
47 'name', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
48 'code', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
49 'section', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
50 'datatype', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
51 'must', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
52 'may', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
53 'shouldnot', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
54 'mustnot', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
55 'encrypt', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
56 ] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
57 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
58 VENDOR_TO_NAME = { |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
59 0: '', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
60 193: 'Ericsson', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
61 8164: 'Starent', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
62 10415: '3GPP', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
63 } |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
64 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
65 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
66 class Avp(object): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
67 """Store an AVP row.""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
68 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
69 # Regex to validate avp-name per RFC 6733 ?? 3.2, |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
70 # with changes: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
71 # - Allow avp-name to start with numbers (for 3GPP) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
72 # - Allow '.' in avp-name, for existing dict_dcca_3gpp usage. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
73 # TODO: if starts with digit, ensure contains a letter somewhere? |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
74 _name_re = re.compile(r'^[a-zA-Z0-9][a-zA-Z0-9-\.]*$') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
75 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
76 __slots__ = CSV_COLUMN_NAMES + [ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
77 'filename', 'linenum', 'standard', 'vendor', ] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
78 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
79 def __init__(self, name, code, section, datatype, |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
80 must, may, shouldnot, mustnot, encrypt, |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
81 filename=None, linenum=0, standard=None, vendor=0): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
82 # Members from CSV row |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
83 self.name = name |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
84 self.code = int(code) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
85 self.section = section |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
86 self.datatype = datatype |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
87 self.must = must |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
88 self.may = may |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
89 self.shouldnot = shouldnot |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
90 self.mustnot = mustnot |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
91 self.encrypt = encrypt |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
92 # Members from file state |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
93 self.filename = filename |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
94 self.linenum = linenum |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
95 self.standard = standard |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
96 self.vendor = vendor |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
97 # Validate CSV fields |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
98 if not self._name_re.match(self.name): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
99 raise ValueError('Invalid AVP name "{}"'.format(self.name)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
100 if (self.code < 0 or self.code > 4294967295): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
101 raise ValueError('Invalid AVP code {}'.format(self.code)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
102 if self.datatype not in ( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
103 'OctetString', 'Integer32', 'Integer64', 'Unsigned32', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
104 'Unsigned64', 'Float32', 'Float64', 'Grouped', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
105 'Address', 'Time', 'UTF8String', 'DiameterIdentity', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
106 'DiameterURI', 'Enumerated', 'IPFilterRule', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
107 ): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
108 raise ValueError('Invalid AVP data type "{}"'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
109 self.datatype)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
110 # TODO: validate must, may, shouldnot, mustnot |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
111 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
112 @property |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
113 def __dict__(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
114 return {s: getattr(self, s) for s in self.__slots__} |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
115 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
116 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
117 class Processor(object): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
118 """Interface for processor of Avp""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
119 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
120 __metaclass__ = abc.ABCMeta |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
121 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
122 @classmethod |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
123 def cls_name(cls): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
124 """Return the name, lower-case, without "processor" suffix.""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
125 suffix = 'processor' |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
126 name = cls.__name__.lower() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
127 if name.endswith(suffix): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
128 return name[:-len(suffix)] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
129 return name |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
130 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
131 @classmethod |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
132 def cls_desc(cls): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
133 """Return the first line of the docstring.""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
134 if cls.__doc__ is None: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
135 return "" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
136 return cls.__doc__.split('\n')[0] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
137 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
138 @abc.abstractmethod |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
139 def next_file(self, filename): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
140 """Called when a file is opened.""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
141 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
142 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
143 @abc.abstractmethod |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
144 def avp(self, avp): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
145 """Process a validated Avp.""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
146 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
147 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
148 @abc.abstractmethod |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
149 def comment(self, comment, filename, linenum): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
150 """Process a comment row: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
151 #comment, |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
152 """ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
153 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
154 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
155 @abc.abstractmethod |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
156 def generate(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
157 """Invoked after all rows processed.""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
158 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
159 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
160 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
161 class DebugProcessor(Processor): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
162 """Display the CSV parsing""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
163 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
164 def next_file(self, filename): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
165 print('File: {}'.format(filename)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
166 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
167 def avp(self, avp): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
168 avpdict = vars(avp) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
169 print('AVP: {name}, {code}, {datatype}'.format(**avpdict)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
170 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
171 def comment(self, comment, filename, linenum): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
172 print('Comment: {}'.format(comment)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
173 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
174 def generate(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
175 print('Generate') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
176 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
177 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
178 class NoopProcessor(Processor): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
179 """Validate the CSV; no other output""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
180 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
181 def next_file(self, filename): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
182 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
183 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
184 def avp(self, avp): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
185 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
186 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
187 def comment(self, comment, filename, linenum): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
188 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
189 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
190 def generate(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
191 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
192 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
193 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
194 class FdcProcessor(Processor): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
195 """Generate freeDiameter C code |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
196 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
197 Comment cells are parsed as: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
198 # text comment /* text comment */ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
199 #= /*==============*/ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
200 # [blank line] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
201 """ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
202 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
203 COMMENT_WIDTH = 64 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
204 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
205 DERIVED_TO_BASE = { |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
206 'Address': 'OctetString', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
207 'Time': 'OctetString', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
208 'UTF8String': 'OctetString', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
209 'DiameterIdentity': 'OctetString', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
210 'DiameterURI': 'OctetString', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
211 'Enumerated': 'Integer32', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
212 'IPFilterRule': 'OctetString', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
213 } |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
214 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
215 def __init__(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
216 self.lines = [] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
217 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
218 def next_file(self, filename): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
219 print('/* CSV file: {} */'.format(filename)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
220 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
221 def avp(self, avp): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
222 comment = '{name}, {datatype}, code {code}'.format(**vars(avp)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
223 if '' != avp.section: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
224 comment += ', section {}'.format(avp.section) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
225 self.add_comment(comment) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
226 self.add('\t{') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
227 self.add('\t\tstruct dict_avp_data data = {') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
228 # TODO: remove comments? |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
229 self.add('\t\t\t{},\t/* Code */'.format(avp.code)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
230 self.add('\t\t\t{},\t/* Vendor */'.format(avp.vendor)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
231 self.add('\t\t\t\"{}\",\t/* Name */'.format(avp.name)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
232 self.add('\t\t\t{},\t/* Fixed flags */'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
233 self.build_flags(', '.join([avp.must, avp.mustnot])))) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
234 self.add('\t\t\t{},\t/* Fixed flag values */'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
235 self.build_flags(avp.must))) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
236 # TODO: add trailing comma? |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
237 self.add('\t\t\tAVP_TYPE_{}\t/* base type of data */'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
238 self.DERIVED_TO_BASE.get( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
239 avp.datatype, avp.datatype).upper())) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
240 self.add('\t\t};') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
241 avp_type = 'NULL' |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
242 if 'Enumerated' == avp.datatype: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
243 self.add('\t\tstruct dict_object\t*type;') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
244 vendor_prefix = '' |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
245 if avp.vendor != 0: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
246 vendor_prefix = '{}/'.format(VENDOR_TO_NAME[avp.vendor]) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
247 self.add( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
248 '\t\tstruct dict_type_data\t tdata = {{ AVP_TYPE_INTEGER32, ' |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
249 '"Enumerated({prefix}{name})", NULL, NULL, NULL }};'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
250 prefix=vendor_prefix, name=avp.name)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
251 # XXX: add enumerated values |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
252 self.add('\t\tCHECK_dict_new(DICT_TYPE, &tdata, NULL, &type);') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
253 avp_type = "type" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
254 elif avp.datatype in self.DERIVED_TO_BASE: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
255 avp_type = '{}_type'.format(avp.datatype) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
256 self.add('\t\tCHECK_dict_new(DICT_AVP, &data, {}, NULL);'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
257 avp_type)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
258 # TODO: remove ; on scope brace |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
259 self.add('\t};') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
260 self.add('') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
261 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
262 def comment(self, comment, filename, linenum): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
263 if '' == comment: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
264 self.add('') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
265 elif '=' == comment: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
266 self.add_header() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
267 elif comment.startswith(' '): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
268 self.add_comment(comment[1:]) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
269 else: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
270 raise ValueError('Unsupported comment "{}"'.format(comment)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
271 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
272 def generate(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
273 self.print_header() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
274 self.print_comment('Start of generated data.') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
275 self.print_comment('') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
276 self.print_comment('The following is created automatically with:') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
277 self.print_comment(' csv_to_fd -p {}'.format(self.cls_name())) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
278 self.print_comment('Changes will be lost during the next update.') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
279 self.print_comment('Do not modify;' |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
280 ' modify the source .csv file instead.') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
281 self.print_header() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
282 print('') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
283 print('\n'.join(self.lines)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
284 self.print_header() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
285 self.print_comment('End of generated data.') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
286 self.print_header() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
287 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
288 def build_flags(self, flags): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
289 result = [] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
290 if 'V' in flags: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
291 result.append('AVP_FLAG_VENDOR') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
292 if 'M' in flags: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
293 result.append('AVP_FLAG_MANDATORY') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
294 return ' |'.join(result) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
295 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
296 def add(self, line): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
297 self.lines.append(line) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
298 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
299 def add_comment(self, comment): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
300 self.lines.append(self.format_comment(comment)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
301 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
302 def add_header(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
303 self.lines.append(self.format_header()) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
304 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
305 def format_comment(self, comment): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
306 return '\t/* {:<{width}} */'.format(comment, width=self.COMMENT_WIDTH) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
307 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
308 def format_header(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
309 return '\t/*={:=<{width}}=*/'.format('', width=self.COMMENT_WIDTH) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
310 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
311 def print_comment(self, comment): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
312 print(self.format_comment(comment)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
313 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
314 def print_header(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
315 print(self.format_header()) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
316 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
317 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
318 class JsonProcessor(Processor): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
319 """Generate freeDiameter JSON object |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
320 """ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
321 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
322 def __init__(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
323 self.avps = [] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
324 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
325 def next_file(self, filename): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
326 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
327 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
328 def avp(self, avp): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
329 flags = collections.OrderedDict([ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
330 ('Must', self.build_flags(avp.must)), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
331 ('MustNot', self.build_flags(avp.mustnot)), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
332 ]) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
333 row = collections.OrderedDict([ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
334 ('Code', avp.code), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
335 ('Flags', flags), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
336 ('Name', avp.name), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
337 ('Type', avp.datatype), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
338 ('Vendor', avp.vendor), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
339 ]) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
340 self.avps.append(row) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
341 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
342 def comment(self, comment, filename, linenum): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
343 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
344 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
345 def generate(self): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
346 doc = {"AVPs": self.avps} |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
347 print(json.dumps(doc, indent=2)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
348 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
349 def build_flags(self, flags): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
350 result = [] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
351 if 'V' in flags: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
352 result.append('V') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
353 if 'M' in flags: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
354 result.append('M') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
355 return ''.join(result) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
356 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
357 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
358 def main(): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
359 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
360 # Build dict of name: NameProcessor |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
361 processors = { |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
362 cls.cls_name(): cls |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
363 for cls in Processor.__subclasses__() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
364 } |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
365 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
366 # Build Processor name to desc |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
367 processor_help = '\n'.join( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
368 [' {:8} {}'.format(key, processors[key].cls_desc()) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
369 for key in sorted(processors)]) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
370 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
371 # Custom OptionParser with improved help |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
372 class MyParser(optparse.OptionParser): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
373 """Custom OptionParser without epilog formatting.""" |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
374 def format_help(self, formatter=None): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
375 return """\ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
376 {} |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
377 Supported PROCESSOR options: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
378 {} |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
379 """.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
380 optparse.OptionParser.format_help(self, formatter), |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
381 processor_help) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
382 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
383 # Parse options |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
384 parser = MyParser( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
385 description="""\ |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
386 Convert CSV files containing RADIUS or Diameter AVP tables |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
387 into various formats using the specified processor PROCESSOR. |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
388 """) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
389 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
390 parser.add_option( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
391 '-p', '--processor', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
392 default='noop', |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
393 help='AVP processor. One of: {}. [%default]'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
394 ', '.join(processors.keys()))) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
395 (opts, args) = parser.parse_args() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
396 if len(args) < 1: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
397 parser.error('Incorrect number of arguments') |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
398 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
399 # Find processor |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
400 try: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
401 avpproc = processors[opts.processor]() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
402 except KeyError as e: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
403 parser.error('Unknown processor "{}"'.format(opts.processor)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
404 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
405 # dict of [vendor][code] : Avp |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
406 avp_codes = collections.defaultdict(dict) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
407 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
408 # Process files |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
409 for filename in args: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
410 avpproc.next_file(filename) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
411 with open(filename, 'r') as csvfile: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
412 csvdata = csv.DictReader(csvfile, CSV_COLUMN_NAMES) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
413 linenum = 0 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
414 standard = '' |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
415 vendor = 0 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
416 for row in csvdata: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
417 linenum += 1 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
418 try: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
419 if row['name'] in (None, '', 'Attribute Name'): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
420 continue |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
421 elif row['name'].startswith('#'): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
422 comment = row['name'][1:] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
423 avpproc.comment(comment, filename, linenum) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
424 elif row['name'].startswith('@'): |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
425 parameter = row['name'][1:] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
426 value = row['code'] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
427 if False: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
428 pass |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
429 elif 'standard' == parameter: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
430 standard = value |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
431 elif 'vendor' == parameter: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
432 vendor = int(value) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
433 else: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
434 raise ValueError('Unknown parameter "{}"'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
435 parameter)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
436 else: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
437 avp = Avp(filename=filename, linenum=linenum, |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
438 standard=standard, vendor=vendor, |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
439 **row) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
440 # Ensure AVP vendor/code not already defined |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
441 if avp.code in avp_codes[avp.vendor]: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
442 conflict = avp_codes[avp.vendor][avp.code] |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
443 raise ValueError( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
444 'AVP vendor {} code {} already present' |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
445 ' in file "{}" line {}'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
446 avp.vendor, avp.code, |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
447 conflict.filename, conflict.linenum)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
448 avp_codes[avp.vendor][avp.code] = avp |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
449 # Process AVP |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
450 avpproc.avp(avp) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
451 except ValueError as e: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
452 sys.stderr.write('CSV file "{}" line {}: {}: {}\n'.format( |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
453 filename, linenum, e.__class__.__name__, e)) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
454 sys.exit(1) |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
455 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
456 # Generate result |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
457 avpproc.generate() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
458 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
459 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
460 if '__main__' == __name__: |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
461 main() |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
462 |
a86eb3375b95
add csv_to_fd, org_to_csv tools
Luke Mewburn <luke@mewburn.net>
parents:
diff
changeset
|
463 # vim: set et sw=4 sts=4 : |