diff --git a/VendServer/LATClient.py b/VendServer/LATClient.py deleted file mode 100644 index 638d20b05bc1f3a136a93f2c5fd415f964c1048e..0000000000000000000000000000000000000000 --- a/VendServer/LATClient.py +++ /dev/null @@ -1,157 +0,0 @@ -from socket import * -from select import select -from os import popen4 -from time import sleep -import logging - -LATCP_SOCKET = '/var/run/latlogin' - -LAT_VERSION = '1.22' -LAT_VERSION = '1.24' # for running on Mermaid. [DAA] 20071107 -LATCP_CMD_VERSION = 8 -LATCP_CMD_TERMINALSESSION = 26 -LATCP_CMD_ERRORMSG = 99 - -class LATClientException(Exception): pass - -def read_for_a_bit(rfh): - message = '' - while 1: - r = select([rfh], [], [], 5.0)[0] - if r: - try: - ch = rfh.read(1) - except socket.error: - ch = '' - if ch == '': - break - message = message + ch - else: - break - logging.debug("Received message: ", repr(message)) - return message - -def write_and_get_response(rfh, wfh, message, expect_echo=True): - logging.debug("Writing message:", repr(message)) - wfh.write(message+'\r\n') - wfh.flush() - 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") - return response - -class LATClient: - def __init__(self, service = None, node = None, port = None, - localport = None, password = None, is_queued = False, - server_name = '', connect_password='', priv_password=''): - - self.server_name = server_name - self.connect_password = connect_password - self.priv_password = priv_password - - self.sock = socket(AF_UNIX, SOCK_STREAM, 0); - self.sock.connect(LATCP_SOCKET) - self.send_msg(LATCP_CMD_VERSION, LAT_VERSION+'\000') - (cmd, msg) = self.read_reply() - if service == None: service = '' - if node == None: node = '' - if port == None: port = '' - if localport == None: localport = '' - if password == None: password = '' - if is_queued == True: - is_queued = 1 - else: - is_queued = 0 - self.send_msg(LATCP_CMD_TERMINALSESSION, '%c%c%s%c%s%c%s%c%s%c%s' % \ - (is_queued, - len(service), service, - len(node), node, - len(port), port, - len(localport), localport, - len(password), password - )) - (cmd, msg) = self.read_reply() - if ord(cmd) == LATCP_CMD_ERRORMSG: - raise LATClientException(msg) - - self.rfh = self.sock.makefile('r') - self.wfh = self.sock.makefile('w') - - r = select([self.rfh], [], [], 2.0)[0] - if r: - l = self.rfh.readline() - if l.find('Service in use') >= 0: - logging.warning("Service in use, apparently: restarting DEC server") - self.reboot_server() - - def __del__(self): - try: - self.sock.close() - self.sock.shutdown(2) - except: - pass - del self.sock - - def send_msg(self, cmd, msg): - self.sock.send('%c%c%c%s'%(cmd, len(msg)/256, len(msg)%256, msg)) - - 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: - 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: - 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: - 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: - 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: - 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() - logging.info("Waiting 10 seconds for DEC server to come back to life...") - sleep(10) - logging.info("Rightyo, back to vending!") - raise LATClientException('needed to reboot server') - - def read_reply(self): - head = self.sock.recv(3) - if len(head) != 3: - raise LATClientException('Short LAT packet') - cmd = head[0] - length = ord(head[1])*256 + ord(head[2]) - msg = self.sock.recv(length) - if cmd == LATCP_CMD_ERRORMSG: - raise LATClientException('Received LAT error: %s'%msg) - return (cmd, msg) - - def get_fh(self): - return (self.rfh, self.wfh) diff --git a/VendServer/LDAPConnector.py b/VendServer/LDAPConnector.py deleted file mode 100644 index 48050bfd7641db7d48f4d43c7ba167bfb2a7b791..0000000000000000000000000000000000000000 --- a/VendServer/LDAPConnector.py +++ /dev/null @@ -1,92 +0,0 @@ -#!/usr/bin/env python2.4 - -import ldap -import ldap.filter - -LDAP_TIMEOUT = 10 - -def get_ldap_connection(): - ldap.set_option(ldap.OPT_X_TLS_CACERTFILE, '/etc/ssl/UCC-CA.crt') - ldap.set_option(ldap.OPT_X_TLS,1) - ldap.set_option(ldap.OPT_X_TLS_ALLOW,1) - #ldap.set_option(ldap.OPT_DEBUG_LEVEL,255) - conn = ldap.initialize('ldaps://mussel.ucc.gu.uwa.edu.au/') - - binddn = 'cn=mifareagent,ou=profile,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' - passfile = open('/etc/dispense2/ldap.passwd') - password = passfile.readline().strip() - passfile.close() - - conn.simple_bind_s(binddn, password) - return conn - -def get_uid(card_id): - ldapconn = get_ldap_connection() - - basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' - filter = ldap.filter.filter_format('(uccDispenseMIFARE=%s)', (card_id, )) - attrs = ('uidNumber',) - - results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT) - - ldapconn.unbind() - - if len(results) != 1: - raise ValueError("no UID found for card ID") - - return results[0][1]['uidNumber'][0] - -def get_uname(uid): - ldapconn = get_ldap_connection() - - basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' - filter = ldap.filter.filter_format('(uidNumber=%s)', (uid, )) - attrs = ('uid',) - - results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT) - - ldapconn.unbind() - - if len(results) != 1: - raise ValueError("no username found for user id") - - return results[0][1]['uid'][0] - -def set_card_id(uidNumber, card_id): - ldapconn = get_ldap_connection() - - # fix uidNumber for three/four digit uids - uidNumber = str(int(uidNumber)) - basedn = 'ou=People,dc=ucc,dc=gu,dc=uwa,dc=edu,dc=au' - filter = ldap.filter.filter_format('(uidNumber=%s)', (uidNumber, )) - attrs = ('objectClass', ) - - results = ldapconn.search_st(basedn, ldap.SCOPE_SUBTREE, filter, attrs, timeout=LDAP_TIMEOUT) - - if len(results) != 1: - raise ValueError('error in uidNumber') - - user_dn = results[0][0] - - mod_attrs = [] - - # Does it have the correct object class? - if 'uccDispenseAccount' not in results[0][1]['objectClass']: - # Add uccDispenseAccount objectclass - mod_attrs.append((ldap.MOD_ADD, 'objectClass', 'uccDispenseAccount')) - - # Add MIFARE Card ID - mod_attrs.append((ldap.MOD_ADD, 'uccDispenseMIFARE', card_id)) - - # Use a double-try here to work around something that's fixed in Python 2.5 - try: - try: - ldapconn.modify_s(user_dn, mod_attrs) - except ldap.TYPE_OR_VALUE_EXISTS as e: - pass - finally: - ldapconn.unbind() - -if __name__ == '__main__': - set_card_id('11126', '\x01\x02\x03\x04\x05\x06') - print(get_uid('\x01\x02\x03\x04\x05\x06')) diff --git a/VendServer/OpenDispense.py b/VendServer/OpenDispense.py index f1100ed9293764a8603489052ca9a866e9c731e1..859a1f5da3aab8dfd0754ac4926d6c06acb6d669 100644 --- a/VendServer/OpenDispense.py +++ b/VendServer/OpenDispense.py @@ -65,7 +65,8 @@ class OpenDispense(DispenseInterface): userId = int(userId) try: - # Get username (TODO: Store the user ID in the dispense database too) + # Get username (TODO: Store the user ID in the dispense database too, so the vending machine + # doesn't need LDAP/AD working) info = pwd.getpwuid(userId) except KeyError: logging.info('getting pin for uid %d: user not in password file'%userId) diff --git a/VendServer/SnackConfig.py b/VendServer/SnackConfig.py deleted file mode 100755 index 560f95f93aa83401e9e5ec2482b71335ee7002bf..0000000000000000000000000000000000000000 --- a/VendServer/SnackConfig.py +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env python - -class VendingException( Exception ): pass - -import subprocess -import os, re - -def get_snack( slot ): - - if slot == "--": - return (0, 'nothing', 'Nothing') - cmd = 'dispense iteminfo snack:%s' % slot -# print 'cmd = %s' % cmd - try: -# info = subprocess.check_output(["dispense","iteminfo",'snack:%s'%slot]) - raw = os.popen(cmd) - info = raw.read() - raw.close() -# print 'cmd (2) = %s' % cmd -# print 'info = "%s"' % info - m = re.match("\s*[a-z]+:\d+\s+(\d+)\.(\d\d)\s+([^\n]+)", info) - val = ( int(m.group(1))*100 + int(m.group(2)), m.group(3), m.group(3) ) -# print 'Price: %i, Name: %s' % (val[0], val[1]) - except BaseException as e: - print("BaseException") - print(e) - val = (0, 'error', 'Error') - except: - print("Unknown exception") - val = (0, 'error', 'Error') - return val - -def get_price( slot ): - p, sn, n = get_snack( slot ) - return p - -def get_name( slot ): - p, sn, n = get_snack( slot ) - return n - -def get_short_name( slot ): - p, sn, n = get_snack( slot ) - return sn - -if __name__ == '__main__': - print("Don't run this") diff --git a/VendServer/VendServer.py b/VendServer/VendServer.py index 4e059ece3e2f941cb5a335aa8f0bee56a57e2d29..8c7e48a059a4016ef6aad58ed748da1aeece465d 100755 --- a/VendServer/VendServer.py +++ b/VendServer/VendServer.py @@ -15,7 +15,6 @@ from .MessageKeeper import MessageKeeper from .HorizScroll import HorizScroll from random import random, seed from .Idler import GreetingIdler,TrainIdler,GrayIdler,StringIdler,ClockIdler,FortuneIdler,FileIdler,PipeIdler -from .SnackConfig import get_snack#, get_snacks import socket from posix import geteuid from .OpenDispense import OpenDispense as Dispense diff --git a/VendServer/VendingMachine.py b/VendServer/VendingMachine.py index b10f7505382a9ee21067132e56ba36c17d7ef6ba..4a5026836b3b17861e3a2f7cc6968a2bb43ddafa 100644 --- a/VendServer/VendingMachine.py +++ b/VendServer/VendingMachine.py @@ -115,7 +115,7 @@ class VendingMachine: else: logging.warning('Unhandled event! (%s %s)\n'%(code,text)) - def authed_message(self, message): + def authed_message(self, message: str): if self.challenge == None: print('self.challenge = None') return message