diff options
author | Timotej Lazar <timotej.lazar@fri.uni-lj.si> | 2019-02-24 21:05:27 +0100 |
---|---|---|
committer | Timotej Lazar <timotej.lazar@fri.uni-lj.si> | 2019-02-24 21:05:27 +0100 |
commit | 8081a5520a441b43a8a7a73f3a90c7aacfaa8e10 (patch) | |
tree | c7f49bd33ed19d53afc0ee9df8b2c82c200c5910 /kpov_judge/tasks/basic_network_gcc | |
parent | 9963b74f777edf985540eac71b1ca095f88b8bca (diff) |
Move everything one level up
Diffstat (limited to 'kpov_judge/tasks/basic_network_gcc')
-rw-r--r-- | kpov_judge/tasks/basic_network_gcc/task.py | 279 |
1 files changed, 0 insertions, 279 deletions
diff --git a/kpov_judge/tasks/basic_network_gcc/task.py b/kpov_judge/tasks/basic_network_gcc/task.py deleted file mode 100644 index b23c060..0000000 --- a/kpov_judge/tasks/basic_network_gcc/task.py +++ /dev/null @@ -1,279 +0,0 @@ -# TODO: -# - check if everything is filled in (computers, params, preparation) -# - improve scoring -# - test -# - switch to a real SSH/SFTP client to properly handle filenames - -instructions = { - 'si': '''\ -<p> -Postavite dva navidezna računalnika: <em>SimpleArbiter</em> in <em>Student</em>. Oba naj bosta povezana na internet. Poleg tega mora biti <em>Student</em> na naslovu <code>{{student_IP}</code> dostopen s <em>SimpleArbiter</em>. - -<p> -Računajte, da se na <em>Student</em> ob zagonu zažene program <code>{{net_prog_name}</code>, -ki vam spreminja nastavitve mrežne kartice. - -<p> -V domačem imeniku uporabnika <code>student</code> obstaja program <code>{{P_c}</code> v programskem jeziku C. Prevedite ga v program z imenom <code>{{P_executable}</code>. Izvorna koda je namenoma pokvarjena tako, da so vanjo vrinjeni nepotrebni znaki. -Pred prevajanjem jo morate popraviti. - -<p> -Napišite skripto ali program <code>{{P_script}</code> v domačem imeniku uporabnika <code>student</code>, ki - -<ul> -<li>požene <code>{{P_executable}</code> z argumentom <code>{{arg_c}</code> in mu na standardni vhod pripelje vrednost spremenljivke <code>{{env_c}</code>; -<li>vse, kar <code>{{P_executable}</code> izpiše na <code>stderr</code>, spravi v datoteko <code>{{out_stderr_c}</code>; -<li>vse vrstice, ki jih <code>{{P_executable}</code> izpiše na <code>stdout</code> in vsebujejo zaporedje znakov <code>ma</code>, zapiše v <code>{{out_stdout_c}</code>. -</ul> - -<p> -Lastnik vseh ustvarjenih datotek mora biti uporabnik <code>student</code>. Gesla uporabnika student (<code>vaje</code>) ne smete spreminjati. -''', - 'en': ''' -''', -} - -computers = { - 'SimpleArbiter': { - 'disks': [ - { - 'name': 'simpleArbiter', - }, - ], - 'network_interfaces': [ - {'network': 'net1'}, - {'network': 'net2'}, - ], - 'flavor': 'm1.tiny', - 'config_drive': True, - }, - 'Student': { - 'disks': [ - {'name': 'student-entrance'} - ], - 'flavor': 'm1.tiny', - 'network_interfaces': [{'network': 'net1'}], - 'config_drive': True, - } -} - -networks = { - 'net1': { - 'public': True, - }, - 'net2': { - 'public': False, - }, -} - -params_meta = { - 'student_IP': { - 'descriptions': { 'si': 'IP naslov SimpleStudent', 'en': 'IP address of SimpleStudent', - }, 'w': False, 'public': True, 'type': 'IP', 'generated': True, - }, - 'net_prog_name': { - 'descriptions': { 'si': 'Ime programa, ki ponastalvlja naslov', 'en': 'The name of the program resetting the network' - }, 'w': False, 'public': True, 'type': 'filename', 'generated': True, - }, - 'P_c': { - 'descriptions': { 'si': 'Datoteka s programom v C', 'en': 'Filename of the program in C', - }, 'w': False, 'public': True, 'type': 'filename', 'generated': True, - }, - 'P_executable': { 'descriptions': { 'si': 'Ime prevedenega programa v C', 'en': 'Filename of the compiled C program' - }, 'w': False, 'public': True, 'type': 'filename', 'generated': True, - }, - 'arg_c': { - 'descriptions': { 'si': 'Vrednost argumenta', 'en': 'Argument value', - }, 'w': False, 'public': True, 'type': 'short_text', 'generated': True, - }, - 'env_c': { - 'descriptions': { 'si': 'Ime okoljske spremenljivke', 'en': 'The name of the environment environment', - }, 'w': False, 'public': True, 'type': 'short_text', 'generated': True, - }, - 'out_stderr_c': { - 'descriptions': { 'si': 'Datoteka z napakami', 'en': 'File to store errors', - }, 'w': False, 'public': True, 'type': 'filename', 'generated': True, - }, - 'P_script': { - 'descriptions': { 'si': 'Ime skripte', 'en': 'Filename of the script', - }, 'w': False, 'public': True, 'type': 'filename', 'generated': True, - }, - 'out_stdout_c': { - 'descriptions': { 'si': 'Datoteka z izhodom', 'en': 'File to store the output', - }, 'w': False, 'public': True, 'type': 'filename', 'generated': True, - }, - 'param_gen_seed': { - 'descriptions': { 'si': 'Nakljucno seme', 'en': 'Random seed', - }, 'w': False, 'public': True, 'type': None, 'generated': True, - }, - 'c_destroy_gen_seed': { - 'descriptions': { 'si': 'Nakljucno seme za kvarjenje kode v C', 'en': 'Random seed for destroying the C code', - }, 'w': False, 'public': False, 'type': None, 'generated': True, - } - -} - -def task(student_IP, net_prog_name, - P_c, P_executable, arg_c, env_c, out_stderr_c, out_stdout_c, P_script, - param_gen_seed): - import random - - r = random.Random(int(param_gen_seed)) - env_val = "".join([r.choice('ABCDEFGHIJKLMNPRSTUVZ012345') for i in range(11)]) - arg_val = "".join([r.choice('ABCDEFGHIJKLMNPRSTUVZ012345') for i in range(13)]) - stdin_val = "".join([r.choice('ABCDEFGHIJKLMNPRSTUVZ012345') for i in range(17)]) - - return kpov_util.ssh_test(student_IP, 'student', 'vaje', ( - ('script_ls', 'ls -l {}'.format(P_script)), - ('executable_ls', 'ls -l {}'.format(P_executable)), - ('script_run', 'export {}={}; {}'.format(env_c, env_val, P_script)), - ('script_stdout', 'cat {}'.format(out_stdout_c)), - ('script_stderr', 'cat {}'.format(out_stderr_c)), - ('prog_stdout', 'echo "{}" | {} "{}" 2> /dev/null'.format(stdin_val, P_executable, arg_val)), - ('prog_stderr', 'echo "{}" | {} "{}" > /dev/null'.format(stdin_val, P_executable, arg_val)), - )) - -def gen_params(user_id, params_meta): - import random - r = random.Random(user_id+'evil cornholio') - params = kpov_util.default_gen(user_id, params_meta) - homedir = '/home/student/' - params['env_c'] = "".join([r.choice('ABCDEFGHIJKLMNPRSTUVZ') for i in range(5)]) - params['P_c'] = "".join([r.choice('abcdefghijklmnoprst') for i in range(5)]) + ".c" - params['param_gen_seed'] = str(r.randint(0, 2**24)) - params['c_destroy_gen_seed'] = str(r.randint(0, 2**24)) - dest_net = kpov_util.IPv4_subnet_gen(r, '10.0.2.128/26', 26) - params['student_IP'] = kpov_util.IPv4_addr_gen(r, dest_net)[0] - for k in ['P_c', 'P_executable', 'out_stderr_c', 'P_script', 'out_stdout_c']: - params[k] = homedir + params[k] - return params - -def task_check(results, params): - import os - def test_out_gen(arg, var): - s_out = "" - s_err = "" - r = 0 - arg_len = len(arg) - env_len = len(var) - for i in range(100): - s_out += chr(32 + ((ord(arg[i % arg_len]) ^ ord(var[i % env_len])) % 64)) - r += ord(arg[i % arg_len]) + ord(var[i % env_len]) + i; - if (i % 17 == 0): - s_out += "RAUS\r\n"; - if (i % 29 == 0): - s_out += 'ma' - s_err += chr((r % 31) + ord('A')); - if (i % 23 == 0): - s_err += "PATACIS\r\n" - retval = r % 16 - s_err += '\r\n' - s_out += '\r\n' - return(s_out, s_err, retval) - score = 0 - hints = [] - r = random.Random(int(params['param_gen_seed'])) - env_val = "".join([r.choice('ABCDEFGHIJKLMNPRSTUVZ012345') for i in range(11)]) - arg_val = "".join([r.choice('ABCDEFGHIJKLMNPRSTUVZ012345') for i in range(13)]) - stdin_val = "".join([r.choice('ABCDEFGHIJKLMNPRSTUVZ012345') for i in range(17)]) - expected_script_stdout, expected_script_stderr, rval = test_out_gen( - params['arg_c'], env_val - ) - if expected_script_stderr != results['script_stderr']: - hints += ['wrong script stderr'] - else: - score += 2 - split_stdout = expected_script_stdout.split('\r\n') - expected_script_stdout = "\r\n".join([ i for i in split_stdout if i.find('ma') >= 0]) - if expected_script_stdout != results['script_stdout'].strip(): - hints += ['wrong script stdout'] - else: - score += 2 - expected_prog_stdout, expected_prog_stderr, rval = test_out_gen( - arg_val, stdin_val - ) - if expected_prog_stderr != results['prog_stderr'][-len(expected_prog_stderr):]: - hints += ['wrong program stderr'] - else: - score += 2 - if expected_prog_stdout != results['prog_stdout'][-len(expected_prog_stdout):]: - hints += ['wrong program stdout'] - else: - score += 2 - if results['script_ls'].find('-r') < 0: - hints += ['script not found'] - else: - score += 1 - if results['executable_ls'].find('xr') < 0: - hints += ['C executable not found'] - else: - score += 1 - return score, hints - -def prepare_disks(templates, task_params, global_params): - c_source = '''#include<stdio.h> -#include<stdlib.h> -#include<string.h> -/* Odstranite vse odvecne velike crke Q, W ali X in program se bo prevedel. */ - -int main(int argc, char **argv){ - unsigned char *arg; - unsigned char var[255]; - int i, arg_len, env_len, r; - scanf("%s", var); - arg = argv[1]; - arg_len = strlen(argv[1]); - env_len = strlen(var); - r = 0; - for (i = 0; i<100; i++){ - printf("%c", 32 + (arg[i % arg_len] ^ var[i % env_len]) % 64); - r += (int)arg[i % arg_len] + (int)var[i % env_len] + i; - if (i % 17 == 0){ - printf("RAUS\\n"); - } - if (i % 29 == 0){ - printf("ma"); - } - fprintf(stderr, "%c", (r % 31) + 'A'); - if (i % 23 == 0){ - fprintf(stderr, "PATACIS\\n"); - } - } - printf("\\n"); - fprintf(stderr, "\\n"); - return r % 16; -} -''' - evil_shell_source = """#!/bin/bash -e -{ while true; do - ifconfig eth1 10.0.4.19 2> /dev/null; - ifconfig eth0 10.0.4.20 2> /dev/null; - ifconfig eth2 10.0.4.21 2> /dev/null; - sleep 10; -done; }& -""" - import random - d = templates['student-entrance'] - r = random.Random(task_params['c_destroy_gen_seed']) - destroyed_c_source = c_source[:110] - for c in c_source[110:]: - i = r.randint(0, 5) - if i == 1: - destroyed_c_source += 'QW' - if i == 2: - destroyed_c_source += 'XW' - if i == 3: - destroyed_c_source += 'QX' - destroyed_c_source += c - d.write(task_params['P_c'], destroyed_c_source) - d.chown(1000, 1000, task_params['P_c']) - sh_path = r.choice(['/usr/share/doc', '/var/lib', '/usr/local/share', '/etc/alternatives']) - sh_file = sh_path + '/' + task_params['net_prog_name'] - d.write(sh_file, evil_shell_source) - d.chmod(0o775, sh_file) - d.write("/etc/rc.local", """#!/bin/sh -e -export PATH=$PATH:{} -{} & - -exit 0 -""".format(sh_path, task_params['net_prog_name'])) |