コード例 #1
0
ファイル: device_status.py プロジェクト: emanuel-bs/quokka
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
コード例 #2
0
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
コード例 #3
0
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"])
コード例 #4
0
    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")