Jump to content

Question

Posted (edited)

Ваша заботливая поддержка отправила регистрироваться на форуме и строчить обращение, поэтому я здесь. В ручке /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()

 

Edited by ihvkzoaunybmgbbufg

1 answer to this question

Recommended Posts

  • 0
Posted
3 часа назад, ihvkzoaunybmgbbufg сказал:

В ручке /rci/show/ip/hotspot/host версии OS 4.2.1 не хватает policy в ответе. Других способов получить policy для host нет, в /rci/show/running-config тоже.

Есть в /rci/show/rc/ip/hotspot.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...

Important Information

This site uses cookies. By clicking "I accept" or continuing to browse the site, you authorize their use in accordance with the Privacy Policy.