#!/usr/bin/env python # vim: set et sw=4 sts=4 : import sys, os def get_campos(line): r = [] for c in line.split('\t'): r.append(c.strip('"\n')) return r def parse(f): hosts = {} line = f.readline() while line: if line.startswith('"tabla de ruteo de '): host = line[19:-7] hosts[host] = {} line = f.readline() hosts[host]['ifaces'] = [] while line and line.strip() <> '"red"\t"ip"\t"mascara"\t"gateway"\t"interfaz"\t"metrica"': if line.startswith('"'): (iface, ip, mascara, broadcast, peer) = get_campos(line)[:5] hosts[host]['ifaces'].append({ 'iface': iface, 'ip': ip, 'mascara': mascara, 'broadcast': broadcast, 'peer': peer, }) line = f.readline() line = f.readline() hosts[host]['rutas'] = [] while line and line.strip() <> '"--"': if line.startswith('"'): (red, ip, mascara, gateway, iface, metrica) = get_campos(line) if not metrica: metrica = "1" hosts[host]['rutas'].append({ 'red': red, 'ip': ip, 'mascara': mascara, 'gateway': gateway, 'iface': iface, 'metrica': metrica, }) line = f.readline() line = f.readline() return hosts def up(host, fd): os.system('cp /etc/hosts /etc/hosts.bak') os.system('cp hosts /etc/hosts') os.system('cp /etc/networks /etc/networks.bak') os.system('cp networks /etc/networks') hosts = parse(fd) ppp = 0 for iface in hosts[host]['ifaces']: if iface['iface'].startswith('ppp'): if host == 'h131' or host == 'h118': print 'UP: pppd -detach modem crtscts lock %(ip)s:%(peer)s /dev/ttyS0 9600' % iface os.system('pppd -detach modem crtscts lock %(ip)s:%(peer)s /dev/ttyS0 9600 &' % iface) else: print 'UP: pppd -detach crtscts lock %(ip)s:%(peer)s /dev/ttyS0' % iface os.system('pppd -detach crtscts lock %(ip)s:%(peer)s /dev/ttyS0 &' % iface) ppp = 1 else: print 'UP: ifconfig %(iface)s %(ip)s broadcast %(broadcast)s netmask %(mascara)s' % iface os.system('ifconfig %(iface)s %(ip)s broadcast %(broadcast)s netmask %(mascara)s' % iface) if ppp: print 'while sleep 1; do if ping -c1 %(peer)s 2>&1 > /dev/null; then break; else echo Esperando link ppp...; fi; done' % iface 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) for ruta in hosts[host]['rutas']: if ruta['metrica'] <> "0": print 'UP: route add -net %(ip)s gw %(gateway)s netmask %(mascara)s dev %(iface)s metric %(metrica)s' % ruta os.system('route add -net %(ip)s gw %(gateway)s netmask %(mascara)s dev %(iface)s metric %(metrica)s' % ruta) def down(host, fd): hosts = parse(fd) for iface in hosts[host]['ifaces']: print 'DOWN: ifconfig %(iface)s down' % iface if iface['iface'].startswith('ppp'): os.system('killall pppd') else: os.system('ifconfig %(iface)s down' % iface) os.system('mv /etc/hosts.bak /etc/hosts') os.system('mv /etc/networks.bak /etc/networks') def list(fd): hosts = parse(fd) for host in hosts.keys(): print host if __name__ == '__main__': if len(sys.argv) < 2: print >>sys.stderr, 'Uso: %s [up|down] host' % sys.argv[0] sys.exit(1) fd = file('rutas.csv') if sys.argv[1] == 'up': up(sys.argv[2], fd) elif sys.argv[1] == 'down': down(sys.argv[2], fd) elif sys.argv[1] == 'restart': down(sys.argv[2], fd) up(sys.argv[2], file('rutas.csv')) elif sys.argv[1] == 'list': list(fd)