diff options
Diffstat (limited to 'ogcp/views.py')
-rw-r--r-- | ogcp/views.py | 60 |
1 files changed, 47 insertions, 13 deletions
diff --git a/ogcp/views.py b/ogcp/views.py index a5d5e2e..056c3e5 100644 --- a/ogcp/views.py +++ b/ogcp/views.py @@ -647,6 +647,7 @@ def action_setup_modify(): for partition in form.partitions: if partition.part_type.data == 'CACHE': cache_count += 1 + if cache_count == 0: flash(_(f'Missing cache partition'), category='error') return redirect(url_for('commands')) @@ -957,23 +958,47 @@ def action_session(): form = SessionForm(request.form) if request.method == 'POST': ips = form.ips.data.split(' ') - disk, partition = form.os.data.split(' ') - + disk, partition, os_name = form.os.data.split(' ', 2) server = get_server_from_clients(list(ips)) - r = server.post('/session', payload={'clients': ips, + + r = server.get('/session', payload={'clients': ips}) + if not r: + return ogserver_down('commands') + if r.status_code != requests.codes.ok: + return ogserver_error('commands') + + sessions = r.json()['sessions'] + if not sessions: + flash(_('ogServer returned an empty session list'), + category='error') + return redirect(url_for('commands')) + + valid_ips = [] + excluded_ips = [] + for os, ip in zip(sessions, ips): + if os['disk'] == int(disk) and os['partition'] == int(partition) and os['name'] == os_name: + valid_ips.append(ip) + else: + excluded_ips.append(ip) + + r = server.post('/session', payload={'clients': valid_ips, 'disk': str(disk), 'partition': str(partition)}) if r.status_code == requests.codes.ok: + if excluded_ips: + flash('The following clients didn\'t match the boot configuration: ' + str(excluded_ips)) return redirect(url_for('commands')) return make_response("400 Bad Request", 400) else: ips = parse_elements(request.args.to_dict()) - if not validate_elements(ips, max_len=1): + ips_list = list(ips) + if not validate_elements(ips): return redirect(url_for('commands')) - server = get_server_from_clients(list(ips)) - form.ips.data = ' '.join(ips) - r = server.get('/session', payload={'client': list(ips)}) + server = get_server_from_clients(ips_list) + form.ips.data = ' '.join(ips_list) + + r = server.get('/session', payload={'clients': ips_list}) if not r: return ogserver_down('commands') if r.status_code != requests.codes.ok: @@ -982,18 +1007,27 @@ def action_session(): sessions = r.json()['sessions'] if not sessions: flash(_('ogServer returned an empty session list'), - category='error') + category='error') return redirect(url_for('commands')) - for os in sessions: - choice = (f"{os['disk']} {os['partition']}", - f"OS: {os['name']} (Disk:{os['disk']}, Partition:{os['partition']})") - form.os.choices.append(choice) + os_groups = {} + for os, ip in zip(sessions, ips_list): + item_key = f"{os['disk']} {os['partition']} {os['name']}" + + if item_key in os_groups: + os_groups[item_key].append(ip) + else: + os_groups[item_key] = [ip] + + choice = (item_key, + f"{os['name']} (Disk:{os['disk']}, Partition:{os['partition']})") + form.os.choices.append(choice) + scopes, clients = get_scopes(set(ips)) selected_clients = list(get_selected_clients(scopes['scope']).items()) return render_template('actions/session.html', form=form, selected_clients=selected_clients, - scopes=scopes) + scopes=scopes, os_groups=os_groups) @app.route('/action/client/info', methods=['GET']) @login_required |