#!/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. """, '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 # TODO (polz): Do not use tabs instead of spaces! import socket import os 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 # 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