summaryrefslogtreecommitdiff
path: root/kpov_judge/tasks/smb_nfs/task.py
blob: 8fd97e7d96520957c83febdffcb0e3c9b9a0597b (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
155
156
157
158
#!/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 = {
    'SMB_NAME': {'descriptions': {'si': 'SMB ime streznika'}, 'w': False, 'public':True, 'type': 'hostname', 'generated': True},
    'SMB_SHARENAME': {'descriptions': {'si': 'Imenik v skupni rabi'}, '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': 'Ime datoteke, ki je deljena'}, 'w': False, 'public': True, 'type': 'filename', 'generated': True},
    'SHARED_FILENAME_CONTENT': {'descriptions': {'si': 'Vsebina datoteke'}, 'w': False, 'public': True, 'type': 'filename', 'generated': True},
}

def task(SMB_NAME, NFS_MOUNT, SHARED_FILENAME, SHARED_FILENAME_CONTENT):
    import subprocess

    # Naslov, na katerem se nahaja streznik.
    address = SMB_NAME
    # TODO: (polz) Try using pexpect instead of subprocess, it's much nicer.
    # Tabela vseh mountov.
    mounts = subprocess.check_output("mount").split("\n")
    # Samo mounti na streznik.
    srvmounts = []
    for m in mounts:
        if str.find(m, address) >= 0:
            srvmounts.append(m)
    # Mounti so v formatu:
    # ["//SMB_NAME/<pot_do_direktorija> on NFS_MOUNT type cifs (rw)", ... ]
    # example: ["//192.168.1.92/srv/samba on /mnt/samba type cifs (rw)", ... ]
    # Seznam mora imeti vnos za NFS in SMB, morata biti obesena na pravo pot in (rw)
    # ++ PIKE za namountan SMB/NFS
    # TODO: (polz) prej ali slej tole kodo premaknite v task_check, v results pa porinite
    #  le mounts (npr. results['mounts'] = mounts
    for m in srvmounts:
        # Dobimo pot, filesystem in pravice iz mounta:
        split = m.split()
        pot = split[2]
        fstype = split[4] #mogoče bomo kaj rabli?
        pravice = split[5]
        # Preverimo če je namountano na pravilen direktorij:
        if pot == NFS_MOUNT:
            # ++PIKE za pravo pot
            # Pregledamo datoteke v temu direktoriju:
            ls = subprocess.check_output(["ls", pot]).split()
            # Preverimo ce je v imeniku datoteka:
            if SHARED_FILENAME in ls:
                # Če je, primerjamo vsebino:
                cat = subprocess.check_output(["cat", pot+"/"+SHARED_FILENAME])
                if cat == SHARED_FILENAME_CONTENT:
                    # DING DING DING PLUS PIKE ZA PRAVO VSEBINO
                    pass
            if pravice == "(rw)":
                # BONUS PIKE ZA READ/WRITE PRAVICE
                pass

    # Samo delno stestirano!

    results = ''.join(random.choice(string.ascii_uppercase) for i in range(12))    
    #results = "test"
    return results
    
def gen_params(user_id, params_meta):
    return kpov_random_helpers.default_gen(user_id, params_meta)

def task_check(results, params):
    
    score = 0
    names = []
    for key in results.keys():
        names.append(key)

    for i in range(len(names)):
	if results[names[i]] is params[names[i]]:
	    score = score + 1

    return score
    """
    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
    score = 0
    return score
    """

def prepare_disks(templates, params):
#    d = templates['simpleArbiterDhcp']
#    Asistent je pocasnela :D    
    pass