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
159
160
161
162
163
164
|
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# TODO: dokoncaj!
# kpov_random_helpers should be imported by add_assignment.py
instructions = {
'si':u"""
Postavi štiri navidezne računalnike - simpleArbiter, DHCP_server,
BootableClientA ter BootableClientB. Na simpleArbiter preberi naslove IP_GW, IP_DHCP,
IP_B ter najdi datoteko A.
Na DHCP_server postavi DHCP strežnik s pomočjo ISC dhcp 3 na naslovu IP_DHCP.
SimpleArbiter naj dobi IP_GW. DHCP_server naj ga uporabi kot gateway.
Če se zaganja BootableClientB, naj se sistem zažene z live ISO in dobi svoj IP.
Če se zaganja katerikoli drug, naj se sistem zažene v datoteko z imenom A.
Tako BootableClientA kot BootableClientB naj bosta brez diskov.
"""
}
instructions_en= {
Set up 4 virtual computers - simpleArbiter, DHCP_server, BootableClientA and
BootableClientB. The simpleArbiter reads the address IP_GW, IP_DHCP and finds
the file A.
On the DHCP_server set up a DHCP server with the help of ISC dhcp 3 on the address IP_DHCP.
Get SimpleArbiter to find IP_GW. Make the DHCP_server use it as a gateway.
If there is BootableClientB loading, make the system start-up with a live ISO and make it get hit own IP.
If there is anyone else loading, make the system load the file with the name A.
Make BootableClientA and BootableClientB be without discs.
}
computers = {
'DHCPServer': {
'disks': [
{ 'name': 'DHCPServer',
},
{ 'name': 'bootable_iso',
'options':{'readonly': True},
'parts': [],
},
#{ 'name': 'CDROM',
# 'options':{'readonly': True},
# 'parts': [],# no parts, no mounting.
#}
],
'network_interfaces': [{'network': 'net1'}],
'flavor': 'm1.tiny',
'config_drive': False
},
'BootableClientA': {
'disks': [
],
'network_interfaces': [{'network': 'net1'}],
'flavor': 'm1.tiny',
'config_drive': False
},
'BootableClientB': {
'disks': [
],
'network_interfaces': [{'network': 'net1'}],
'flavor': 'm1.tiny',
'config_drive': False
},
'SimpleArbiter': {
'disks': [
{ 'name': 'simpleArbiterDhcp',
},
#{ '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 = {
'IP_DHCP': {'descriptions': {'si': 'IP DHCP streznika'}, 'w': False, 'public': True, 'type':'IP', 'generated': True},
'IP_GW': {'descriptions': {'si': 'IP SimpleArbiterja'}, 'w': False, 'public': True, 'type':'IP', 'generated': True},
'MAC_BOOT': {'descriptions': {'si': 'MAC racunalnika, ki se zazene z ISO'}, 'w': True, 'public': True, 'type':'MAC', 'generated': False},
'IP_BOOT': {'descriptions': {'si': 'IP racunalnika, ki se zazene z ISO'}, 'w': True, 'public': True, 'type':'IP', 'generated': False},
'BOOT_FNAME': {'descriptions': {'si': 'Ime datoteke'}, 'w': False, 'public': True, 'type': 'filename', 'generated': True},
}
def task(IP_DHCP, IP_GW, MAC_BOOT, BOOT_FNAME):
# check the IP
import socket
import os
results={}
try:
if IP_DHCP.count('.')!=3 or IP_GW.count('.')!=3:
results['IPcheck']=False
socket.inet_pton(socket.AF_INET,IP_DHCP)
socket.inet_pton(socket.AF_INET,IP_GW)
results['IPcheck']=True
# ping the DHCP server
if os.system("ping "+IP_DHCP)==0:
results[PingDHCP]=True
print("Povezava z DHCP strežnikom je OK")
# check whether the fname served by the dhcp server is
# correct
datoteka=open(BOOT_FNAME,"r")
array=[]
for line in datoteka:
array.append(line)
datoteka.close()
#greš skozi array preverit ce je vse ok
else:
print("Povezava s strežnikom ni OK")
results['PingDHCP']=False
except FileNotFoundError:
results['BootFname']=False
return "Datoteka ne obstaja"
except IOError:
results['BootFname']=False
return "I/O napaka"
except OSError:
results['IPcheck']=False
# check whether the fname served by the dhcp server is correct
# connect to the service in the special ISO
# check the MAC of the server on IP_BOOT
return results
def gen_params(user_id, params_meta):
params = dict()
r = random.Random(user_id)
net = kpov_random_helpers.IPv4_subnet_gen(r, '10.75.0.0/10', 24)
params['IP_DHCP'], params['IP_GW'] = kpov_random_helpers.IPv4_addr_gen(r, net, 2)
params['BOOT_FNAME'] = kpov_random_helpers.filename_gen(r)
# IP_NM, DNS_NM, IP_static, DNS_static)
return params
def task_check(results, params):
import re
score = 0
#TO FINISH SCORING WE REQUIRE DICT KEYS AND FUNCTIONS gen_params AND task TO BE FINISHED
#POINTS FOR EACH TASK MAY BE ADJUSTED IN THE FUTURE
#TASK1: all computers up
if results['NM_nslookup'].find('Server:\t\t{0}\r'.format(params['DNS_NM'])) > -1:
score += 3
#TASK2: SimpleArbeiter IP_GW
if results['static_nslookup'].find('Server:\t\t{0}\r'.format(params['DNS_static'])) > -1:
score += 3
#TASK3: SimpleArbeiter IP_DHCP
if re.search(r'eth0 +802-.*connected', results['NM_nmcli']):
score += 2
#TASK4: SimpleArbaiter IP_B
if re.search(r'eth0 +802-.*connected', results['static_nmcli']):
score += 2
if results['NoNameATM'].find('NoFormatATM'.format(params['NoNameAtm]))> -1:
score +=2
#Same pattern for other tasks
return score
def prepare_disks(templates, params):
# d = templates['simpleArbiterDhcp']
pass
|