summaryrefslogtreecommitdiff
path: root/tasks/rename_grep_network/task.py
diff options
context:
space:
mode:
Diffstat (limited to 'tasks/rename_grep_network/task.py')
-rw-r--r--tasks/rename_grep_network/task.py282
1 files changed, 282 insertions, 0 deletions
diff --git a/tasks/rename_grep_network/task.py b/tasks/rename_grep_network/task.py
new file mode 100644
index 0000000..4d81313
--- /dev/null
+++ b/tasks/rename_grep_network/task.py
@@ -0,0 +1,282 @@
+# 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': """
+<pre>Ustvari dva navidezna računalnika s slikama diskov
+- SimpleArbiterExam s sliko diska simpleArbiterDhcp in
+SmallStudent s slikama diska student-entrance3
+in smallstudent-personal.
+
+Drugi razdelek na sliki smallstudent-personal priklopi na imenik {mntdir}
+
+Na SimpleArbiterExam se lahko prijaviš z uporabniškim imenom tester in geslom test.
+Na SmallStudentExam se lahko prijaviš kot root z geslom kaboom.
+
+Poskrbi, da bo SmallStudent s SimpleArbiter dostopen na naslovu {testip}.
+
+Na SmallStudent ustvari uporabnika {testuser} z geslom {passwd}.
+
+Na smallstudent-personal je nekje skrita
+datoteka, ki vsebuje niz {magicstr}.
+Skopiraj jo v domači imenik {testuser} in preimenuj tako, da vse znake 'O' v imenu zamenjaš z 'I'.
+Pazi, da nobena druga datoteka v domačem imeniku v svojem imenu ne bo vsebovala "I".
+
+Poskrbi, da bo lastnik {testuser}, skupina pa naj ostane nespremenjena.
+Brati naj jo ima pravico samo lastnik, pisati lastnik in skupina, poganjati nihče.</pre>
+""",
+ 'en': '''
+''',
+}
+
+instructions = {'si': 'Potrpite.', 'en': 'Have patience.'}
+
+computers = {
+ 'SimpleArbiter': {
+ 'disks': [
+ {
+ 'name': 'simpleArbiterEntrance',
+ },
+ ],
+ 'network_interfaces': [
+ {
+ 'network': 'net1',
+ },
+ {
+ 'network': 'net2',
+ },
+ ],
+ 'flavor': 'm1.tiny',
+ 'config_drive': False,
+ },
+ 'SmallStudent': {
+ 'disks': [
+ {
+ 'name': 'student-entrance4',
+ # 'parts': [{'dev': 'sda1', 'path': '/'}],
+ },
+ {
+ 'name': 'smallstudent-personal',
+ 'parts': [{'dev': 'sdb1', 'path': '/media'}, {'dev': 'sdb2', 'path': '/mnt'}]
+ }
+ ],
+ 'network_interfaces': [
+ {
+ 'network': 'net2',
+ },
+ ],
+ 'flavor': 'm1.tiny',
+ 'config_drive': False,
+ }
+}
+
+networks = {
+ 'net1': {
+ 'public': True,
+ },
+ 'net2': {
+ 'public': False,
+ }
+}
+
+params_meta = {
+ 'testip': {
+ 'descriptions': {
+ 'si': 'IP SmallStudent',
+ 'en': 'IP SmallStudent',
+ },
+ 'w': False,
+ 'public': True,
+ 'type': 'IP',
+ 'generated': True,
+ },
+ 'testuser': {
+ 'descriptions': {
+ 'si': 'Uporabnik na SmallStudent',
+ 'en': 'Username on SmallStudent',
+ },
+ 'w': False,
+ 'public': True,
+ 'type': 'username',
+ 'generated': True,
+ },
+ 'passwd': {
+ 'descriptions': {
+ 'si': 'Geslo na SmallStudent',
+ 'en': 'Password on SmallStudent',
+ },
+ 'w': False,
+ 'public': True,
+ 'type': None,
+ 'generated': True,
+
+ },
+ 'mntdir': {
+ 'descriptions': {
+ 'si': 'imenik za priklop diska',
+ 'en': 'mountpoint',
+ },
+ 'w': False,
+ 'public': True,
+ 'type': 'dirname',
+ 'generated': True,
+ },
+ 'magicstr' : {
+ 'descriptions': {
+ 'si': 'Niz v iskani datoteki',
+ 'en': 'String in the file you need to find',
+ },
+ 'w': False,
+ 'public': True,
+ 'type': None,
+ 'generated': True,
+
+ },
+ 'rndseed': {
+ 'descriptions': {
+ 'si': 'random seed za skrito datoteko',
+ 'en': 'random seed for hiding the file',
+ },
+ 'w': False,
+ 'public': False,
+ 'type': None,
+ 'generated': True,
+ },
+}
+
+def task(testip, testuser, passwd, mntdir, magicstr):
+ return kpov_util.ssh_test(testip, testuser, passwd, (
+ ('home_ls', 'ls ~/'),
+ ('dst_file_contents', 'cat ~/*I*.txt'),
+ ('dst_ls', 'ls -l ~/*I*.txt'),
+ ('mnt', 'mount'),
+ ))
+
+def gen_params(user_id, params_meta):
+ import random
+ params = dict()
+ r = random.Random(user_id)
+ params['testip'] = kpov_util.IPv4_addr_gen(r,
+ network = '10.94.80.0/19', n_generated=1)[0]
+ params['testuser'] = kpov_util.default_generators['username'](r)
+ params['passwd'] = kpov_util.alnum_gen(r, 8)
+ params['magicstr'] = "".join([r.choice("qwerztlpoQWERTPOL") for i in range(10)])
+ params['mntdir'] = "/" + kpov_util.default_generators['filename'](r)
+ params['rndseed'] = kpov_util.alnum_gen(r, 8)
+ return params
+
+
+def task_check(results, params):
+ import os
+ import re
+ hints = []
+ score = 0
+ if results['ssh'] is not True:
+ hints += ['ssh failed: ' + results['ssh']]
+ hidden_contents = params['magicstr']
+ r = random.Random(params['rndseed'])
+ dstfile = "".join([r.choice("qQoOp") for i in range(64)]) + "I.txt"
+ dstfile = dstfile.replace('O', 'I')
+ for i in range(1000):
+ start = "".join([r.choice(["po", "p0", "no", "ko", "fo", "qo"]) for i in range(20)])
+ mid = "".join([r.choice("uiasdfghjkyxcvbnm1234567890ASDFGHJKYZXCVBNM") for i in range(60)])
+ end = r.choice(["lz", "1z", "Iz", "iz", "l2", "I2", "12"])
+ #if start[:2] == "po" and end == "lz":
+ # start = "po"
+ # mid = "kaka"
+ x = start + mid + end
+ hidden_contents += x + "\r\n"
+ expected_contents = hidden_contents
+ #expected_contents = re.sub(r"^po.*lz\r$",
+ # r"pokakalz\r",
+ # hidden_contents,
+ # re.MULTILINE)
+ if results["dst_file_contents"] == expected_contents:
+ score += 3
+ else:
+ diff_pos = (0, "")
+ for i, c in enumerate(results["dst_file_contents"]):
+ if len(expected_contents) < i or c != expected_contents[i]:
+ start = max(0, i-10)
+ end = min(len(expected_contents), len(results["dst_file_contents"]), i+20)
+ diff_pos = (i, results["dst_file_contents"][start:end])
+ break
+ hints += ["wrong file contents\n" + str(diff_pos[1])]
+ params['dstfile'] = dstfile
+ expected_dst_ls = "-rw--w---- 1 {testuser} bilbo .*{dstfile}".format(**params)
+ if re.match(expected_dst_ls, results["dst_ls"]):
+ score += 2
+ else:
+ hints += ["missing file or wrong user/permissions\n" + results["dst_ls"] + "\n" + expected_dst_ls]
+ if results["home_ls"].find(params['dstfile']) > -1:
+ score += 2
+ expected_mnts = [
+ "/dev/sdb2 on {mntdir} type ext4".format(**params),
+ "sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)",
+ "proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)",
+ "udev on /dev type devtmpfs (rw,nosuid,relatime",
+ "/dev/sda1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)",]
+ if all([results["mnt"].find(expected_mnt) > -1 for expected_mnt in expected_mnts]):
+ score += 3
+ else:
+ hints += ["missing or wrong mount\n"]
+ return score, hints
+
+
+def prepare_disks(templates, task_params, global_params):
+ import random
+ import os
+
+ # first create the file contents to make it easyer to check.
+ hidden_contents = task_params['magicstr']
+ r = random.Random(task_params['rndseed'])
+ dstfile = "".join([r.choice("qQoOp") for i in range(64)]) + "I.txt"
+ for i in range(1000):
+ x = "".join([r.choice(["po", "p0", "no", "ko", "fo", "qo"]) for i in range(20)])
+ x += "".join([r.choice("uiasdfghjkyxcvbnm1234567890ASDFGHJKYZXCVBNM") for i in range(60)])
+ x += r.choice(["lz", "1z", "Iz", "iz", "l2", "I2", "12"])
+ hidden_contents += x + "\n"
+
+ # create hidden file
+ dir_list = ['Qlipper', 'Thunar', 'blender', 'autostart', 'kazam', 'mc', 'netsurf', 'pulse', 'qupzilla', 'radare2', 'teamviewer', 'texstudio', 'vlc']
+ ending_list = ['rc', '.conf', '', '.txt']
+ start_list = ['net', 'dev', 'doc', 'lib', 'time', 'conf']
+ for i in range(20):
+ start_list.append("".join([r.choice("qQoOp") for i in range(64)]) + "O")
+ r.shuffle(dir_list)
+ file_letters = ["mod", "co"]
+
+ d = templates['smallstudent-personal']
+ d.mkdir('/mnt/.hideme')
+ d.mkdir('/media/.hideme')
+ for potential_dir in dir_list:
+ try:
+ potential_dir1 = os.path.join('/mnt/.hideme', potential_dir)
+ potential_dir2 = os.path.join('/media/.hideme', potential_dir)
+ d.mkdir(potential_dir1)
+ d.chown(1001, 1001, potential_dir1)
+ d.mkdir(potential_dir2)
+ d.chown(1001, 1001, potential_dir2)
+ except:
+ pass
+ rndstr2 = dstfile
+ for i in range(r.randint(2, 20)):
+ hidden_file_name1 = os.path.join(potential_dir1,
+ rndstr2)
+ hidden_file_name2 = os.path.join(potential_dir2,
+ rndstr2)
+ d.write(hidden_file_name1, hidden_contents)
+ d.chown(1001, 1001, hidden_file_name1)
+ file_letters = ["stamp", "", "dev", "re"]
+ hidden_contents = "".join([r.choice("asdfghjkyxcvbnm1234567890 \n") for j in range(10000)])
+ d.write(hidden_file_name2, hidden_contents)
+ d.chown(1001, 1001, hidden_file_name2)
+ rndstr2 = r.choice(start_list) + \
+ r.choice(file_letters) + r.choice(ending_list)
+ file_letters = file_letters + ["mod", "co"]
+ # TODO create some additional files
+
+ # write_default_config(templates['simpleArbiterDhcpGW'], global_params)