Uso delle script di automazione dei test ntkd su netkit
Alcune scripts sono state create (e con il tempo sono state e saranno corrette e migliorate) per facilitare le operazioni di test e debug di Netsukuku all'interno di un ambiente Netkit.
Le scripts si trovano nella directory scripts-netkit di netsukuku. Queste scripts vengono testate ed usate con le macchine virtuali di Netkit che montano il filesystem descritto in TestWithNetkit e con una macchina host con sistema Ubuntu.
Presumibilmente, dovrebbero funzionare in modo analogo con una qualsiasi distribuzione GNU/Linux moderna come sistema host.
L'obiettivo di queste script è quello di facilitare le seguenti operazioni:
Creazione di uno scenario (chiamato anche lab), anche complesso, che possa essere avviato con un solo comando.
Salvataggio e successiva visualizzazione dei logs prodotti dalle istanze di ntkd che girano sulle diverse macchine del lab.
Avvio in tempi prestabiliti sia del demone ntkd, sia di comandi utili a testare la connettività della rete.
...
Funzioni helper
Alcune operazioni sono state implementate come funzioni bash, negli script host_utils.bash e service.bash.
Il primo è utile per programmare le operazioni che deve svolgere il laboratorio nel suo insieme.
Per implementare un laboratorio si crea una script (di norma in una directory vuota) il cui compito è quello di avviare un certo numero di macchine virtuali.
In tale script si può importare (con il comando source o .) lo script host_utils.bash che definisce alcune funzioni utili alla macchina host.
Il secondo è utile per programmare le operazioni che deve svolgere una singola macchina virtuale.
Di solito ogni macchina virtuale si avvia specificando uno script da eseguire al suo interno come "boot". Lo script può risiedere anche all'esterno della macchina virtuale, ad esempio si può accedere tramite la pseudo-directory /hosthome/. Di norma si mette lo script di boot della macchina virtuale nella stessa directory in cui si è messo lo script di avvio del laboratorio a cui appartiene.
In tale script si può importare (con il comando source o .) lo script service.bash che definisce alcune funzioni utili alla macchina virtuale.
Creazione di un lab
Dimostriamo l'uso delle funzioni presenti negli scripts host_utils.bash e service.bash con un esempio.
Creiamo in una directory vuota all'interno della nostra home, il file launchlab.bash contenente:
#!/bin/bash # Call base script to define functions. . ~/netsukuku/scripts-netkit/host_utils.bash # Find the directory where this script resides... find_dir_script $0 SCRIPT_IS_HERE=$RET # ... the way it is accessible from guest. make_hosthome_path $SCRIPT_IS_HERE DIRPATH=$RET vstart -e ${DIRPATH}/service1.bash guest01 --eth0=A --eth1=B --mem=64 &>/dev/null sleep 1 vstart -e ${DIRPATH}/service2.bash guest02 --eth0=B --eth1=C --mem=64 &>/dev/null sleep 1 vstart -e ${DIRPATH}/service3.bash guest03 --eth0=C --eth1=D --mem=64 &>/dev/null sleep 1 vstart -e ${DIRPATH}/service4.bash guest04 --eth0=D --eth1=E --mem=64 &>/dev/null sleep 1 echo 'Lab launched.'
Nella stessa directory creiamo i files service1.bash, service2.bash, service3.bash e service4.bash. Il primo contiene:
#!/bin/bash # Call base script to define functions. . /hosthome/netsukuku/scripts-netkit/service.bash # Find the directory where this script resides. find_dir_script $0 SCRIPT_IS_HERE=$RET launch_ntkd $SCRIPT_IS_HERE 0 echo "Virtual Machine 1: services started." echo "logs to " $NTKD_OUTPUT
Negli altri cambiamo nella penultima riga il numero della VM e nella riga precedente il numero di secondi da attendere prima di avviare il demone.
Per una prima prova di laboratorio possiamo mettere 0 secondi per la prima macchina, 30 per la seconda, 60 per la terza e 90 per la quarta.
Ora avviamo, dalla directory in cui abbiamo salvato, lo script launchlab.bash
luca@luca-laptop:~/test-ntk/lab_1$ ./launchlab.bash Lab launched.
Appaiono le console delle macchine virtuali. Al loro interno possiamo vedere (ad esempio in guest01)
--- Starting Netkit phase 2 init script --- Executing /hosthome/test-ntk/lab_1/service1.bash ... Virtual Machine 1: services started. logs to /hosthome/test-ntk/lab_1/guest01/ntkd.log --- Netkit phase 2 initialization terminated ---
e dopo un po' di tempo compare alla console anche la dicitura:
ntkd daemon launched.
Questa dicitura compare quando viene avviato il demone, quindi la vedremo apparire nella prima console immediatamente, nella seconda dopo 30 secondi, e così via.
Quando saranno passati circa 3 minuti, possiamo dare all'interno delle macchine virtuali il comando 'ip route' per vedere se le rotte sono state impostate, e poi arrestarle con il comando 'halt'.
Vediamo ora nel dettaglio il significato delle script che abbiamo creato.
Avvio del laboratorio
Nella script launchlab.bash abbiamo fatto uso delle funzioni find_dir_script e make_hosthome_path (presenti in host_utils.bash) per recuperare la path delle directory in cui si trova la script, nel modo in cui si può raggiungere dell'interno della macchina virtuale.
Poi abbiamo avviato (con un sleep di 1 secondo tra l'una e l'altra) 4 macchine virtuali, dando ad ognuna come script di boot le script create in questa directory.
Dopo aver avviato le macchine virtuali la script termina.
Avvio del demone
Per ogni macchina virtuale, l'avvio del demone ntkd sarà gestito dal suo script di boot, che importa lo script service.bash.
Per avviare il demone ad un determinato istante è sufficiente richiamare la funzione launch_ntkd (presente in service.bash) specificando la directory su cui salvare i logs e i secondi da attendere.
Per salvare i logs nella stessa directory in cui si trovano gli script del laboratorio si può usare la funzione find_dir_script (presente in service.bash)
La funzione launch_ntkd ritorna subito, anche se ad esempio si richiedesse un delay di 30 secondi. E alla sua uscita sono valorizzate le variabili:
NTKD_OUTPUT: path del file in cui vengono salvati i log del demone ntkd;
NTKD_PID: identificativo del processo del demone.
Il PID del demone può essere usato con la funzione kill_generation (presente in service.bash) per terminare il processo.
Siccome la funzione launch_ntkd ritorna subito, la script prosegue e noi vediamo immediatamente la dicitura Virtual Machine 1: services started e solo dopo un po' di tempo la dicitura ntkd daemon launched.
Inoltre questo è necessario per avere immediatamente il prompt dei comandi nella console della macchina virtuale.
Altre possibili operazioni programmate
Nello script abbiamo specificato dopo quanto tempo avviare il demone ntkd. Prima di terminare lo script, possiamo "schedulare" altre operazioni.
Ad esempio questo script:
#!/bin/bash # Call base script to define functions. . /hosthome/netsukuku/scripts-netkit/service.bash delay_then_kill() { DELAY=$1 NTKD_PID=$2 sleep $DELAY kill_generation $NTKD_PID echo "launch_ntkd killed." } # Find the directory where this script resides. find_dir_script $0 SCRIPT_IS_HERE=$RET launch_ntkd $SCRIPT_IS_HERE 0 delay_then_kill 180 $NTKD_PID & echo "Virtual Machine 1: services started." echo "logs to " $NTKD_OUTPUT
avvia immediatamente il demone; di seguito avvia in background una funzione che interromperà il demone dopo 180 secondi.
Visualizzazione log
Nell'output prodotto dal demone si trovano i log.
Ogni riga contiene la data e il tipo di informazione (ULTRADEBUG livello 4, DEBUG livello 3, INFO livello 2, WARNING livello 1, ERROR livello 0).
Questo ci permette di filtrare le informazioni in eccesso e ordinare cronologicamente i log provenienti anche da diverse macchine virtuali.
Per facilitare queste operazioni ci sono le scripts view_logs.bash e view_short_ip_cmds.bash.
view_logs.bash prende come primo parametro il livello di informazioni desiderato e di seguito i files con i log.
Ad esempio
~/netsukuku/scripts-netkit/view_logs.bash 2 guest01/ntkd.log guest02/ntkd.log guest03/ntkd.log guest04/ntkd.log
produce in output i log in ordine cronologico, fino al livello INFO. I log provenienti dalla prima macchina virtuale sono allineati a sinistra. Quelli della seconda sono indentati di 3 spazi, della terza di 6 e così via.
view_short_ip_cmds.bash prende come parametri solo i files con i log.
Ad esempio
~/netsukuku/scripts-netkit/view_short_ip_cmds.bash guest01/ntkd.log guest02/ntkd.log guest03/ntkd.log guest04/ntkd.log
produce solo le informazioni riguardanti la tabella di routing del kernel. Anche in questo caso indentati in base all'ordine dei files specificati.
Raccolta informazioni
Lo script net_info.bash va eseguito all'interno della macchina virtuale.
Produce sullo standard output informazioni su:
le interfacce di rete presenti nel sistema (una riga che inizia con "nic" per ogni interfaccia)
- l'indirizzo IP proprio del sistema
una unica riga che inizia con "addr";
- si presume che il sistema usi netsukuku, quindi abbia un solo indirizzo;
- si presume anche che il sistema abbia l'interfaccia eth0.
i vicini noti al sistema (una riga che inizia con "neighbour" per ogni vicino)
- gli altri nodi e gnodi della rete verso i quali il sistema ha una rotta;
una riga che inizia con "gnode_1" per ogni nodo appartenente al nostro stesso gnodo di livello 1.
una riga che inizia con "gnode_2" per ogni gnodo di livello 1 appartenente al nostro stesso gnodo di livello 2.
una riga che inizia con "gnode_3" per ogni gnodo di livello 2 appartenente al nostro stesso gnodo di livello 3.
una riga che inizia con "gnode_4" per ogni gnodo di livello 3 appartenente al nostro stesso gnodo di livello 4.
Lo script collect_ips.bash va eseguito all'interno della macchina virtuale. Fa uso dello script net_info.bash.
Produce sullo standard output un elenco di indirizzi IP che riesce a raccogliere.
- Il proprio IP
- Quelli dei vicini
- Quelli del primo nodo che incontra su ogni gnodo nella mappa