def get_device_status(device): device_status = dict() device_status["availability"] = False device_status["response_time"] = None device_status["cpu"] = None device_status["memory"] = None device_status["last_heard"] = None env = None response_time = None if device["os"] in {"ios", "iosxe", "nxos-ssh"} and device["transport"] == "napalm": try: time_start = time.time() result, env = get_device_info(device, "environment") response_time = time.time() - time_start except BaseException as e: info = f"!!! Exception in monitoring device, get environment: {repr(e)}" log_console(info) log_event( str(datetime.now())[:-3], "device", device["name"], "SEVERE", info ) result = "failed" else: try: time_start = time.time() result, facts = get_device_info(device, "facts", get_live_info=True) response_time = time.time() - time_start except BaseException as e: info = f"!!! Exception in monitoring device, get facts: {repr(e)}" log_console(info) log_event( str(datetime.now())[:-3], "device", device["name"], "SEVERE", info ) result = "failed" if result != "success": log_event( str(datetime.now())[:-3], "device monitor", device["name"], "SEVERE", f"Availability failed for device: {device['name']}", ) else: device_status["availability"] = True if response_time: device_status["response_time"] = int(response_time * 1000) device_status["last_heard"] = str(datetime.now())[:-3] if env: device_status["cpu"] = calculate_cpu(env["environment"]["cpu"]) device_status["memory"] = calculate_memory(env["environment"]["memory"]) return device_status
def device_info(): device_name = request.args.get("device") requested_info = request.args.get("info") live = request.args.get("live") if not device_name or not requested_info: return "Must provide device and info", 400 result, info = get_device(device_name=device_name) if result == "failed": return info, 406 device = info if not live: get_live_info = False else: if live.lower() not in {"true", "false"}: return "Value of 'live', if specified, must be 'true' or 'false'" else: get_live_info = bool(live) status, result_info = get_device_info(device, requested_info, get_live_info) if status == "success": return result_info, 200 else: return result_info, 406
def check_os_compliance(device): facts = None standard = Compliance.query.filter_by(**{ "vendor": device["vendor"], "os": device["os"] }).one_or_none() if standard is None: log_console( f"!!! Error retrieving compliance record for this device {device['name']}" ) return False try: result, facts = get_device_info(device, "facts", get_live_info=True) except BaseException as e: log_console( f"!!! Exception getting device info in compliance monitoring for {device['name']}: {repr(e)}" ) result = "failed" if result == "failed" or not facts or "facts" not in facts or "os_version" not in facts[ "facts"]: log_console( f"!!! Error retrieving version info for this device {device['name']}" ) return False return check_version(device, standard=standard.standard_version, actual=facts["facts"]["os_version"])
def monitor(self, interval): while True and not self.terminate: device_ids = get_all_device_ids() log_console( f"Monitor: Beginning Configuration monitoring for {len(device_ids)} devices" ) for device_id in device_ids: if self.terminate: break result, device = get_device( device_id=device_id ) # re-retrieve device as it may have been changed if result != "success": log_console( f"Configuration Monitor: Error retrieving device from DB. id: {device_id}, error: {device}" ) continue try: result, config = get_device_info(device, "config", get_live_info=True) if result != "success": log_console( f"!!! Unable to get device info (config) for {device['name']}" ) continue except BaseException as e: log_console( f"!!! Exception getting device info in configuration monitoring for {device['name']}: {repr(e)}" ) continue # If we made it here, we got the configuration, so store it in the DB record_device_config(device_id, config["config"]["running"]) log_event( str(datetime.now())[:-3], "configuration", device['name'], "INFO", f"Stored configuration for: {device['name']}", ) for _ in range(0, int(interval / 10)): sleep(10) if self.terminate: break log_console("...gracefully exiting monitor:configuration")