chiark / gitweb /
make-secnet-sites: Crash if complain() is called too late
[secnet.git] / make-secnet-sites
index e344886782a2a7f68be67914c7798d71c37250e0..ab125ffaed3f7de5e44c136266efdf8eef6753c1 100755 (executable)
@@ -60,6 +60,7 @@ import sys
 import os
 import getopt
 import re
+import argparse
 
 import ipaddress
 
@@ -79,24 +80,30 @@ if version_info.major == 2:  # for python2
     import io
     open=lambda f,m='r': io.open(f,m,encoding='utf-8')
 
-# Are we being invoked from userv?
-service=0
-# If we are, which group does the caller want to modify?
-group=None
-
-if len(sys.argv)<2:
-       inputfile=None
-       of=sys.stdout
-else:
-       if sys.argv[1]=='-u':
-               if len(sys.argv)!=6:
+def parse_args():
+       global service
+       global inputfile
+       global header
+       global groupfiledir
+       global sitesfile
+       global group
+       global user
+       global of
+
+       ap = argparse.ArgumentParser(description='process secnet sites files')
+       ap.add_argument('--userv', '-u', action='store_true',
+                       help='userv service fragment update mode')
+       ap.add_argument('--prefix', '-P', nargs=1,
+                       help='set prefix')
+       ap.add_argument('arg',nargs=argparse.REMAINDER)
+       av = ap.parse_args()
+       #print(repr(av), file=sys.stderr)
+       service = 1 if av.userv else 0
+       if service:
+               if len(av.arg)!=4:
                        print("Wrong number of arguments")
                        sys.exit(1)
-               service=1
-               header=sys.argv[2]
-               groupfiledir=sys.argv[3]
-               sitesfile=sys.argv[4]
-               group=sys.argv[5]
+               (header, groupfiledir, sitesfile, group) = av.arg
                if "USERV_USER" not in os.environ:
                        print("Environment variable USERV_USER not found")
                        sys.exit(1)
@@ -113,16 +120,14 @@ else:
                        print("caller not in group %s"%group)
                        sys.exit(1)
        else:
-               if sys.argv[1]=='-P':
-                       prefix=sys.argv[2]
-                       sys.argv[1:3]=[]
-               if len(sys.argv)>3:
+               if len(av.arg)>3:
                        print("Too many arguments")
                        sys.exit(1)
-               inputfile=sys.argv[1]
-               of=sys.stdout
-               if len(sys.argv)>2:
-                       of=open(sys.argv[2],'w')
+               (inputfile, outputfile) = (av.arg + [None]*2)[0:2]
+               if outputfile is None: of=sys.stdout
+               else: of=open(sys.argv[2],'w')
+
+parse_args()
 
 # Classes describing possible datatypes in the configuration file
 
@@ -172,7 +177,8 @@ class dhgroup (basetype):
 class hash (basetype):
        "A choice of hash function"
        def __init__(self,w):
-               self.ht=w[1]
+               hname=w[1]
+               self.ht=hname
                if (self.ht!='md5' and self.ht!='sha1'):
                        complain("unknown hash type %s"%(self.ht))
        def __str__(self):
@@ -400,10 +406,11 @@ prefix=''
 
 def set_property(obj,w):
        "Set a property on a configuration node"
-       if w[0] in obj.properties:
-               obj.properties[w[0]].add(obj,w)
+       prop=w[0]
+       if prop in obj.properties:
+               obj.properties[prop].add(obj,w)
        else:
-               obj.properties[w[0]]=keywords[w[0]][0](w)
+               obj.properties[prop]=keywords[prop][0](w)
 
 def pline(i,allow_include=False):
        "Process a configuration file line"
@@ -437,9 +444,10 @@ def pline(i,allow_include=False):
                # See if it's a new one (and whether that's permitted)
                # or an existing one
                current=obstack[len(obstack)-1]
-               if w[1] in current.children:
+               tname=w[1]
+               if tname in current.children:
                        # Not new
-                       current=current.children[w[1]]
+                       current=current.children[tname]
                        if service and group and current.depth==2:
                                if group!=current.group:
                                        complain("Incorrect group!")
@@ -452,7 +460,7 @@ def pline(i,allow_include=False):
                                        "level %d"%nl.depth)
                                # we risk crashing if we continue
                                sys.exit(1)
-                       current.children[w[1]]=nl
+                       current.children[tname]=nl
                        current=nl
                obstack.append(current)
                return [i]
@@ -577,6 +585,7 @@ if complaints>0:
        if complaints==1: print("There was 1 problem.")
        else: print("There were %d problems."%(complaints))
        sys.exit(1)
+complaints=None # arranges to crash if we complain later
 
 if service:
        # Put the user's input into their group file, and rebuild the main