def rmUser(user=None): user = getUser(user) if not user: return putMessage("User [{:d}] '{:s} {:s}'" .format(user['userID'], user['firstName'], user['lastName']), level=severity.WARNING) putMessage("will be permanently deleted,", level=severity.WARNING) putMessage("along with all associated logs!", level=severity.WARNING) putMessage("Delete this User?", level=severity.WARNING) if getInput("{'yes' to continue, anything else to exit}") == 'yes': putMessage("Really Delete?", level=severity.WARNING) if getInput("{'yes' to delete user, anything else to exit}") == 'yes': backend.rmUser(user['userID']) putMessage("User {:d}: '{:s} {:s}' has been deleted.".format(user['userID'], user['firstName'], user['lastName']), level=severity.WARNING)
def showUser(userID=None, email=None, filters=None, getAll=False): fieldOrder = [ 'userID', 'status', 'email', 'firstName', 'lastName', 'tags', 'rfids' ] def addUserRow(userDict): userTable.add_row([user[field] for field in fieldOrder]) userTable = PrettyTable(fieldOrder) if getAll or filters: allUsers = list(backend.getAllUsers()) filteredUsers = [] if filters: for filt in filters: try: filteredUsers = [] for user in allUsers: user_value = str(user[filt]) if isinstance( user[filt], long) else user[filt] user_value = [user_value] if isinstance( user_value, basestring) else user_value filter_value = ([filters[filt]] if isinstance( filters[filt], basestring) else filters[filt]) match = True for f in filter_value: if f not in user_value: match = False break if match: filteredUsers.append(user) allUsers = filteredUsers except KeyError: return 1 for user in allUsers: addUserRow(user) else: search = userID if userID else (email if email else None) user = getUser(search, confirm=False if search else True) if user: addUserRow(user) # userTable.sortby = 'tags' print userTable
def unenroll(user=None, nfcID=None, quiet=False, reader=False): user = getUser(user, False if user else True) if not user: return if not user['rfids']: putMessage("User is not enrolled", level=severity.WARNING) return else: putMessage("Found {:d} NFC card{:s}.".format( len(user['rfids']), 's' if len(user['rfids']) > 1 else '')) if nfcID in user['rfids']: backend.unenroll(user['userID'], nfcID) putMessage('Removed key {:}'.format(nfcID), level=severity.OK) return for rfid in user['rfids']: if getInput("Remove NFC key with UID = {:s}?".format(rfid), options=['y','n']) == 'y': backend.unenroll(user['userID'], rfid) putMessage("Key un-enrolled", level=severity.OK)
def rmUser(user=None): user = getUser(user) if not user: return putMessage("User [{:d}] '{:s} {:s}'".format(user['userID'], user['firstName'], user['lastName']), level=severity.WARNING) putMessage("will be permanently deleted,", level=severity.WARNING) putMessage("along with all associated logs!", level=severity.WARNING) putMessage("Delete this User?", level=severity.WARNING) if getInput("{'yes' to continue, anything else to exit}") == 'yes': putMessage("Really Delete?", level=severity.WARNING) if getInput("{'yes' to delete user, anything else to exit}") == 'yes': backend.rmUser(user['userID']) putMessage("User {:d}: '{:s} {:s}' has been deleted.".format( user['userID'], user['firstName'], user['lastName']), level=severity.WARNING)
def showUser(userID=None, email=None, filters=None, getAll=False): fieldOrder = ['userID', 'status', 'email', 'firstName', 'lastName', 'tags', 'rfids'] def addUserRow(userDict): userTable.add_row([user[field] for field in fieldOrder]) userTable = PrettyTable(fieldOrder) if getAll or filters: allUsers = list(backend.getAllUsers()) filteredUsers = [] if filters: for filt in filters: try: filteredUsers = [] for user in allUsers: user_value = str(user[filt]) if isinstance(user[filt], long) else user[filt] user_value = [user_value] if isinstance(user_value, basestring) else user_value filter_value = ([filters[filt]] if isinstance(filters[filt], basestring) else filters[filt]) match = True for f in filter_value: if f not in user_value: match = False break if match: filteredUsers.append(user) allUsers = filteredUsers except KeyError: return 1 for user in allUsers: addUserRow(user) else: search = userID if userID else (email if email else None) user = getUser(search, confirm = False if search else True) if user: addUserRow(user) # userTable.sortby = 'tags' print userTable
def enroll(userID=None, nfcID=None, steal=False, quiet=False, reader=False): if os.geteuid() != 0: print "Root is required to run this script" return user = getUser(userID, confirm=(False if userID else True)) if user == None: return userID = user['userID'] if not reader: if not nfcID: putMessage( "Enter key UID manually,") choice = getInput("or read key from NFC reader?", options=['m', 'r']) if choice == 'm': nfcID = getInput("Enter key UID") if not nfcID: try: restartDoorLock = True if killDoorLock() == 0 else False from rpi import interfaceControl while True: log.debug("Starting NFC read") if not quiet: putMessage("Swipe card now") retry = 0 while retry < 30: interfaceControl.setPowerStatus(True) nfcID = interfaceControl.nfcGetUID() interfaceControl.setPowerStatus(False) if nfcID: break time.sleep(0.75) retry += 1 log.debug("Finished NFC read") if not nfcID and not quiet: retry = getInput("Couldn't read card. Retry?", options=['y', 'n']) if nfcID != None or retry != 'y': break else: break except KeyboardInterrupt: log.info("Received KeyboardInterrupt") except: putMessage("Unexpected error: {:}".format(sys.exc_info()[0]), level=severity.ERROR) log.error("Unexpected error: {:}".format(sys.exc_info()[0])) raise finally: interfaceControl.cleanup() if restartDoorLock: log.info("restarting door-lock.py") startDoorLock() if nfcID != None: # @TODO: catch duplicate key error, exit with error status try: backend.enroll(nfcID, userID, steal) putMessage("User [{:d}] enrolled with ID: {:s}".format(userID, nfcID),level=severity.OK) except IntegrityError: putMessage("Key is already assigned!",level=severity.WARNING) putMessage("User not enrolled",level=severity.ERROR) else: putMessage("Did not enroll user", level=severity.WARNING)
def editUser(userID=None, email=None, firstName=None, lastName=None, status=None, tags=None, password=None): if userID or email: userSearch = userID if userID else email user = getUser(userSearch, confirm=False) else: user = None if user: putMessage("Editing user [{:d}] '{:s} {:s}'".format( user['userID'], user['firstName'], user['lastName']), level=severity.WARNING) putMessage("Enter new information to change.") putMessage("Leave blank to leave stored info unchanged.") mode = 'edit' elif email or (not email and not userID): putMessage("Adding new user") mode = 'add' else: return while email == None: email = getInput("e-mail", user['email'] if user else '') if email == None and mode == "edit": break if email == '-': message = ("Not a valid e-mail address" if mode == "add" else "Cannot delete e-mail; edit instead.") putMessage(message, level=severity.ERROR) email = None elif not validateEmail(email): putMessage("Not a valid e-mail address", level=severity.ERROR) email = None else: if backend.getUserByEmail(email): putMessage("e-mail address is already in use!", level=severity.ERROR) email = None while firstName == None: firstName = firstName if firstName else getInput( "First Name", user['firstName'] if user else '') if firstName == None and mode == 'edit': break elif firstName == None and mode == 'add': putMessage("This field is required", level=severity.ERROR) while lastName == None: lastName = lastName if lastName else getInput( "Last Name", user['lastName'] if user else '') if lastName == None and mode == 'edit': break elif lastName == None and mode == 'add': putMessage("This field is required", level=severity.ERROR) while status == None: status = getInput("Status", user['status'] if user else '') if status == None: break if status == '-': putMessage("Cannot delete status; edit instead.", level=severity.ERROR) status = None elif status not in validStatuses: putMessage("Invalid status '{:s}'".format(status), level=severity.ERROR) status = None while tags == None: putMessage("Enter '-' to delete stored tags.") userInput = getInput("Tags", ", ".join(user['tags']) if user else '') if userInput == None: break if userInput == '-': tags = '' break tags = [x.strip() for x in userInput.split(',') if not x == ''] if not tags: tags = None continue for tag in tags: if tag not in validTags: putMessage("Invalid tag '{:s}'".format(tag), level=severity.ERROR) tags = None if not password: putMessage("Enter '-' to delete stored password.") password = getInput("Password", password=True) if password: confirmPassword = getInput("Confirm password", password=True) while password != confirmPassword: putMessage("Passwords do not match", level=severity.ERROR) password = getInput("Password", password=True) confirmPassword = getInput("Confirm password", password=True) password = '' if password == '-' else password if password == '': putMessage("Password will be removed!", level=severity.WARNING) if mode == 'add': userID = backend.addUser(email, firstName, lastName, password, tags) user = backend.getUserByUserID(userID) if userID != None: putMessage("User [{:d}] added to the database".format(userID), level=severity.OK) return 0 else: putMessage("Failed to add user", level=severity.ERROR) return 1 else: backend.updateUser(user['userID'], email=email, firstName=firstName, lastName=lastName, status=status, tags=tags, password=password) putMessage("Information for user [{:d}] has been updated".format( user['userID']), level=severity.OK)
def editUser(userID=None, email=None, firstName=None, lastName=None, status=None, tags=None, password=None): if userID or email: userSearch = userID if userID else email user = getUser(userSearch, confirm=False) else: user = None if user: putMessage("Editing user [{:d}] '{:s} {:s}'".format( user['userID'], user['firstName'], user['lastName']), level=severity.WARNING) putMessage("Enter new information to change.") putMessage("Leave blank to leave stored info unchanged.") mode = 'edit' elif email or (not email and not userID): putMessage("Adding new user") mode = 'add' else: return while email == None: email = getInput("e-mail", user['email'] if user else '') if email == None and mode == "edit": break if email == '-': message = ("Not a valid e-mail address" if mode == "add" else "Cannot delete e-mail; edit instead.") putMessage(message, level=severity.ERROR) email = None elif not validateEmail(email): putMessage("Not a valid e-mail address", level=severity.ERROR) email = None else: if backend.getUserByEmail(email): putMessage("e-mail address is already in use!", level=severity.ERROR) email = None while firstName == None: firstName = firstName if firstName else getInput("First Name", user['firstName'] if user else '') if firstName == None and mode == 'edit': break elif firstName == None and mode == 'add': putMessage("This field is required", level=severity.ERROR) while lastName == None: lastName = lastName if lastName else getInput("Last Name", user['lastName'] if user else '') if lastName == None and mode == 'edit': break elif lastName == None and mode == 'add': putMessage("This field is required", level=severity.ERROR) while status == None: status = getInput("Status", user['status'] if user else '') if status == None: break if status == '-': putMessage("Cannot delete status; edit instead.", level=severity.ERROR) status = None elif status not in validStatuses: putMessage("Invalid status '{:s}'".format(status), level=severity.ERROR) status = None while tags == None: putMessage("Enter '-' to delete stored tags.") userInput = getInput("Tags", ", ".join(user['tags']) if user else '') if userInput == None: break if userInput == '-': tags = '' break tags = [x.strip() for x in userInput.split(',') if not x == ''] if not tags: tags = None continue for tag in tags: if tag not in validTags: putMessage("Invalid tag '{:s}'".format(tag), level=severity.ERROR) tags = None if not password: putMessage("Enter '-' to delete stored password.") password = getInput("Password", password=True) if password: confirmPassword = getInput("Confirm password", password = True) while password != confirmPassword: putMessage("Passwords do not match", level=severity.ERROR) password = getInput("Password", password =True) confirmPassword = getInput("Confirm password", password = True) password = '' if password == '-' else password if password == '': putMessage("Password will be removed!", level=severity.WARNING) if mode == 'add': userID = backend.addUser(email, firstName, lastName, password,tags) user = backend.getUserByUserID(userID) if userID != None: putMessage("User [{:d}] added to the database".format(userID), level=severity.OK) return 0 else: putMessage("Failed to add user", level=severity.ERROR) return 1 else: backend.updateUser(user['userID'], email=email, firstName=firstName, lastName=lastName, status=status, tags=tags, password=password) putMessage("Information for user [{:d}] has been updated".format(user['userID']), level= severity.OK)
def enroll(userID=None, nfcID=None, steal=False, quiet=False, reader=False): if os.geteuid() != 0: print "Root is required to run this script" return user = getUser(userID, confirm=(False if userID else True)) if user == None: return userID = user['userID'] if not reader: if not nfcID: putMessage("Enter key UID manually,") choice = getInput("or read key from NFC reader?", options=['m', 'r']) if choice == 'm': nfcID = getInput("Enter key UID") if not nfcID: try: restartDoorLock = True if killDoorLock() == 0 else False from rpi import interfaceControl while True: log.debug("Starting NFC read") if not quiet: putMessage("Swipe card now") retry = 0 while retry < 30: interfaceControl.setPowerStatus(True) nfcID = interfaceControl.nfcGetUID() interfaceControl.setPowerStatus(False) if nfcID: break time.sleep(0.75) retry += 1 log.debug("Finished NFC read") if not nfcID and not quiet: retry = getInput("Couldn't read card. Retry?", options=['y', 'n']) if nfcID != None or retry != 'y': break else: break except KeyboardInterrupt: log.info("Received KeyboardInterrupt") except: putMessage("Unexpected error: {:}".format(sys.exc_info()[0]), level=severity.ERROR) log.error("Unexpected error: {:}".format(sys.exc_info()[0])) raise finally: interfaceControl.cleanup() if restartDoorLock: log.info("restarting door-lock.py") startDoorLock() if nfcID != None: # @TODO: catch duplicate key error, exit with error status try: backend.enroll(nfcID, userID, steal) putMessage("User [{:d}] enrolled with ID: {:s}".format( userID, nfcID), level=severity.OK) except IntegrityError: putMessage("Key is already assigned!", level=severity.WARNING) putMessage("User not enrolled", level=severity.ERROR) else: putMessage("Did not enroll user", level=severity.WARNING)