]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica1/makeroute
Ya estamos fragmentando! (falta testing intensivo pero parece andar)
[z.facultad/75.74/practicos.git] / practicas / practica1 / makeroute
1 #!/usr/bin/env python
2 # vim: set et sw=4 sts=4 :
3
4 import sys, os
5
6 def get_campos(line):
7     r = []
8     for c in line.split('\t'):
9         r.append(c.strip('"\n'))
10     return r
11
12 def parse(f):
13     hosts = {}
14     line = f.readline()
15     while line:
16         if line.startswith('"tabla de ruteo de '):
17             host = line[19:-7]
18             hosts[host] = {}
19             line = f.readline()
20             hosts[host]['ifaces'] = []
21             while line and line.strip() <> '"red"\t"ip"\t"mascara"\t"gateway"\t"interfaz"\t"metrica"':
22                 if line.startswith('"'):
23                     (iface, ip, mascara, broadcast, peer) = get_campos(line)[:5]
24                     hosts[host]['ifaces'].append({
25                         'iface': iface,
26                         'ip': ip,
27                         'mascara': mascara,
28                         'broadcast': broadcast,
29                         'peer': peer,
30                     })
31                 line = f.readline()
32             line = f.readline()
33             hosts[host]['rutas'] = []
34             while line and line.strip() <> '"--"':
35                 if line.startswith('"'):
36                     (red, ip, mascara, gateway, iface, metrica) = get_campos(line)
37                     if not metrica: metrica = "1"
38                     hosts[host]['rutas'].append({
39                         'red': red,
40                         'ip': ip,
41                         'mascara': mascara,
42                         'gateway': gateway,
43                         'iface': iface,
44                         'metrica': metrica,
45                         })
46                 line = f.readline()
47         line = f.readline()
48     return hosts
49
50 def up(host, fd):
51     os.system('cp /etc/hosts /etc/hosts.bak')
52     os.system('cp hosts /etc/hosts')
53     os.system('cp /etc/networks /etc/networks.bak')
54     os.system('cp networks /etc/networks')
55     hosts = parse(fd)
56     ppp = 0
57     for iface in hosts[host]['ifaces']:
58         if iface['iface'].startswith('ppp'):
59             if host == 'h131' or host == 'h118':
60                 print 'UP: pppd -detach modem crtscts lock %(ip)s:%(peer)s /dev/ttyS0 9600' % iface
61                 os.system('pppd -detach modem crtscts lock %(ip)s:%(peer)s /dev/ttyS0 9600 &' % iface)
62             else:
63                 print 'UP: pppd -detach crtscts lock %(ip)s:%(peer)s /dev/ttyS0' % iface
64                 os.system('pppd -detach crtscts lock %(ip)s:%(peer)s /dev/ttyS0 &' % iface)
65             ppp = 1
66         else:
67             print 'UP: ifconfig %(iface)s %(ip)s broadcast %(broadcast)s netmask %(mascara)s' % iface
68             os.system('ifconfig %(iface)s %(ip)s broadcast %(broadcast)s netmask %(mascara)s' % iface)
69     if ppp:
70         print 'while sleep 1; do if ping -c1 %(peer)s 2>&1 > /dev/null; then break; else echo Esperando link ppp...; fi; done' % iface
71         os.system('while sleep 1; do if ping -c1 %(peer)s 2>&1 > /dev/null; then break; else echo Esperando link ppp...; fi; done' % iface)
72     for ruta in hosts[host]['rutas']:
73         if ruta['metrica'] <> "0":
74             print 'UP: route add -net %(ip)s gw %(gateway)s netmask %(mascara)s dev %(iface)s metric %(metrica)s' % ruta
75             os.system('route add -net %(ip)s gw %(gateway)s netmask %(mascara)s dev %(iface)s metric %(metrica)s' % ruta)
76
77 def down(host, fd):
78     hosts = parse(fd)
79     for iface in hosts[host]['ifaces']:
80         print 'DOWN: ifconfig %(iface)s down' % iface
81         if iface['iface'].startswith('ppp'):
82             os.system('killall pppd')
83         else:
84             os.system('ifconfig %(iface)s down' % iface)
85     os.system('mv /etc/hosts.bak /etc/hosts')
86     os.system('mv /etc/networks.bak /etc/networks')
87
88 def list(fd):
89     hosts = parse(fd)
90     for host in hosts.keys():
91         print host
92
93 if __name__ == '__main__':
94     if len(sys.argv) < 2:
95         print >>sys.stderr, 'Uso: %s [up|down] host' % sys.argv[0]
96         sys.exit(1)
97     fd = file('rutas.csv')
98     if sys.argv[1] == 'up':
99         up(sys.argv[2], fd)
100     elif sys.argv[1] == 'down':
101         down(sys.argv[2], fd)
102     elif sys.argv[1] == 'restart':
103         down(sys.argv[2], fd)
104         up(sys.argv[2], file('rutas.csv'))
105     elif sys.argv[1] == 'list':
106         list(fd)
107