Ваша заботливая поддержка отправила регистрироваться на форуме и строчить обращение, поэтому я здесь. В ручке /rci/show/ip/hotspot/host версии OS 4.2.1 не хватает policy в ответе. Других способов получить policy для host нет, в /rci/show/running-config тоже. Необходимо добавить. Возражения не принимаю, там обязано быть это поле, и нет его только по чьему-то недосмотру
А на полдник держите сниппет для аутентификации на Python
#!/usr/bin/env python3
import argparse
import hashlib
import netifaces
import requests
def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser()
parser.add_argument("--login", "-l", default="login")
parser.add_argument("--password", "-p", default="password")
parser.add_argument("--policy", "-t", action=argparse.BooleanOptionalAction)
return parser.parse_args()
def hash_password(login: str, password: str, challenge: str, realm: str) -> str:
md5 = hashlib.md5(f"{login}:{realm}:{password}".encode()).hexdigest()
return hashlib.sha256(f"{challenge}{md5}".encode()).hexdigest()
def authenticate(url: str, login: str, password: str) -> requests.Session:
session = requests.Session()
response = session.get(url) # returns 401; do not call raise_for_status
challenge = response.headers["X-NDM-Challenge"]
realm = response.headers["X-NDM-Realm"]
password_hash = hash_password(login, password, challenge, realm)
response = session.post(url, json={"login": login, "password": password_hash})
response.raise_for_status()
return session
def main() -> None:
args = parse_args()
gateway, interface = netifaces.gateways()["default"][netifaces.AF_INET]
with open(f"/sys/class/net/{interface}/address", "rt") as f:
mac = f.read().strip()
session = authenticate(f"http://{gateway}/auth", args.login, args.password)
response = session.post(
f"http://{gateway}/rci/ip/hotspot/host",
json={"mac": mac, "policy": "Policy0" if args.policy else False},
)
response.raise_for_status()
print(
(
status[0]
if len(status := response.json().get("policy", {}).get("status", [])) > 0
else {}
).get("message", "gateway sent no message"),
)
if __name__ == "__main__":
main()