chiark / gitweb /
rename "password" to "secret" everywhere
[hippotat.git] / hippotatlib / __init__.py
index a4e7b693404f8f58e4365b1fa63cc670320191d3..282266c009651b004ec940f7b79aac2b84f5c3c7 100644 (file)
@@ -126,7 +126,7 @@ class LogNotBoringTwisted:
 #---------- default config ----------
 
 defcfg = '''
-[DEFAULT]
+[COMMON]
 max_batch_down = 65536
 max_queue_time = 10
 target_requests_outstanding = 3
@@ -157,7 +157,7 @@ vvnetwork = 172.24.230.192
 
 
 # [<client-ip4-or-ipv6-address>]
-# password = <password>    # used by both, must match
+# secret = <secret>    # used by both, must match
 
 [LIMIT]
 max_batch_down = 262144
@@ -386,11 +386,21 @@ def _cfg_process_putatives():
   server_pat = r'[-.0-9A-Za-z]+'
   client_pat = r'[.:0-9a-f]+'
   server_re = regexp.compile(server_pat)
-  serverclient_re = regexp.compile(server_pat + r' ' + client_pat)
+  serverclient_re = regexp.compile(
+        server_pat + r' ' + '(?:' + client_pat + '|LIMIT)')
 
   for cs in cfg.sections():
-    if cs == 'LIMIT':
-      # plan A "[LIMIT]"
+    def dbg(m):
+      log_debug_config('putatives: section [%s] %s' % (cs, m))
+
+    def log_ignore(why):
+      dbg('X ignore: %s' % (why))
+      print('warning: ignoring config section [%s] (%s)' % (cs, why),
+            file=sys.stderr)
+
+    if cs == 'LIMIT' or cs == 'COMMON':
+      # plan A "[LIMIT]" or "[COMMON]"
+      dbg('A ignore')
       continue
 
     try:
@@ -400,6 +410,7 @@ def _cfg_process_putatives():
 
       if server_re.fullmatch(cs):
         # plan C "[<servername>]"
+        dbg('C <server>')
         putative(servers, cs, cs)
         continue
 
@@ -409,32 +420,37 @@ def _cfg_process_putatives():
 
         if pcs == 'LIMIT':
           # plan E "[<servername> LIMIT]"
+          dbg('E <server> LIMIT')
           continue
 
         try:
           # plan D "[<servername> <client>]" part 2
-          ci = ipaddr(pc)
+          ci = ipaddr(pcs)
         except AddressValueError:
-          # plan F "[<some thing we do not understand>]"
-          # well, we ignore this
-          print('warning: ignoring config section %s' % cs, file=sys.stderr)
+          # plan F branch 1 "[<some thing we do not understand>]"
+          log_ignore('bad-addr')
           continue
 
         else: # no AddressValueError
-          # plan D "[<servername> <client]" part 3
+          # plan D "[<servername> <client>]" part 3
+          dbg('D <server> <client>')
           putative(clients, ci, pcs)
           putative(servers, pss, pss)
           continue
+      else:
+        # plan F branch 2 "[<some thing we do not understand>]"
+        log_ignore('nomatch '+ repr(serverclient_re))
 
     else: # no AddressValueError
       # plan B "[<client>" part 2
+      dbg('B <client>')
       putative(clients, ci, cs)
       continue
 
   return (servers, clients)
 
 def cfg_process_general(c, ss):
-  c.mtu = cfg.getint(ss, 'mtu')
+  c.mtu = cfg1getint(ss, 'mtu')
 
 def cfg_process_saddrs(c, ss):
   class ServerAddr():
@@ -460,20 +476,20 @@ def cfg_process_saddrs(c, ss):
     def __repr__(self):
       return 'ServerAddr'+repr((self.port,self.addr))
 
-  c.port = cfg.getint(ss,'port')
+  c.port = cfg1getint(ss,'port')
   c.saddrs = [ ]
-  for addrspec in cfg.get(ss, 'addrs').split():
+  for addrspec in cfg1get(ss, 'addrs').split():
     sa = ServerAddr(c.port, addrspec)
     c.saddrs.append(sa)
 
 def cfg_process_vnetwork(c, ss):
-  c.vnetwork = ipnetwork(cfg.get(ss,'vnetwork'))
+  c.vnetwork = ipnetwork(cfg1get(ss,'vnetwork'))
   if c.vnetwork.num_addresses < 3 + 2:
     raise ValueError('vnetwork needs at least 2^3 addresses')
 
 def cfg_process_vaddr(c, ss):
   try:
-    c.vaddr = cfg.get(ss,'vaddr')
+    c.vaddr = cfg1get(ss,'vaddr')
   except NoOptionError:
     cfg_process_vnetwork(c, ss)
     c.vaddr = next(c.vnetwork.hosts())
@@ -484,29 +500,40 @@ def cfg_search_section(key,sections):
       return section
   raise NoOptionError(key, repr(sections))
 
+def cfg_get_raw(*args, **kwargs):
+  # for passing to cfg_search
+  return cfg.get(*args, raw=True, **kwargs)
+
 def cfg_search(getter,key,sections):
   section = cfg_search_section(key,sections)
   return getter(section, key)
 
+def cfg1get(section,key, getter=cfg.get,**kwargs):
+  section = cfg_search_section(key,[section,'COMMON'])
+  return getter(section,key,**kwargs)
+
+def cfg1getint(section,key, **kwargs):
+  return cfg1get(section,key, getter=cfg.getint,**kwargs);
+
 def cfg_process_client_limited(cc,ss,sections,key):
-  val = cfg_search(cfg.getint, key, sections)
-  lim = cfg_search(cfg.getint, key, ['%s LIMIT' % ss, 'LIMIT'])
+  val = cfg_search(cfg1getint, key, sections)
+  lim = cfg_search(cfg1getint, key, ['%s LIMIT' % ss, 'LIMIT'])
   cc.__dict__[key] = min(val,lim)
 
 def cfg_process_client_common(cc,ss,cs,ci):
-  # returns sections to search in, iff password is defined, otherwise None
+  # returns sections to search in, iff secret is defined, otherwise None
   cc.ci = ci
 
   sections = ['%s %s' % (ss,cs),
               cs,
               ss,
-              'DEFAULT']
+              'COMMON']
 
-  try: pwsection = cfg_search_section('password', sections)
+  try: pwsection = cfg_search_section('secret', sections)
   except NoOptionError: return None
     
-  pw = cfg.get(pwsection, 'password')
-  cc.password = pw.encode('utf-8')
+  pw = cfg1get(pwsection, 'secret')
+  cc.secret = pw.encode('utf-8')
 
   cfg_process_client_limited(cc,ss,sections,'target_requests_outstanding')
   cfg_process_client_limited(cc,ss,sections,'http_timeout')
@@ -522,7 +549,7 @@ def cfg_process_ipif(c, sections, varmap):
   #print('CFGIPIF',repr((varmap, sections, c.__dict__)),file=sys.stderr)
 
   section = cfg_search_section('ipif', sections)
-  c.ipif_command = cfg.get(section,'ipif', vars=c.__dict__)
+  c.ipif_command = cfg1get(section,'ipif', vars=c.__dict__)
 
 #---------- startup ----------
 
@@ -580,7 +607,7 @@ def common_startup(process_cfg):
 
   def read_defconfig():
     readconfig('/etc/hippotat/config.d', False)
-    readconfig('/etc/hippotat/passwords.d', False)
+    readconfig('/etc/hippotat/secrets.d', False)
     readconfig('/etc/hippotat/master.cfg',   False)
 
   def oc_defconfig(od,os, value, op):