Newsgroup: it.comp.os.linux.sys
Titolo: pppd: idle insufficiente

L'opzione in questione permette di far cadedere in automatico una
connesione dopo *n* secondi di inattivita`.
Purtroppo la definizione di _inattivaita`_. cioe` connessione
assolutamente ferma, e` troppo restrittiva. Infatti anche se non
si sta ne' trasmettendo ne' ricevendo ci sono sempre ci sono
sempre delle informazioni di servizio che passane sul canale. In
questo modo anche se si imposta unh idle di 30 secondi si puo`
avere una connesione che resta inattiva anche diversi minuti
prima che cada per inattivita`. Il probelma e` noto infatti ci
sarebbe l'opzione 'active-filter filter-expression' che permette
di decidere cosa e` traffico e cosa non lo e`.
Ho detto sarebbe peche' questa opzione e` implementata solo su
NetBSD. Dal manuale non mi e` sembrato che ci sia un modo per
risolvere il problema.
Io conosco due metodi, ma non ho idea di come possano essere
implementati.
Qualcuno di voi sa come risolvere il problema?
Se nessuno sa come fare, conosco due metodi per migliorare il
comportamento di pppd. Per uno di questi ho uni'idea di scrpt, ma
ci vuole awk che io non conosco. 
A presto,
   Nuccio
 ---
You can find me at:
 e-mail: 
xywznucci...@usa.net
  REMOVE XYWZ FROM MY ADDRESS
 ICQ# 64759760

ci vuole awk che io non conosco. 
Che cos'e`, "Sentieri"? Caccia 'sti metodi, che ne parliamo.
Io, di mio, non vedo molto bene un meccanismo di controllo esterno; mi
sembrerebbe piu` giusto che fosse pppd stesso a decidere quando chiudere
bottega. Se non lo fa in modo efficiente, avra` i suoi motivi; e se i
motivi non sono abbastanza motivati, e` probabilmente comunque preferibile
cercare di mettere le cose a posto dall'interno, dove si dovrebbe avere una
visione piu` completa del traffico, piuttosto che buttargli giu` il
telefono alle spalle.
Comunque, se si tratta di dare una mano con awk, a proposito o no, non mi
tiro mai indietro.
Ciao.

 tiro mai indietro.
L'idea e` di stabilire se un traffico di x byte nel idle time
stabilito va considerato traffico. Con un po' di prove ho visto
che 100 byte in 30 secondi non sono una connessione in attivita`.
pppstats fa al caso nostro. L'output per pppstats -w 1 e di
questo tipo:
   IN   PACK VJCOMP  VJUNC  VJERR  |      OUT   PACK VJCOMP VJUNC NON-VJ
31636    662      0      0      0  |    43906    591      0     0    591
    0      0      0      0      0  |        0      0      0     0      0
    0      0      0      0      0  |        0      0      0     0      0
    0      0      0      0      0  |        0      0      0     0      0
con -w 1 genera una linea ogni secondo oppure si puo` usare un
for con uno sleep 1. Si deve estarre con awk la somma dei byte in
uscita e di quelli in entrata. Metterli in un accumulatore e se
la somma in 30 secondi e` inferiore a 100 byte si chiude la
connessione. Naturalmente 30 e 100 sono dei parametri dipendenti,
ma come prima versione di usano sono due varibili 
IDLE=30
MIN=100
poi si cerca una relazione che permette di specificare solo IDLE.
Ci sono altre possibili migliorie, ma una volta fatto lo script
non e` difficile aggiungere qualcosa di piu` intelligente. 
Per me un punto di partenza puo` essere
pppstats -w 1 -c $IDLE | awk blablabla..
Che ne pensi?


 ci vuole awk che io non conosco. 
[...]
C'e' un metodo molto piu' semplice a mio avviso...
Se ci fai caso quando configuri il pppd con l'opzione on-demand puoi
specificare anche due indirizzi ip local_IP_add:rem_IP_add (es.
192.168.0.1:192.168.0.2) verso i quali i pacchetti passano per le regole
di routing e pppd li analizza per decidere se deve alzare la
chiamata e mandarli all'esterno.  Se tu usi ipchains per negare
l'ingresso di questi pacchetti risolvi il problema:
ad esempio se il tuo problema, come penso, sono i pacchetti netbios (e
quale altro protocollo manda i dati quando non servono apparte quello di
win...) ogni 30 secondi circa io userei:
#nega tutti i pacchetti da qualsiasi origine/porte da 137 a 139 sulle
#interfaccie ppp, con protocolli tcp e udp e destinazione 192.168.0.1
ipchains -A input -s 
0.0.0.0/0.0.0.0
 -d 
192.168.0.1/255.255.255.255
 \
137:139 -i ppp+ -p TCP -j DENY
ipchains -A input -s 
0.0.0.0/0.0.0.0
 -d 
192.168.0.1/255.255.255.255
 \
137:139 -i ppp+ -p UDP -j DENY
#nega tutti i pacchetti da qualsiasi origine/porte da 137 a 139 sulle
#interfaccie ppp, con protocolli tcp e udp e destinazione 192.168.0.2
ipchains -A input -s 
0.0.0.0/0.0.0.0
 -d 
192.168.0.2/255.255.255.255
 \
137:139 -i ppp+ -p TCP -j DENY
ipchains -A input -s 
0.0.0.0/0.0.0.0
 -d 
192.168.0.2/255.255.255.255
 \
137:139 -i ppp+ -p UDP -j DENY
Ciao!

 l'ingresso di questi pacchetti risolvi il problema:
Non conosco queste cosa per sapere se e` possibile farle. Tu dici
in sostanza che queste informazioni sono inuliti?
Allora perche il protocollo le prevede?
Di solito questo problema non viene risolto cosi`. Ho letto due
tecniche i un articolo sul MLPPP. Una delle due tecniche e`
queslla di cui ho porposti l'implemetazione. L'altra non ho idea
di come si possa implementare senza un router, che nella maggior
marte delle connessioni dial-up non e` presente.


 Allora perche il protocollo le prevede?
[...]
Semplicemente perche', nel mio caso, non server avere nessuna
condivisione di risorse (quali stampanti o directory) attiva su un
computer che fa da dial-up on demand, masquerading e transparent proxy
per altri utenti che non sanno nemmeno che esiste. 
Che poi Netbios tra le informazioni inutili trasmetta anche qualcosa che
serve e' un altro discorso... :)
Ciao!

 serve e' un altro discorso... :)
Riepilogo breve. Quel leggere traffico che tiene su la
connessione inutilmente e` generato da netbios che io non suo. Le
regole che mi hai dato bloccano solo questo tipo di traffico?


Le regole che mi hai dato bloccano solo questo tipo di traffico?
Si, perche' gli ip che utilizzo (192.168.0.1 e 192.168.0.2 nell'esempio)
e l'interfaccia che utilizzo (tutti i ppp nell'esempio) sono SOLO quelle
per il dialup, mentre quelle delle eventuali schede di rete le lascio
cosi' come sono. 
In pratica applico delle regole di ipchains sugli ip a cui vengono
instradati i pacchetti per uscire su internet, in modo da evitare che il
pc alzi la chiamata inutilmente.
Ciao!

connessione.
In questo momento non ho molto tempo per sviluppare la cosa. Comunque, per
quanto riguarda awk, tirare fuori IN e OUT dale righe cosi` fatte e`
banale: li hai direttamente nelle variabili $1 e $8.
Se awk riceve (o, che e` lo stesso, pppstats produce) una riga ogni
secondo, si puo` usare un pattern sul numero di record (se la variabile NR
e` assegnabile; non ricordo in questo momento) o su un contatore apposito.
Qualcosa del genere:
righe < 30 {
  traffico += $1 + $8;
  if (traffico > 100) {
	righe = 0;
	traffico = 0;
  }
}
Il problema e` che cosa fare se non c'e` traffico. Io non so come buttar
giu` la connessione da awk; immagino che una chiamata a "system" dovrebbe
risolvere, ma non so poi bene che cosa chiamare.
L'idea comunque e` qualcosa del genere:
righe >= 30 {
  traffico += $1 + $8;
  if (traffico < 100) {
	butta giu`;
  } else {
	traffico = 0;
	righe = 0;
  }
}
Se si puo` fare in modo che, dopo la chiamata:
    pppstats -w 1 -c $IDLE | awk blablabla..
lo script di orgine se ne stia in attesa, il "butta giu`" potrebbe essere
un semplice "return" o "exit". Quindi lo script proseguira` chiudendo la
connessione.
A "righe" dovrebbe essere possibile sostituire NR (che viene incrementato
automaticamente ad ogni record), se e` assegnabile. Altrimenti e`
necessario aggiungere un'altra istruzione, all'inizio del programma awk:
   {++righe}
Il tutto nell'impossibilita` di fare alcuna prova, sicche' non garantisco
di aver detto qualcosa che abbia il benche' minimo senso.
Ciao.

connessione. Naturalmente 30 e 100 sono dei parametri dipendenti,
Puoi ottenere gli stessi dati da "ifconfig ppp0", senza bisogno quindi
di usare pppstats o tenere accumulatori.
I=ppp0
LIMIT=100
PREV=0
while(true); do
	sleep 30
	# Per la serie "chi non conosce Perl e' costretto
	# a reinventarlo", la Gray Prodàccions presenta:
	PKTS=$( ifconfig $I | grep X | tr -s " " ":" \
		| cut -d: -f4 | tr "\n" "+" \
		| cut -f1,2 -d+ | bc | grep -v + )
	NEXT=$[ $PREV + $LIMIT ]
	if [ $PKTS -lt $NEXT ]; then
		kill -9 $( pidof pppd )
		exit 0
	fi
	PREV=$PKTS
done
...lo si puo' lanciare in background da ip-up... credo :-)
Leonardo mai provato
".signature": bad command or file name

 risolvere, ma non so poi bene che cosa chiamare.
Vediamo come ti sembra quello che ho buttato giu` partendo dal
tuo codice. Il risultato e` ottenuto unendo sh e awk.
idle.awk:
BEGIN   { traffico = 0; minimo = 100 }
/* le prime due linee vanno sempre ingnorate */
NR > 2  {
        traffico += $1 + $7;
        }
END     { if (traffico < minimo) exit -1 }
ppp-on:
#!/bin/sh
# script ppp-on: effettua la connesione
#
# getstore telefonico (CT) e idle time di default
CT=88
IDLE=30
# Prendo eventuale idle time e gestore diverso dal default
if [ $# != 0 ]; then
  IDLE=$1;
  if [ $# == 2 ]; then
    CT=$2
  fi
fi
(qui c'e` la chiamata pppd|\ 
mail -s "pppd$CT: `date +%c`" $USER@shezan)&
# Ci mette un po' tra handshake modem e negoziazione ppp
sleep 30
# Ciclo su l'output di pppstats
while -1 do
  (pppstats -c $IDLE -w 1 | awk -f scrpt.awk) || \ 
  (ppp-off ; break)
done
Che ne pensi?


 ...lo si puo' lanciare in background da ip-up... credo :-)
Questo consiglio lo prendo al volo... come non detto: dove l'ho
messo io posso accedere alla variabile IDLE.


Che ne pensi?
Cioe` pppstats, e quindi awk, vengono richiamati ancora e di nuovo ogni
$IDLE? Immagino che funzioni, ma allora forse awk e` un po' troppo solo per
tirar fuori due campi.
Avevo capito che si potesse chiamare pppstats una volta sola, facendo in
modo che spedisca un record ogni secondo ad awk, nei secoli dei secoli,
finche' awk non decide di chiudere.
In questo modo caricheresti awk una volta sola, che mi sembra preferibile
(non e` certo pesante come Perl, ma non e` poi neppur una cosetta di un
paio di Kb).
Se non e` possibile, cercherei un modo per evitare awk, a favore di
qualcosa di molto piu` leggero. Tanto quello che deve fare e` veramente
elementare.
Ciao.

 elementare.
Da questo punto di vista lo script di Leonardo sembra perfetto. E
che mi devo studiare la maggior parte delle cose che usa.
Intanto una cosa di awk mi servirebbe per rendere lo script
completamente funzionate. Come si passano parametri a linea di
comando a uno script awk?


 comando a uno script awk?
Forse cosi' (dalla man page:)
       --     Indica  la  fine delle opzioni. Permette di passare
              al programma AWK stesso argomenti che comincino con
              "-",  e quindi conformi alla convenzione di passag­
              gio dei parametri della maggior parte delle  appli­
              cazioni UNIX.
-- 
Pierluigi De Rosa (
tho...@durin.khazad-dum.net
).
<<      LINUX: the choice of a GNU generation     >>
<<   For my real address... ask the Balrog.       >>
* Sostenete la Lega per la Soppressione dei Troll *

comando a uno script awk?
Glieli passi: awk -f prg.awk parametro1 parametro2 ....
E da awk li leggi con ARGC (numero parametri) e ARGV (array di parametri),
analoghi ai corrispondenti in C.
ARGV[0] e` sempre 'awk' (il nome del comando), quindi seguono i parametri.
ARGC e` quindi sempre 1 + il numero di parametri.
Ciao.

 ARGC e` quindi sempre 1 + il numero di parametri.
Alla fine mi sono accroto che la variabile NR alla fine ha il
valore del numero di righe esaminate. Cosi` non c'e` stato
bisogno di passare il valore di idle che si sta usando perche' e`
dat o dal numero di righe che ha generato pppstats.
Grazie.
Vi passo lo script corretto e funzionante.  Per attivare la
connessione si usa ppp-on che accetta due prametri: idle time
(default 30) e gestore di telefonia (default 88 cioe` wind, 55
infostrada).  Lo script ppp-on fa partire la connessione e poi
attraverso lo script awk calcola il traffico avvenuto nell'idle e
se e` inferiore a 3 byte al secondo fa cadere la connessione.
Questo mi permette di generare due log, uno per gestore, delle
telefonate con l'aiuto di procmail.
#!/bin/sh
# script ppp_on
#
CT=88
IDLE=30
if [ $# != 0 ]; then
  IDLE=$1;
  if [ $# == 2 ]; then
    CT=$2
  fi
fi
 
(/usr/sbin/pppd connect			\
  "/usr/sbin/chat -v -t60 '' 		\
   atz OK 				\
   'at S7=45 S0=0 L2V1X3&c1E1Q0' OK 	\
   atdt10${CT}0503190000 		\
   CONNECT ''"				\
idle $IDLE				\
nodetach				\
pap-max-authreq 20			\
pap-timeout 10				\
user nuccio.amoddio | 			\
sed -e '/password/d'| 			\
mail -s "pppd$CT: `date +%c`" $USER@shezan)&
echo idle time:	$IDLE
echo gestore:	$CT
# Aspetto che la connessione sia attiva
sleep 20
# Controllo che il traffico non sia troppo basso.
while [ -1 ]
do
  (/usr/sbin/pppstats -c $IDLE -w 1 | awk -f /etc/ppp/scrpt.awk) || break
done
/etc/ppp/ppp-off
Lo script awk salta le prime due linee e poi fa il conto del
traffico e se e` *poco* esce con -1.
BEGIN 	{ traffico = 0; minimo = 3; /* traffico minimo in un secondo */ }
NR > 2 	{	
	traffico += $1 + $7;
	}
END	{ if (traffico < minimo * (NR - 2)) exit -1 } 
Spero che possa essere utile a qualcuno, anche se la soluzione di
Leonardo e` sicuramente migliore. Per ora pero` non la capisco e
preferisco usare questa.


 per il dialup, mentre quelle delle eventuali schede di rete le lascio
Ho letto che le informazioni che tengono su la connessione sono
messaggi con informazioni di routing e keep-alive. 
Bisogna garantire che queste passino, ma senza considerarli
traffico. Nell'articolo la soluzione proposta usava il router, che
in quella configurazione era gia` presente.
Con le tue regole queste informazioni non vengono bloccate (e
credo che questo non vada fatto) e quindi la connessione
rimarrebbe su anche in assenza di attivita non "trofica".


Prende la somma di cio` che e` in uscita e in entrata?
Si'.
Leonardo


 	PKTS=$( ifconfig $I | grep X | tr -s " " ":" \
In questo modo selezioni le righe con il numero di pacchetti. Non
sarebbe piu` giusto moltiplicare questo valore per MTU?


sarebbe piu` giusto moltiplicare questo valore per MTU?
No, quello che interessa a me per stabilire l'attivita' di un link e'
lo scambio di pacchetti; quanto sono grossi non mi interessa piu' che
tanto.


 paio di Kb).
Da ignorante mi permetto di segnalare 'cut'.
Credo sia quello che serve qui.
--
Antonino Sabetta
sab...@quipo.it
http://web.tiscalinet.it/sabetta