summaryrefslogtreecommitdiff
path: root/tasks/smb_nfs/task.py
diff options
context:
space:
mode:
Diffstat (limited to 'tasks/smb_nfs/task.py')
-rw-r--r--tasks/smb_nfs/task.py138
1 files changed, 138 insertions, 0 deletions
diff --git a/tasks/smb_nfs/task.py b/tasks/smb_nfs/task.py
new file mode 100644
index 0000000..6d1e51d
--- /dev/null
+++ b/tasks/smb_nfs/task.py
@@ -0,0 +1,138 @@
+# kpov_util should be imported by add_assignment.py
+
+# TODO: dokoncaj!
+instructions = {
+ 'si': '''\
+<p>
+Postavi dva navidezna računalnika: <em>simpleArbiterDhcp</em> in <em>FileServer</em>.
+
+<p>
+Poskrbi, da bo imenik <code>{{NFS_MOUNT}}</code> na <em>FileServer</em> dostopen prek NFS in prek SMB kot imenik v skupni rabi <code>{{SMB_SHARENAME}}</code>. Ime strežnika SMB nastavite na <code>{{FILESERVER_NAME}}</code>.
+
+<p>
+<em>SimpleArbiterDhcp</em> naj ima prek NFS pravico pisati po imeniku.
+''',
+ 'en': '''\
+<p>
+Set up two virtual computers: <em>simpleArbiterDhcp</em> and <em>FileServer</em>.
+
+<p>
+Make sure that the directory <code>{{NFS_MOUNT}}</code> on <em>FileServer</em> is accessible over NFS and over SMB under the sharename <code>{{SMB_SHARENAME}}</code>. Set the SMB server name to <code>{{FILESERVER_NAME}}</code>.
+
+<p>
+<em>SimpleArbiterDhcp</em> should have write access to <code>{{NFS_MOUNT}}</code> over NFS.
+''',
+}
+
+computers = {
+ 'FileServer': {
+ 'disks': [
+ { 'name': 'student-fileserver',
+ },
+ ],
+ 'network_interfaces': [{'network': 'net1'}],
+ 'flavor': 'm1.tiny',
+ 'config_drive': False
+
+ },
+ 'SimpleArbiter': {
+ 'disks': [
+ { 'name': 'simpleArbiterDhcpGW',
+ },
+ ],
+ 'network_interfaces': [{'network': 'net1'}, {'network': 'test-net'}],
+ 'flavor': 'm1.tiny',
+ 'config_drive': False
+ }
+}
+
+networks = { 'net1': {'public': False}, 'test-net': {'public': True} }
+
+params_meta = {
+ 'FILESERVER_IP': {'descriptions': {'si': 'IP streznika'}, 'w': True, 'public':True, 'type': 'IP', 'generated': False},
+ 'FILESERVER_NAME': {'descriptions': {'si': 'Ime streznika'}, 'w': False, 'public':True, 'type': 'hostname', 'generated': True},
+ 'SMB_SHARENAME': {'descriptions': {'si': 'Ime imenika v skupni rabi prek SMB', 'en': 'SMB sharename'}, 'w': False, 'public':True, 'type': 'filename', 'generated': True},
+ 'NFS_MOUNT': {'descriptions': {'si': 'Imenik, dostopen prek NFS'}, 'w': False, 'public': True, 'type': 'filename', 'generated': True},
+ 'SHARED_FILENAME': {'descriptions': {'si': 'Iskana datoteka'}, 'w': False, 'public': True, 'type': 'filename', 'generated': True},
+ 'SHARED_CONTENT': {'descriptions': {'si': 'Vsebina iskane datoteke'}, 'w': False, 'public': False, 'type': 'short', 'generated': True},
+ 'SHARED_FILE_SEED': {'descriptions': {'si': 'Dodatni podatek za testiranje'}, 'w': False, 'public': True, 'type': 'filename', 'generated': True},
+}
+
+def task(FILESERVER_IP, FILESERVER_NAME, NFS_MOUNT, SMB_SHARENAME, SHARED_FILE_SEED):
+ import pexpect
+ import random
+ # TODO: (polz) Try using pexpect instead of subprocess, it's much nicer.
+ # Tabela vseh mountov.
+ # Samo mounti na streznik.
+ results = dict()
+ results['mount'] = pexpect.run('mount')
+ results['try_mount_nfs'] = pexpect.run('sudo mount -t nfs {}:/{} /mnt/nfs'.format(
+ FILESERVER_IP, NFS_MOUNT))
+ results['try_mount_smb'] = pexpect.run(
+ 'sudo mount -t cifs //{}/{} /mnt/smb -o ip={},guest'.format(
+ FILESERVER_NAME, SMB_SHARENAME, FILESERVER_IP))
+ results['mount_after'] = pexpect.run('mount')
+ results['ls_smbmount'] = pexpect.run('ls /mnt/smb')
+ results['ls_nfs'] = pexpect.run('ls /mnt/nfs')
+ r = random.Random(SHARED_FILE_SEED)
+ testfile = kpov_util.fname_gen(r)
+ teststring = kpov_util.alnum_gen(r, 200)
+ with open('/mnt/nfs/{}'.format(testfile),'w') as f:
+ f.write(teststring)
+ results['filestr'] = pexpect.run(
+ 'cat /mnt/smb/{}'.format(testfile))
+ results['filels'] = pexpect.run(
+ 'ls /mnt/smb/'.format(testfile))
+ pexpect.run('rm /mnt/nfs/{}'.format(testfile))
+ results['filels_later'] = pexpect.run('ls /mnt/smb')
+ pexpect.run("sudo umount /mnt/nfs")
+ pexpect.run("sudo umount /mnt/smb")
+ return results
+
+def gen_params(user_id, params_meta):
+ d = kpov_util.default_gen(user_id, params_meta)
+ r = random.Random(user_id)
+ d['FILESERVER_NAME'] = kpov_util.hostname_gen(r)
+ d['SMB_SHARENAME'] = kpov_util.hostname_gen(r)
+ d['NFS_MOUNT'] = "/srv/nfs/" + kpov_util.fname_gen(r, False)
+ d['SHARED_FILENAME'] = kpov_util.fname_gen(r)
+ d['SHARED_CONTENT'] = kpov_util.fortune(r, 4096)
+ d['SHARED_FILE_SEED'] = kpov_util.alnum_gen(r, 42)
+ return d
+
+def task_check(results, params):
+ score = 0
+ hints = []
+ r = random.Random(params['SHARED_FILE_SEED'])
+ testfile = kpov_util.fname_gen(r)
+ teststring = kpov_util.alnum_gen(r, 200)
+ # no need to check results['mount'] or results['try_mount_nfs']
+ # or results['try_mount_smb']
+ if results['mount_after'].find('//{}/{} on /mnt/smb type cifs'.format(
+ params['FILESERVER_NAME'], params['SMB_SHARENAME'])) >= 0:
+ score += 2
+ if results['mount_after'].find('{}:{} on /mnt/nfs type nfs'.format(
+ params['FILESERVER_IP'], params['NFS_MOUNT'])) >= 0:
+ score += 2
+ if results['ls_smbmount'].find(params['SHARED_FILENAME']) >= 0:
+ score += 1
+ if results['ls_nfs'].find(params['SHARED_FILENAME']) >= 0:
+ score += 1
+ if results['filestr'] == teststring:
+ score += 2
+ filels_later = set(results['filels_later'].split())
+ filels = set(results['filels'].split())
+ if "".join(filels - filels_later).find(testfile) >= 0:
+ score += 2
+ return score, hints
+
+def prepare_disks(templates, task_params, global_params):
+ d = templates['student-fileserver']
+ d.mkdir("/srv/nfs")
+ d.mkdir(task_params['NFS_MOUNT'])
+ d.write(task_params['NFS_MOUNT'] + "/" + task_params["SHARED_FILENAME"],
+ task_params["SHARED_CONTENT"])
+ d = templates['simpleArbiterDhcpGW']
+ d.mkdir('/mnt/nfs')
+ d.mkdir('/mnt/smb')
+ write_default_config(templates['simpleArbiterDhcpGW'], global_params)