1 | # Copyright (C) 2020-2021 Soleta Networks <info@soleta.eu> |
---|
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 |
---|
5 | # Free Software Foundation; either version 3 of the License, or |
---|
6 | # (at your option) any later version. |
---|
7 | |
---|
8 | from urllib.parse import urlparse |
---|
9 | from cli.utils import * |
---|
10 | |
---|
11 | import argparse |
---|
12 | |
---|
13 | |
---|
14 | class OgImage(): |
---|
15 | |
---|
16 | @staticmethod |
---|
17 | def list_images(rest): |
---|
18 | r = rest.get('/images') |
---|
19 | print_json(r.text) |
---|
20 | |
---|
21 | @staticmethod |
---|
22 | def restore_image(rest, args): |
---|
23 | parser = argparse.ArgumentParser() |
---|
24 | parser.add_argument('--disk', |
---|
25 | nargs='?', |
---|
26 | required=True, |
---|
27 | help='Disk') |
---|
28 | parser.add_argument('--part', |
---|
29 | nargs='?', |
---|
30 | required=True, |
---|
31 | help='Partition') |
---|
32 | parser.add_argument('--id', |
---|
33 | nargs='?', |
---|
34 | type=int, |
---|
35 | required=True, |
---|
36 | help='Image id to be restored') |
---|
37 | parser.add_argument('--type', |
---|
38 | nargs='?', |
---|
39 | required=False, |
---|
40 | choices=['unicast', |
---|
41 | 'unicast-direct', 'tiptorrent'], |
---|
42 | default='tiptorrent', |
---|
43 | help='Transfer method. (Default: tiptorrent)') |
---|
44 | parser.add_argument('--repo', |
---|
45 | nargs='?', |
---|
46 | default=urlparse(rest.URL).netloc.split(':')[0], |
---|
47 | help='Images repository ip') |
---|
48 | group = parser.add_argument_group('clients', 'Client selection args') |
---|
49 | group.add_argument('--center-id', |
---|
50 | type=int, |
---|
51 | action='append', |
---|
52 | default=[], |
---|
53 | required=False, |
---|
54 | help='Clients from given center id') |
---|
55 | group.add_argument('--room-id', |
---|
56 | type=int, |
---|
57 | action='append', |
---|
58 | default=[], |
---|
59 | required=False, |
---|
60 | help='Clients from given room id') |
---|
61 | group.add_argument('--client-ip', |
---|
62 | action='append', |
---|
63 | default=[], |
---|
64 | required=False, |
---|
65 | help='Specific client IP') |
---|
66 | parsed_args = parser.parse_args(args) |
---|
67 | |
---|
68 | r = rest.get('/scopes') |
---|
69 | scopes = r.json() |
---|
70 | ips = set() |
---|
71 | |
---|
72 | for center in parsed_args.center_id: |
---|
73 | center_scope = scope_lookup(center, 'center', scopes) |
---|
74 | ips.update(ips_in_scope(center_scope)) |
---|
75 | for room in parsed_args.room_id: |
---|
76 | room_scope = scope_lookup(room, 'room', scopes) |
---|
77 | ips.update(ips_in_scope(room_scope)) |
---|
78 | for l in parsed_args.client_ip: |
---|
79 | ips.add(l) |
---|
80 | |
---|
81 | if not ips: |
---|
82 | print('No clients specified.') |
---|
83 | return |
---|
84 | |
---|
85 | r = rest.get('/images') |
---|
86 | images = r.json() |
---|
87 | found_image = [img for img in images['images'] |
---|
88 | if img['id'] == parsed_args.id] |
---|
89 | if not found_image: |
---|
90 | print(f'Image with id {parsed_args.id} not found.') |
---|
91 | return |
---|
92 | else: |
---|
93 | found_image = found_image[0] |
---|
94 | |
---|
95 | payload = {'disk': parsed_args.disk, 'partition': parsed_args.part, |
---|
96 | 'id': str(parsed_args.id), 'name': found_image['name'], |
---|
97 | 'profile': str(found_image['software_id']), |
---|
98 | 'repository': parsed_args.repo, |
---|
99 | 'type': parsed_args.type.upper(), 'clients': list(ips)} |
---|
100 | r = rest.post('/image/restore', payload=payload) |
---|
101 | |
---|
102 | @staticmethod |
---|
103 | def create_image(rest, args): |
---|
104 | parser = argparse.ArgumentParser() |
---|
105 | parser.add_argument('--disk', |
---|
106 | nargs='?', |
---|
107 | required=True, |
---|
108 | help='Disk') |
---|
109 | parser.add_argument('--part', |
---|
110 | nargs='?', |
---|
111 | required=True, |
---|
112 | help='Partition') |
---|
113 | parser.add_argument('--name', |
---|
114 | nargs='?', |
---|
115 | required=True, |
---|
116 | help='Image name') |
---|
117 | parser.add_argument('--desc', |
---|
118 | nargs='?', |
---|
119 | required=False, |
---|
120 | help='Image description (for new images)') |
---|
121 | parser.add_argument('--repo-id', |
---|
122 | nargs='?', |
---|
123 | default=1, |
---|
124 | help='Images repository id') |
---|
125 | group = parser.add_argument_group('clients', 'Client selection args') |
---|
126 | group.add_argument('--client-ip', |
---|
127 | action='append', |
---|
128 | default=[], |
---|
129 | required=True, |
---|
130 | help='Specific client IP') |
---|
131 | parsed_args = parser.parse_args(args) |
---|
132 | |
---|
133 | r = rest.get('/client/info', payload={'client': parsed_args.client_ip}) |
---|
134 | center_id = r.json()['center'] |
---|
135 | |
---|
136 | r = rest.get('/client/setup', |
---|
137 | payload={'client': parsed_args.client_ip}) |
---|
138 | if r.status_code == 200: |
---|
139 | part_info = list(filter(lambda x: x['disk'] == int(parsed_args.disk) and |
---|
140 | x['partition'] == int(parsed_args.part), |
---|
141 | r.json()['partitions'])) |
---|
142 | if not part_info: |
---|
143 | print('Partition not found.') |
---|
144 | return |
---|
145 | fs_code = list(part_info)[0]['code'] |
---|
146 | |
---|
147 | payload = {'clients': parsed_args.client_ip, 'disk': parsed_args.disk, 'center_id': center_id, |
---|
148 | 'partition': parsed_args.part, 'code': str(fs_code), 'name': parsed_args.name, |
---|
149 | 'id': '0'} |
---|
150 | if parsed_args.desc: |
---|
151 | payload['description'] = parsed_args.desc |
---|
152 | payload['repository_id'] = parsed_args.repo_id |
---|
153 | |
---|
154 | rest.post('/image/create', payload=payload) |
---|