X-Git-Url: https://git.ucc.asn.au/?p=uccvend-vendserver.git;a=blobdiff_plain;f=VendServer%2FVendServer.py;h=21fe2c87067b4e01b30c7283646060ad08a9eb62;hp=d6a07a04b83bf5523413f3ad274791fe2e8aa88c;hb=db55f34efc5c9d66c9608176c4b66162ee9e7318;hpb=15173eaaa20442f08c2d32fca37825e5c3bcb3e6 diff --git a/VendServer/VendServer.py b/VendServer/VendServer.py index d6a07a0..21fe2c8 100755 --- a/VendServer/VendServer.py +++ b/VendServer/VendServer.py @@ -164,38 +164,33 @@ class VendServer(): _pin_pin = '----' _last_card_id = -1 + dispense = None + """ Show information to the user as to what can be dispensed. """ def scroll_options(self, username, mk, welcome = False): # If the user has just logged in, show them their balance if welcome: - # Balance checking - acct, unused = Popen(['dispense', 'acct', username], close_fds=True, stdout=PIPE).communicate() - # this is fucking appalling - balance = acct[acct.find("$")+1:acct.find("(")].strip() + balance = self.dispense.getBalance() msg = [(self.center('WELCOME'), False, TEXT_SPEED), - (self.center(username), False, TEXT_SPEED), + (self.center(self.dispense.getUsername()), False, TEXT_SPEED), (self.center(balance), False, TEXT_SPEED),] else: msg = [] choices = ' '*10+'CHOICES: ' # Show what is in the coke machine + # Need to update this so it uses the abstracted system cokes = [] - for i in range(0, 7): - args = ('dispense', 'iteminfo', 'coke:%i' % i) - info, unused = Popen(args, close_fds=True, stdout=PIPE).communicate() - m = re.match("\s*[a-z]+:\d+\s+(\d+)\.(\d\d)\s+([^\n]+)", info) - cents = int(m.group(1))*100 + int(m.group(2)) - cokes.append('%i %i %s' % (i, cents, m.group(3))); + for i in ['08', '18', '28', '38', '48', '58', '68']: + cokes.append((i, self.dispense.getItemInfo(i))) for c in cokes: - c = c.strip() - (slot_num, price, slot_name) = c.split(' ', 2) - if slot_name == 'dead': continue - choices += '%s-(%sc)-%s8 '%(slot_name, price, slot_num) + if c[1][0] == 'dead': + continue + choices += '%s-(%sc)-%s8 '%(c[1][0], c[1][1], c[0]) # Show the final few options choices += '55-DOOR ' @@ -206,88 +201,6 @@ class VendServer(): # Send it to the display mk.set_messages(msg) - - """ - Verify the users pin - """ - def _check_pin(self, uid, pin): - print "_check_pin('",uid,"',---)" - if uid != self._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. Fixing.'%uid) - os.chmod(pinfile, 0600) - 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 - self._pin_uid = uid - self._pin_pin = pinstr - self._pin_uname = info.pw_name - else: - pinstr = self._pin_pin - if pin == int(pinstr): - logging.info("Pin correct for %d",uid) - else: - logging.info("Pin incorrect for %d",uid) - return pin == int(pinstr) - - """ - Check if the users account has been disabled - """ - def acct_is_disabled(self, name=None): - if name == None: - name = self._pin_uname - acct, unused = Popen(['dispense', 'acct', self._pin_uname], close_fds=True, stdout=PIPE).communicate() - # this is fucking appalling - flags = acct[acct.find("(")+1:acct.find(")")].strip() - if 'disabled' in flags: - return True - if 'internal' in flags: - return True - return False - - """ - Check that the user has a valid pin set - """ - def has_good_pin(self, uid): - return self._check_pin(uid, None) != None - - """ - Verify the users pin. - """ - def verify_user_pin(self, uid, pin, skip_pin_check=False): - if skip_pin_check or self._check_pin(uid, pin) == True: - info = pwd.getpwuid(uid) - if skip_pin_check: - if self.acct_is_disabled(info.pw_name): - logging.info('refused mifare for disabled acct uid %d (%s)'%(uid,info.pw_name)) - return '-disabled-' - logging.info('accepted mifare for uid %d (%s)'%(uid,info.pw_name)) - else: - 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 - """ In here just for fun. """ @@ -511,7 +424,7 @@ class VendServer(): self.vstatus.last_timeout_refresh = None else: # Price check mode. - self.price_check() + self.dispense.getItemInfo(self.vstatus.cur_selection) self.vstatus.cur_selection = '' self.vstatus.time_to_autologout = None self.vstatus.last_timeout_refresh = None @@ -576,23 +489,6 @@ class VendServer(): self.v.display('UNK ERROR') sleep(1) - """ - Find the price of an item. - """ - def price_check(): - if self.vstatus.cur_selection[1] == '8': - args = ('dispense', 'iteminfo', 'coke:' + self.vstatus.cur_selection[0]) - info, unused = Popen(args, close_fds=True, stdout=PIPE).communicate() - dollarprice = re.match("\s*[a-z]+:\d+\s+(\d+\.\d\d)\s+([^\n]+)", info).group(1) - else: - # first see if it's a named slot - try: - price, shortname, name = get_snack( self.vstatus.cur_selection ) - except: - price, shortname, name = get_snack( '--' ) - dollarprice = "$%.2f" % ( price / 100.0 ) - self.v.display(self.vstatus.cur_selection+' - %s'%dollarprice) - """ Triggered when the user presses a button while entering their pin. """ @@ -611,8 +507,8 @@ class VendServer(): self.vstatus.cur_pin += chr(key + ord('0')) self.vstatus.mk.set_message('PIN: '+'X'*len(self.vstatus.cur_pin)) if len(self.vstatus.cur_pin) == PIN_LENGTH: - self.vstatus.username = self.verify_user_pin(int(self.vstatus.cur_user), int(self.vstatus.cur_pin)) - if self.vstatus.username: + self.dispense.authUserIdPin(self.vstatus.cur_user, self.vstatus.cur_pin) + if self.dispense.getUsername(): self.v.beep(0, False) self.vstatus.cur_selection = '' self.vstatus.change_state(STATE_GET_SELECTION) @@ -642,7 +538,7 @@ class VendServer(): self.vstatus.time_to_autologout = None self.vstatus.mk.set_message('PRICECHECK') sleep(0.5) - self.scroll_options('', vstatus.mk) + self.scroll_options('', self.vstatus.mk) self.vstatus.change_state(STATE_GET_SELECTION) return @@ -702,18 +598,9 @@ class VendServer(): return - if not self.has_good_pin(uid): - logging.info('user '+self.vstatus.cur_user+' has a bad PIN') - self.vstatus.mk.set_messages( - [(' '*10+'INVALID PIN SETUP'+' '*11, False, 3)]) - self.vstatus.cur_user = '' - self.vstatus.cur_pin = '' - - self.reset_idler(3) - - return - - if self.acct_is_disabled(): + # TODO Fix this up do we can check before logging in + """ + if self.dispense.isDisabled(): logging.info('user '+self.vstatus.cur_user+' is disabled') self.vstatus.mk.set_messages( [(' '*11+'ACCOUNT DISABLED'+' '*11, False, 3)]) @@ -722,7 +609,7 @@ class VendServer(): self.reset_idler(3) return - + """ self.vstatus.cur_pin = '' self.vstatus.mk.set_message('PIN: ') @@ -921,47 +808,37 @@ class VendServer(): self._last_card_id = card_id - try: - self.vstatus.cur_user = get_uid(card_id) - logging.info('Mapped card id to uid %s'%vstatus.cur_user) - self.vstatus.username = get_uname(vstatus.cur_user) - if self.acct_is_disabled(self.vstatus.username): - self.vstatus.username = '-disabled-' - except ValueError: - self.vstatus.username = None - if self.vstatus.username == '-disabled-': + self.dispense.authMifareCard(card_id) + logging.info('Mapped card id to uid %s'%self.dispense.getUsername()) + if not self.dispense.isLoggedIn(): self.v.beep(40, False) self.vstatus.mk.set_messages( - [(self.center('ACCT DISABLED'), False, 1.0), + [(self.center('BAD CARD'), False, 1.0), (self.center('SORRY'), False, 0.5)]) self.vstatus.cur_user = '' self.vstatus.cur_pin = '' - self.vstatus.username = None + self._last_card_id = -1 self.reset_idler(2) return - elif self.vstatus.username: - self.v.beep(0, False) - self.vstatus.cur_selection = '' - self.vstatus.change_state(STATE_GET_SELECTION) - self.scroll_options(self.vstatus.username, self.vstatus.mk, True) - return - else: + elif self.dispense.isDisabled(): self.v.beep(40, False) self.vstatus.mk.set_messages( - [(self.center('BAD CARD'), False, 1.0), + [(self.center('ACCT DISABLED'), False, 1.0), (self.center('SORRY'), False, 0.5)]) - self.vstatus.cur_user = '' - self.vstatus.cur_pin = '' - self._last_card_id = -1 - + self.dispense.logOut() self.reset_idler(2) return + else: + self.vstatus.cur_selection = '' + self.vstatus.change_state(STATE_GET_SELECTION) + self.scroll_options(self.vstatus.username, self.vstatus.mk, True) + return """ Triggered when a user swipes their card and the machine is logged in. """ - def handle_mifare_add_user_event(self, evnt, params): + def handle_mifare_add_user_event(self, event, params): card_id = params # Translate card_id into uid. @@ -969,25 +846,19 @@ class VendServer(): return self._last_card_id = card_id - - try: - if get_uid(card_id) != None: - self.vstatus.mk.set_messages( - [(self.center('ALREADY'), False, 0.5), - (self.center('ENROLLED'), False, 0.5)]) - - # scroll_options(vstatus.username, vstatus.mk) - return - except ValueError: - pass - logging.info('Enrolling card %s to uid %s (%s)'%(card_id, vstatus.cur_user, vstatus.username)) - self.set_card_id(self.vstatus.cur_user, card_id) - self.vstatus.mk.set_messages( - [(self.center('CARD'), False, 0.5), - (self.center('ENROLLED'), False, 0.5)]) + res = self.dispense.addCard(card_id) - # scroll_options(vstatus.username, vstatus.mk) + if get_uid(card_id) != None: + self.vstatus.mk.set_messages( + [(self.center('ALREADY'), False, 0.5), + (self.center('ENROLLED'), False, 0.5)]) + else: + logging.info('Enrolling card %s to uid %s (%s)'%(card_id, self.vstatus.cur_user, self.vstatus.username)) + self.set_card_id(self.vstatus.cur_user, self.card_id) + self.vstatus.mk.set_messages( + [(self.center('CARD'), False, 0.5), + (self.center('ENROLLED'), False, 0.5)]) def return_to_idle(self, event, params): self.reset_idler() @@ -1050,6 +921,7 @@ class VendServer(): def run_forever(self, rfh, wfh, options, cf): self.v = VendingMachine(rfh, wfh, USE_MIFARE) + self.dispense = Dispense() self.vstatus = VendState(self.v) self.create_state_table() @@ -1085,11 +957,11 @@ def connect_to_vend(options, cf): 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() - #elif options.use_serial: - # # Open vending machine via serial. - # logging.info('Connecting to vending machine using serial') - # serialclient = SerialClient(port = '/dev/ttyS1', baud = 9600) - # rfh,wfh = serialclient.get_fh() + elif options.use_serial: + # Open vending machine via serial. + logging.info('Connecting to vending machine using serial') + serialclient = SerialClient(port = '/dev/ttyS1', baud = 9600) + rfh,wfh = serialclient.get_fh() else: #(rfh, wfh) = popen2('../../virtualvend/vvend.py') logging.info('Connecting to virtual vending machine on %s:%d'%(options.host,options.port)) @@ -1110,7 +982,7 @@ def parse_args(): from optparse import OptionParser op = OptionParser(usage="%prog [OPTION]...") - op.add_option('-f', '--config-file', default='./servers.conf', metavar='FILE', dest='config_file', help='use the specified config file instead of /etc/dispense/servers.conf') + op.add_option('-f', '--config-file', default='/etc/dispense2/servers.conf', metavar='FILE', dest='config_file', help='use the specified config file instead of /etc/dispense/servers.conf') op.add_option('--serial', action='store_true', default=False, dest='use_serial', help='use the serial port') op.add_option('--lat', action='store_true', default=False, dest='use_lat', help='use LAT') op.add_option('--virtualvend', action='store_false', default=True, dest='use_serial', help='use the virtual vending server instead of LAT')