From a124ccf1f0c2b0a9d7e5f6ac856fa3b8afd16a92 Mon Sep 17 00:00:00 2001 From: seba Date: Sun, 30 Oct 2011 02:56:45 +0100 Subject: [PATCH] Cleanup, qrnet updates --- tunnel/ircvpn/conf.py | 20 +----- tunnel/ircvpn/ircvpn.py | 2 +- tunnel/qrnet/conf.py | 22 ++++++ tunnel/qrnet/qrconf.py | 19 ------ tunnel/qrnet/qrnet.py | 145 ++++++++++++++++++++++++---------------- 5 files changed, 112 insertions(+), 96 deletions(-) create mode 100755 tunnel/qrnet/conf.py delete mode 100755 tunnel/qrnet/qrconf.py diff --git a/tunnel/ircvpn/conf.py b/tunnel/ircvpn/conf.py index 53a9a58..87d85fb 100644 --- a/tunnel/ircvpn/conf.py +++ b/tunnel/ircvpn/conf.py @@ -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: + # %s will be replaces with the device name 'postConnectCmd': '/sbin/dhclient -v %s', } diff --git a/tunnel/ircvpn/ircvpn.py b/tunnel/ircvpn/ircvpn.py index 7fc9031..fa7a363 100755 --- a/tunnel/ircvpn/ircvpn.py +++ b/tunnel/ircvpn/ircvpn.py @@ -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 diff --git a/tunnel/qrnet/conf.py b/tunnel/qrnet/conf.py new file mode 100755 index 0000000..053c8c3 --- /dev/null +++ b/tunnel/qrnet/conf.py @@ -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 (value needed for opencv) + 'camnum': 0, + + # drop outgoing packets if more than X are in the queue + 'packetDrop': 20, +} + diff --git a/tunnel/qrnet/qrconf.py b/tunnel/qrnet/qrconf.py deleted file mode 100755 index 9e14ef3..0000000 --- a/tunnel/qrnet/qrconf.py +++ /dev/null @@ -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 - diff --git a/tunnel/qrnet/qrnet.py b/tunnel/qrnet/qrnet.py index 171c82d..8b022d8 100755 --- a/tunnel/qrnet/qrnet.py +++ b/tunnel/qrnet/qrnet.py @@ -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(" 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(" 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(" 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