You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.5 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#! env/bin/python3
import sys
import requests
import logging
from typing import Tuple, List, Union, Dict
from pprint import pprint
LOG_LEVELS = {logging.ERROR: "ERROR",
logging.INFO: "INFO",
logging.WARNING: "WARNING",
logging.DEBUG: "DEBUG",
logging.CRITICAL: "CRITICAL",
}
def main():
# Обращаемся к корню сервера для получения списка доступных ресурсов.
data, links = get_root_data("http://127.0.0.1:2007")
if data is None:
return
print(f"Connected to {data['name']}")
print("\nRoot links:")
pprint(links)
# Получаем данные о текущей команде.
cl_command, cl_parameters = get_console_command()
print_console_parameters(cl_parameters)
data, links, parameters = find_command(cl_command, links)
if data is None:
return
print_command_info(data)
print_parameters(parameters)
links = start_command_configuration(links)
print("\nConfig links:")
pprint(links)
print("\nSetting Parameters")
print("\nLinks:")
data, links = set_parameters(links, cl_parameters)
pprint(links)
if data is not None:
print_config_errors(data)
print("\nCancel configuration:")
result = cancel_configuration(links)
pprint(result)
def get_root_data(base_url: str) -> Tuple[Union[dict, None],
Union[dict, None]]:
try:
response = requests.get(f"{base_url}/")
if response.status_code == 200:
data = response.json()["data"]
links = response.json()["_links"]
return data, links
else:
detail = response.json()['detail']
print(f"{response.status_code}: {detail}")
except Exception as error:
print("ERROR:", str(error))
return None, None
def find_command(console_command: str, links: dict) -> dict:
find_uri = links["find_command"]["href"].format(
console_command=console_command,
is_gui=0)
response = requests.get(find_uri)
if response.status_code == 200:
json = response.json()
data = json["data"]
links = json["_links"]
parameters = json["_embedded"]["parameters"]
return data, links, parameters
else:
detail = response.json()['detail']
print(f"{response.status_code}: {detail}")
return None, None, None
def get_parameters(links: dict) -> List[dict]:
params_uri = links["parameters"]["href"]
response = requests.get(params_uri)
if response.status_code == 200:
return response.json()
else:
print(f"Response Code: {response.status_code}, {response.text}")
return None
def start_command_configuration(links: dict) -> Union[dict, None]:
configure_uri = links["configure"]["href"]
response = requests.post(configure_uri)
if response.status_code == 200:
json = response.json()
return json["_links"]
else:
print(f"Response Code: {response.status_code}, {response.text}")
return None
def set_parameters(links: dict, parameters: List[dict]) -> Dict[str, dict]:
configure_uri = links["configure"]["href"]
response = requests.patch(configure_uri, json=parameters)
if response.status_code == 200:
json = response.json()
data = json.get("data", None)
links = json["_links"]
return data, links
else:
print(f"Response Code: {response.status_code}, {response.text}")
return None, None
def cancel_configuration(links: dict) -> List[dict]:
configure_uri = links["cancel"]["href"]
response = requests.delete(configure_uri)
if response.status_code == 200:
return response.json()
else:
print(f"Response Code: {response.status_code}, {response.text}")
return None
def get_console_command() -> Tuple[str, List[str]]:
offset = 1 if sys.argv[0].endswith("client.py") else 0
command_args = []
if len(sys.argv) < 1 + offset:
command = None
else:
command = sys.argv[offset].split("/")[-1]
args = sys.argv[1 + offset:]
if len(args) >= 2 and not (len(args) % 2):
for index in range(0, len(args) - len(args) % 2, 2):
id, value = args[index: index + 2]
command_args.append({"id": id.strip("-"),
"value": value})
return command, command_args
def print_console_parameters(parameters: dict):
print("\nConsole parameters:")
for parameter in parameters:
print(f" {parameter['id']} = {parameter['value']}")
def print_command_info(data: dict) -> None:
print(f"\nCurrent command: {data['id']}\n"
f" category: {data['category']}\n"
f" title: {data['title']}")
def print_parameters(parameters_data: list) -> None:
parameters = parameters_data["data"]
print("\nParameters:")
for group in parameters:
print(f" {group['group_id']}")
group_parameters = group["parameters"]
for parameter in group_parameters:
print(f" parameter:\t{parameter['id']}\n"
f" default:\t{parameter['default']}\n")
def print_config_errors(errors: Dict[str, str]) -> None:
print("\nConfiguration errors:")
for parameter_id, error in errors.items():
print(f" {parameter_id}: {error}")
if __name__ == "__main__":
main()