import twisted
from twisted.internet import reactor
+from twisted.logger import LogLevel
import ipaddress
from ipaddress import AddressValueError
import hippotat.slip as slip
+from optparse import OptionParser
+from configparser import ConfigParser
+from configparser import NoOptionError
+
+import collections
+
+cfg = ConfigParser()
+optparser = OptionParser()
+
#---------- packet parsing ----------
def packet_addrs(packet):
try: (dummy, packet) = self._pq[0]
except IndexError: return None
return packet
+
+#---------- error handling ----------
+
+def crash(err):
+ print('CRASH ', err, file=sys.stderr)
+ try: reactor.stop()
+ except twisted.internet.error.ReactorNotRunning: pass
+
+def crash_on_defer(defer):
+ defer.addErrback(lambda err: crash(err))
+
+def crash_on_critical(event):
+ if event.get('log_level') >= LogLevel.critical:
+ crash(twisted.logger.formatEvent(event))
+
+#---------- startup ----------
+
+def common_startup(defcfg):
+ twisted.logger.globalLogPublisher.addObserver(crash_on_critical)
+
+ optparser.add_option('-c', '--config', dest='configfile',
+ default='/etc/hippotat/config')
+ (opts, args) = optparser.parse_args()
+ if len(args): optparser.error('no non-option arguments please')
+
+ cfg.read_string(defcfg)
+ cfg.read(opts.configfile)
+
+def common_run():
+ reactor.run()
+ print('CRASHED (end)', file=sys.stderr)
import twisted.internet
import twisted.internet.endpoints
from twisted.web.server import NOT_DONE_YET
-from twisted.logger import LogLevel
#import twisted.web.server import Site
#from twisted.web.resource import Resource
-from optparse import OptionParser
-from configparser import ConfigParser
-from configparser import NoOptionError
-
-import collections
-
import syslog
clients = { }
target_requests_outstanding = 10
'''
-#---------- error handling ----------
-
-def crash(err):
- print('CRASH ', err, file=sys.stderr)
- try: reactor.stop()
- except twisted.internet.error.ReactorNotRunning: pass
-
-def crash_on_defer(defer):
- defer.addErrback(lambda err: crash(err))
-
-def crash_on_critical(event):
- if event.get('log_level') >= LogLevel.critical:
- crash(twisted.logger.formatEvent(event))
-
#---------- "router" ----------
def route(packet, saddr, daddr):
ipif_command = cfg.get('server','ipif', vars=iic_vars)
def startup():
- global cfg
-
- op = OptionParser()
- op.add_option('-c', '--config', dest='configfile',
- default='/etc/hippottd/server.conf')
- global opts
- (opts, args) = op.parse_args()
- if len(args): op.error('no non-option arguments please')
-
- twisted.logger.globalLogPublisher.addObserver(crash_on_critical)
-
- cfg = ConfigParser()
- cfg.read_string(defcfg)
- cfg.read(opts.configfile)
+ common_startup(defcfg)
process_cfg()
-
start_ipif(ipif_command, route)
start_http()
startup()
-reactor.run()
-print('CRASHED (end)', file=sys.stderr)
+common_run()
[virtual]
network = 192.0.2.0/24
+
+[192.0.2.3]
+password = sesame
+
+# normally only a client would have the [client] section and
+# only a server the other sections
+
+[client]
+server = http://127.0.0.1:8099/
+password = sesame
+virtual = 192.0.2.3