Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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)
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
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)