# -*- python -*-
+#
+# Hippotat - Asinine IP Over HTTP program
+# hippotatlib/__init__.py - common library code
+#
+# Copyright 2017 Ian Jackson
+#
+# GPLv3+
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program, in the file GPLv3. If not,
+# see <http://www.gnu.org/licenses/>.
+
import signal
signal.signal(signal.SIGINT, signal.SIG_DFL)
msg += ' ' + d + trunc
log.info('{dflag} {msgcore}', dflag=dflag, msgcore=msg)
+def logevent_is_boringtwisted(event):
+ try:
+ if event.get('log_level') != LogLevel.info:
+ return False
+ dflag = event.get('dflag')
+ if dflag is False : return False
+ if dflag in debug_set: return False
+ if dflag is None and DBG.TWISTED in debug_set: return False
+ return True
+ except Exception:
+ print(traceback.format_exc(), file=org_stderr)
+ return False
+
@implementer(twisted.logger.ILogFilterPredicate)
class LogNotBoringTwisted:
def __call__(self, event):
- yes = twisted.logger.PredicateResult.yes
- no = twisted.logger.PredicateResult.no
- try:
- if event.get('log_level') != LogLevel.info:
- return yes
- dflag = event.get('dflag')
- if dflag is False : return yes
- if dflag in debug_set: return yes
- if dflag is None and DBG.TWISTED in debug_set: return yes
- return no
- except Exception:
- print(traceback.format_exc(), file=org_stderr)
- return yes
+ return (
+ twisted.logger.PredicateResult.no
+ if logevent_is_boringtwisted(event) else
+ twisted.logger.PredicateResult.yes
+ )
#---------- default config ----------
http_retry = 5
port = 80
vroutes = ''
+ifname_client = hippo%%d
+ifname_server = shippo%%d
#[server] or [<client>] overrides
-ipif = userv root ipif %(local)s,%(peer)s,%(mtu)s,slip %(rnets)s
+ipif = userv root ipif %(local)s,%(peer)s,%(mtu)s,slip,%(ifname)s %(rnets)s
# relating to virtual network
mtu = 1500
-[SERVER]
-server = SERVER
# addrs = 127.0.0.1 ::1
# url
self._endpointfactory = twisted.internet.endpoints.TCP6ServerEndpoint
self._inurl = b'[%s]'
def make_endpoint(self):
- return self._endpointfactory(reactor, self.port, self.addr)
+ return self._endpointfactory(reactor, self.port,
+ interface= '%s' % self.addr)
def url(self):
url = b'http://' + (self._inurl % str(self.addr).encode('ascii'))
if self.port != 80: url += b':%d' % self.port
url += b'/'
return url
+ def __repr__(self):
+ return 'ServerAddr'+repr((self.port,self.addr))
c.port = cfg.getint(ss,'port')
c.saddrs = [ ]
#---------- startup ----------
+def log_debug_config(m):
+ if not DBG.CONFIG in debug_set: return
+ print('DBG.CONFIG:', m)
+
def common_startup(process_cfg):
# calls process_cfg(putative_clients, putative_servers)
def readconfig(pathname, mandatory=True):
def log(m, p=pathname):
if not DBG.CONFIG in debug_set: return
- print('DBG.CONFIG: %s: %s' % (m, pathname))
+ log_debug_config('%s: %s' % (m, pathname))
try:
files = os.listdir(pathname)
# is a directory
log('directory')
re = regexp.compile('[^-A-Za-z0-9_]')
- for f in os.listdir(cdir):
+ for f in os.listdir(pathname):
if re.search(f): continue
subpath = pathname + '/' + f
try:
need_defcfg = False
readconfig(value)
+ def oc_extra_config(od,os, value, op):
+ readconfig(value)
+
+ def read_defconfig():
+ readconfig('/etc/hippotat/config.d', False)
+ readconfig('/etc/hippotat/passwords.d', False)
+ readconfig('/etc/hippotat/master.cfg', False)
+
+ def oc_defconfig(od,os, value, op):
+ nonlocal need_defcfg
+ need_defcfg = False
+ read_defconfig(value)
+
def dfs_less_detailed(dl):
return [df for df in DBG.iterconstants() if df <= dl]
def ds_default(od,os,dl,op):
global debug_set
- debug_set = set(dfs_less_detailed(debug_def_detail))
+ debug_set.clear
+ debug_set |= set(dfs_less_detailed(debug_def_detail))
def ds_select(od,os, spec, op):
for it in spec.split(','):
action='callback',
callback= oc_config)
+ optparser.add_option('--extra-config',
+ nargs=1,
+ type='string',
+ metavar='CONFIGFILE',
+ dest='configfile',
+ action='callback',
+ callback= oc_extra_config)
+
+ optparser.add_option('--default-config',
+ action='callback',
+ callback= oc_defconfig)
+
(opts, args) = optparser.parse_args()
if len(args): optparser.error('no non-option arguments please')
if need_defcfg:
- readconfig('/etc/hippotat/config', False)
- readconfig('/etc/hippotat/config.d', False)
+ read_defconfig()
try:
(pss, pcs) = _cfg_process_putatives()
- process_cfg(pss, pcs)
+ process_cfg(opts, pss, pcs)
except (configparser.Error, ValueError):
traceback.print_exc(file=sys.stderr)
print('\nInvalid configuration, giving up.', file=sys.stderr)
sys.exit(12)
- #print(repr(debug_set), file=sys.stderr)
+
+ #print('X', debug_set, file=sys.stderr)
log_formatter = twisted.logger.formatEventAsClassicLogText
stdout_obs = twisted.logger.FileLogObserver(sys.stdout, log_formatter)
stdsomething_obs = twisted.logger.FilteringLogObserver(
stderr_obs, [pred], stdout_obs
)
- log_observer = twisted.logger.FilteringLogObserver(
+ global file_log_observer
+ file_log_observer = twisted.logger.FilteringLogObserver(
stdsomething_obs, [LogNotBoringTwisted()]
)
#log_observer = stdsomething_obs
twisted.logger.globalLogBeginner.beginLoggingTo(
- [ log_observer, crash_on_critical ]
+ [ file_log_observer, crash_on_critical ]
)
def common_run():
log_debug(DBG.INIT, 'entering reactor')
if not _crashing: reactor.run()
- print('CRASHED (end)', file=sys.stderr)
+ print('ENDED', file=sys.stderr)
+ sys.exit(16)