[CentOS] Need basic PPPoE startup help

Wed Jul 9 15:47:05 UTC 2008
Robert Moskowitz <rgm at htt-consult.com>

I need basic PPPoE startup help.

adsl-start DID bring up my PPPoE link (ppp0) to my ISP over eth0 via the 
DSL modem/bridge.  My IPv4 CIDR block is routing and Shorewall is doing 
the firewalling.

But shorewall has to be started after ppp0 is up and working.  For now 
this means running shorewall restart (or start?).  Shorewall 4.2 will 
have a way to restart shorewall without recompiling, I learned on the 
their list.

In /etc/sysconfig/network-scripts/ifcfg-ppp0 I have:

BOOTPROTO=dialup
NAME=DSLppp0
DEVICE=ppp0
TYPE=xDSL
ONBOOT=no

Should ONBOOT be changed to yes, or is there some startup script that I 
should add the

/sbin/adsl-start ppp0

command line followed with the shorewall restart command?

I am away at IEEE 802 plenary meeting next week, and I need this to be 
automated in case of system glitches.

Also sometimes the Speedstream just stops forwarding datagrams.  
Supposedly if it overheats.  This requires a power recycle for the 
speedstream (and my ISP will not use anything else for the modem 
services).  I suspect this will glich the PPPoE connection as well, so I 
will need some sort of watchdog and a restart of ppp0 and Shorewall.  
Attached is a rather large script of a user that I picked up on the 
Shorewall list for some Linux distro.  I am NOT a script reader, let 
alone writer.  Should I use this (how would I modify it for Centos and a 
ppp0 interface) and where would I place it to run as needed?

=======================================================

#!/usr/bin/perl -w

#THIS SCRIPT CREATED BY EJM (alias Erik Mundall) IN ORDER TO MAINTAIN A 
CONSTANT CONNECTION WITH THE TWO
#PPPOE ADSL LINES WHICH HAVE PROVEN TO BE UNRELIABLE/UNSTABLE.  15 APRIL 
2008
#
#THIS PROGRAM NEEDS TO FOLLOW THE FOLLOWING ROUTINE IN ORDER TO MAINTAIN 
CONNECTIVITY OF THE TWO PPPOE LINES
#AND TO SHARE THE INTERNET LOAD ACROSS THOSE AND ACROSS THE STATIC LINE
#
#THE STATIC SHOULD NEVER FAIL.  THIS SCRIPT IS INTENDED TO ADDRESS ONLY 
THE INSTABILITY OF THE TWO PPPOE
#LINES, AND WILL DO NOTHING FOR THE STATIC LINE IF IT SHOULD FAIL.
#
#
#STEP ONE:    THE PROGRAM SHOULD IDENTIFY THE LINE(S) THAT ARE DOWN, IF 
ANY, AND ISOLATE THEM.
#STEP TWO:    THE PROGRAM SHOULD RECONFIGURE AND RESTART SHOREWALL TO 
MATCH THE LINES THAT ARE UP.
#STEP THREE:    THE PROGRAM SHOULD FOCUS ON RESTORING THE DROPPED PPPOE 
LINE(S).
#STEP FOUR:    THE PROGRAM MUST REPEAT STEP TWO ONCE STEP THREE HAS 
SUCCEEDED.

###############################################
#  REQUIRED VARIABLES.  THESE MUST BE SET PROPERLY!!!
our $admin_email =q`your_email_address at your_domain_name.com`;
our $domain_name = "your_domain_name.com";
our $GATEWAY_1 = 'x.x.x.x'; #GATEWAY OF PPP0 LINE
our $GATEWAY_2 = 'x.x.x.x'; #GATEWAY OF PPP1 LINE
our $IPADDRESS_1 = 'x.x.x.x'; #STATIC IP ADDRESS OF PPP0 LINE (ASSIGNED 
BY ISP)
our $IPADDRESS_2 = 'x.x.x.x'; #STATIC IP ADDRESS OF PPP1 LINE (ASSIGNED 
BY ISP)

our $DEBUG=1;   #SET THIS TO 1 FOR DEBUGGING, 0 TO TURN DEBUGGING OFF
our $DEBFILE='/var/log/ppp/debug.log'; #THE /var/log/ppp DIRECTORY MUST 
EXIST FOR THE DEBUG FILE
our $logfile='/var/log/ppp/maint.log'; #THE /var/log/ppp DIRECTORY MUST 
EXIST FOR LOGGING.

###############################################
# BELOW THIS LINE, NOTHING MORE SHOULD NEED TO BE CONFIGURED.
our @ifconf = ();
our @iprout = `/sbin/ip route`;
our $p1;
our $p2;
our $ppp0=0;
our $ppp1=0;
our $FAILED='FALSE';
our $FAIL='TRUE';
our $attempt=0;
our $date='';
our @data=();
our @updata=();
our @log=();
our @total_log=();
our $cur_day=0;
our $cur_month=0;
our $cur_year=0;
our $late_day=0;
our $late_month=0;
our $late_year=0;
our 
%months=(Jan,1,Feb,2,Mar,3,Apr,4,May,5,Jun,6,Jul,7,Aug,8,Sep,9,Oct,10,Nov,11,Dec,12);
our $start_time=`/bin/date`;
our $stop_time;

#############################################
### SAFEGUARD AGAINST MULTIPLE PROCESSES! ###
#############################################
our @pslist = `/bin/ps auxw`;
our $line='';
our $scripts=0;

foreach $line(@pslist) {
    if ($line=~s/(ppp-line-maintenance\.pl)/$1/) {  #THIS SCRIPT MUST 
NOT BE RENAMED, OR IF IT IS, THIS LINE MUST BE ADJUSTED ACCORDINGLY!!!!
        $scripts++;
        if ($DEBUG==1) {print "Line:$line\nScripts:$scripts\n" };
    };
};
if ($scripts<=2) {  #CONTINUE THIS SCRIPT IF ONLY ONE OCCURRENCE (THIS 
ONE) OF THIS SCRIPT IN CURRENT PROCESS LIST


#############
### BEGIN ###
#############
if ($DEBUG==1) {open DLOG, ">$DEBFILE" or die "Cannot open debugging 
file!\n"};


&ping1;
&ping2;
&checkdowned;
&trimlog;

if ($DEBUG==1) {close DLOG};

} #END 'CONTINUE SCRIPT'

sleep 2;

exit;


######################################################################################################
### SUBROUTINES ###
###################

sub ping1 {
    $p1=`/bin/ping -c 3 $GATEWAY_1`;
    if ($p1=~s/100\%\spacket\sloss//) {$p1='DOWN'};
    if ($p1=~s/unreachable//) {$p1='DOWN'};
    if ($DEBUG==1) {print DLOG "p1:$p1\n"};
    return $p1;
};

sub ping2 {
    $p2=`/bin/ping -c 3 $GATEWAY_2`; 
    if ($p2=~s/100\%\spacket\sloss//) {$p2='DOWN'};
    if ($p2=~s/unreachable//) {$p2='DOWN'};
    if ($DEBUG==1) {print DLOG "p2:$p2\n"};
    return $p2;
};


sub trimlog {
################
### TRIM LOG ###
################
# THIS PRUNES THE LOG FILE TO JUST THE PREVIOUS THREE MONTH PERIOD.
    open DATA, "<$logfile" or die "Cannot read PPP maint log file!\n";
    @data = <DATA>;
    close DATA;
    $date = `/bin/date`;
    #$cur_month = 
(Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec)[(localtime)[4]];
    $cur_month = (localtime)[4];
    $cur_year = (localtime)[5];    $cur_year+=1900;
    $cur_day = (localtime)[3];
       
    #PPP Check: Wed Jan 30 09:20:01 CST 2008 [sample from log]
    foreach $line(@data) {
        if ($line=~m/PPP\sCheck:\s\w{3}\s(\w{3})\s(\d{2}).{14}(\d{4})/) {
            $late_month=$months{$1}; $late_day=$2; $late_year=$3;
            if ( ($late_year==$cur_year) && ( 
(($cur_month-$late_month)>=3) && ($late_day<=$cur_day) ) ) {@updata=()}
            elsif ( ($late_year<$cur_year) && ( 
(($late_month-$cur_month)<=9) && ($late_day<=$cur_day) ) ) {@updata=()}
            else { push @updata, $line }
        } else { push @updata, $line };
    }
    open DATA, ">$logfile" or die "Cannot write PPP maint log file!\n";
    print DATA @updata;
    close DATA;
################### END TRIM LOG
};

##############################
### Check for Downed Lines ###
##############################

sub checkdowned {
while ($FAIL eq 'TRUE') {
@ifconf=();
@ifconf = `/sbin/ifconfig`;
$FAIL='FALSE';

while (@ifconf) {
$line=shift @ifconf;
    if ($line=~m/ppp0/) {
        if ($DEBUG==1) {print DLOG "PPPO:$ppp0 "};

        $ppp0=1;
        if ($DEBUG==1) {print  DLOG "PPPO:$ppp0 "};

        $line=shift @ifconf;
        if ($line=~m/$IPADDRESS_1/) {$ppp0+=2};
        if ($DEBUG==1) {print  DLOG "PPPO:$ppp0 "};
        $line=shift @ifconf;
        if ($line=~m/UP /) {$ppp0+=4};
        if ($DEBUG==1) {print  DLOG "PPPO:$ppp0\n"};
    };
    if ($line=~m/ppp1/) {
        if ($DEBUG==1) {print  DLOG "PPP1:$ppp1 "};
        $ppp1=1;
        if ($DEBUG==1) {print  DLOG "PPP1:$ppp1 "};
        $line=shift @ifconf;
        if ($line=~m/$IPADDRESS_2/) {$ppp1+=2};
        if ($DEBUG==1) {print  DLOG "PPP1:$ppp1 "};
        $line=shift @ifconf;
        if ($line=~m/UP /) {$ppp1+=4};
        if ($DEBUG==1) {print  DLOG "PPP1:$ppp1\n"};
        print $line
    };
}

$attempt++;
if ($DEBUG==1) {print "ATTEMPT: $attempt\n"};
if ($FAILED eq 'TRUE') {push @log, "Attempt#:$attempt > PPP0:$ppp0 
PPP1:$ppp1\n"};

if ($ppp0<7) {
if ($DEBUG==1) {print "$ppp0: Restarting ppp0 line by ifdown/ifup 
commands...\n"};
system("/sbin/ifdown ppp0");
sleep 3;
system("/sbin/ifup ppp0");
};
if ($ppp1<7) {
if ($DEBUG==1) {print "$ppp1: Restarting ppp1 line by ifdown/ifup 
commands...\n"};
system("/sbin/ifdown ppp1");
sleep 3;
system("/sbin/ifup ppp1");
};
        if ($FAILED eq 'TRUE') {
            push @log, `/bin/date`."\n";
            push @log, @iprout."\n\n";
            open LOG, ">>$logfile";
            print LOG @log;
            close LOG;
        }
        push @total_log, @log;
        @log=();

my $testppp0=ping0;
my $testppp1=ping1;
if ($DEBUG==1) {print "testppp0: $testppp0 testppp1:$testppp1\n"};
if (($testppp0 eq 'DOWN') || ($testppp1 eq 'DOWN')) { $FAIL='TRUE' };
if ($FAIL eq 'TRUE') {$FAILED='TRUE'};
if ($DEBUG==1) {print  DLOG "FAIL:$FAIL\n"};


if ($FAILED eq 'TRUE') {

    system("/etc/init.d/shorewall", "restart");
    system("/etc/init.d/snmpd restart");
    open LOG, ">>$logfile" or die "Cannot open PPP maint log file!\n";
    print LOG @log;
    close LOG;
    push @total_log, @log;
$stop_time=`/bin/date`;

#########################################################################################################
#NOW, SEND AN EMAIL OR CAUSE AN ERROR SO THAT CRON WILL EMAIL THE 
SYSADMIN A NOTICE OF THIS NECESSITY!!!
system("/bin/mail -t <<EOF
To: $admin_email
From: pppoe-maintenance\@$domain_name
Subject: PPPoE Dropped Connection Restored!\n\n

A PPPoE Connection was dropped or was lost. It should now be restored.  
The restoration of the line began at:

$start_time -- and finished at -- $stop_time.

Here is the log from this process:

@total_log

END OF REPORT.

EOF
");
############################################################################################################

 } else {

    open LOG, ">>$logfile" or die "Cannot open PPP maint log file!\n";
    print LOG "PPP Check: ".`/bin/date`;
    close LOG;
}; #END IF FAILED
} #END WHILE FAIL

print "SUCCEEDED AFTER $attempt ATTEMPTS!\n";
} #END SUB CHECKDOWNED