GESTIONE CONNESSIONI


Premessa: In questa pagina è possibile trovare alcuni script che utilizzo per la gestione delle connessioni, e per creare delle semplici statistiche delle stesse. Ovviamente non hanno la pretesa di essere adatti a tutti, ognuno dovrà quindi necessariamente personalizzarli. Infine, non essendo il sottoscritto un programmatore, ogni script qui presente può essere sicuramente migliorato ;-P


Prima di tutto ci si deve assicurare che i programmi utilizzati per connettersi abbiano attivo il bit SUID, cioè possono essere utilizzati da qualsiasi utente. Questo si può fare con i seguenti comandi, dati da root:

# chmod a+s /usr/sbin/chat
# chmod a+s /usr/sbin/pppd

Per comodità, sul mio pc ho ua directory /prog che contiene tutti i miei script.
Dentro /prog ho creato /prog/ppp che contiene i dati relative alle connessioni. Qui ci sono dei file chiamati con i nomi dei provider che uso (libero, tin, wind). Tutti questi file sono eseguibili (chmod 775) e hanno questo formato:

#!/bin/bash
/usr/sbin/pppd connect '/usr/sbin/chat -v \
"" ATx3m0DT01123456789 CONNECT \
"" ' user USER_NAME -d -detach &

01123456789 è il numero di telefono da chiamare
USER_NAME
è l'user name usato per quel provider

In /etc/ppp ho 3 file chiamati resolv.conf.wind, resolv.conf.libero, resolv.conf.tin con i DNS dei 3 provider. Eccoli:

###/etc/ppp/resolv.conf.libero
nameserver 193.70.192.25
nameserver 193.70.152.25

###/etc/ppp/resolv.conf.wind
nameserver 212.141.53.123
nameserver 212.245.255.2

###/etc/ppp/resolv.conf.tin
nameserver 212.216.112.222
nameserver 212.216.172.162

Sempre in /etc/ppp ci sono alcuni file standard:

###/etc/ppp/options
/dev/modem
57600
debug
lock
crtscts
defaultroute
mtu 552
mru 552

###/etc/ppp/pap-secrets
user_libero        ppp0    pass_libero
user_tin        ppp0    pass_tin
user_wind        ppp0    pass_wind

Dato che per inviare la posta utilizzo postfix, in /etc/postfix si sono tre file: main.cf.libero, main.cf.tin, main.cf.wind, tutti uguali, tranna che per:

relayhost = [mail.provider.it]

In tal modo, quando voglio utilizzare un altro provider, la posta viene inviata col server giusto.
Lo script per cambiare provider è il seguente:

###/prog/cambia
#!/bin/bash
if [ $# = 0 ]
then
        echo Manca un parametro
        exit
fi
if [ -f /etc/ppp/resolv.conf.$1 ]
then
        rm -f /etc/ppp/resolv.conf
        cp /etc/ppp/resolv.conf.$1 /etc/ppp/resolv.conf
        rm -f /etc/postfix/main.cf
        cp /etc/postfix/main.cf.$1 /etc/postfix/main.cf
        /usr/sbin/postfix reload
        echo $1 > /prog/ppp/current
        rm -f /prog/ppp/current1
        cp /prog/ppp/$1 /prog/ppp/current1
        chown hf.hf /prog/ppp/current*
else
        echo Il provider $1 non esiste
fi

Dopo aver reso questo script eseguibile con un chmod 775 /prog/cambia, per utilizzare un diverso provider sarà sufficiente lanciare (da root, altrimenti /usr/sbin/postfix reload non funziona) "cambia libero", oppure  "cambia tin" oppure ancora "cambia wind".
Lo script crea in /prog/ppp i file:
- current (con dentro il nome del provider attivo)
- current1 (esegubile che effettua la connessione)
Per verificare quindi che provider è in uso sarà sufficiente questo piccolo scirpt:

###/prog/checkisp

#!/bin/bash
echo
echo PROVIDER: `cat /prog/ppp/current`
echo

Per connettersi sarà sufficiente creare un file chiamato ISP come questo:

###/prog/isp

#!/bin/bash
echo
echo PROVIDER: `cat /prog/ppp/current`
/prog/ppp/current > /dev/null
/prog/online &

Online è un altro piccolo script che verifica quando la connessione è avvenuta lanciando continuamente ifconfig.

###/prog/online
#!/usr/bin/perl
while (1) {
@a=`ifconfig`;
    foreach $line (@a) {
        if ($line =~ /ppp/) {
        $found++;
        last;
        }
    }
    if ($found == 1) {
    print "\nStato: ON-LINE\n";
    last;
    }
sleep(1);
}
open (FILE,"> /prog/ppp/time");
$time=time;
print FILE "$time";
close FILE;

ifconfig è però un programma che può usare solo l'utente root, sarà quindi necessario dare il comando:
ln -s /sbin/ifconfig /usr/local/bin/ifconfig
Lo script qui sopra verifica quando si è online e salva in un file chiamato /prog/ppp/time l'ora dell'inizio della connessione.
Lo script sottostante, da come output i minuti di connessione:

###/prog/timeisp
#!/usr/bin/perl
open(FILE,"/prog/ppp/time") || die "Non si è ancora connessi";
@file = <FILE>;
close FILE;
chomp $file[0];
$time=time-$file[0];
$time=int($time/60);
print "\nDURATA CONNESSIONE: $time minuti\n\n";

Per scollegarsi ecco un altro script:

###/prog/scollega
#!/bin/bash
if [ -f /var/run/ppp0.pid ]
then
kill `cat /var/run/ppp0.pid`
else
echo Non si è ancora connessi
fi
timeisp
rm -f /prog/ppp/time
makelog
cat /dev/null > /var/log/daemon

Questo script, oltre a chiudere la connessione, cancella il file /prog/ppp/time che non serve più, visualizza la durata della  connessione e lancia un altro script, makelog.

###/prog/makelog
#!/usr/bin/perl
open (LOG,"< /var/log/daemon") || die "Impossibile aprire il file: $!";
@log = <LOG>;
close LOG;
        foreach $line (@log) {
        chomp $line;
        $line =~ s/  / /g;
        @line = split (/\s/,$line);
        if ($line[4] =~ /^pppd/i) {
        $time = sprintf("%5s",$line[7]) if ($line[5] eq 'Connect'&&  $line[7] ne 'failed');
        if ($line[5] eq 'Sent') {
                $sent = sprintf("%5s",mega($line[6]));
                $recv = sprintf("%5s",mega($line[9]));
                $line[1] = sprintf("%2s",$line[1]);
                $level = &ora;
                $tariffa = "-!-" if ($level == 1);
                $tariffa = "- -" if ($level == 2);
                $costo = sprintf("%5d",100+($time*20)) if ($level == 1);
                $costo = sprintf("%5d",120+($time*17)) if ($level == 2);
                print "$line[1] $line[0] $line[2] [$tariffa] | $time min | $sent Mb  | $recv Mb | $costo lire\n";
                $time = '';
                $sent = '';
                $recv = '';
                }
        }
        }

sub mega {
local ($byte) = @_;
$mega = $byte/(1024*1000);
$mega = sprintf("%.1f",$mega);
return $mega;
}

sub ora {
        $_ORA=`date +%H-%M-%a`;
        chomp $_ORA;
        ($ORA,$MIN,$GIO) = split(/-/,$_ORA);
        return 2 if ($GIO eq 'sab' || $GIO eq 'dom');
        return 1 if ($ORA > 8 && $ORA < 18);
        if ($ORA == 18) {
                return 1 if ($MIN <= 30);
                return 2 if ($MIN > 30);
        }
        return 2;
}

Questo script agisce sul file /var/log/daemon, dove vengono salvati tutti i dati relativi ai demoni.
Per fare ciò si deve modificare il file /etc/syslog.conf aggiungendo la riga:
daemon.* /var/log/daemon e dando i permessi al file: chmod 666 /var/log/daemon

Makelog crea in /prog/ppp un file chiamato "bolletta" nel quale salva le seguenti opzioni:
- Giorno e ora dell'inizio della connessione
- Durata della connessione
- Megabyte inviati
- Megabyte ricevuti
- Costo della telefonata
Per impostare i costi modificare la parte eviednziata in rosso specificando costo al minuto e scatto alla risposta, in lire a seconda delle fasce orarie (la prima intera, la seconda ridotta).
Lo script tiene conto anche dell'ora della chiamata, applicando quindi la tariffa intera o ridotta.
Un altro script, /prog/totale, darà come output il file /prog/ppp/bolletta e anche il costo totale di tutte le chiamate:

###/prog/scollega
#!/usr/bin/perl
open (FILE,"/prog/ppp/bolletta");
@file = <FILE>;
close FILE;
        foreach $line (@file) {
        print "$line";
        chomp $line;
        @a = split (/ /,$line);
        $totale += $a[$#a-1];
        }
$totale = converti($totale);
print "\n+ TOTALE: $totale lire\n\n";

sub converti {
local ($numero) = @_;
$numero = reverse $numero;
$numero =~ s/(\d\d\d)(?=\d)(?!\d*\,)/$1./g;
return scalar reverse $numero;
}

INDIETRO