handle config parser errors more nicely than just throwing up tracebacks
[uccvend-vendserver.git] / sql-edition / servers / VendServer.py
index ff17122..dd9739d 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:
@@ -362,10 +364,10 @@ def run_forever(rfh, wfh):
                                        time_to_autologout = time() + 8
 
 # FIXME: a less ugly way of passing all these options would be nice
                                        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):
+def connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName, ServicePassword, ServerName, ConnectPassword, PrivPassword):
        # Open vending machine via LAT
        if options.use_lat:
        # Open vending machine via LAT
        if options.use_lat:
-               latclient = LATClient(service = ServiceName, password = ServicePassword)
+               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')
                rfh, wfh = latclient.get_fh()
        else:
                #(rfh, wfh) = popen2('../../virtualvend/vvend.py')
@@ -378,7 +380,7 @@ def connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName,
        return rfh, wfh
 
 if __name__ == '__main__':
        return rfh, wfh
 
 if __name__ == '__main__':
-       from ConfigParser import ConfigParser
+       import ConfigParser
        from optparse import OptionParser
 
        op = OptionParser(usage="%prog [OPTION]...")
        from optparse import OptionParser
 
        op = OptionParser(usage="%prog [OPTION]...")
@@ -391,20 +393,39 @@ if __name__ == '__main__':
        if len(args) != 0:
                op.error('extra command line arguments: ' + ' '.join(args))
 
        if len(args) != 0:
                op.error('extra command line arguments: ' + ' '.join(args))
 
-       cp = ConfigParser()
-       cp.read(options.config_file)
-       DBServer = cp.get('Database', 'Server')
-       DBName = cp.get('Database', 'Name')
-       DBUser = cp.get('VendingMachine', 'DBUser')
-       DBPassword = cp.get('VendingMachine', 'DBPassword')
-
-       ServiceName = cp.get('VendingMachine', 'ServiceName')
-       ServicePassword = cp.get('VendingMachine', 'Password')
+       try:
+               cp = ConfigParser.ConfigParser()
+               cp.read(options.config_file)
+               DBServer = cp.get('Database', 'Server')
+               DBName = cp.get('Database', 'Name')
+               DBUser = cp.get('VendingMachine', 'DBUser')
+               DBPassword = cp.get('VendingMachine', 'DBPassword')
+               
+               ServiceName = cp.get('VendingMachine', 'ServiceName')
+               ServicePassword = cp.get('VendingMachine', 'Password')
+               
+               ServerName = cp.get('DecServer', 'Name')
+               ConnectPassword = cp.get('DecServer', 'ConnectPassword')
+               PrivPassword = cp.get('DecServer', 'PrivPassword')
+       except ConfigParser.Error, e:
+               print "Error reading config file: " + str(e)
+               sys.exit(1)
 
        while True:
 
        while True:
-               rfh, wfh = connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName, ServicePassword)
+               try:
+                       rfh, wfh = connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName, ServicePassword, ServerName, ConnectPassword, PrivPassword)
+               except (LATClientException, socket.error), e:
+                       (exc_type, exc_value, exc_traceback) = sys.exc_info()
+                       print
+                       print "Connection error: "+str(exc_type)+" "+str(e)
+                       print_tb(exc_traceback)
+                       del exc_traceback
+                       print "Trying again in 5 seconds."
+                       sleep(5)
+                       continue
                try:
                        run_forever(rfh, wfh)
                except VendingException:
                try:
                        run_forever(rfh, wfh)
                except VendingException:
+                       print
                        print "Connection died, trying again..."
 
                        print "Connection died, trying again..."
 

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