From 8bf3b178db0d2a8f3b8dcdfa02b6f8ca80cfad56 Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:15:18 +0000 Subject: [PATCH 01/16] tweak log priorities --- sql-edition/servers/VendServer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index a09ac2a..0f1daec 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -531,13 +531,13 @@ if __name__ == '__main__': options, config_opts = set_stuff_up() while True: try: - logging.info('Starting Vend Server') + logging.warning('Starting Vend Server') do_vend_server(options, config_opts) - logging.warning('Vend Server finished unexpectedly, restarting') + logging.error('Vend Server finished unexpectedly, restarting') except KeyboardInterrupt: logging.info("Killed by signal, cleaning up") clean_up_nicely(options, config_opts) - logging.info("Vend Server stopped") + logging.warning("Vend Server stopped") break except: (exc_type, exc_value, exc_traceback) = sys.exc_info() -- 2.20.1 From 7c61f2e7d593f845697c84ba52f7dc58045c78c6 Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:21:00 +0000 Subject: [PATCH 02/16] death to stderr and print statements! --- sql-edition/servers/LATClient.py | 39 ++++++++++++++++++--------- sql-edition/servers/VendingMachine.py | 5 ++-- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/sql-edition/servers/LATClient.py b/sql-edition/servers/LATClient.py index ce77970..4d17643 100644 --- a/sql-edition/servers/LATClient.py +++ b/sql-edition/servers/LATClient.py @@ -2,6 +2,7 @@ from socket import * from select import select from os import popen4 from time import sleep +import logging LATCP_SOCKET = '/var/run/latlogin' @@ -26,14 +27,14 @@ def read_for_a_bit(rfh): message = message + ch else: break - print "Received message: ", repr(message) + logging.debug("Received message: ", repr(message)) return message def write_and_get_response(rfh, wfh, message, expect_echo=True): - print "Writing message:", repr(message) + logging.debug("Writing message:", repr(message)) wfh.write(message+'\r\n') wfh.flush() - print " --> Sent" + logging.debug(" --> Sent") response = read_for_a_bit(rfh) if response.find(message) == -1 and expect_echo: raise LATClientException("Talking to DEC server, expected to find original message in echo but didn't") @@ -80,7 +81,7 @@ class LATClient: if r: l = self.rfh.readline() if l.find('Service in use') >= 0: - print "Service in use, apparently: restarting DEC server" + logging.warning("Service in use, apparently: restarting DEC server") self.reboot_server() def __del__(self): @@ -97,35 +98,47 @@ class LATClient: def reboot_server(self): self.sock.shutdown(2) self.sock.close() + + logging.info('Logging into DEC server') mopw, mopr = popen4('/usr/sbin/moprc '+self.server_name) write_and_get_response(mopr, mopw, '') + + logging.info('Sending password') r = write_and_get_response(mopr, mopw, self.connect_password, False) if r.find('Enter username> ') == -1: - print "Expected username prompt, got ", repr(r) + logging.warning("Expected username prompt, got " + repr(r)) raise LATClientException('failed to reboot server') + + logging.info('Sending username') r = write_and_get_response(mopr, mopw, 'grim reaper') if r.find('Local> ') == -1: - print "Expected DEC server prompt, got ", repr(r) + logging.warning("Expected DEC server prompt, got " + repr(r)) raise LATClientException('failed to reboot server') + + logging.info('Requesting privileges') r = write_and_get_response(mopr, mopw, 'set priv') if r.find('Password> ') == -1: - print "Expected priv password prompt, got ", repr(r) + logging.warning("Expected priv password prompt, got " + repr(r)) raise LATClientException('failed to reboot server') + + logging.info('Sending password') r = write_and_get_response(mopr, mopw, self.priv_password, False) if r.find('Local> ') == -1: - print "Expected DEC server prompt, got ", repr(r) + logging.warning("Expected DEC server prompt, got " + repr(r)) raise LATClientException('failed to reboot server') + + logging.info('Sending reboot request') r = write_and_get_response(mopr, mopw, 'init del 0') if r.find('Target does not respond') == -1: - print "Expected DEC server to die, got ", repr(r) + logging.warning("Expected DEC server to die, got " + repr(r)) raise LATClientException('failed to reboot server') + + logging.info('Closed connection to server') mopr.close() mopw.close() - print - print "Waiting 10 seconds for DEC server to come back to life..." + logging.info("Waiting 10 seconds for DEC server to come back to life...") sleep(10) - print "Rightyo, back to vending!" - print + logging.info("Rightyo, back to vending!") raise LATClientException('needed to reboot server') def read_reply(self): diff --git a/sql-edition/servers/VendingMachine.py b/sql-edition/servers/VendingMachine.py index 9506daf..4a40922 100644 --- a/sql-edition/servers/VendingMachine.py +++ b/sql-edition/servers/VendingMachine.py @@ -2,7 +2,7 @@ import re from CRC import do_crc from select import select -import socket +import socket, logging asynchronous_responses = [ '400', '401', # door open/closed '610', # switches changed @@ -42,7 +42,6 @@ class VendingMachine: 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': @@ -97,7 +96,7 @@ class VendingMachine: elif code[0] == '2': self.events.append((KEY, int(code[1:3]))) else: - sys.stderr.write('WARNING: Unhandled event! (%s %s)\n'%(code,text)) + logging.warning('Unhandled event! (%s %s)\n'%(code,text)) def authed_message(self, message): if self.challenge == None: -- 2.20.1 From 3332a98fa5f734d3319d17d4b772148400ce6700 Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:23:43 +0000 Subject: [PATCH 03/16] fix up stupid debug message --- sql-edition/servers/VendServer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 0f1daec..31365f9 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -204,7 +204,7 @@ class MessageKeeper: def run_forever(rfh, wfh, options, cf): v = VendingMachine(rfh, wfh) - logging.debug('PING is', v.ping()) + logging.debug('PING is' + str(v.ping())) if USE_DB: db = DispenseDatabase(v, cf.DBServer, cf.DBName, cf.DBUser, cf.DBPassword) cur_user = '' -- 2.20.1 From 121e87fe81b7cc07c327b5562d97aac577c82c08 Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:24:01 +0000 Subject: [PATCH 04/16] whitespace fix --- sql-edition/servers/VendServer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 31365f9..94fbeb0 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -204,7 +204,7 @@ class MessageKeeper: def run_forever(rfh, wfh, options, cf): v = VendingMachine(rfh, wfh) - logging.debug('PING is' + str(v.ping())) + logging.debug('PING is ' + str(v.ping())) if USE_DB: db = DispenseDatabase(v, cf.DBServer, cf.DBName, cf.DBUser, cf.DBPassword) cur_user = '' -- 2.20.1 From 1ee12bb474a7f55a68920fbfab5f79c148248721 Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:35:39 +0000 Subject: [PATCH 05/16] more logging, yay --- sql-edition/servers/VendServer.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 94fbeb0..30fac43 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -86,22 +86,27 @@ def get_pin(uid): try: info = pwd.getpwuid(uid) except KeyError: + logging.info('getting pin for uid %d: user not in password file'%uid) return None if info.pw_dir == None: return False pinfile = os.path.join(info.pw_dir, '.pin') try: s = os.stat(pinfile) except OSError: + logging.info('getting pin for uid %d: .pin not found in home directory'%uid) return None if s.st_mode & 077: + logging.info('getting pin for uid %d: .pin has wrong permissions'%uid) return None try: f = file(pinfile) except IOError: + logging.info('getting pin for uid %d: I cannot read pin file'%uid) return None pinstr = f.readline() f.close() if not re.search('^'+'[0-9]'*PIN_LENGTH+'$', pinstr): + logging.info('getting pin for uid %d: %s not a good pin'%(uid,repr(pinstr))) return None return int(pinstr) @@ -111,8 +116,10 @@ def has_good_pin(uid): def verify_user_pin(uid, pin): if get_pin(uid) == pin: info = pwd.getpwuid(uid) + logging.info('accepted pin for uid %d (%s)'%(uid,info.pw_name)) return info.pw_name else: + logging.info('refused pin for uid %d'%(uid)) return None def door_open_mode(v): @@ -283,6 +290,7 @@ def run_forever(rfh, wfh, options, cf): if len(cur_user) == 5: uid = int(cur_user) if not has_good_pin(uid): + logging.info('user '+cur_user+' has a bad PIN') #mk.set_messages( #[(center('INVALID'), False, 0.7), #(center('PIN'), False, 0.7), @@ -296,6 +304,7 @@ def run_forever(rfh, wfh, options, cf): continue cur_pin = '' mk.set_message('PIN: ') + logging.info('need pin for user %s'%cur_user) continue elif len(cur_pin) < PIN_LENGTH: if key == 11: @@ -348,13 +357,16 @@ def run_forever(rfh, wfh, options, cf): # XXX this should move somewhere else: if cur_selection == '55': mk.set_message('OPENSESAME') + logging.info('dispensing a door for %s'%username) if geteuid() == 0: ret = os.system('su - "%s" -c "dispense door"'%username) else: ret = os.system('dispense door') if ret == 0: + logging.info('door opened') mk.set_message(center('DOOR OPEN')) else: + logging.warning('user %s tried to dispense a bad door'%username) mk.set_message(center('BAD DOOR')) sleep(1) elif cur_selection == '91': @@ -378,10 +390,12 @@ def run_forever(rfh, wfh, options, cf): def connect_to_vend(options, cf): # Open vending machine via LAT? if options.use_lat: + logging.info('Connecting to vending machine using LAT') 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') + logging.info('Connecting to virtual vending machine on %s:%d'%(options.host,options.port)) import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) sock.connect((options.host, options.port)) -- 2.20.1 From d715598199720bbe016561366fd7e933449a1348 Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:38:47 +0000 Subject: [PATCH 06/16] make syslog logging facility an option --- sql-edition/servers/VendServer.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 30fac43..b272eba 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -413,7 +413,7 @@ def parse_args(): 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('-l', '--log-file', metavar='FILE', dest='log_file', default='', help='log output to the specified file') - op.add_option('-s', '--syslog', dest='syslog', action='store_true', default=False, help='log output to syslog') + op.add_option('-s', '--syslog', dest='syslog', metavar='FACILITY', default=None, help='log output to given syslog facility') op.add_option('-d', '--daemon', dest='daemon', action='store_true', default=False, help='run as a daemon') op.add_option('-v', '--verbose', dest='verbose', action='store_true', default=False, help='spit out lots of debug output') op.add_option('-q', '--quiet', dest='quiet', action='store_true', default=False, help='only report errors') @@ -501,8 +501,8 @@ def set_up_logging(options): except IOError, e: logger.warning('unable to write to log file '+options.log_file+': '+str(e)) - if options.syslog: - sys_logger = logging.handlers.SysLogHandler('/dev/log', 'daemon') + if options.syslog != None: + sys_logger = logging.handlers.SysLogHandler('/dev/log', options.syslog) sys_logger.setFormatter(logging.Formatter('vendserver[%d]'%(os.getpid()) + ' %(levelname)s: %(message)s')) logger.addHandler(sys_logger) -- 2.20.1 From b52f37832bb59523d63967cad0e381300b02879d Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:57:17 +0000 Subject: [PATCH 07/16] fix some logging bugs --- sql-edition/servers/VendServer.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index b272eba..02d5f9b 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -451,9 +451,7 @@ class VendConfigFile: self.__dict__[option] = value except ConfigParser.Error, e: - logging.critical("Error reading config file "+config_file+": " + str(e)) - logging.critical("Bailing out") - sys.exit(1) + raise SystemExit("Error reading config file "+config_file+": " + str(e)) def create_pid_file(name): try: @@ -472,9 +470,9 @@ def set_stuff_up(): signal.signal(signal.SIGINT, stop_server) options = parse_args() - set_up_logging(options) config_opts = VendConfigFile(options.config_file, config_options) if options.daemon: become_daemon() + set_up_logging(options) if options.pid_file != '': create_pid_file(options.pid_file) return options, config_opts @@ -489,9 +487,10 @@ def clean_up_nicely(options, config_opts): def set_up_logging(options): logger = logging.getLogger() - stderr_logger = logging.StreamHandler(sys.stderr) - stderr_logger.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) - logger.addHandler(stderr_logger) + if not options.daemon: + stderr_logger = logging.StreamHandler(sys.stderr) + stderr_logger.setFormatter(logging.Formatter('%(levelname)s: %(message)s')) + logger.addHandler(stderr_logger) if options.log_file != '': try: @@ -519,8 +518,15 @@ def become_daemon(): os.dup2(fd, 0) os.dup2(fd, 1) os.dup2(fd, 2) - if os.fork() != 0: - sys.exit(0) + logging.debug('about to fork') + try: + if os.fork() != 0: + logging.debug('in parent process: dying') + sys.exit(0) + logging.debug('back from fork') + os.setsid() + except OSError, e: + logging.critical('failed to fork: '+e) def do_vend_server(options, config_opts): while True: -- 2.20.1 From 28e0903fea49a38a15d0b1d390c92d2879990238 Mon Sep 17 00:00:00 2001 From: Cameron Patrick Date: Sun, 1 Aug 2004 08:59:27 +0000 Subject: [PATCH 08/16] really fix it --- sql-edition/servers/VendServer.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 02d5f9b..f7bd1cd 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -518,15 +518,12 @@ def become_daemon(): os.dup2(fd, 0) os.dup2(fd, 1) os.dup2(fd, 2) - logging.debug('about to fork') try: if os.fork() != 0: - logging.debug('in parent process: dying') sys.exit(0) - logging.debug('back from fork') os.setsid() except OSError, e: - logging.critical('failed to fork: '+e) + raise SystemExit('failed to fork: '+str(e)) def do_vend_server(options, config_opts): while True: -- 2.20.1 From c945258a9f4c89bf8f19108ed0ee2f477d5a9493 Mon Sep 17 00:00:00 2001 From: Bernard Blackham Date: Mon, 2 Aug 2004 09:36:27 +0000 Subject: [PATCH 09/16] Added random idler choice. --- sql-edition/servers/Idler.py | 11 ++++++++-- sql-edition/servers/VendServer.py | 36 +++++++++++++++++++++++++------ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index ecf3e36..4efb56f 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -9,6 +9,9 @@ class Idler: def next(self): pass + def reset(self): + pass + class TrainIdler(Idler): def __init__(self, v): self.idle_state = 0 @@ -68,6 +71,9 @@ class TrainIdler(Idler): self.idle_state += 1 self.idle_state %= 18*36*54 + def reset(self): + self.idle_state = 0 + class GrayIdler(Idler): def __init__(self, v, one=None, zero=None): self.bits = 8 @@ -129,5 +135,6 @@ class GrayIdler(Idler): return bin - - + def reset(self): + self.i = 0 + self.grayCode = 0 diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index f7bd1cd..bed5366 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -209,6 +209,28 @@ class MessageKeeper: def done(self): return len(self.scrolling_message) == 0 +idlers = [] +idler = None +def setup_idlers(v): + global idlers, idler + idlers = [ + TrainIdler(v), + GrayIdler(v), + GrayIdler(v,one="*",zero="-"), + GrayIdler(v,one="/",zero="\\"), + GrayIdler(v,one="X",zero="O"), + ] + idler = choose_idler() + +def choose_idler(): + global idler + idler = idlers[int(random()*len(idlers))] + idler.reset() + +def idle_step(): + global idler + idler.next() + def run_forever(rfh, wfh, options, cf): v = VendingMachine(rfh, wfh) logging.debug('PING is ' + str(v.ping())) @@ -221,9 +243,7 @@ def run_forever(rfh, wfh, options, cf): mk = MessageKeeper(v) mk.set_message(GREETING) time_to_autologout = None - #idler = TrainIdler(v) - #idler = GrayIdler(v) - idler = GrayIdler(v,one="*",zero="-") + setup_idlers(v) time_to_idle = None last_timeout_refresh = None @@ -254,15 +274,17 @@ def run_forever(rfh, wfh, options, cf): # start autologout time_to_autologout = time() + 15 - if time_to_idle == None and cur_user == '': time_to_idle = time() + 60 + if time_to_idle == None and cur_user == '': + time_to_idle = time() + 2 + choose_idler() if time_to_idle != None and cur_user != '': time_to_idle = None - if time_to_idle is not None and time() > time_to_idle: idler.next() + if time_to_idle is not None and time() > time_to_idle: idle_step() mk.update_display() e = v.next_event(0) if e == None: - e = v.next_event(0.1) + e = v.next_event(0.05) if e == None: continue time_to_idle = None @@ -556,6 +578,8 @@ if __name__ == '__main__': clean_up_nicely(options, config_opts) logging.warning("Vend Server stopped") break + except SystemExit: + break except: (exc_type, exc_value, exc_traceback) = sys.exc_info() tb = format_tb(exc_traceback, 20) -- 2.20.1 From fe057d5b30168e9918d17a239c8bfdd5bffcd46d Mon Sep 17 00:00:00 2001 From: Bernard Blackham Date: Mon, 2 Aug 2004 10:19:38 +0000 Subject: [PATCH 10/16] Randomise gray code. --- sql-edition/servers/Idler.py | 43 ++++++++++++++++++++++++++++++- sql-edition/servers/VendServer.py | 8 +++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index 4efb56f..555630f 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -1,6 +1,9 @@ #!/usr/bin/env python import string +from random import random + +orderings = None class Idler: def __init__(self, v): @@ -74,8 +77,34 @@ class TrainIdler(Idler): def reset(self): self.idle_state = 0 +class OrderMaker: + def __init__(self, n=8): + self.n = n + self.a = [] + self.u = [] + self.s = [] + for x in range(0,n): + self.u.append(False) + self.go() + + def go(self): + from copy import deepcopy + if len(self.s) == self.n: + self.a.append(deepcopy(self.s)) + else: + for x in range(0,self.n): + if self.u[x]: continue + self.s.append(x) + self.u[x] = True + self.go() + self.u[x] = False + self.s.pop() + + def order(self): + return self.a + class GrayIdler(Idler): - def __init__(self, v, one=None, zero=None): + def __init__(self, v, one=None, zero=None, reorder=0): self.bits = 8 self.size = 1 << self.bits self.i = 0 @@ -83,6 +112,10 @@ class GrayIdler(Idler): self.v = v self.one = one self.zero = zero + self.reorder = reorder + global orderings + if not orderings: + orderings = OrderMaker().order() def next(self): output = self.do_next_state() @@ -91,6 +124,12 @@ class GrayIdler(Idler): output = string.replace(output, "0", self.zero) if self.one: output = string.replace(output, "1", self.one) + if self.reorder: + global orderings + newoutput = "" + for i in range(0,8): + newoutput += output[orderings[self.reorder][i]] + output = newoutput self.v.display(" %8.8s " % (output)) self.i = (self.i + 1) % self.size @@ -138,3 +177,5 @@ class GrayIdler(Idler): def reset(self): self.i = 0 self.grayCode = 0 + if self.reorder: + self.reorder = int(random()*40320) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index bed5366..992a65d 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -219,6 +219,9 @@ def setup_idlers(v): GrayIdler(v,one="*",zero="-"), GrayIdler(v,one="/",zero="\\"), GrayIdler(v,one="X",zero="O"), + GrayIdler(v,one="*",zero="-",reorder=1), + GrayIdler(v,one="/",zero="\\",reorder=1), + GrayIdler(v,one="X",zero="O",reorder=1), ] idler = choose_idler() @@ -275,10 +278,13 @@ def run_forever(rfh, wfh, options, cf): time_to_autologout = time() + 15 if time_to_idle == None and cur_user == '': - time_to_idle = time() + 2 + time_to_idle = time() + 30 choose_idler() if time_to_idle != None and cur_user != '': time_to_idle = None if time_to_idle is not None and time() > time_to_idle: idle_step() + if time() > time_to_idle + 300: + time_to_idle = time() + choose_idler() mk.update_display() -- 2.20.1 From 0188e9eabe7564ccefed60d719eaed061e57fcf6 Mon Sep 17 00:00:00 2001 From: Bernard Blackham Date: Thu, 12 Aug 2004 09:44:57 +0000 Subject: [PATCH 11/16] Random idler fixes. --- sql-edition/servers/Idler.py | 2 +- sql-edition/servers/VendServer.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index 555630f..5ffea0b 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -178,4 +178,4 @@ class GrayIdler(Idler): self.i = 0 self.grayCode = 0 if self.reorder: - self.reorder = int(random()*40320) + self.reorder = int(random()*40319)+1 diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 992a65d..45288f1 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -278,11 +278,11 @@ def run_forever(rfh, wfh, options, cf): time_to_autologout = time() + 15 if time_to_idle == None and cur_user == '': - time_to_idle = time() + 30 + time_to_idle = time() + 5 choose_idler() - if time_to_idle != None and cur_user != '': time_to_idle = None + if time_to_idle is not None and cur_user != '': time_to_idle = None if time_to_idle is not None and time() > time_to_idle: idle_step() - if time() > time_to_idle + 300: + if time_to_idle is not None and time() > time_to_idle + 300: time_to_idle = time() choose_idler() -- 2.20.1 From 703f5f6edbd9cfdd683fb8ffe2174b4049e8c0d3 Mon Sep 17 00:00:00 2001 From: Mark Tearle Date: Tue, 21 Sep 2004 09:57:30 +0000 Subject: [PATCH 12/16] Added StringIdler Factored out into own file MessageKeeper --- sql-edition/servers/Idler.py | 14 +++++++ sql-edition/servers/MessageKeeper.py | 52 +++++++++++++++++++++++++ sql-edition/servers/VendServer.py | 57 +++++++--------------------- 3 files changed, 79 insertions(+), 44 deletions(-) create mode 100755 sql-edition/servers/MessageKeeper.py diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index 5ffea0b..80963a8 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -2,6 +2,7 @@ import string from random import random +from MessageKeeper import MessageKeeper orderings = None @@ -179,3 +180,16 @@ class GrayIdler(Idler): self.grayCode = 0 if self.reorder: self.reorder = int(random()*40319)+1 + + +class StringIdler(Idler): + def __init__(self, v, text="Hello Cruel World!"): + self.v = v + self.mk = MessageKeeper(v) + self.text = text + + def next(self): + self.mk.update_display() + + def reset(self): + self.mk.set_message(self.text, True, None) diff --git a/sql-edition/servers/MessageKeeper.py b/sql-edition/servers/MessageKeeper.py new file mode 100755 index 0000000..e9dee51 --- /dev/null +++ b/sql-edition/servers/MessageKeeper.py @@ -0,0 +1,52 @@ +#!/usr/bin/python +# vim:ts=4 + +import sys, os, string, re, pwd, signal +from HorizScroll import HorizScroll +from random import random, seed + +class MessageKeeper: + def __init__(self, vendie): + # Each element of scrolling_message should be a 3-tuple of + # ('message', True/False if it is to be repeated, time to display) + self.scrolling_message = [] + self.v = vendie + self.next_update = None + + def set_message(self, string): + self.scrolling_message = [(string, False, None)] + self.update_display(True) + + def set_messages(self, strings): + self.scrolling_message = strings + self.update_display(True) + + def update_display(self, forced = False): + if not forced and self.next_update != None and time() < self.next_update: + return + if len(self.scrolling_message) > 0: + if len(self.scrolling_message[0][0]) > 10: + (m, r, t) = self.scrolling_message[0] + a = [] + exp = HorizScroll(m).expand(padding = 0, wraparound = True) + if t == None: + t = 0.1 + else: + t = t / len(exp) + for x in exp: + a.append((x, r, t)) + del self.scrolling_message[0] + self.scrolling_message = a + self.scrolling_message + newmsg = self.scrolling_message[0] + if newmsg[2] != None: + self.next_update = time() + newmsg[2] + else: + self.next_update = None + self.v.display(self.scrolling_message[0][0]) + if self.scrolling_message[0][1]: + self.scrolling_message.append(self.scrolling_message[0]) + del self.scrolling_message[0] + + def done(self): + return len(self.scrolling_message) == 0 + diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 45288f1..71097bb 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -12,12 +12,22 @@ from time import time, sleep from popen2 import popen2 from LATClient import LATClient, LATClientException from VendingMachine import VendingMachine, VendingException +from MessageKeeper import MessageKeeper from HorizScroll import HorizScroll from random import random, seed -from Idler import TrainIdler,GrayIdler +from Idler import TrainIdler,GrayIdler,StringIdler import socket from posix import geteuid +CREDITS=""" +This vending machine software brought to you by: +Bernard Blackham +Mark Tearle +Nick Bannon +Cameron Patrick +and a collective of hungry alpacas. +""" + GREETING = 'UCC SNACKS' PIN_LENGTH = 4 @@ -164,50 +174,7 @@ def center(str): LEN = 10 return ' '*((LEN-len(str))/2)+str -class MessageKeeper: - def __init__(self, vendie): - # Each element of scrolling_message should be a 3-tuple of - # ('message', True/False if it is to be repeated, time to display) - self.scrolling_message = [] - self.v = vendie - self.next_update = None - - def set_message(self, string): - self.scrolling_message = [(string, False, None)] - self.update_display(True) - - def set_messages(self, strings): - self.scrolling_message = strings - self.update_display(True) - - def update_display(self, forced = False): - if not forced and self.next_update != None and time() < self.next_update: - return - if len(self.scrolling_message) > 0: - if len(self.scrolling_message[0][0]) > 10: - (m, r, t) = self.scrolling_message[0] - a = [] - exp = HorizScroll(m).expand(padding = 0, wraparound = True) - if t == None: - t = 0.1 - else: - t = t / len(exp) - for x in exp: - a.append((x, r, t)) - del self.scrolling_message[0] - self.scrolling_message = a + self.scrolling_message - newmsg = self.scrolling_message[0] - if newmsg[2] != None: - self.next_update = time() + newmsg[2] - else: - self.next_update = None - self.v.display(self.scrolling_message[0][0]) - if self.scrolling_message[0][1]: - self.scrolling_message.append(self.scrolling_message[0]) - del self.scrolling_message[0] - def done(self): - return len(self.scrolling_message) == 0 idlers = [] idler = None @@ -215,6 +182,8 @@ def setup_idlers(v): global idlers, idler idlers = [ TrainIdler(v), + StringIdler(v), + StringIdler(v, text=CREDITS), GrayIdler(v), GrayIdler(v,one="*",zero="-"), GrayIdler(v,one="/",zero="\\"), -- 2.20.1 From 903a02269050489e78a7a848723be03957274d5c Mon Sep 17 00:00:00 2001 From: ACC Murphy Date: Tue, 21 Sep 2004 10:16:07 +0000 Subject: [PATCH 13/16] okay... still bugs with StringIdler --- sql-edition/servers/Idler.py | 3 ++- sql-edition/servers/VendServer.py | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index 80963a8..babfab1 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -189,7 +189,8 @@ class StringIdler(Idler): self.text = text def next(self): - self.mk.update_display() + #self.mk.update_display() + self.v.display(" %8.8s " % ("BOG")) def reset(self): self.mk.set_message(self.text, True, None) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 71097bb..7c4a278 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -182,8 +182,6 @@ def setup_idlers(v): global idlers, idler idlers = [ TrainIdler(v), - StringIdler(v), - StringIdler(v, text=CREDITS), GrayIdler(v), GrayIdler(v,one="*",zero="-"), GrayIdler(v,one="/",zero="\\"), @@ -192,6 +190,8 @@ def setup_idlers(v): GrayIdler(v,one="/",zero="\\",reorder=1), GrayIdler(v,one="X",zero="O",reorder=1), ] + #StringIdler(v), + #StringIdler(v, text=CREDITS), idler = choose_idler() def choose_idler(): -- 2.20.1 From 90f4134ee5ad00d8676916360c3d7b055ed1504f Mon Sep 17 00:00:00 2001 From: Mark Tearle Date: Wed, 22 Sep 2004 09:24:48 +0000 Subject: [PATCH 14/16] Working StringIdler (missing cleansing functions) --- sql-edition/servers/Idler.py | 7 ++++--- sql-edition/servers/MessageKeeper.py | 1 + sql-edition/servers/VendServer.py | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index babfab1..d2cbabb 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -189,8 +189,9 @@ class StringIdler(Idler): self.text = text def next(self): - #self.mk.update_display() - self.v.display(" %8.8s " % ("BOG")) + #self.mk.update_display(forced=True) + self.mk.update_display() def reset(self): - self.mk.set_message(self.text, True, None) + msg = [(self.text, True, 0.8)] + self.mk.set_messages(msg) diff --git a/sql-edition/servers/MessageKeeper.py b/sql-edition/servers/MessageKeeper.py index e9dee51..c61ce35 100755 --- a/sql-edition/servers/MessageKeeper.py +++ b/sql-edition/servers/MessageKeeper.py @@ -4,6 +4,7 @@ import sys, os, string, re, pwd, signal from HorizScroll import HorizScroll from random import random, seed +from time import time, sleep class MessageKeeper: def __init__(self, vendie): diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 7c4a278..8942855 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -181,8 +181,10 @@ idler = None def setup_idlers(v): global idlers, idler idlers = [ - TrainIdler(v), + StringIdler(v), + StringIdler(v, text=CREDITS), GrayIdler(v), + TrainIdler(v), GrayIdler(v,one="*",zero="-"), GrayIdler(v,one="/",zero="\\"), GrayIdler(v,one="X",zero="O"), @@ -190,8 +192,6 @@ def setup_idlers(v): GrayIdler(v,one="/",zero="\\",reorder=1), GrayIdler(v,one="X",zero="O",reorder=1), ] - #StringIdler(v), - #StringIdler(v, text=CREDITS), idler = choose_idler() def choose_idler(): -- 2.20.1 From ce75000d4e6f38c8143c1eb0cafe2756d903c6ed Mon Sep 17 00:00:00 2001 From: Mark Tearle Date: Wed, 22 Sep 2004 12:45:51 +0000 Subject: [PATCH 15/16] Working String Idler --- sql-edition/servers/Idler.py | 28 +++++++++++++++++++++++----- sql-edition/servers/VendServer.py | 12 +++++++++++- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/sql-edition/servers/Idler.py b/sql-edition/servers/Idler.py index d2cbabb..48e819a 100755 --- a/sql-edition/servers/Idler.py +++ b/sql-edition/servers/Idler.py @@ -183,15 +183,33 @@ class GrayIdler(Idler): class StringIdler(Idler): - def __init__(self, v, text="Hello Cruel World!"): + def __init__(self, v, text="Hello Cruel World! "): self.v = v self.mk = MessageKeeper(v) - self.text = text + self.text = self.clean_text(text) + + msg = [("",False, None),(self.text, True, 0.8)] + self.mk.set_messages(msg) + + def clean_text(self, text): + # nothing like a bit of good clean text :) + valid = string.digits \ + + string.letters \ + + string.punctuation \ + + " " + # uppercase it + text = string.upper(text) + clean = "" + for char in text: + if char in valid: + clean = clean + char + else: + clean = clean + " " + return clean def next(self): - #self.mk.update_display(forced=True) self.mk.update_display() def reset(self): - msg = [(self.text, True, 0.8)] - self.mk.set_messages(msg) + pass + #self.mk.update_display(forced=True) diff --git a/sql-edition/servers/VendServer.py b/sql-edition/servers/VendServer.py index 8942855..c82dda8 100755 --- a/sql-edition/servers/VendServer.py +++ b/sql-edition/servers/VendServer.py @@ -4,7 +4,7 @@ USE_DB = 0 import ConfigParser -import sys, os, string, re, pwd, signal +import sys, os, string, re, pwd, signal, math import logging, logging.handlers from traceback import format_tb if USE_DB: import pg @@ -26,6 +26,13 @@ Mark Tearle Nick Bannon Cameron Patrick and a collective of hungry alpacas. + + + +For a good time call +61 8 6488 3901 + + + """ GREETING = 'UCC SNACKS' @@ -178,11 +185,14 @@ def center(str): idlers = [] idler = None + def setup_idlers(v): global idlers, idler idlers = [ StringIdler(v), StringIdler(v, text=CREDITS), + StringIdler(v, text=str(math.pi) + " "), + StringIdler(v, text=str(math.e) + " "), GrayIdler(v), TrainIdler(v), GrayIdler(v,one="*",zero="-"), -- 2.20.1 From fdc1481795409a394aed30166df27d5bdf8339f6 Mon Sep 17 00:00:00 2001 From: Bernard Blackham Date: Sun, 26 Sep 2004 14:20:49 +0000 Subject: [PATCH 16/16] Update LAT version. --- sql-edition/servers/LATClient.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sql-edition/servers/LATClient.py b/sql-edition/servers/LATClient.py index 4d17643..d9b0614 100644 --- a/sql-edition/servers/LATClient.py +++ b/sql-edition/servers/LATClient.py @@ -6,7 +6,7 @@ import logging LATCP_SOCKET = '/var/run/latlogin' -LAT_VERSION = '1.21' +LAT_VERSION = '1.22' LATCP_CMD_VERSION = 8 LATCP_CMD_TERMINALSESSION = 26 LATCP_CMD_ERRORMSG = 99 -- 2.20.1