refactor config file parsing a bit
[uccvend-vendserver.git] / sql-edition / servers / VendServer.py
index ff17122..2133f37 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:
@@ -195,11 +197,11 @@ class MessageKeeper:
        def done(self):
                return len(self.scrolling_message) == 0
 
        def done(self):
                return len(self.scrolling_message) == 0
 
-def run_forever(rfh, wfh):
+def run_forever(rfh, wfh, options, cf):
        v = VendingMachine(rfh, wfh)
        print 'PING is', v.ping()
 
        v = VendingMachine(rfh, wfh)
        print 'PING is', v.ping()
 
-       if USE_DB: db = DispenseDatabase(v, DBServer, DBName, DBUser, DBPassword)
+       if USE_DB: db = DispenseDatabase(v, cf.DBServer, cf.DBName, cf.DBUser, cf.DBPassword)
        cur_user = ''
        cur_pin = ''
        cur_selection = ''
        cur_user = ''
        cur_pin = ''
        cur_selection = ''
@@ -361,11 +363,10 @@ 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):
-       # Open vending machine via LAT
+def connect_to_vend(options, cf):
+       # Open vending machine via LAT?
        if options.use_lat:
        if options.use_lat:
-               latclient = LATClient(service = ServiceName, password = ServicePassword)
+               latclient = LATClient(service = cf.ServiceName, password = cf.ServicePassword, server_name = cf.ServerName, connect_password = cf.ConnectPassword, priv_password = cf.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')
@@ -377,8 +378,7 @@ def connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName,
                
        return rfh, wfh
 
                
        return rfh, wfh
 
-if __name__ == '__main__':
-       from ConfigParser import ConfigParser
+def parse_args():
        from optparse import OptionParser
 
        op = OptionParser(usage="%prog [OPTION]...")
        from optparse import OptionParser
 
        op = OptionParser(usage="%prog [OPTION]...")
@@ -391,20 +391,59 @@ 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')
+       return options
+
+config_options = {
+       'DBServer': ('Database', 'Server'),
+       'DBName': ('Database', 'Name'),
+       'DBUser': ('VendingMachine', 'DBUser'),
+       'DBPassword': ('VendingMachine', 'DBPassword'),
+       
+       'ServiceName': ('VendingMachine', 'ServiceName'),
+       'ServicePassword': ('VendingMachine', 'Password'),
+       
+       'ServerName': ('DecServer', 'Name'),
+       'ConnectPassword': ('DecServer', 'ConnectPassword'),
+       'PrivPassword': ('DecServer', 'PrivPassword'),
+       }
+
+class VendConfigFile:
+       def __init__(self, config_file, options):
+               try:
+                       cp = ConfigParser.ConfigParser()
+                       cp.read(config_file)
+
+                       for option in options:
+                               section, name = options[option]
+                               value = cp.get(section, name)
+                               self.__dict__[option] = value
+               
+               except ConfigParser.Error, e:
+                       print "Error reading config file "+config_file+": " + str(e)
+                       sys.exit(1)
+
+
+if __name__ == '__main__':
+       import ConfigParser
 
 
-       ServiceName = cp.get('VendingMachine', 'ServiceName')
-       ServicePassword = cp.get('VendingMachine', 'Password')
+       options = parse_args()
+       config_opts = VendConfigFile(options.config_file, config_options)
 
        while True:
 
        while True:
-               rfh, wfh = connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName, ServicePassword)
                try:
                try:
-                       run_forever(rfh, wfh)
+                       rfh, wfh = connect_to_vend(options, config_opts)
+               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, options, config_opts)
                except VendingException:
                except VendingException:
+                       print
                        print "Connection died, trying again..."
 
                        print "Connection died, trying again..."
 

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