1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
|
"""Firmware endpoint module."""
from __future__ import annotations
from typing import Any
from asusrouter.const import UNKNOWN_MEMBER
from asusrouter.modules.data import AsusData
from asusrouter.modules.firmware import (
Firmware,
WebsError,
WebsFlag,
WebsUpdate,
WebsUpgrade,
)
from asusrouter.tools.converters import clean_string, safe_enum, safe_int
from asusrouter.tools.readers import read_js_variables as read # noqa: F401
REQUIRE_FIRMWARE = True
def process(data: dict[str, Any]) -> dict[AsusData, Any]:
"""Process firmware data."""
# Stay on the safe side with Enums
# since the endpoint can provide empty strings
_available = Firmware(data.get("webs_state_info", "")).safe()
_available_beta = Firmware(data.get("webs_state_info_beta", "")).safe()
# Load all the static data
firmware: dict[str, Any] = {
"current": None,
"state": False,
"available": None,
"state_beta": False,
"available_beta": None,
"webs": {
"update": safe_enum(
WebsUpdate,
safe_int(data.get("webs_state_update")),
default=WebsUpdate.UNKNOWN,
),
"upgrade": safe_enum(
WebsUpgrade,
safe_int(data.get("webs_state_upgrade")),
default=WebsUpgrade.INACTIVE,
),
"available": _available,
"available_beta": _available_beta,
"required": Firmware(data.get("webs_state_REQinfo", "")).safe(),
"error": safe_enum(
WebsError,
safe_int(data.get("webs_state_error")),
default_value=UNKNOWN_MEMBER,
),
"flag": safe_enum(
WebsFlag,
safe_int(data.get("webs_state_flag")),
default_value=UNKNOWN_MEMBER,
),
"level": safe_int(data.get("webs_state_level")),
},
"cfg": {
"check": safe_int(data.get("cfg_check")),
"upgrade": safe_int(data.get("cfg_upgrade")),
},
"sig": {
"update": safe_int(data.get("sig_state_update")),
"upgrade": safe_int(data.get("sig_state_upgrade")),
"version": clean_string(data.get("sig_ver")),
"error": safe_int(data.get("sig_state_error")),
"flag": safe_int(data.get("sig_state_flag")),
},
"hndwr": {
"status": safe_int(data.get("hndwr_status")),
},
}
# Check the current firmware
_current = data.get("firmware")
firmware["current"] = _current
# Check if the stable firmware is available
firmware["state"] = (
_current < _available if _current else _available is not None
)
if firmware["state"]:
firmware["available"] = _available
# Check if the beta firmware is available
firmware["state_beta"] = (
_current < _available_beta if _current else _available_beta is not None
)
if firmware["state_beta"]:
firmware["available_beta"] = _available_beta
return {AsusData.FIRMWARE: firmware}
|