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)
Esempio n. 2
0
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')
Esempio n. 4
0
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")
Esempio n. 5
0
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
Esempio n. 6
0
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')
Esempio n. 7
0
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'
Esempio n. 9
0
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))
Esempio n. 10
0
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'
Esempio n. 11
0
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)
Esempio n. 13
0
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))