Перейти к содержанию

Вопрос

Опубликовано (изменено)

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

 

Изменено пользователем ihvkzoaunybmgbbufg

Рекомендуемые сообщения

  • 0
Опубликовано
3 часа назад, ihvkzoaunybmgbbufg сказал:

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

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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...

Важная информация

На этом сайте используются файлы cookie. Нажимая "Я принимаю" или продолжая просмотр сайта, вы разрешаете их использование: Политика конфиденциальности.