From: Cameron Patrick Date: Sat, 31 Jul 2004 09:39:34 +0000 (+0000) Subject: clean up code a little, in preparation for automatically rebooting DEC server when... X-Git-Url: https://git.ucc.asn.au/?a=commitdiff_plain;h=753f7f6d9b81b406cdb9b5d48fbbf2005fead1a7;p=zanchey%2Fdispense2.git clean up code a little, in preparation for automatically rebooting DEC server when it dies --- diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 6d79b51..19a7e67 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -9,7 +9,6 @@ from time import time, sleep from popen2 import popen2 from LATClient import LATClient from VendingMachine import VendingMachine -from ConfigParser import ConfigParser from HorizScroll import HorizScroll from random import random, seed from Idler import TrainIdler,GrayIdler @@ -196,27 +195,7 @@ class MessageKeeper: def done(self): return len(self.scrolling_message) == 0 -if __name__ == '__main__': - cp = ConfigParser() - cp.read('/etc/dispense/servers.conf') - 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') - # Open vending machine via LAT - if 0: - 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(('localhost', 5150)) - rfh = sock.makefile('r') - wfh = sock.makefile('w') +def run_forever(rfh, wfh): v = VendingMachine(rfh, wfh) print 'PING is', v.ping() @@ -381,3 +360,42 @@ if __name__ == '__main__': sleep(0.5) cur_selection = '' time_to_autologout = time() + 8 + +if __name__ == '__main__': + from ConfigParser import ConfigParser + from optparse import OptionParser + + op = OptionParser(usage="%prog [OPTION]...") + 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() + + if len(args) != 0: + op.error('extra command line arguments: ' + ' '.join(args)) + + cp = ConfigParser() + cp.read('/etc/dispense/servers.conf') + 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') + + + +# # 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) diff --git a/sql-edition/servers/VendingMachine.py b/sql-edition/servers/VendingMachine.py index edc593c..9fe5245 100644 --- a/sql-edition/servers/VendingMachine.py +++ b/sql-edition/servers/VendingMachine.py @@ -12,6 +12,8 @@ DOOR = 1 SWITCH = 2 KEY = 3 +class VendingException(Exception): pass + class VendingMachine: def __init__(self, rfh, wfh): self.events = [] @@ -27,7 +29,7 @@ class VendingMachine: self.wfh.write('PING\n') code = '' while code != '000': - (code, _) = self.get_response() + code = self.get_response()[0] self.get_switches() def await_prompt(self): @@ -36,8 +38,12 @@ class VendingMachine: prefix = '' s = '' while True: - s = self.rfh.read(1) - if s == '': raise Exception('nothing read!') + try: + s = self.rfh.read(1) + except socket.error: + print "Blah, seems DEC server has fallen over" + raise VendingException('failed to read input from vending machine') + if s == '': raise VendingException('nothing read!') if s == '\n' or s == '\r': state = 1 prefix = ''