summaryrefslogtreecommitdiff
path: root/kpov_judge/tasks/smb_nfs/task.py
blob: fe264cb629a458dfe00d8a5795080687874f990e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# kpov_random_helpers should be imported by add_assignment.py
# TODO: dokoncaj!
instructions = {
    'si':u"""
Postavi dva navidezna računalnika (simpleArbiterDhcp in FileServer). Na SimpleArbiterDhcp poišči imenik
Mapa ter preberi pot NFS_POT ter ime imenika v skupni rabi SAMBA_SHARE. Skopiraj datoteke iz imenika Mapa,
na FileServer. Poskrbi, da bo imenik z datotekami dostopen prek NFS v imeniku NFS_POT in prek SMB na imeniku v skupni
rabi SAMBA_SHARE. SimpleArbiterDhcp naj ima prek NFS pravico pisati po imeniku.

NFS_POT je pot do nekega imenika in je za vsakega studenta drugacna. Ustvari 
mapo in poskrbi da bo dostopna prek protokolov NFS in SMB. Vanj skopiraj
datoteke iz imenika MAPA (ta mapa naj vsebuje datoteko z imenom SHARED_FILENAME in vsebino SHARED_FILENAME_CONETENT), ki bosta za vsakega studenta drugacni.
Naloga za studenta, ki pise gen_params() in params_meta je da nazreba opisane parametre.
V task() napisi zaporedje ukazov, ki bodo preverili, ali je student res postavil delujoca streznika NFS in SMB in ali je nanju postavil datoteko SHARED_FILENAME. Vecina logike te funkcije gre v task_check.
Izpis teh rezultatov spravi v results. Naloga student, ki pise task_check(results, params) je da napise funkcijo, ki pregleda ustvarjeni results in pove, ali je student opravil nalogo v skladu z navodili.
""",
'en':u"""

Set up two virtual computers (simpleArbiterDhcp and FileServer).

On SimpleArbiterDhcp find directory Mapa, read path NFS_POT and name of directory in shared folder SAMBA_SHARE.

Copy files from directory Mapa to FileServer.

Make sure that the directory with files will be available over NFS (which is in directory NFS_POT) and over SMB, on directory in shared folder SAMBA_SHARE.

SimpleArbiterDhcp should have the right to write in directory, using NFS.

"""
}

computers = {
    'FileServer': {
        'disks': [
            {   'name': 'FileServer',
            },
            #{   '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
            },
            #{   'name': 'CDROM',
            #    'options': {'readonly': True},
            #    'parts': [{'dev': 'b1', 'path': '/cdrom'}],
            #},
        ],
        '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_random_helpers.fname_gen(r)
    teststring = kpov_random_helpers.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_random_helpers.default_gen(user_id, params_meta)
    r = random.Random(user_id)
    d['FILESERVER_NAME'] = kpov_random_helpers.hostname_gen(r)
    d['SMB_SHARENAME'] = kpov_random_helpers.hostname_gen(r)
    d['NFS_MOUNT'] = "/srv/nfs/" + kpov_random_helpers.fname_gen(r, False)
    d['SHARED_FILENAME'] = kpov_random_helpers.fname_gen(r)
    d['SHARED_CONTENT'] = kpov_random_helpers.fortune(r, 4096)
    d['SHARED_FILE_SEED'] = kpov_random_helpers.alnum_gen(r, 42)
    return d

def task_check(results, params):
    score = 0
    r = random.Random(params['SHARED_FILE_SEED'])
    testfile = kpov_random_helpers.fname_gen(r)
    teststring = kpov_random_helpers.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

def prepare_disks(templates, params):
    d = templates['FileServer']
    d.mkdir("/srv/nfs")
    d.mkdir(params['NFS_MOUNT'])
    d.write(params['NFS_MOUNT'] + "/" + params["SHARED_FILENAME"],
        params["SHARED_CONTENT"])
    d = templates['SimpleArbiter']
    d.mkdir('/mnt/nfs')
    d.mkdir('/mnt/smb')