Better handling if invalid known_devices.csv encountered.

This commit is contained in:
Paulus Schoutsen 2013-10-06 16:54:46 -07:00
parent 59fa58beaf
commit 4ce550b432

View File

@ -89,8 +89,12 @@ class DeviceTracker(object):
self.lock = threading.Lock() self.lock = threading.Lock()
# Dictionary to keep track of known devices and devices we track
self.known_devices = {} self.known_devices = {}
# Did we encounter a valid known devices file
self.invalid_known_devices_file = False
# Read known devices if file exists # Read known devices if file exists
if os.path.isfile(KNOWN_DEVICES_FILE): if os.path.isfile(KNOWN_DEVICES_FILE):
with open(KNOWN_DEVICES_FILE) as inp: with open(KNOWN_DEVICES_FILE) as inp:
@ -100,33 +104,37 @@ class DeviceTracker(object):
# so we can ensure we have unique categories. # so we can ensure we have unique categories.
used_categories = [] used_categories = []
for row in csv.DictReader(inp): try:
device = row['device'] for row in csv.DictReader(inp):
device = row['device']
row['track'] = True if row['track'] == '1' else False row['track'] = True if row['track'] == '1' else False
self.known_devices[device] = row self.known_devices[device] = row
# If we track this device setup tracking variables # If we track this device setup tracking variables
if row['track']: if row['track']:
self.known_devices[device]['last_seen'] = default_last_seen self.known_devices[device]['last_seen'] = default_last_seen
# Make sure that each device is mapped to a unique category name # Make sure that each device is mapped to a unique category name
name = row['name'] if row['name'] else "unnamed_device" name = row['name'] if row['name'] else "unnamed_device"
tries = 0 tries = 0
while True: while True:
tries += 1 tries += 1
category = STATE_CATEGORY_DEVICE_FORMAT.format(name if tries == 1 else "{}_{}".format(name, tries)) category = STATE_CATEGORY_DEVICE_FORMAT.format(name if tries == 1 else "{}_{}".format(name, tries))
if category not in used_categories: if category not in used_categories:
break break
self.known_devices[device]['category'] = category self.known_devices[device]['category'] = category
used_categories.append(category) used_categories.append(category)
except KeyError:
self.invalid_known_devices_file = False
self.logger.warning("Invalid {} found. We won't update it with new found devices.".format(KNOWN_DEVICES_FILE))
if len(self.device_state_categories()) == 0: if len(self.device_state_categories()) == 0:
self.logger.warning("No devices to track. Please update {}.".format(KNOWN_DEVICES_FILE)) self.logger.warning("No devices to track. Please update {}.".format(KNOWN_DEVICES_FILE))
@ -169,30 +177,32 @@ class DeviceTracker(object):
self.statemachine.set_state(STATE_CATEGORY_ALL_DEVICES, all_devices_state) self.statemachine.set_state(STATE_CATEGORY_ALL_DEVICES, all_devices_state)
# If we come along any unknown devices we will write them to the known devices file # If we come along any unknown devices we will write them to the known devices file
unknown_devices = [device for device in found_devices if device not in self.known_devices] # but only if we did not encounter an invalid known devices file
if not self.invalid_known_devices_file:
unknown_devices = [device for device in found_devices if device not in self.known_devices]
if len(unknown_devices) > 0: if len(unknown_devices) > 0:
try: try:
# If file does not exist we will write the header too # If file does not exist we will write the header too
should_write_header = not os.path.isfile(KNOWN_DEVICES_FILE) should_write_header = not os.path.isfile(KNOWN_DEVICES_FILE)
with open(KNOWN_DEVICES_FILE, 'a') as outp: with open(KNOWN_DEVICES_FILE, 'a') as outp:
self.logger.info("DeviceTracker:Found {} new devices, updating {}".format(len(unknown_devices), KNOWN_DEVICES_FILE)) self.logger.info("DeviceTracker:Found {} new devices, updating {}".format(len(unknown_devices), KNOWN_DEVICES_FILE))
writer = csv.writer(outp) writer = csv.writer(outp)
if should_write_header: if should_write_header:
writer.writerow(("device", "name", "track")) writer.writerow(("device", "name", "track"))
for device in unknown_devices: for device in unknown_devices:
# See if the device scanner knows the name # See if the device scanner knows the name
temp_name = self.device_scanner.get_device_name(device) temp_name = self.device_scanner.get_device_name(device)
name = temp_name if temp_name else "unknown_device" name = temp_name if temp_name else "unknown_device"
writer.writerow((device, name, 0)) writer.writerow((device, name, 0))
self.known_devices[device] = {'name':name, 'track': False} self.known_devices[device] = {'name':name, 'track': False}
except IOError: except IOError:
self.logger.exception("DeviceTracker:Error updating {} with {} new devices".format(KNOWN_DEVICES_FILE, len(unknown_devices))) self.logger.exception("DeviceTracker:Error updating {} with {} new devices".format(KNOWN_DEVICES_FILE, len(unknown_devices)))
self.lock.release() self.lock.release()