<?xml version="1.0" encoding="windows-1252"?>
<node id="15345" title="Cable Modem Check" created="2000-05-30 03:40:25" updated="2005-07-27 13:42:04">
<type id="1042">
CUFP</type>
<author id="15263">
Ozymandias</author>
<data>
<field name="doctext">
&lt;a href="http://www.perlmonks.com/index.pl?node_id=5203&amp;lastnode_id=5222&amp;"&gt;Nascent asked&lt;/a&gt; a question about a Perl code snippit that would reconnect his dial-up modem if it failed. Well, this is something similar.
&lt;p&gt;
I have a cable modem connection, and every couple of days or so, the modem dies. It's a SURFboard SB3100, manufactured by General Instrument, although I'm told this happens with other modems, too.
&lt;p&gt;
Anyway. From my router/firewall box, everything appears normal; IFCONFIG reports the connection as being up, but I can't ping anything past the modem. The only fix is to reset the modem; since this modem doesn't have a power switch, the only way to do that is to unplug it, wait 30 to 45 seconds, and plug it back in.
&lt;p&gt;
Being a lazy X10 geek, I soon installed an appliance module and used my X10 remote to stop and restart the modem. Then I started thinking about how nice it would be not to have to hit that button. This is the result, although it's far from complete; my first "from scratch" Perl script. My intention, once I've completed it, is to use it in a cron job every 1/2 hour or so.
&lt;blockquote&gt;
&lt;code&gt;
#!/usr/bin/perl
#
#         File: modemcheck.pl	
#  Description: Tests for Internet connectivity through standard cable
#               modem; uses X10 to reset modem in the event of failure
#
#       Author: Ozymandias
#        Email: Ozymandias29@hotmail.com
#      Version: .3
#  Copyright ©: 2000 Matt Beland. All rights reserved.
#      License: This script is redistributable under the terms of the GPL.
#
# Dependencies: Heyu X10 Control software, CM11A X10 two-way controller, X10
# 		module for modem
#
# 		Heyu can be obtained from http://www.prado.com/~dbs/
#		This script was written using version 1.28h
#
#    Variables: 
#
# $admin_email: Email address notifications should go to
# $error_email: Errorlog email; used as "From: in notifications
#      $device: Heyu address of cable modem; e.g., a5 or modem 
#      $target: IP address of test target; I recommend the network gateway
#		(of your cable service, of course.)
#	
#

# User-defined variables - THESE MUST BE CHANGED FOR THE SCRIPT TO WORK

$admin_email = "you@/didntchangeit.com";
$error_email = "did@/you.com";
$device = "a1";
$target = "192.168.1.1";


# define commands needed

$ping ="/bin/ping -c 1 ";				# Ping 
$kill_modem = "/usr/local/bin/heyu turn $device off";	# Kill modem
$start_modem = "/usr/local/bin/heyu turn $device on";	# Start modem

# begin test

$linecount = 0;
$errortime = localtime;
open (I,"$ping $target |"); 				# Is it down?
while(&lt;I&gt;) {
     	chop $_;
     	$linecount = $linecount + 1;
     	if($linecount == 2) {
     		if(/unreachable/i)  {		# Connection down
            $errortime = localtime;
            $wait = time;		# Test again in 5 minutes
            $wait = $wait + 300;
            until($go &gt;= $wait) {
               $go = time;
               };
            open (II,"$ping $target |");
            while(&lt;II&gt;) {
               chop $_;
               if(/Unreachable/) {
                  $error = 2;
                  $errortime = localtime;
                  system "$kill_modem";
                  $wait = time;
                  $wait = $wait + 60;
                  until($go &gt;= $wait) {
                     $go = time;
                     };
                  system "$start_modem";
                        
                     # send "restarted" email
   
                  open(III,"|/usr/lib/sendmail -t");
                     print III "From: $errormail\n";
                     print III "To: $adminmail\n";
                     print III "Subject: NET CONNECTION ERROR\n\n";
                     print III "At $errortime the net connection was"; 
                     print III "restarted by the errorhandler.\n";
                  close(III);
               };
               
                     # send minor glitch email
   
            open(IV,"|/usr/lib/sendmail -t");
                                   	print IV "From: $errormail\n";
                          		print IV "To: $adminmail\n";  
                          		print IV "Subject: NET CONNECTION ERROR\n\n";
                          		print IV "At $errortime there was a minor problem.\n";
               print IV "No restart was necessary.\n";
                     	close(IV);
            };
            close(II);
      };
      print "Test successfully completed at $errortime\n";
   };
};
close(I);
&lt;/code&gt;
&lt;/blockquote&gt;
This code does work; I've tested it both for "OK" conditions and failure conditions. But there's still a lot I want to do with this:
&lt;p&gt;
&lt;ul&gt;
&lt;li&gt;Add testing to avoid infinite looping (if there's another cause for the problem)
&lt;li&gt;Add support for other X10 backends (simple)
&lt;li&gt;Add URL-based network support - to execute X10 commands on another system
&lt;li&gt;Extra notification if the script can't solve the problem (most likely using X10 to flash a light)
&lt;/ul&gt;
As I said, this is my first from scratch code, so helpful comments would be appreciated.
&lt;p&gt;
- &lt;a href="mailto:ozymandias29@hotmail.com"&gt;Ozymandias&lt;/a&gt;</field>
</data>
</node>
