#!/usr/bin/python
# vim:ts=4
-USE_DB = 0
USE_MIFARE = 1
import ConfigParser
import sys, os, string, re, pwd, signal, math, syslog
import logging, logging.handlers
from traceback import format_tb
-if USE_DB: import pg
from time import time, sleep, mktime, localtime
from subprocess import Popen, PIPE
from LATClient import LATClient, LATClientException
from SnackConfig import get_snack#, get_snacks
import socket
from posix import geteuid
-from LDAPConnector import get_uid,get_uname, set_card_id
from OpenDispense import OpenDispense as Dispense
CREDITS="""
except ConfigParser.Error, e:
raise SystemExit("Error reading config file "+config_file+": " + str(e))
-class DispenseDatabaseException(Exception): pass
-
-class DispenseDatabase:
- def __init__(self, vending_machine, host, name, user, password):
- self.vending_machine = vending_machine
- self.db = pg.DB(dbname = name, host = host, user = user, passwd = password)
- self.db.query('LISTEN vend_requests')
-
- def process_requests(self):
- logging.debug('database processing')
- query = 'SELECT request_id, request_slot FROM vend_requests WHERE request_handled = false'
- try:
- outstanding = self.db.query(query).getresult()
- except (pg.error,), db_err:
- raise DispenseDatabaseException('Failed to query database: %s\n'%(db_err.strip()))
- for (id, slot) in outstanding:
- (worked, code, string) = self.vending_machine.vend(slot)
- logging.debug (str((worked, code, string)))
- if worked:
- query = 'SELECT vend_success(%s)'%id
- self.db.query(query).getresult()
- else:
- query = 'SELECT vend_failed(%s)'%id
- self.db.query(query).getresult()
-
- def handle_events(self):
- notifier = self.db.getnotify()
- while notifier is not None:
- self.process_requests()
- notify = self.db.getnotify()
"""
This class manages the current state of the vending machine.
"""
self._last_card_id = card_id
- res = self.dispense.addCard(card_id)
-
- if get_uid(card_id) != None:
+ if not self.dispense.addCard(card_id):
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)])
logging.debug('PING is ' + str(self.v.ping()))
- if USE_DB: db = DispenseDatabase(v, cf.DBServer, cf.DBName, cf.DBUser, cf.DBPassword)
-
self.setup_idlers()
self.reset_idler()
while True:
- if USE_DB:
- try:
- db.handle_events()
- except DispenseDatabaseException, e:
- logging.error('Database error: '+str(e))
-
timeout = self.time_to_next_update()
(event, params) = self.v.next_event(timeout)
self.run_handler(event, params)