Ashier, utility per l’automazione dell’interazione da terminale

Di - 9 November 2012 - in

Google rilascia Ashier, un software per automatizzare l’interazione in un terminale in riga di comando. Spesso accade di dover lanciare un comando che, dopo un certo periodo di tempo, chieda qualcosa all’utente (ad esempio la compilazione di un software). Non sempre si ha tempo di attendere la domanda, e la si lascia quindi in sospeso finché non si torna al terminale.

Risultano quindi necessari dei software in grado di rispondere in automatico alle domande, simulando la presenza di una persona. Tali software, per essere utilizzabili, devono essere in grado di leggere le domande e di dare quindi la risposta corretta in base alla domanda.

Ashier, rilasciato su Google Code, ha proprio questa funzione ed è in grado di assolverla basandosi su template e su programmi scritti in qualunque linguaggio. Esistono già software analoghi, come il classico expect, ma Ashier ha il duplice vantaggio di avere template facilmente comprensibili e di essere indipendente dal linguaggio di programmazione usato.

Le cose sono molto piú facili a farsi che a dirsi, quindi vi propongo i due esempi fatti da Google.

Nel primo esempio, si utilizza wargames, celebre programmino classico della collezione bsdgames, presente in qualunque distribuzione Linux. È bene rispondere di no alla domanda Would you like to play a game? (per motivi che non vi sto a spiegare).

Per intercettare la domanda e rispondere, è necessario creare un file di template, che chiameremo wargames.ahr così composto:

>       Would you like to play a game?
! terminal "n"

Il simbolo > seguito da TAB nella prima riga serve ad indicare che la stringa che segue è quella a cui associare l’azione. La seconda riga è l’azione da intraprendere, ovvero la digitazione su terminale del tasto “n”.

A questo punto basterà lanciare Ashier con il comando:

ashier -c wargames.ahr /bin/false

-c wargames.ahr è l’opzione per caricare il file di template, mentre /bin/false

(un programma che in Linux non fa nulla) è messo come programma di controllo, dal momento che non ci serve alcun programma di controllo in questo caso.

Verrà cosí lanciata una shell interattiva, sulla quale si potrà eseguire wargames dando in automatico la risposta “no” alla domanda.

Il secondo esempio è un caso d’uso un po’ piú pratico. Tra le utilità di sistema piú note e comode, esiste ping. Si tratta di un programmino in grado di mandare un pacchetto dati noto come ping ad un nodo su una rete, alla quale il nodo dovrebbe rispondere con un pacchetto dati simile chiamato pong. L’utilità, inoltre, stampa alla ricezione del pong (o dopo un timeout) alcune informazioni, come il tempo trascorso tra l’invio del ping e la ricezione del pong, molto utili per la diagnostica delle reti. Sui sistemi UNIX e derivati, come Linux, in genere ping continua ad inviare pacchetti finché non riceve un segnale di SIGINT (ad esempio finché l’utente non preme Ctrl-C sulla tastiera).

Esiste in effetti un’opzione per fare in modo che l’utilità si fermi dopo un certo numero di ping, ma fingiamo che questa opzione non esista e supponiamo che ci serva di inviare solo dieci ping, interrompendo poi con un SIGINT il programma.

Creiamo il nostro file di template, che chiameremo ping-output.ahr:

>       64 bytes from slashdot.org (216.34.181.45): icmp_req=3 ttl=230 time=94.4 ms
?       ..
?                     ............................
?                                                            . req
?                                                                  ... ttl
?                                                                           .... time
! controller "REPLY $req $ttl $time"

Analizziamolo. La sintassi della prima riga ci è già nota. Le righe successive iniziano con un punto interrogativo seguito da TAB. Tale simbolo indica che si tratta di una riga che contiene un modificatore della stringa da cercare. I puntini indicano che ciò che è nella stessa posizione nella stringa ha un contenuto variabile (il numero 64, in questo caso, potrebbe essere qualunque altra cosa, tranne la stringa vuota). Lo stesso vale per la terza riga.

Nella quarta riga, oltre a dare la possibilità di avere altro che non sia il numero 3, si dice anche che ciò che sarà in quella posizione sarà etichettato come “req”. Lo stesso vale nella riga successiva, dove etichetteremo ciò che sta al posto del 230 come “ttl”, e nella riga ancora successiva, dove etichetteremo ciò che sta al posto del 94.4 come “time”.

L’ultima riga, invece di far digitare un tasto da terminale, richiede di inviare al programma di controllo la stringa “REPLY” seguita dai numeri etichettati come “req”, “ttl” e  “time”.

Il nostro programma di controllo sarà un semplice script python, ping_react.py:

#!/usr/bin/python

import sys

print 'exec /bin/ping %s' % sys.argv[1]  # Esegue ping con gli argomenti passati

responses = 0
with open(sys.argv[2], 'w') as output:   # apre il file di output (il nome è passato come argomento)
  while responses < 10:                  # Finché non si arriva a 10 risposte
    line = sys.stdin.readline()          # Riceve la stringa da Ashier
    if line.startswith('REPLY '):        # Controlla che inizi con REPLY
      output.write(line[6:])             # Scrive i parametri passati da Ashier sul file di output
      responses += 1                     # Incrementa il contatore

sys.stdout.write(chr(3))                 # Invia il SIGINT tramite Ctrl-C

A questo punto ci basta lanciare Ashier con il comando:

ashier -c ping_output.ahr ./ping_react.py google.com output.txt

Il parametro -c ping_output.ahr carica il template, mentre ./ping_react.py specifica il nostro programmino di controllo. Seguono i due parametri per il nostro programmino, ovvero l’indirizzo del nodo a cui fare ping e il nome del file di output.

Il comando lancerà direttamente ping con i parametri richiesti e lo terminerà dopo dieci ping scrivendo l’output su file. La scrittura dell’output su file è necessaria, in quanto Ashier non permette di far scrivere output su terminale al programma di controllo.

Considerato che qualcuno a questo punto potrebbe esserselo chiesto, aggiungo che è possibile essere un po’ piú precisi nel controllo delle stringhe, specificando espressioni regolari in maniera simile al modo in cui si specificano le etichette. La documentazione è molto ben fatta e molto chiara a riguardo.

Insomma, una utility molto comoda e decisamente versatile, che renderà del tutto inutile il drinking bird.

Via | Google Open Source Blog

Leave a Reply

Lorenzo Breda Articolo scritto da

Studente di Informatica a Roma, si occupa di programmazione web sopratutto lato server, e di accessibilità del web. Utilizza e ama Debian GNU/Linux, e si interessa di fisica, fumetto, trekking e fotografia (gli ultimi due possibilmente abbinati). Collabora con Googlab da aprile 2012.

Contatta l'autore

Previous post:

Next post: