i=0
pppip="<my_ip>"
echo -e "waiting pppoe connection"
until [ "$i" -eq "30" ]
do
iconf=`/sbin/ifconfig tun0 | awk '/inet/ {print $2}'`
if [ "$iconf" = "$pppip" ]
then
echo -e "successful"
i="30"
break
else
i=`expr $i + 1`
echo -n "."
sleep 5
fi
done
if [ "$iconf" != "$pppip" ]
then
echo -e "pppoe not connected!\nSystem will be reboot"
reboot
fi #! / usr / bin / perl
use strict;
use warnings;
use threads;
use Touch;
use Net :: Ping;
use Net :: Ifconfig :: Wrapper qw (Ifconfig);
my @check_hosts = qw / ya.ru google.com/;
my @check_ips = qw / 172.18.1.1 172.18.1.2/;
my $ int_if = 're0';
my $ ext_if = 're1';
sub get_ips {
my ($ iface) = @_;
my @ifaces = ();
my $ info = Ifconfig ('list', '', '', '');
unless (defined ($ info -> {$ iface})) {
die "Couldn't find ip address on $ iface \ n";
}
for (sort keys% {$ info -> {$ iface} {'inet'}}) {
push (@ifaces, $ _);
}
if (scalar (@ifaces)> 0) {
return \ @ifaces;
}
else {
return undef;
}
}
sub ping_state {
my ($ dst_src, $ proto, $ iface) = @_;
die "Check params in sub ping_state"
unless (defined ($ dst_src) && ref ($ dst_src) eq 'ARRAY');
$ proto = ''
unless (defined ($ proto));
my $ p = Net :: Ping-> new ($ proto);
my $ int_ips = undef;
$ int_ips = get_ips ($ iface)
if (defined ($ iface));
$ p-> bind ($ int_ips -> [0])
if (defined ($ int_ips));
my $ i = 0;
for my $ sources (@ {$ dst_src}) {
if ($ p-> ping ($ sources, 10)) {
$ i ++; last;
}
}
$ p-> close ();
if ($ i> 0) {return 1; }
else {return 0; }
}
sub do_log {
my ($ message, $ log_file) = @_;
$ log_file = '/var/log/ifaces.log'
unless (defined ($ log_file));
unless (-e "$ log_file") {
touch ($ log_file) or die ("Failed touch $ log_file");
}
open (LOG, ">> $ log_file");
my ($ sec, $ min, $ hour, $ mday, $ mon, $ year) = localtime (time);
print LOG '['. ($ year + 1900).
'-'. (($ mon <10)? ('0'. $ mon): $ mon).
'-'. (($ mday <10)? ('0'. $ mday): $ mday).
''. (($ hour <10)? ('0'. $ hour): $ hour).
':'. (($ min <10)? ('0'. $ min): $ min).
':'. (($ sec <10)? ('0'. $ sec): $ sec).
']'. "$ message \ n";
close LOG;
}
my $ thr = threads-> create (sub {
unless (ping_state (\ @ check_ips, 'tcp', $ int_if)) {
do_log ("Check connect to LAN resources: failed");
system ("dhclient $ ext_if");
}
});
unless (ping_state (\ @ check_hosts, 'icmp')) {
do_log ("Check connect to WAN resources: failed");
opendir (RUN, '/ var / run');
for (grep {/tun\w+\.pid/} readdir (RUN)) {
open (PID, '/ var / run /'. "$ _");
local $ / = undef;
my $ pid = <PID>;
close (PID);
chop ($ pid);
kill (9, $ pid);
}
closedir (RUN);
system ("ppp -ddial akado");
}
foreach my $ t (threads-> list (threads :: all)) {
$ t-> join ();
} Source: https://habr.com/ru/post/66644/
All Articles