[5f92257] | 1 | # Copyright (C) 2020-2021 Soleta Networks <info@soleta.eu> |
---|
[14b7729] | 2 | # |
---|
| 3 | # This program is free software: you can redistribute it and/or modify it under |
---|
| 4 | # the terms of the GNU Affero General Public License as published by the |
---|
[5f92257] | 5 | # Free Software Foundation; either version 3 of the License, or |
---|
| 6 | # (at your option) any later version. |
---|
[14b7729] | 7 | |
---|
[dbf0f00] | 8 | from cli.objects.client import OgClient |
---|
| 9 | from cli.objects.scopes import OgScope |
---|
| 10 | from cli.objects.modes import OgModes |
---|
[0f55ce7] | 11 | from cli.objects.wol import OgWol |
---|
[5abe862] | 12 | from cli.objects.images import OgImage |
---|
[4dfb90c] | 13 | from cli.objects.disks import OgDisk |
---|
[19e7d98] | 14 | from cli.objects.poweroff import OgPoweroff |
---|
[2f824d8] | 15 | from cli.objects.reboot import OgReboot |
---|
[dbdfc10] | 16 | import argparse |
---|
[2120ef6] | 17 | import requests |
---|
[dbdfc10] | 18 | import sys |
---|
[2120ef6] | 19 | |
---|
[d90ab82] | 20 | |
---|
[dbdfc10] | 21 | class OgREST(): |
---|
[d90ab82] | 22 | def __init__(self, ip, port, api_token): |
---|
| 23 | self.URL = f'http://{ip}:{port}' |
---|
| 24 | self.HEADERS = {'Authorization': api_token} |
---|
| 25 | |
---|
| 26 | def get(self, path, payload=None): |
---|
| 27 | try: |
---|
| 28 | r = requests.get(f'{self.URL}{path}', |
---|
| 29 | headers=self.HEADERS, |
---|
| 30 | json=payload) |
---|
| 31 | if r.status_code != 200: |
---|
| 32 | sys.exit(f"Cannot connect to ogServer: " |
---|
| 33 | f"{r.status_code} HTTP status code") |
---|
| 34 | except IOError as e: |
---|
| 35 | sys.exit(f"Cannot connect to ogServer: {e}") |
---|
| 36 | return r |
---|
| 37 | |
---|
| 38 | def post(self, path, payload): |
---|
| 39 | try: |
---|
| 40 | r = requests.post(f'{self.URL}{path}', |
---|
| 41 | headers=self.HEADERS, |
---|
| 42 | json=payload) |
---|
| 43 | print(r.text) |
---|
| 44 | if r.status_code not in {200, 202}: |
---|
| 45 | sys.exit(f"Cannot connect to ogServer: " |
---|
| 46 | f"{r.status_code} HTTP status code") |
---|
| 47 | except IOError as e: |
---|
| 48 | sys.exit(f"Cannot connect to ogServer: {e}") |
---|
| 49 | return r |
---|
| 50 | |
---|
[4dddd35] | 51 | |
---|
[dbdfc10] | 52 | class OgCLI(): |
---|
[d90ab82] | 53 | def __init__(self, cfg): |
---|
| 54 | self.rest = OgREST(cfg['ip'], cfg['port'], cfg['api_token']) |
---|
| 55 | |
---|
| 56 | def list(self, args): |
---|
| 57 | choices = ['clients', 'scopes', 'modes', 'hardware', |
---|
| 58 | 'client', 'images', 'disks'] |
---|
| 59 | parser = argparse.ArgumentParser(prog='ogcli list') |
---|
| 60 | parser.add_argument('item', choices=choices) |
---|
| 61 | parsed_args = parser.parse_args([args[0]]) |
---|
| 62 | |
---|
| 63 | if parsed_args.item == 'clients': |
---|
| 64 | OgClient.list_clients(self.rest) |
---|
| 65 | elif parsed_args.item == 'client': |
---|
| 66 | OgClient.get_client_properties(self.rest, args[1:]) |
---|
| 67 | elif parsed_args.item == 'hardware': |
---|
| 68 | OgClient.list_client_hardware(self.rest, args[1:]) |
---|
| 69 | elif parsed_args.item == 'modes': |
---|
| 70 | OgModes.list_available_modes(self.rest) |
---|
| 71 | elif parsed_args.item == 'scopes': |
---|
| 72 | OgScope.list_scopes(self.rest) |
---|
| 73 | elif parsed_args.item == 'images': |
---|
| 74 | OgImage.list_images(self.rest) |
---|
| 75 | elif parsed_args.item == 'disks': |
---|
| 76 | OgDisk.list_disks(self.rest, args[1:]) |
---|
| 77 | |
---|
| 78 | def set(self, args): |
---|
| 79 | choices = ['modes', 'mode'] |
---|
| 80 | parser = argparse.ArgumentParser(prog='ogcli set') |
---|
| 81 | parser.add_argument('item', choices=choices) |
---|
| 82 | parsed_args = parser.parse_args([args[0]]) |
---|
| 83 | |
---|
| 84 | if parsed_args.item in choices: |
---|
| 85 | OgModes.set_modes(self.rest, args[1:]) |
---|
| 86 | |
---|
| 87 | def send(self, args): |
---|
[2f824d8] | 88 | choices = ['reboot', 'refresh', 'poweroff', 'wol'] |
---|
[d90ab82] | 89 | parser = argparse.ArgumentParser(prog='ogcli send') |
---|
| 90 | parser.add_argument('send_obj', choices=choices) |
---|
| 91 | parsed_args = parser.parse_args([args[0]]) |
---|
| 92 | |
---|
| 93 | if parsed_args.send_obj == 'wol': |
---|
| 94 | OgWol.send_wol(self.rest, args[1:]) |
---|
| 95 | elif parsed_args.send_obj == 'poweroff': |
---|
| 96 | OgPoweroff.send_poweroff(self.rest, args[1:]) |
---|
| 97 | elif parsed_args.send_obj == 'refresh': |
---|
| 98 | OgClient.send_refresh(self.rest, args[1:]) |
---|
[2f824d8] | 99 | elif parsed_args.send_obj == 'reboot': |
---|
| 100 | OgReboot.send_reboot(self.rest, args[1:]) |
---|
[d90ab82] | 101 | |
---|
| 102 | def restore(self, args): |
---|
| 103 | choices = ['image'] |
---|
| 104 | parser = argparse.ArgumentParser(prog='ogcli restore') |
---|
| 105 | parser.add_argument('send_obj', choices=choices) |
---|
| 106 | parsed_args = parser.parse_args([args[0]]) |
---|
| 107 | |
---|
| 108 | if parsed_args.send_obj == 'image': |
---|
| 109 | OgImage.restore_image(self.rest, args[1:]) |
---|
| 110 | |
---|
| 111 | def create(self, args): |
---|
| 112 | choices = ['image'] |
---|
| 113 | parser = argparse.ArgumentParser(prog='ogcli create') |
---|
| 114 | parser.add_argument('create_obj', choices=choices) |
---|
| 115 | parsed_args = parser.parse_args([args[0]]) |
---|
| 116 | |
---|
| 117 | if parsed_args.create_obj == 'image': |
---|
| 118 | OgImage.create_image(self.rest, args[1:]) |
---|
| 119 | |
---|
| 120 | def setup(self, args): |
---|
| 121 | choices = ['disk'] |
---|
| 122 | parser = argparse.ArgumentParser(prog='ogcli setup') |
---|
| 123 | parser.add_argument('setup_obj', choices=choices) |
---|
| 124 | parsed_args = parser.parse_args([args[0]]) |
---|
| 125 | |
---|
| 126 | if parsed_args.setup_obj == 'disk': |
---|
| 127 | OgDisk.setup_disk(self.rest, args[1:]) |
---|