После безуспешного шаманства вокруг pppd с использованием persist, holdof и maxfail
решил написать следующий скрипт. Запускается из rc.local#!/usr/bin/perl
use strict;
use Net::Ping;
my $hping=Net::Ping->new("icmp");
my $s=0;
sub logger($) {
my @ldata=localtime;$ldata[5]+=1900;$ldata[4]+=1;
my $j = 0;
for ($j = 0;$j < 5; $j++) {
if ($ldata[$j] <10) {
$ldata[$j] = "0" . $ldata[$j];
}
}
my $data1="$ldata[3]/$ldata[4]/$ldata[5] $ldata[2]:$ldata[1]:$ldata[0]";
open (MAN_LOG, ">>/var/log/ppp_watcher");
print MAN_LOG "pw: $data1\t$_[0]\n";
close(MAN_LOG)
}
logger("daemon started.");
`echo "kill -15 $$" > /root/ppp_watch.die`;
`chmod 0700 /root/ppp_watch.die`;
sub ppp_watch {
my @presence=split(' ', `ifconfig | grep ppp0`);
$presence[0].='';
if ($presence[0] ne 'ppp0') {
logger("trying to start daemon.");
`route add -net <LOCAL NETWORK> netmask 255.255.255.0 gw <LOCAL GW> 2>/dev/null`;
`sleep 2`;
`pppd noauth nobsdcomp nodeflate name sspm pty "pptp <GW> --nolaunchpppd" 2>/dev/null`;
`sleep 3`;
`route add -net <IP> netmask 255.255.255.0 gw <GW> 2>/dev/null`;
`sleep 2`;
`route del -net 0.0.0.0 netmask 0.0.0.0 gw <LOCAL IP> 2>/dev/null`;
`sleep 3`;
`route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0`;
$SIG{'ALRM'}='ppp_watch';
logger("delaying for 20 sec...");
alarm(20);
} else {
my @traff=split(' ', `pppstats | tail -1`);
logger("watching, total traffic $traff[0]");
$SIG{'ALRM'}='ppp_watch';
alarm(5);
}
}
ppp_watch;
sub ppp_die {
$s=1;
}
$SIG{'TERM'}='ppp_die';
while ($s ne 1) {
}
logger("daemon stopped.");
exit 0;
Кроме всего прочего ведет лог состояния и трафика.
URL:
Обсуждается: http://www.opennet.dev/tips/info/824.shtml