Cleanup, qrnet updates

This commit is contained in:
seba 2011-10-30 02:56:45 +01:00
parent 50faf05cd9
commit a124ccf1f0
5 changed files with 112 additions and 96 deletions

View File

@ -3,21 +3,6 @@
# | ircvpn - irc virtual public network configuration |
# |___________________________________________________|
# config options
# IRC
# - server (ip, port, ssl)
# - channel
# - nick prefix
# - maximum line length
# Network
# - device: ip, netmask, mtu
# - dhclient instead of static ip?
# - routing?
# - dns?
# Tunnel
# - security settings
# - mode (hub or switch)
import os
Conf = {
@ -39,9 +24,6 @@ Conf = {
# ======== IRC settings ========
# irc-server to use
#ircserver = ('irc.someserver.de', 6667)
#ircserver = ('testine.someserver.de', 6667)
#ircserver = ('192.168.56.1', 6667)
'ircserver': ('testine.someserver.de', 6667),
# broadcast domain (where to meet other clients)
@ -78,6 +60,6 @@ Conf = {
# ======== misc settings ========
# executed after being connected to the server
# arguments: <command> <device>
# %s will be replaces with the device name
'postConnectCmd': '/sbin/dhclient -v %s',
}

View File

@ -119,7 +119,7 @@ class IrcVPN(Ether2Any):
partmsg = base64.b64decode(basemsg[:64])
if len(partmsg) < 24:
raise ValueError()
except base64.binascii.Error, ValueError:
except (base64.binascii.Error, ValueError):
self.irclog.warning("Could not decode parted base64 message, discarding")
return
self.packets[msgid] = basemsg

22
tunnel/qrnet/conf.py Executable file
View File

@ -0,0 +1,22 @@
import os
Conf = {
# ======== network settings ========
# ipsettings for the device
'devname': '',
'network':
{
'address': '10.10.10.74',
'netmask': '255.255.255.0',
#gateway: '',
'mtu': 417,
},
# number of video device, mostly /dev/video<num> (value needed for opencv)
'camnum': 0,
# drop outgoing packets if more than X are in the queue
'packetDrop': 20,
}

View File

@ -1,19 +0,0 @@
import os
netmask = "255.255.255.0"
mtu = 417
ip = ""
camnum = 0
packetDrop = 20
if os.popen("hostname", "r").read().strip() in ("navi", ):
ip = "10.44.13.1"
camnum = 0
else:
ip = "10.44.13.2"
camnum = 2
if __name__ == '__main__':
print ip

View File

@ -27,19 +27,21 @@ from conf import Conf
mqueueMutex = threading.Lock()
squeueMutex = threading.Lock()
exqueue = Queue.Queue()
class QrDisplay(gtk.Window):
def __init__(self, mqueue, squeue, displog, timeout=250):
super(QrDisplay, self).__init__()
self.fullscreen()
self.qrimgPadding = 20
(wx, wy) = self.getHackySize()
self.timeout = timeout
self.mqueue = mqueue
self.squeue = squeue
self.displog = displog
self.fullscreen()
self.qrimgPadding = 20
(wx, wy) = self.getHackySize()
# build up gui
self.vbox = gtk.VBox(False, 0)
self.qrimg = gtk.Image()
@ -54,7 +56,7 @@ class QrDisplay(gtk.Window):
self.add(self.vbox)
# connect signals
self.connect("destroy", gtk.main_quit)
self.connect("destroy", self.quitGui)
self.set_size_request(wx, wy)
self.maximize()
self.set_position(gtk.WIN_POS_CENTER)
@ -62,6 +64,9 @@ class QrDisplay(gtk.Window):
self.qrSet("")
gobject.timeout_add(self.timeout, self.checkQueue)
def quitGui(self, *args, **kwargs):
exqueue.put(KeyboardInterrupt())
def checkQueue(self):
#print "Check queue...",
mqueueMutex.acquire()
@ -87,7 +92,7 @@ class QrDisplay(gtk.Window):
def getHackySize(self):
""" Obtain current size of screen via xrandr. """
#p = subprocess.Popen(["bash", "-c", 'xrandr|egrep "\*+"|egrep -o "[0-9]+x[0-9]+"'], stdout=subprocess.PIPE)
p = subprocess.Popen('xrandr|egrep "\*+"|egrep -o "[0-9]+x[0-9]+"', stdout=subprocess.PIPE)
p = subprocess.Popen('xrandr|egrep "\*+"|egrep -o "[0-9]+x[0-9]+"', stdout=subprocess.PIPE, shell=True)
p.wait()
(myout, myin) = p.communicate()
return map(lambda x: int(x)-self.qrimgPadding, myout.strip().split("x"))
@ -124,14 +129,17 @@ class DisplayThread(threading.Thread):
threading.Thread.__init__(self)
self.dev = dev
self.quit = False
self.qrdisplay = QrDisplay(mqueue, squeue, )
self.qrdisplay = QrDisplay(mqueue, squeue, displog)
self.mqueue = mqueue
self.squeue = squeue
self.displog = displog
def run(self):
self.displog.info("Display GTK Gui is up and running.")
gtk.main()
try:
gtk.main()
except Exception, e:
exqueue.push(e)
class CamThread(threading.Thread):
""" Captures images from a webcam and decodes them.
@ -151,55 +159,57 @@ class CamThread(threading.Thread):
self.success = 0
self.lastPacket = ""
self.reader = highgui.cvCreateCameraCapture(camnum)
self.reader = highgui.cvCreateCameraCapture(Conf.get("camnum", 0))
self.scanner = zbar.ImageScanner()
self.scanner.parse_config('enable')
def run(self):
while not self.quit:
frame = highgui.cvQueryFrame(self.reader)
self.frame += 1
frame = opencv.cvGetMat(frame)
img = adaptors.Ipl2PIL(frame)
width, height = img.size
zimg = zbar.Image(width, height, 'Y800', img.convert("L").tostring())
self.scanner.scan(zimg)
data = None
for symbol in zimg:
data = symbol.data
self.camlog.debug("Data is: %s" % data)
self.success += 1
# handle data
if not self.lastPacket == data:
self.lastPacket = data
try:
msg = base64.b64decode(data)
(rawtime, packet) = (msg[0:8], msg[8:])
ptime = struct.unpack("<d", rawtime)
self.camlog.debug("Network packet! Heade (time) is %s" % (ptime,))
self.dev.write(packet)
except base64.binascii.Error:
print " ==> base64 error"
self.camlog.error("Base64 error - could not decode packet")
except struct.error:
self.camlog.error("Header error - could not extract header information")
else:
# packet is already known, discard
pass
try:
while not self.quit:
frame = highgui.cvQueryFrame(self.reader)
self.frame += 1
frame = opencv.cvGetMat(frame)
img = adaptors.Ipl2PIL(frame)
width, height = img.size
zimg = zbar.Image(width, height, 'Y800', img.convert("L").tostring())
self.scanner.scan(zimg)
data = None
for symbol in zimg:
data = symbol.data
self.camlog.debug("Data is: %s" % data)
self.success += 1
# handle data
if not self.lastPacket == data:
self.lastPacket = data
try:
msg = base64.b64decode(data)
(rawtime, packet) = (msg[0:8], msg[8:])
ptime = struct.unpack("<d", rawtime)
self.camlog.debug("Network packet! Heade (time) is %s" % (ptime,))
self.dev.write(packet)
except (base64.binascii.Error, TypeError):
self.camlog.error("Base64 error - could not decode packet")
except struct.error:
self.camlog.error("Header error - could not extract header information")
else:
# packet is already known, discard
pass
# status report to gui
if self.frame % self.reportAfter == 0:
self.frame = self.success = 0
# too much status codes? flush 'em
squeueMutex.acquire()
if self.squeue.qsize() > self.reportAfter/2:
while not self.squeue.empty():
self.squeue.get()
# add new status code
self.squeue.put((self.frame, self.success))
squeueMutex.release()
# status report to gui
if self.frame % self.reportAfter == 0:
self.frame = self.success = 0
squeueMutex.acquire()
if self.squeue.qsize() > self.reportAfter/2:
while not self.squeue.empty():
self.squeue.get()
# add new status code
self.squeue.put((self.frame, self.success))
squeueMutex.release()
except Exception, e:
exqueue.put(e)
raise e
class QrNet(Ether2Any):
@ -208,10 +218,15 @@ class QrNet(Ether2Any):
# device
Ether2Any.__init__(self, tap=True)
self.qrlog = self.setupLogging("QrNet")
self.dev.ifconfig(address=ip, netmask=netmask, mtu=mtu)
self.packetDrop = packetDrop
self.mqueue = Queue.Queue()
self.squeue = Queue.Queue()
self.setTimeout(1)
network = Conf.get("network", {'mtu': 400})
self.packetDrop = Conf.get("packetDrop", 20)
self.dev.ifconfig(**network)
self.dev.up()
# thread starting...
gtk.gdk.threads_init()
@ -221,10 +236,10 @@ class QrNet(Ether2Any):
self.display = DisplayThread(self.dev, self.mqueue, self.squeue, self.setupLogging("DisplayThread"))
self.display.start()
def sendToNet(self):
def sendToNet(self, msg):
# prepare data for queue && display
self.qrlog.debug("Data from the device")
msg = self.dev.read()
# add acttime to generate "unique" images
acttime = struct.pack("<d", time.time())
bmsg = base64.b64encode(acttime + msg)
@ -238,10 +253,26 @@ class QrNet(Ether2Any):
self.qrlog.debug("Dropping packet!")
mqueueMutex.release()
def callAfterSelect(self):
# check queue for excetions
if exqueue.qsize() > 0:
ex = exqueue.get()
raise ex
def quit(self):
self.display.quit = True
self.cam.quit = True
gtk.main_quit()
if __name__ == '__main__':
qrnet = QrNet()
qrnet.run()
try:
qrnet = QrNet()
qrnet.run()
except KeyboardInterrupt:
try:
qrnet.quit()
except NameError:
pass
sys.exit(0)
except Exception, e:
raise e