OpenDispense - Fix to actually work
authorJohn Hodge <tpg@ucc.asn.au>
Sun, 19 Feb 2017 11:38:08 +0000 (19:38 +0800)
committerJohn Hodge <tpg@ucc.asn.au>
Sun, 19 Feb 2017 11:38:08 +0000 (19:38 +0800)
VendServer/OpenDispense.py

index de8ff84..c8dcf83 100644 (file)
@@ -12,6 +12,8 @@ import os
 import logging
 import re
 import pwd
+import base64
+import socket
 from subprocess import Popen, PIPE
 from LDAPConnector import get_uid,get_uname, set_card_id
 
@@ -75,21 +77,24 @@ class OpenDispense(DispenseInterface):
                        
                        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
                        sock.connect(DISPENSE_ENDPOINT)
-                       sock.write("AUTHIDENT\n")
-                       rsp = sock.readline()
+                       logging.debug('connected to dispsrv')
+                       sockf = sock.makefile()
+                       sockf.write("AUTHIDENT\n"); sockf.flush()
+                       rsp = sockf.readline()
                        assert "200" in rsp
-                       sock.write("AUTHCARD %s\n" % (card_base64,))
-                       rsp = sock.readline()
+                       logging.debug('authenticated')
+                       sockf.write("AUTHCARD %s\n" % (card_base64,)); sockf.flush()
+                       rsp = sockf.readline()
                        if not "200" in rsp:
                                raise ValueError, "no UID found for card ID"
-                       username = rsp.split('=')[1]
+                       username = rsp.split('=')[1].strip()
 
                        # Check for thier username
                        try:
                                # Get info from the system (by username)
                                info = pwd.getpwnam(username)
                        except KeyError:
-                               logging.info('getting pin for uid %d: user not in password file'%uid)
+                               logging.info('getting info for user \'%s\': user not in password file' % (username,))
                                return False
                else:
                        # Get the users ID
@@ -100,7 +105,7 @@ class OpenDispense(DispenseInterface):
                                # Get info from the system (by UID)
                                info = pwd.getpwuid(self._userid)
                        except KeyError:
-                               logging.info('getting pin for uid %d: user not in password file'%uid)
+                               logging.info('getting info for uid %d: user not in password file' % (self._userid,))
                                return False
 
                # If we get this far all is good
@@ -118,14 +123,15 @@ class OpenDispense(DispenseInterface):
                        logging.info('Enrolling card %s to uid %s (%s)' % (cardId, self._userId, self._username))
                        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
                        sock.connect(DISPENSE_ENDPOINT)
-                       sock.write("AUTHIDENT\n")
-                       rsp = sock.readline()
+                       sockf = sock.makefile()
+                       sockf.write("AUTHIDENT\n")
+                       sockf.flush(); rsp = sockf.readline()
                        assert "200" in rsp
-                       sock.write("SETEUSER %s\n", self._username)
-                       rsp = sock.readline()
+                       sockf.write("SETEUSER %s\n", self._username)
+                       sockf.flush(); rsp = sockf.readline()
                        assert "200" in rsp
-                       sock.write("CARD_ADD %s\n", card_base64)
-                       rsp = sock.readline()
+                       sockf.write("CARD_ADD %s\n", card_base64)
+                       sockf.flush(); rsp = sockf.readline()
                        if "200" in rsp:
                                return True
                        else:
@@ -154,6 +160,7 @@ class OpenDispense(DispenseInterface):
                return balance
 
        def getItemInfo(self, itemId):
+               logging.debug("getItemInfo(%s)" % (itemId,))
                itemId = OpenDispenseMapping.vendingMachineToOpenDispense(itemId)
                args = ('dispense', 'iteminfo', itemId)
                info, unused = Popen(args, close_fds=True, stdout=PIPE).communicate()
@@ -190,8 +197,20 @@ class OpenDispenseMapping():
 
        @staticmethod
        def vendingMachineToOpenDispense(itemId):
+               logging.debug("vendingMachineToOpenDispense(%s)" % (itemId,))
                _mappingFile = "OpenDispenseMappings.conf"
-               fh = open(_mappingFile)
+               try:
+                       fh = open(_mappingFile)
+               except IOError:
+                       if itemId[1] == '8':
+                               return 'coke:' + itemId[0]
+                       elif itemId[1] == '5':
+                               if itemId[0] == '5':
+                                       return 'door'
+                               else:
+                                       return None
+                       else:
+                               return 'snack:' + itemId
                map = ""
                for line in fh:
                        #line = line.strip()

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