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