chiark / gitweb /
make-secnet-sites: Provide --output-version option
[secnet.git] / make-secnet-sites
index 1dee0b3cf8ba7b40dce7c899c9ce55c9f10bfb2e..a51b53d992e22943960463575a03dd42a1b1a44c 100755 (executable)
@@ -70,11 +70,14 @@ import ipaddress
 sys.path.insert(1,"/usr/local/share/secnet")
 sys.path.insert(1,"/usr/share/secnet")
 import ipaddrset
+import base91
 
 from argparseactionnoyes import ActionNoYes
 
 VERSION="0.1.18"
 
+max_version = 1
+
 from sys import version_info
 if version_info.major == 2:  # for python2
     import codecs
@@ -89,6 +92,12 @@ def debugrepr(*args):
        if debug_level > 0:
                print(repr(args), file=sys.stderr)
 
+def base91s_encode(bindata):
+       return base91.encode(bindata).replace('"',"-")
+
+def base91s_decode(string):
+       return base91.decode(string.replace("-",'"'))
+
 class Tainted:
        def __init__(self,s,tline=None,tfile=None):
                self._s=s
@@ -120,7 +129,9 @@ class Tainted:
                if maxlen is None: maxlen=max[what]
                self._max_ok(what,maxlen)
                if self._ok is False: return False
-               if bad.search(self._s): return self._bad(what,'bad syntax')
+               if bad.search(self._s):
+                       #print(repr(self), file=sys.stderr)
+                       return self._bad(what,'bad syntax')
                return True
 
        def _rtnval(self, is_ok, ifgood, ifbad=''):
@@ -234,6 +245,7 @@ def parse_args():
        global prefix
        global key_prefix
        global debug_level
+       global output_version
 
        ap = argparse.ArgumentParser(description='process secnet sites files')
        ap.add_argument('--userv', '-u', action='store_true',
@@ -241,6 +253,9 @@ def parse_args():
        ap.add_argument('--conf-key-prefix', action=ActionNoYes,
                        default=True,
                 help='prefix conf file key names derived from sites data')
+       ap.add_argument('--output-version', nargs=1, type=int,
+                       help='sites file output version',
+                       default=[max_version])
        ap.add_argument('--prefix', '-P', nargs=1,
                        help='set prefix')
        ap.add_argument('--debug', '-D', action='count', default=0)
@@ -251,6 +266,7 @@ def parse_args():
        service = 1 if av.userv else 0
        prefix = '' if av.prefix is None else av.prefix[0]
        key_prefix = av.conf_key_prefix
+       output_version = av.output_version[0]
        if service:
                if len(av.arg)!=4:
                        print("Wrong number of arguments")
@@ -587,8 +603,15 @@ def set_property(obj,w):
        else:
                obj.properties[propname]=kw[0](w)
 
+class FilterState:
+       def __init__(self):
+               self.reset()
+       def reset(self):
+               # called when we enter a new node,
+               # in particular, at the start of each site
+               pass
 
-def pline(il,allow_include=False):
+def pline(il,filterstate,allow_include=False):
        "Process a configuration file line"
        global allow_defs, obstack, root
        w=il.rstrip('\n').split()
@@ -596,9 +619,9 @@ def pline(il,allow_include=False):
        w=list([Tainted(x) for x in w])
        keyword=w[0]
        current=obstack[len(obstack)-1]
-       copyout=lambda: ['    '*len(obstack) +
-                       ' '.join([ww.output() for ww in w]) +
-                       '\n']
+       copyout_core=lambda: ' '.join([ww.output() for ww in w])
+       indent='    '*len(obstack)
+       copyout=lambda: [indent + copyout_core() + '\n']
        if keyword=='end-definitions':
                keyword.raw_mark_ok()
                allow_defs=sitelevel.depth
@@ -645,6 +668,7 @@ def pline(il,allow_include=False):
                                sys.exit(1)
                        current.children[tname]=nl
                        current=nl
+               filterstate.reset()
                obstack.append(current)
                return copyout()
        if keyword.raw() not in current.allow_properties:
@@ -672,10 +696,11 @@ def pfile(name,lines,allow_include=False):
        file=name
        line=0
        outlines=[]
+       filterstate = FilterState()
        for i in lines:
                line=line+1
                if (i[0]=='#'): continue
-               outlines += pline(i,allow_include=allow_include)
+               outlines += pline(i,filterstate,allow_include=allow_include)
        return outlines
 
 def outputsites(w):