X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=hippotat.git;a=blobdiff_plain;f=hippotatlib%2F__init__.py;h=0f59f0dc625389e5b64171bde4b195fae0dcdd66;hp=9c2ebfd869f459fd4721b13d1e36b40dc494e51e;hb=343c8cf482d0a5a7fbd34be06d0d190e36c982e4;hpb=c57e18a772353fb3fed92072d5753fb00fe8f4ef diff --git a/hippotatlib/__init__.py b/hippotatlib/__init__.py index 9c2ebfd..0f59f0d 100644 --- a/hippotatlib/__init__.py +++ b/hippotatlib/__init__.py @@ -110,7 +110,8 @@ def logevent_is_boringtwisted(event): if dflag is None and DBG.TWISTED in debug_set: return False return True except Exception: - print(traceback.format_exc(), file=org_stderr) + print('EXCEPTION (IN BORINGTWISTED CHECK)', + traceback.format_exc(), file=org_stderr) return False @implementer(twisted.logger.ILogFilterPredicate) @@ -125,7 +126,7 @@ class LogNotBoringTwisted: #---------- default config ---------- defcfg = ''' -[DEFAULT] +[COMMON] max_batch_down = 65536 max_queue_time = 10 target_requests_outstanding = 3 @@ -385,11 +386,20 @@ 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]" + log_debug_config('putatives: section [%s]...' % (cs)) + + def log_ignore(why): + log_debug_config('putatives: section [%s] X ignore: %s' % (cs, why)) + print('warning: ignoring config section [%s] (%s)' % (cs, why), + file=sys.stderr) + + if cs == 'LIMIT' or cs == 'COMMON': + # plan A "[LIMIT]" or "[COMMON]" + log_debug_config('putatives: section [%s] A ignore' % (cs)) continue try: @@ -399,6 +409,7 @@ def _cfg_process_putatives(): if server_re.fullmatch(cs): # plan C "[]" + log_debug_config('putatives: section [%s] C ' % (cs)) putative(servers, cs, cs) continue @@ -408,32 +419,38 @@ def _cfg_process_putatives(): if pcs == 'LIMIT': # plan E "[ LIMIT]" + log_debug_config('putatives: section [%s] E LIMIT' % (cs)) continue try: # plan D "[ ]" part 2 - ci = ipaddr(pc) + ci = ipaddr(pcs) except AddressValueError: - # plan F "[]" - # well, we ignore this - print('warning: ignoring config section %s' % cs, file=sys.stderr) + # plan F branch 1 "[]" + log_ignore('bad-addr') continue else: # no AddressValueError - # plan D "[ ]" part 3 + log_debug_config('putatives: section [%s] D ' + % (cs)) putative(clients, ci, pcs) putative(servers, pss, pss) continue + else: + # plan F branch 2 "[]" + log_ignore('nomatch '+ repr(serverclient_re)) else: # no AddressValueError # plan B "[" part 2 + log_debug_config('putatives: section [%s] B ' % (cs)) putative(clients, ci, cs) continue return (servers, clients) -def cfg_process_common(c, ss): - c.mtu = cfg.getint(ss, 'mtu') +def cfg_process_general(c, ss): + c.mtu = cfg1getint(ss, 'mtu') def cfg_process_saddrs(c, ss): class ServerAddr(): @@ -459,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()) @@ -483,13 +500,24 @@ 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): @@ -499,12 +527,12 @@ def cfg_process_client_common(cc,ss,cs,ci): sections = ['%s %s' % (ss,cs), cs, ss, - 'DEFAULT'] + 'COMMON'] try: pwsection = cfg_search_section('password', sections) except NoOptionError: return None - pw = cfg.get(pwsection, 'password') + pw = cfg1get(pwsection, 'password') cc.password = pw.encode('utf-8') cfg_process_client_limited(cc,ss,sections,'target_requests_outstanding') @@ -521,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 ---------- @@ -540,7 +568,7 @@ def common_startup(process_cfg): def readconfig(pathname, mandatory=True): def log(m, p=pathname): if not DBG.CONFIG in debug_set: return - log_debug_config('%s: %s' % (m, pathname)) + log_debug_config('%s: %s' % (m, p)) try: files = os.listdir(pathname)