summaryrefslogtreecommitdiffstats
path: root/ogcp/views.py
diff options
context:
space:
mode:
authorJavier Hernandez <jhernandez@soleta.eu>2023-12-15 12:26:28 +0100
committerOpenGnSys Support Team <soporte-og@soleta.eu>2023-12-15 13:02:54 +0100
commit869f15ecf05b2d8d1ee6f34227764bb829d176b1 (patch)
tree7ee2d35172211ec56a57420924531deb3d8c45ba /ogcp/views.py
parent6cb7be03fdd8c30c4cc25cc3d83b8c439e177a37 (diff)
Limit restore image to images of assigned repo
Allow to restore only to images that are in the repo the client is assigned to.
Diffstat (limited to 'ogcp/views.py')
-rw-r--r--ogcp/views.py39
1 files changed, 35 insertions, 4 deletions
diff --git a/ogcp/views.py b/ogcp/views.py
index 8494d4f..a10c9c4 100644
--- a/ogcp/views.py
+++ b/ogcp/views.py
@@ -612,6 +612,30 @@ def search_image(images_list, image_id):
return image
return False
+def get_images_grouped_by_repos_from_server(server):
+ r = server.get('/images')
+ images = r.json()['images']
+ repos={}
+
+ for image in images:
+ repo_id=image['repo_id']
+ if repo_id not in repos:
+ repos[repo_id] = [image]
+ else:
+ repos[repo_id].append(image)
+ return repos
+
+def get_clients_repo(server, ips):
+ repo_id=None
+ for ip in ips:
+ r = server.get('/client/info', payload={'client': [ip]})
+ repo_id_aux = r.json()['repo_id']
+ if repo_id is None:
+ repo_id = repo_id_aux
+ elif repo_id_aux != repo_id:
+ return None
+ return repo_id
+
@app.route('/action/image/restore', methods=['GET', 'POST'])
@login_required
def action_image_restore():
@@ -649,13 +673,20 @@ def action_image_restore():
return redirect(url_for('commands'))
form.ips.data = ' '.join(ips)
- part_choices = []
-
server = get_server_from_clients(ips)
- r = server.get('/images')
- for image in r.json()['images']:
+
+ repo_id = get_clients_repo(server, ips)
+ if repo_id is None:
+ flash(_(f'Computers have different repos assigned'), category='error')
+ return redirect(url_for('commands'))
+ images = get_images_grouped_by_repos_from_server(server)
+ if repo_id not in images:
+ flash(_(f'Computer(s) assigned to a repo with no images'), category='error')
+ return redirect(url_for('commands'))
+ for image in images[repo_id]:
form.image.choices.append((image['id'], image['name']))
+ part_choices = []
for ip in ips:
r = server.get('/client/setup', payload={'client': [ip]})
if r.status_code == requests.codes.ok: