summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--kpov_judge/tasks/isc_dhcp_live_boot/task.py154
1 files changed, 81 insertions, 73 deletions
diff --git a/kpov_judge/tasks/isc_dhcp_live_boot/task.py b/kpov_judge/tasks/isc_dhcp_live_boot/task.py
index 23bd294..66b75dc 100644
--- a/kpov_judge/tasks/isc_dhcp_live_boot/task.py
+++ b/kpov_judge/tasks/isc_dhcp_live_boot/task.py
@@ -12,28 +12,24 @@ IP_B ter ime datoteke BOOT_FNAME.
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. ISO je priklopljen na DHCP_server.
-Če se zaganja katerikoli drug, naj se sistem zažene v datoteko z imenom BOOT_FNAME.
+Če se zaganja BootableClientB, naj se sistem zažene v datoteko z imenom BOOT_FNAME.
+Če se zaganja katerikoli drug, naj se sistem zažene z live USB in dobi svoj IP. USB je priklopljen na DHCP_server. Datoteke z nastavitvami za PXELinux MORAJO biti dostopne na korenskem imeniku strežnika TFTP.
+
Tako BootableClientA kot BootableClientB naj bosta brez diskov.
-""", '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 BOOT_FNAME.
-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 BOOT_FNAME.
-Make BootableClientA and BootableClientB be without discs. """
+""",
+ # TODO: write a proper translation. The one that used to be here was just wrong.
+ 'en': """Set up 4 virtual computers - simpleArbiter, DHCP_server, BootableClientA and
+BootableClientB."""
}
computers = {
'DHCPServer': {
'disks': [
{ 'name': 'DHCPServer',
},
- { 'name': 'bootable_iso',
+ { 'name': 'bootable_usb',
'options':{'readonly': True},
- # for testing purposes only
- 'parts': [ {} ],
+ 'parts': [ {'dev': 'sdb1', 'path':'/mnt'} ],
},
#{ 'name': 'CDROM',
# 'options':{'readonly': True},
@@ -60,7 +56,7 @@ computers = {
},
'SimpleArbiter': {
'disks': [
- { 'name': 'simpleArbiterDhcp',
+ { 'name': 'simpleArbiterGW',
},
#{ 'name': 'CDROM',
# 'options': {'readonly': True},
@@ -79,56 +75,56 @@ 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},
+ # 'IP_BOOT': {'descriptions': {'si': 'IP racunalnika, ki se zazene z ISO'}, 'w': True, 'public': True, 'type':'IP', 'generated': False},
+ 'TFTP_STRING': {'descriptions': {'si': 'vsebina'}, 'w': False, 'public': False, 'type':'short', 'generated': True},
'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
# TODO (polz): Do not use tabs instead of spaces!
- import socket
- import os
+ import pexpect
+ import re
+ import tftpy
+ import StringIO
results={}
- try:
- # TODO (polz): What purpose does this check serve?
- 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
- # TODO (polz): Please use pexpect instead of os.system, it's much nicer.
- # Also, test your functions. This function was obviously never run.
- #
- 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
- # you should check the DHCP response from the server.
- # You can use dhcpdump to get some packets, dhcping to create a
- # DHCP Request. You may also use any other tool.
- # If you choose to use dhcping, do not forget to set the hw address
- # and ip arguments. You can simply feed it MAC_BOOT and IP_BOOT.
- # dhcping -h MAC_BOOT -c IP_BOOT -V -r
- # could work (but you should test it)
- 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
+ # TODO (polz): Please use pexpect instead of os.system, it's much nicer.
+ # Also, test your functions. This function was obviously never run.
+ #
+ # check whether the fname served by the dhcp server is
+ # correct
+ # you should check the DHCP response from the server.
+ # You can use dhcpdump to get some packets, dhcping to create a
+ # DHCP Request. You may also use any other tool.
+ # If you choose to use dhcping, do not forget to set the hw address
+ # and ip arguments. You can simply feed it MAC_BOOT and IP_BOOT.
+ # dhcping -h MAC_BOOT -c IP_BOOT -V -r
+ # could work (but you should test it)
+ dhcpdump = pexpect.spawn("sudo dhcpdump -i eth1")
+ mac_str = pexpect.run("ip link show eth1")
+ mac_re = re.search(r"(([0-9a-f]{2}:){5}[0-9a-f]{2})", mac_str)
+ mac_SA = mac_re.group(1)
+ results['dhcping_other'] = pexpect.run('sudo dhcping -s {} -h {}'.format(
+ IP_DHCP, MAC_BOOT))
+ dhcpdump.expect('---------------------------------------------------------------------------')
+ results['dhcpdump_other_req'] = dhcpdump.before
+ dhcpdump.expect('---------------------------------------------------------------------------')
+ results['dhcpdump_other_reply'] = dhcpdump.before
+ dhcpdump.expect('---------------------------------------------------------------------------')
+ results['dhcpdump_other_release'] = dhcpdump.before
+ results['dhcping_SA'] = pexpect.run('sudo dhcping -s {} -h {}'.format(
+ IP_DHCP, mac_SA))
+ dhcpdump.expect('---------------------------------------------------------------------------')
+ results['dhcpdump_SA_req'] = dhcpdump.before
+ dhcpdump.expect('---------------------------------------------------------------------------')
+ results['dhcpdump_SA_reply'] = dhcpdump.before
+ dhcpdump.expect('---------------------------------------------------------------------------')
+ results['dhcpdump_SA_release'] = dhcpdump.before
+ dhcpdump.sendintr()
+ tftp_client = pexpect.spawn('tftp {}'.format(IP_DHCP))
+ tftp_client.sendline('get pxelinux.cfg/default /dev/stdout')
+ tftp_client.expect(r'Received \d* bytes in \d*\.\d* seconds')
+ results['tftp_string'] = tftp_client.before
# 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
@@ -139,35 +135,47 @@ def gen_params(user_id, params_meta):
r = random.Random(user_id)
net = kpov_random_helpers.IPv4_subnet_gen(r, '10.64.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.fname_gen(r)
+ params['BOOTA_FNAME'] = kpov_random_helpers.fname_gen(r)
+ params['TFTP_STRING'] = kpov_random_helpers.alnum_gen(r, 45)
# 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:
+ if results['dhcping_other'].find(params['IP_DHCP']) >= 0:
+ score += 1
+ if results['dhcping_other'].find(params['IP_DHCP']) >= 0:
+ score += 1
+ p = re.search(r"FNAME:(.*)\r",
+ results['dhcpdump_other_reply'])
+ other_fname = p.group(1)
+ if other_fname == params['BOOT_FNAME']:
score += 3
- #TASK2: SimpleArbeiter IP_GW
- if results['static_nslookup'].find('Server:\t\t{0}\r'.format(params['DNS_static'])) > -1:
+ p = re.search(r"FNAME:(.*)\r",
+ results['dhcpdump_SA_reply'])
+ sa_fname = p.group(1)
+ if sa_fname == params['BOOT_FNAME']:
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']):
+ if results['tftp_string'].split('\r\r\n')[-2] == "# " + params['TFTP_STRING']:
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
+ d = templates['DHCPServer']
+ s = """# use this exact config for your booting clients.
+# search path for the c32 support libraries (libcom32, libutil etc.)
+path
+include menu.cfg
+default vesamenu.c32
+prompt 0
+timeout 0
+# {}""".format(params['TFTP_STRING'])
+ d.write('/mnt/syslinux.cfg', s)
+
+