summaryrefslogtreecommitdiff
path: root/kpov_judge/tasks/nat_vlc/task.py
blob: 52244957832de4e29a26851b52c00eeeacbaaff4 (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
# kpov_util should be imported by add_assignment.py

# Poglej nek film na nekem določenem URL.
# (?md5 vsota filma?)

# Nastavi nek računalnik tako, da bo izvajal NAT.
#TODO: finish this

instructions = {
    'si': '''\
<p>
Postavi dva navidezna računalnika: <em>SimpleArbiter</em> in <em>NATServer</em>. <em>NATServer</em> naj ima dva omrežna vmesnika - z enim naj bo povezan na lokalno omrežje, na katerem naj bo tudi simpleArbiter, z drugim pa na Internet.

<p>
Na <em>NATServer</em> skonfiguriraj omrežne vmesnike tako, da bo imel dostop do Interneta in da bo imel na lokalnem omrežju <code>{{IP_NAT}}</code>. Na <em>NATServer</em> ustvarite še uporabnika <code>{{IP_NAT_user}}</code>.

<p>
Poskrbi, da bo <em>SimpleArbiter</em> prek DHCP dobil naslov <code>{{IP_simple}}</code>. Poskrbi, da bo <em>NATServer</em> deloval kot prehod za <em>SimpleArbiter</em> in izvajal NAT.
''',
        'en': '''\
<p>
Set up two virtual machines: <em>SimpleArbiter</em> and
<em>NATServer</em>. <em>NATServer</em> should have two network
adapters. Connect the first adapter to <em>SimpleArbiter</em> and the
second adapter to the Internet.

<p>
Configure the network in <em>NATServer</em> so that one interface is connected to the Internet while the other is connected to <em>SimpleArbiter</em> and has the address <code>{{IP_NAT}}</code>. Create a user called <code>{{IP_NAT_user}}</code> on <em>NATServer</em>.

<p>
Configure a DHCP server on <em>NATServer</em> so that <em>SimpleArbiter</em> gets the IP <code>{{IP_simple}}</code>. Also, set up NAT on <em>NATServer</em> and set it as the gateway for <em>SimpleArbiter</em>.
''',
}

computers = {
    'NATServer': {
        'disks': [
            {   'name': 'student-NATServer',
            },
        ],
        'network_interfaces': [{'network': 'net1'}, {'network': 'test-net'}],
        'flavor': 'm1.tiny',
        'config_drive': False
    },
    'SimpleArbiter': {
        'disks': [
            {   'name': 'simpleArbiter',
            },
        ],
        'network_interfaces': [{'network': 'net1'}],
        'flavor': 'm1.tiny',
        'config_drive': False
    },
}

networks = { 'net1': {'public': False}, 'test-net': {'public': True} }

#ne potrebujemo dnsjev in ip za malibreznewtork manager?
params_meta = {
   'IP_simple': {'descriptions': {'si': 'Naslov SimpleArbiter', 'en': 'SimpleArbiter address'}, 'w': False, 'public': True, 'type': 'IP', 'generated': True},
   'IP_NAT': {'descriptions': {'si': 'Naslov NATServer', 'en': 'NATServer address'}, 'w': False, 'public': True,  'type': 'IP', 'generated': True },    
   'IP_NAT_user': {'descriptions': {'si': 'Username na NATServer', 'en': 'Username on NATServer'}, 'w': False, 'public' : True, 'type' : 'username', 'generated' : True},
   'IP_NAT_passwd': {'descriptions': {'si': 'Password na NATServer', 'en': 'Password on NATServer'}, 'w': True,'public' : True, 'type' : 'passwd', 'generated' : False},
}

def task(IP_simple, IP_NAT, IP_NAT_user, IP_NAT_passwd):
    import pexpect

    results = kpov_util.ssh_test(IP_NAT, IP_NAT_user, IP_NAT_passwd, (
        ('IP_NAT_ip_forward', 'cat /proc/sys/net/ipv4/ip_forward'),
    ))

    # Check if If IP_simple is connected to NAT
    results['IP_simple_ping_to_NAT'] = pexpect.run('ping -c 5 {}'.format(IP_NAT), encoding='utf-8')
    # Check routing table on IP_simple
    results['IP_simple_routing_table'] = pexpect.run('route -n', encoding='utf-8', env={'PATH': '/bin:/sbin'})
    # Tracert Check if IP_simple is connected to internet
    results['IP_simple_to_internet'] = pexpect.run('traceroute 8.8.8.8', encoding='utf-8')

    return results
    
def gen_params(user_id, params_meta):
    params = dict()
    r = random.Random(user_id)
    # IP_NM, DNS_NM, IP_static, DNS_static)
    # dns_servers = ['193.2.1.66', '193.2.1.72', '8.8.8.8', '8.8.4.4', '208.67.222.222', '208.67.220.220']
    net = kpov_util.IPv4_net_gen(r, 253, True, False)
    # params['DNS_NM'] = r.choice(dns_servers)
    params['IP_NAT'], params['IP_simple'] = kpov_util.IPv4_addr_gen(r, net, 2)
    params['IP_NAT_user'] = kpov_util.default_generators['username'](r)
    # params['IP_NM'] 
    # params['IP_simple'] = kpov_util.IPv4_addr_gen(r, net, 1)
    # params['DNS_static'] = r.choice(dns_servers)
    return params

def task_check(results, params):
    import re
    score = 0
    hints = []
    if re.search(
        "PING.*\r\n64 bytes from {}: icmp_seq=[0-9]+ ttl=64 time=[0-9.]* ms".format(
                params['IP_NAT']), results['IP_simple_ping_to_NAT']):
        score += 3
    else:
        hints.append("Ping to NAT incorrect")
    if results['IP_NAT_ip_forward'].strip() == "1":
        score += 2
    else:
        hints.append("ip_forward not set on NAT?")
    rs = r"1 +{0} +\({0}\)".format(params['IP_NAT'])
    if re.search(rs,
        results['IP_simple_to_internet']):
        score += 3
    else:
        hints.append("traceroute not OK")
    gateway=r'0\.0\.0\.0 +{} +0\.0\.0\.0 +UG'.format(params['IP_NAT'].replace('.', '\.'))
    if re.search(gateway,results['IP_simple_routing_table']) and \
           re.search("Kernel IP routing table\r\nDestination", results['IP_simple_routing_table']):
        score += 2
    else:
        hints.append("route not OK")
    return score, hints

def prepare_disks(templates, task_params, global_params):
    write_default_config(templates['simpleArbiter'], global_params)