tidy up exception handling code
[zanchey/dispense2.git] / sql-edition / servers / VendServer.py
index 19a7e67..ad972ca 100755 (executable)
@@ -7,11 +7,13 @@ import sys, os, string, re, pwd
 if USE_DB: import pg
 from time import time, sleep
 from popen2 import popen2
 if USE_DB: import pg
 from time import time, sleep
 from popen2 import popen2
-from LATClient import LATClient
-from VendingMachine import VendingMachine
+from LATClient import LATClient, LATClientException
+from VendingMachine import VendingMachine, VendingException
 from HorizScroll import HorizScroll
 from random import random, seed
 from Idler import TrainIdler,GrayIdler
 from HorizScroll import HorizScroll
 from random import random, seed
 from Idler import TrainIdler,GrayIdler
+import socket
+from traceback import print_tb
 
 GREETING = 'UCC SNACKS'
 PIN_LENGTH = 4
 
 GREETING = 'UCC SNACKS'
 PIN_LENGTH = 4
@@ -109,7 +111,7 @@ def verify_user_pin(uid, pin):
        else:
                return None
 
        else:
                return None
 
-def door_open_mode(vending_machine):
+def door_open_mode(v):
        print "Entering open door mode"
        v.display("-FEED  ME-")
        while True:
        print "Entering open door mode"
        v.display("-FEED  ME-")
        while True:
@@ -361,21 +363,38 @@ def run_forever(rfh, wfh):
                                        cur_selection = ''
                                        time_to_autologout = time() + 8
 
                                        cur_selection = ''
                                        time_to_autologout = time() + 8
 
+# FIXME: a less ugly way of passing all these options would be nice
+def connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName, ServicePassword, ServerName, ConnectPassword, PrivPassword):
+       # Open vending machine via LAT
+       if options.use_lat:
+               latclient = LATClient(service = ServiceName, password = ServicePassword, server_name = ServerName, connect_password = ConnectPassword, priv_password = PrivPassword)
+               rfh, wfh = latclient.get_fh()
+       else:
+               #(rfh, wfh) = popen2('../../virtualvend/vvend.py')
+               import socket
+               sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
+               sock.connect((options.host, options.port))
+               rfh = sock.makefile('r')
+               wfh = sock.makefile('w')
+               
+       return rfh, wfh
+
 if __name__ == '__main__':
        from ConfigParser import ConfigParser
        from optparse import OptionParser
 
        op = OptionParser(usage="%prog [OPTION]...")
 if __name__ == '__main__':
        from ConfigParser import ConfigParser
        from optparse import OptionParser
 
        op = OptionParser(usage="%prog [OPTION]...")
+       op.add_option('-f', '--config-file', default='/etc/dispense/servers.conf', metavar='FILE', dest='config_file', help='use the specified config file instead of /etc/dispense/servers.conf')
        op.add_option('-v', '--virtualvend', action='store_false', default=True, dest='use_lat', help='use the virtual vending server instead of LAT')
        op.add_option('-n', '--hostname', dest='host', default='localhost', help='the hostname to connect to for virtual vending machine mode (default: localhost)')
        op.add_option('-p', '--port', dest='port', default=5150, type='int', help='the port number to connect to (default: 5150)')
        op.add_option('-v', '--virtualvend', action='store_false', default=True, dest='use_lat', help='use the virtual vending server instead of LAT')
        op.add_option('-n', '--hostname', dest='host', default='localhost', help='the hostname to connect to for virtual vending machine mode (default: localhost)')
        op.add_option('-p', '--port', dest='port', default=5150, type='int', help='the port number to connect to (default: 5150)')
-       (options, args) = op.parse_args()
+       options, args = op.parse_args()
 
        if len(args) != 0:
                op.error('extra command line arguments: ' + ' '.join(args))
 
        cp = ConfigParser()
 
        if len(args) != 0:
                op.error('extra command line arguments: ' + ' '.join(args))
 
        cp = ConfigParser()
-       cp.read('/etc/dispense/servers.conf')
+       cp.read(options.config_file)
        DBServer = cp.get('Database', 'Server')
        DBName = cp.get('Database', 'Name')
        DBUser = cp.get('VendingMachine', 'DBUser')
        DBServer = cp.get('Database', 'Server')
        DBName = cp.get('Database', 'Name')
        DBUser = cp.get('VendingMachine', 'DBUser')
@@ -384,18 +403,23 @@ if __name__ == '__main__':
        ServiceName = cp.get('VendingMachine', 'ServiceName')
        ServicePassword = cp.get('VendingMachine', 'Password')
 
        ServiceName = cp.get('VendingMachine', 'ServiceName')
        ServicePassword = cp.get('VendingMachine', 'Password')
 
-       
-       
-#      # Open vending machine via LAT
-       if options.use_lat:
-               latclient = LATClient(service = ServiceName, password = ServicePassword)
-               (rfh, wfh) = latclient.get_fh()
-       else:
-               #(rfh, wfh) = popen2('../../virtualvend/vvend.py')
-               import socket
-               sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
-               sock.connect((options.host, options.port))
-               rfh = sock.makefile('r')
-               wfh = sock.makefile('w')
-       
-       run_forever(rfh, wfh)
+       ServerName = cp.get('DecServer', 'Name')
+       ConnectPassword = cp.get('DecServer', 'ConnectPassword')
+       PrivPassword = cp.get('DecServer', 'PrivPassword')
+
+       while True:
+               try:
+                       rfh, wfh = connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName, ServicePassword, ServerName, ConnectPassword, PrivPassword)
+               except (LATClientException, socket.error):
+                       (exc_type, exc_value, exc_traceback) = sys.exc_info()
+                       print "Connection error ("+str(exc_type)+"):"
+                       print_tb(exc_traceback)
+                       del exc_traceback
+                       print "Trying again in 5 seconds."
+                       sleep(5)
+                       continue
+               try:
+                       run_forever(rfh, wfh)
+               except VendingException:
+                       print "Connection died, trying again..."
+

UCC git Repository :: git.ucc.asn.au