Compare commits

...

7 Commits

Author SHA1 Message Date
Alejandro Sirgo Rica 4fe97139c5 cli: remove duplicate payload argument in get()
Use only one payload function argument in the http get() function.
2024-12-18 14:10:52 +01:00
Alejandro Sirgo Rica 7d2678422e cli: cleanup http error handling
Use more specific exception request exception handling to provide
better error messages.

Define an interal request function for get, post and delete to
reuse code.
2024-12-16 12:49:46 +01:00
Alejandro Sirgo Rica 2f870d7b6a cli: add lives alias to the live command argument 2024-12-13 13:59:54 +01:00
Alejandro Sirgo Rica 80a68ceb5a live: use human readable date in live list
Parse the unix timestamp into a human readable format like
"2024-11-25 12:28:19".

Make print_json() print from string and from a json object to
enable manipulation of data before printing.
2024-12-13 13:59:39 +01:00
Alejandro Sirgo Rica 12d965ce1c cli: improve HTTP status code error logging
Use a different message for each status code when the request is
not successful.
2024-12-10 11:28:44 +01:00
Alejandro Sirgo Rica 4b77e1bca8 folder: fix add folder command
Fix typo causing an error in the add folder command.
2024-12-10 10:45:31 +01:00
Alejandro Sirgo Rica 0225502832 cli: add live set --default command
Add command to set a new default live.

Command example:
ogcli set live --default --name ogLive-5.4.0-r20220408
2024-12-05 13:25:46 +01:00
4 changed files with 95 additions and 46 deletions

View File

@ -26,55 +26,62 @@ import requests
import sys
def _log_http_status_code(res):
if res.status_code == 400:
print('Error 400: invalid payload')
elif res.status_code == 404:
print('Error 404: object not found')
elif res.status_code == 405:
print('Error 405: method not allowed')
elif res.status_code == 409:
print('Error 409: object already exists')
elif res.status_code == 423:
print('Error 423: object in use')
elif res.status_code == 501:
print('Error 501: cannot connect to database')
elif res.status_code == 507:
print('Error 500: disk full')
else:
print(f'Received status code {res.status_code}')
class OgREST():
def __init__(self, ip, port, api_token):
if not ip or not port or not api_token:
raise ValueError("IP, port, and API token must be provided.")
self.URL = f'http://{ip}:{port}'
self.HEADERS = {'Authorization': api_token}
def get(self, path, payload=None):
def _request(self, method, path, payload, expected_status):
try:
res = requests.get(f'{self.URL}{path}',
headers=self.HEADERS,
json=payload)
if res.status_code != 200:
print(f"Error: Request to ogServer failed with status code {res.status_code}")
res = requests.request(
method,
f'{self.URL}{path}',
headers=self.HEADERS,
json=payload,
)
if res.status_code not in expected_status:
_log_http_status_code(res)
return None
return res
except requests.exceptions.ConnectionError:
print("Cannot connect to ogserver")
except requests.exceptions.Timeout:
print("Request to ogserver timed out")
except requests.exceptions.TooManyRedirects:
print("Too many redirects occurred while contacting ogserver")
except requests.exceptions.RequestException as e:
print(f"Error: Cannot connect to ogServer: {e}")
return None
print(f"An error occurred while contacting ogserver: {e}")
return None
return res
def get(self, path, payload=None):
return self._request('GET', path, payload, expected_status={200})
def post(self, path, payload):
try:
res = requests.post(f'{self.URL}{path}',
headers=self.HEADERS,
json=payload)
if res.status_code not in {200, 202}:
print(f"Error: Request to ogServer failed with status code {res.status_code}")
return None
except requests.exceptions.RequestException as e:
print(f"Error: Cannot connect to ogServer: {e}")
return None
return res
return self._request('POST', path, payload, expected_status={200, 202})
def delete(self, path, payload):
try:
res = requests.delete(f'{self.URL}{path}',
headers=self.HEADERS,
json=payload)
if res.status_code != 200:
print(f"Error: Request to ogServer failed with status code {res.status_code}")
return None
except IOError as e:
print(f"Error: Cannot connect to ogServer: {e}")
return None
return res
return self._request('DELETE', path, payload, expected_status={200})
class OgCLI():
@ -83,7 +90,8 @@ class OgCLI():
def list(self, args):
choices = ['clients', 'scopes', 'modes', 'hardware',
'client', 'images', 'disks', 'servers', 'repos', 'live']
'client', 'images', 'disks', 'servers', 'repos',
'live', 'lives']
parser = argparse.ArgumentParser(prog='ogcli list')
parser.add_argument('item', choices=choices)
@ -112,12 +120,12 @@ class OgCLI():
ret = OgRepo.list_repos(self.rest)
elif parsed_args.item == 'servers':
ret = OgServer.list_servers(self.rest)
elif parsed_args.item == 'live':
elif parsed_args.item in ['live', 'lives']:
ret = OgLive.list_live(self.rest, args[1:])
return ret
def set(self, args):
choices = ['modes', 'mode', 'repo']
choices = ['modes', 'mode', 'repo', 'live', 'lives']
parser = argparse.ArgumentParser(prog='ogcli set')
parser.add_argument('item', choices=choices)
@ -132,6 +140,8 @@ class OgCLI():
ret = OgModes.set_modes(self.rest, args[1:])
elif parsed_args.item == 'repo':
ret = OgRepo.set_repo(self.rest, args[1:])
elif parsed_args.item in ['live', 'lives']:
ret = OgLive.set_live(self.rest, args[1:])
return ret
def request(self, args):
@ -231,7 +241,8 @@ class OgCLI():
return ret
def delete(self, args):
choices = ['server', 'repo', 'center', 'room', 'client', 'folder', 'live']
choices = ['server', 'repo', 'center', 'room', 'client', 'folder',
'live', 'lives']
parser = argparse.ArgumentParser(prog='ogcli delete')
parser.add_argument('delete_obj', choices=choices)
@ -253,7 +264,7 @@ class OgCLI():
ret = OgClient.delete_client(self.rest, args[1:])
elif parsed_args.delete_obj == 'folder':
ret = OgFolder.delete_folder(self.rest, args[1:])
elif parsed_args.delete_obj == 'live':
elif parsed_args.delete_obj in ['live', 'lives']:
ret = OgLive.delete_live(self.rest, args[1:])
return ret
@ -284,7 +295,7 @@ class OgCLI():
return ret
def install(self, args):
choices = ['live']
choices = ['live', 'lives']
parser = argparse.ArgumentParser(prog='ogcli install')
parser.add_argument('install_obj', choices=choices)
@ -295,6 +306,6 @@ class OgCLI():
parsed_args = parser.parse_args([args[0]])
ret = 0
if parsed_args.install_obj == 'live':
if parsed_args.install_obj in ['live', 'lives']:
ret = OgLive.install_live(self.rest, args[1:])
return ret

View File

@ -39,7 +39,7 @@ class OgFolder():
payload['room'] = parsed_args.room_id
if parsed_args.center_id:
payload['center'] = parsed_args.center_id
res = restest.post('/folder/add', payload=payload)
res = rest.post('/folder/add', payload=payload)
if not res:
return 1
return 0

View File

@ -8,6 +8,7 @@
import argparse
from cli.config import cfg, OG_CLI_CFG_PATH
from datetime import datetime
from cli.utils import *
import requests
import shutil
@ -23,6 +24,15 @@ class OgLive():
]
tmp_extension = '.tmp'
@staticmethod
def _parse_timestamps(payload):
for elem in payload['oglive']:
if 'date' in elem:
timestamp = elem['date']
readable_date = datetime.fromtimestamp(timestamp).strftime("%Y-%m-%d %H:%M:%S")
elem['date'] = readable_date
@staticmethod
def _get_local_live_dir():
local_live_dir = cfg.get('local_live', '/var/www/html/ogrelive')
@ -155,7 +165,10 @@ class OgLive():
res = rest.get('/oglive/list')
if not res:
return 1
print_json(res.text)
live_data = json.loads(res.text)
OgLive._parse_timestamps(live_data)
print_json(live_data)
return 0
@staticmethod
@ -286,3 +299,25 @@ class OgLive():
print(f'Error: no directory found for {live_name}')
return 0
@staticmethod
def set_live(rest, args):
parser = argparse.ArgumentParser(prog='ogcli set live')
parser.add_argument('--default',
action='store_true',
required=True,
help='set the default live image')
parser.add_argument('--name',
nargs='?',
required=True,
help='Name of the live')
parsed_args = parser.parse_args(args)
live_name = parsed_args.name
payload = {'name': live_name}
res = rest.post('/oglive/default', payload=payload)
if not res:
return 1
return 0

View File

@ -49,8 +49,11 @@ def reorder_json_tree(payload):
payload[k] = val
reorder_json_tree(val)
def print_json(text):
payload = json.loads(text)
def print_json(data):
if isinstance(data, (dict, list)):
payload = data
else:
payload = json.loads(data)
reorder_json_tree(payload)
print(json.dumps(payload, indent=2, ensure_ascii=False))