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
+import socket
+from traceback import print_tb
GREETING = 'UCC SNACKS'
PIN_LENGTH = 4
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:
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()
- 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_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:
- 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')
return rfh, wfh
-if __name__ == '__main__':
- from ConfigParser import ConfigParser
+def parse_args():
from optparse import OptionParser
op = OptionParser(usage="%prog [OPTION]...")
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:
- rfh, wfh = connect_to_vend(options, DBServer, DBName, DBUser, DBPassword, ServiceName, ServicePassword)
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:
+ print
print "Connection died, trying again..."