summaryrefslogtreecommitdiff
path: root/kpov_judge/tasks/copy_rename_100_files/task.py
diff options
context:
space:
mode:
authormc1824@student.uni-lj.si <mc1824@student.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414>2015-01-25 18:58:41 +0000
committermc1824@student.uni-lj.si <mc1824@student.uni-lj.si@5cf9fbd1-b2bc-434c-b4b7-e852f4f63414>2015-01-25 18:58:41 +0000
commitd017cb67820f9b3dc3810459896deeedcbefa430 (patch)
tree0ded8481ee6ac15f91e2eafe5d1f8c78c45d86db /kpov_judge/tasks/copy_rename_100_files/task.py
parent7334ff1f913735d5718cd824696e71f878ddf840 (diff)
Initial draft for course 01 evaluation
git-svn-id: https://svn.lusy.fri.uni-lj.si/kpov-public-svn/kpov-public@232 5cf9fbd1-b2bc-434c-b4b7-e852f4f63414
Diffstat (limited to 'kpov_judge/tasks/copy_rename_100_files/task.py')
-rw-r--r--kpov_judge/tasks/copy_rename_100_files/task.py166
1 files changed, 79 insertions, 87 deletions
diff --git a/kpov_judge/tasks/copy_rename_100_files/task.py b/kpov_judge/tasks/copy_rename_100_files/task.py
index 6ff8d2c..87ef7e9 100644
--- a/kpov_judge/tasks/copy_rename_100_files/task.py
+++ b/kpov_judge/tasks/copy_rename_100_files/task.py
@@ -1,7 +1,8 @@
-#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-
-# kpov_random_helpers should be imported by add_assignment.py
+# 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':u"""
@@ -10,111 +11,102 @@ ustvari uporabnika test z geslom test.
Na sliki diska simpleArbiterDhcp najdeš imenik s 100 datotekami. Prekopiraj vse datoteke na drugi računalnik v domači imenik uporabnika test.
Spremeni vsebino datotek tako, da vse male črke spremeniš v velike. Poskrbi, da se bo s prvega računalnika (simpleArbiterDhcp) mogoče prek
ssh prijaviti na drugi računalnik in prebrati predelane datoteke.
-"""
+""",
+ 'en': u'''
+Create two virtual machines. For the first, use the `simpleArbiterDhcp' image.
+On the second machine, create a user `test' with the password `test'.
+The `simpleArbiterDhcp' disk image contains a folder with 100 files. Copy all
+of these files to the other computer into the home folder of theuser `test'.
+Modify the content of these files by converting all lowercase letters into
+uppercase. Make sure that the first machine (`simpleArbiterDhcp') can use ssh
+to access the second machine and read the processed files.
+''',
}
computers = {
- 'maliNetworkManager': {
- 'disks': [
- { 'name': 'maliNetworkManager',
- },
- #{ 'name': 'CDROM',
- # 'options':{'readonly': True},
- # 'parts': [],# no parts, no mounting.
- #}
- ],
- 'network_interfaces': [{'network': 'net1'}],
- 'flavor': 'm1.tiny',
- 'config_drive': False
-
- },
- 'maliBrezNetworkManager': {
+ 'SimpleArbiter': {
'disks': [
- { 'name': 'maliBrezNetworkManager',
+ {
+ 'name': 'simpleArbiterDhcp',
},
- #{ 'name': 'CDROM',
- # 'options':{'readonly': True},
- # 'parts': [],# no parts, no mounting.
- #}
],
- 'network_interfaces': [{'network': 'net1'}],
- 'flavor': 'm1.tiny',
- 'config_drive': False
-
- },
- 'SimpleArbiter': {
- 'disks': [
- { 'name': 'simpleArbiterDhcp',
- # attempt automount
+ 'network_interfaces': [
+ {
+ 'network': 'net1',
},
- #{ 'name': 'CDROM',
- # 'options': {'readonly': True},
- # 'parts': [{'dev': 'b1', 'path': '/cdrom'}],
- #},
],
- 'network_interfaces': [{'network': 'net1'}, {'network': 'test-net'}],
'flavor': 'm1.tiny',
- 'config_drive': False
+ 'config_drive': False,
}
}
-networks = { 'net1': {'public': False}, 'test-net': {'public': True} }
+networks = {
+ 'net1': {
+ 'public': True,
+ },
+}
params_meta = {
- 'IP_NM': {'descriptions': {'si': 'Naslov maliNetworkManager'}, 'w': False, 'public':True, 'type': 'IP', 'generated': True},
- 'DNS_NM': {'descriptions': {'si': 'DNS za maliNetworkManager'}, 'w': False, 'public':True, 'type': 'IP', 'generated': True},
- 'IP_static': {'descriptions': {'si': 'Naslov maliBrezNetworkManager'}, 'w': False, 'public': True, 'type': 'IP', 'generated': True},
- 'DNS_static': {'descriptions': {'si': 'DNS za maliBrezNetworkManager'}, 'w': False, 'public': True, 'type': 'IP', 'generated': True},
+ 'folder': {
+ 'descriptions': {
+ 'si': 'Mapa, ki vsebuje 100 datotek',
+ 'en': 'A folder with 100 files',
+ },
+ 'w': False,
+ 'public': True,
+ 'type': 'dirname',
+ 'generated': False,
+ },
+ 'host': {
+ 'descriptions': {
+ 'si': 'Naslov racunalnika, na katerega kopiramo datoteke',
+ 'en': 'The address of the computer to which the files are copied',
+ },
+ 'w': True,
+ 'public': True,
+ 'type': 'IP',
+ 'generated': False,
+ },
}
-def task(IP_NM, DNS_NM, IP_static, DNS_static):
+def task(host, folder):
import pxssh
- import pexpect
- results = dict()
- peer_user = 'student'
- peer_passwd = 'vaje'
- sA = pxssh.pxssh()
- sB = pxssh.pxssh()
- sA.login(IP_NM, peer_user, peer_passwd)
- sB.login(IP_static, peer_user, peer_passwd)
- # sA
- # make sure NM is not handling eth0
- results['NM_nmcli'] = sA.run('nmcli d')
- results['NM_nslookup'] = sA.run('nslookup www.arnes.si')
- # sB
- # check whether NM is handling eth0
- results['static_nmcli'] = sB.run('nmcli d')
- results['static_nslookup'] = sB.run('nslookup www.arnes.si')
- sA.logout()
- sB.logout()
+
+ # ideally, this would be done using a SFTP client instead of pxssh
+ target = pxssh.pxssh()
+ target.login(host, 'test', 'test')
+ results = {
+ 'files': target.run('ls -1').split('\n'), # XXX: file may have newlines
+ 'contents': target.run("cat *"), # XXX: may include other files in $HOME
+ }
+ target.logout()
return results
-
+
def gen_params(user_id, params_meta):
- params = dict()
- r = random.Random(user_id)
- # IP_NM, DNS_NM, IP_static, DNS_static)
- dns_servers = ['193.2.1.66', '193.2.1.72', '8.8.8.8', '8.8.4.4', '208.67.222.222', '208.67.220.220']
- net = kpov_random_helpers.IPv4_subnet_gen(r, '172.23.128.0/18', 24)
- params['DNS_NM'] = r.choice(dns_servers)
- params['IP_NM'], params['IP_static'] = kpov_random_helpers.IPv4_addr_gen(r, net, 2)
- params['DNS_static'] = r.choice(dns_servers)
- return params
+ pass
def task_check(results, params):
- import re
- score = -9
- if results['NM_nslookup'].find('Server:\t\t{0}\r'.format(params['DNS_NM'])) > -1:
- score += 3
- if results['static_nslookup'].find('Server:\t\t{0}\r'.format(params['DNS_static'])) > -1:
- score += 3
- if re.search(r'eth0 +802-.*connected', results['NM_nmcli']):
- score += 2
- if not re.search(r'eth0 +802-.*connected', results['static_nmcli']):
- score += 2
+ import os
+
score = 0
+
+ matched = 0
+ files = os.listdir(params['folder'])
+ for fn in files:
+ if fn in results['files']:
+ matched += 1
+ score += matched > 0
+ score += 2 * (matched > len(files)/2)
+ score += 3 * (matched == len(files))
+
+ rl = set(results['contents'].split('\n'))
+ tl = set()
+ for fn in files:
+ with open(fn) as f:
+ tl.update(set(f.read().split('\n')))
+ score += 4 * (rl == tl)
+
return score
def prepare_disks(templates, params):
-# d = templates['simpleArbiterDhcp']
- pass
-
+ pass