Bullwinkle: Hey Rocky, guarda, tiro fuori un coniglio dal cappello.
Rocky: Ma quel trucco non funziona mai.
Bullwinkle: Questa volta sì.
Voilà!
Beh, ci sono andato vicino.
Rocky: Ed ora è il momento di un altro effetto speciale.
--- "Rocky e i suoi amici"
XmDipmon è un'elegante applicazioncina che mostra un bottone indicante lo stato di una connessione Internet. Lampeggia e suona quando la connessione si interrompe, come troppo spesso accade nelle linee telefoniche di campagna. Sfortunatamente XmDipmon funziona solo con dip, il che lo rende inutile per tutti quelli, la maggioranza, che usano chat per collegarsi.
Compilare XmDipmon non è un problema. XmDipmon si linka con le librerie Motif, ma può essere compilato, e funziona bene, anche con le Lesstif. La sfida è di modificare il pacchetto per farlo funzionare con chat. Ciò in pratica richiede di armeggiare con il codice sorgente ed è quindi necessario avere delle conoscenze di programmazione.
"Quando xmdipmon parte, cerca un file chiamato /etc/dip.pid
(potete fargli cercare un altro file usando l'opzione -pidfile
dalla riga di comando). Tale file contiente il PID del demone
dip (dip stesso si pone in modo demone, dopo che ha stabilito
una connessione)."
--- dal file README di XmDipmon
Usando l'opzione -pidfile, il programma può essere indotto, al suo avvio, a cercare un altro file, uno che esista solo dopo che un login con chat è stato effettuato con successo. Il candidato più ovvio è il file di lock del modem. Potremmo quindi provare a lanciare il programma con xmdipmon -pidfile /var/lock/LCK..ttyS3 (assumendo che il modem sia sulla porta com numero 4, ttyS3). Comunque così si risolve solo una parte del problema. Il programma osserva continuamente il demone dip e dobbiamo invece fare in modo che controlli un processo che sia associato a chat o a ppp.
C'è un solo file sorgente e fortunatamente è ben commentato.
Scorrendo il file xmdipmon.c
troviamo la funzione
getProcFile, la cui descrizione, all'inizio, riporta quanto segue:
/*****
* Name: getProcFile
* Return Type: Boolean
* Description: tries to open the /proc entry as read from the dip pid file.
<snip>
*****/
(Traducendo la descrizione: prova ad aprire l'elemento di /proc secondo quanto letto dal file pid di dip)
Siamo sulla pista giusta. Guardando nel corpo della funzione...
/* we watch the status of the real dip deamon */
sprintf(buf, "/proc/%i/status", pid);
procfile = (String)XtMalloc(strlen(buf)*sizeof(char)+1);
strcpy(procfile, buf);
procfile[strlen(buf)] = '\0';
Il colpevole è la linea 2383:
sprintf(buf, "/proc/%i/status", pid);
^^^^^^^^^^^^^^^^^^^^^
Questo controlla se il processo demone dip è in esecuzione. Quindi, come possiamo cambiarlo in modo che controlli il demone pppd?
Guardando sulla pagina di manuale di pppd:
FILES
/var/run/pppn.pid (BSD o Linux), /etc/ppp/pppn.pid (altri)
Identificatore del processo (Process-ID) di pppd sull'unità
d'interfaccia n di ppp.
Cambiamo la linea 2383 di xmdipmon.c
in:
sprintf(buf, "/var/run/ppp0.pid" );
Ricompiliamo il pacchetto così modificato. Nessun problema con la
compilazione. Ora proviamolo con il nuovo argomento della riga di comando.
Funziona che è un incanto. Il bottoncino blu indica quando è
stata stabilita una connessione ppp
con l'ISP e lampeggia e suona
quando la connessione si interrompe. Ora abbiamo un monitor per
chat pienamente funzionante.
XmDipmon può essere scaricato da Ripley Linux Tools.