def change_workout_state(): if request.method == 'POST': request_data = request.get_json(force=True) response = {} response['workout_id'] = request_data['workout_id'] response['new_state'] = request_data['new_state'] workout = ds_client.get( ds_client.key('cybergym-workout', request_data['workout_id'])) if 'state' in workout: previous_state = workout['state'] workout['state'] = request_data['new_state'] g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "Workout {} state override: {} to {}".format( request_data['workout_id'], previous_state, request_data['new_state']), "previous_state": str(previous_state), "new_state": str(request_data['new_state']), "workout": str(request_data['workout_id']) }, severity=LOG_LEVELS.INFO) ds_client.put(workout) return json.dumps(response)
def start_vm(): if (request.method == 'POST'): data = request.get_json(force=True) workout_id = None run_hours = None if 'workout_id' in data: workout_id = data['workout_id'] if 'time' in data: run_hours = data['time'] workout = ds_client.get(ds_client.key('cybergym-workout', workout_id)) if run_hours: workout['run_hours'] = min(int(run_hours), workout_globals.MAX_RUN_HOURS) else: workout['run_hours'] = 2 ds_client.put(workout) g_logger = log_client.logger('student-app') g_logger.log_struct( { "message": "Workout {} started by student".format(workout_id), "workout": str(workout_id), "runtime": str(workout['run_hours']) }, severity=LOG_LEVELS.INFO ) pub_start_vm(workout_id) return 'VM Started'
def update_logo(): if request.method == "POST": data = request.files['custom_logo'] store_custom_logo(data) g_logger = log_client.logger('admin-app') g_logger.log_struct({"message": "Updating logo image"}, severity=LOG_LEVELS.INFO) return redirect('/admin/home')
def handle_404(e): g_logger = log_client.logger('cybergym-app-errors') g_logger.log_struct( { "error_type": 404, "details": str(e), "request": str(request) } ) return render_template("404.html")
def handle_500(e): g_logger = log_client.logger('cybergym-app-errors') g_logger.log_struct( { "error_type": 500, "details": str(e), "request": str(request) } ) return render_template("500.html", error=e), 500
def update_base(): if request.method == "POST": if 'custom_color' in request.form: store_background_color(request.form['custom_color']) g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "Updated background color to {}".format(request.form['custom_color']) }, severity=LOG_LEVELS.INFO ) return redirect('/admin/home')
def reset_vm(): if (request.method == 'POST'): data = request.get_json(force=True) workout_id = None if 'workout_id' in data: workout_id = data['workout_id'] if workout_id: g_logger = log_client.logger(str(workout_id)) g_logger.log_text(str('Resetting workout ' + workout_id)) try: reset_workout(workout_id) except: compute = workout_globals.refresh_api() reset_workout(workout_id) g_logger = log_client.logger('student-app') g_logger.log_struct( { "message": "Workout {} reset by student".format(workout_id), "workout": str(workout_id) }, severity=LOG_LEVELS.INFO ) return redirect("/landing/%s" % (workout_id))
def admin_server_management(workout_id): if request.method == 'POST': data = request.json if 'action' in data: g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "{} action called for server {}".format( data['action'], data['server_name']) }, severity=LOG_LEVELS.INFO) pub_manage_server(data['server_name'], data['action']) return 'True'
def reset_vm(): if (request.method == 'POST'): data = request.get_json(force=True) workout_id = None if 'workout_id' in data: workout_id = data['workout_id'] g_logger = log_client.logger(str(workout_id)) g_logger.log_text(str('Resetting workout ' + workout_id)) try: reset_workout(workout_id) except: compute = workout_globals.refresh_api() reset_workout(workout_id) return redirect("/landing/%s" % (workout_id))
def start_vm(): if (request.method == 'POST'): data = request.get_json(force=True) workout_id = None if 'workout_id' in data: workout_id = data['workout_id'] g_logger = log_client.logger(str(workout_id)) g_logger.log_text(str('Starting workout ' + workout_id)) workout = ds_client.get(ds_client.key('cybergym-workout', workout_id)) if 'time' not in request.form: workout['run_hours'] = 2 else: workout['run_hours'] = min(int(request.form['time']), workout_globals.MAX_RUN_HOURS) # workout['running'] = True ds_client.put(workout) pub_start_vm(workout_id) return 'VM Started'
def arena_landing(workout_id): workout = ds_client.get(ds_client.key('cybergym-workout', workout_id)) unit = ds_client.get(ds_client.key('cybergym-unit', workout['unit_id'])) arena_server_info = get_arena_ip_addresses_for_workout(workout_id) assessment_manager = CyberArenaAssessment(workout_id) student_instructions_url = None if 'student_instructions_url' in workout: student_instructions_url = workout['student_instructions_url'] formatted_instruction_url = student_instructions_url assessment = guac_user = guac_pass = flags_found = None if 'workout_user' in workout: guac_user = workout['workout_user'] if 'workout_password' in workout: guac_pass = workout['workout_password'] if 'assessment' in workout: try: assessment = assessment_manager.get_assessment_questions() except TypeError: g_logger = log_client.logger('cybergym-app-errors') g_logger.log_text( "TypeError encountered when submitting assessment for arena {}" .format(workout_id), severity=LOG_LEVELS.INFO) if (request.method == "POST"): attempt = assessment_manager.submit() return jsonify(attempt) return render_template('arena_landing.html', description=unit['description'], unit_id=unit.key.name, assessment=assessment, workout=workout, dns_suffix=dns_suffix, guac_user=guac_user, guac_pass=guac_pass, arena_id=workout_id, student_instructions=formatted_instruction_url, server_info=arena_server_info)
def save_workout_spec(): if request.method == 'POST': request_data = request.get_json(force=True) save_yaml_file(request_data) response = {} response['completed'] = True admin_info = ds_client.get( ds_client.key('cybergym-admin-info', 'cybergym')) workout_entry = str(request_data['workout']['name']) if 'workout_list' not in admin_info: admin_info['workout_list'] = [] g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "Created new workout specification", "new_workout_type": workout_entry }, severity=LOG_LEVELS.INFO) admin_info['workout_list'].append( workout_entry.replace(" ", "").lower()) ds_client.put(admin_info) return json.dumps(response)
def admin_page(): admin_info = ds_client.get(ds_client.key('cybergym-admin-info', 'cybergym')) comment_query = ds_client.query(kind='cybergym-comments') comment_query.order = ['date'] comment_list = comment_query.fetch() comments = [] active_workouts = [] for comment in comment_list: comments.append(comment) instance_list = [] machine_instances = compute.instances().list(project=project, zone=zone, filter=("name:cybergym-*")).execute() if 'items' in machine_instances: for instance in machine_instances['items']: if 'name' in instance: instance_list.append(str(instance['name'])) if request.method == "POST": response = { 'action_completed': 'false' } data = request.get_json(force=True) if data['action'] == 'approve_user': if data['user_email'] in admin_info['pending']: admin_info['authorized_users'].append(data['user_email']) admin_info['pending'].remove(data['user_email']) ds_client.put(admin_info) response['action_completed'] = 'true' g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "User {} approved for general access".format(data['user_email']) }, severity=LOG_LEVELS.INFO ) elif data['action'] == 'deny_user': if data['user_email'] in admin_info['pending']: admin_info['pending'].remove(data['user_email']) ds_client.put(admin_info) response['action_completed'] = 'true' g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "User {} denied general access".format(data['user_email']) }, severity=LOG_LEVELS.INFO ) elif data['action'] == 'promote_user': if data['user_email'] in admin_info['authorized_users']: admin_info['admins'].append(data['user_email']) ds_client.put(admin_info) response['action_completed'] = 'true' g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "User {} granted administrator privileges".format(data['user_email']) }, severity=LOG_LEVELS.INFO ) elif data['action'] == 'remove_user': if data['user_email'] in admin_info['authorized_users']: admin_info['authorized_users'].remove(data['user_email']) ds_client.put(admin_info) response['action_completed'] = 'true' g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "User {} removed".format(data['user_email']) }, severity=LOG_LEVELS.INFO ) elif data['action'] == 'revoke_access': if data['user_email'] in admin_info['admins']: admin_info['admins'].remove(data['user_email']) ds_client.put(admin_info) response['action_completed'] = 'true' g_logger = log_client.logger('admin-app') g_logger.log_struct( { "message": "User {} is no longer an administrator".format(data['user_email']) }, severity=LOG_LEVELS.INFO ) return json.dumps(response) admin_actions = {key: value for key, value in AdminActions.__dict__.items() if not (key.startswith('__') and key.endswith('__'))} # print(admin_actions) return render_template('admin_page.html', auth_config=auth_config, admin_info=admin_info, admin_actions=admin_actions, active_workouts=active_workouts, comments=comments, instance_list=json.dumps(instance_list))