#!/usr/bin/perl -w
use strict;
use Getopt::Std;
use Pod::Usage;
use Sysadm::Install qw(:all);
use Config::Patch;
use Buffalo::G54;
use X10::Home;
use Log::Log4perl 1.13 qw(:easy);

my @isps = qw(cable dsl);
my($switch_to) = @ARGV;

Log::Log4perl->easy_init($INFO);

if(! defined $switch_to) {
    pod2usage(
          "Specify what ISP to switch to");
}

if(! grep { $_ eq $switch_to }  @isps) {
    pod2usage("Unknown isp, use ", 
              join(", ", @isps));
}

my $x10 = X10::Home->new();

my $P = password_read("Router password: ");

no strict 'refs';
eval { $switch_to->(); };
network_restart();

###########################################
sub dsl {
###########################################
  gateway_patch("192.168.10.1");
  $x10->send("bridge", "off");
  dhcp("on");
}

###########################################
sub cable {
###########################################
  gateway_patch("192.168.10.98");
  $x10->send("bridge", "on");
  dhcp("off");
  ALWAYS "Waiting for bridge to start up";
  sleep 20;
}

###########################################
sub network_restart {
###########################################
  tap "sudo", "/etc/rc.d/init.d/network", 
      "restart";
}

###########################################
sub gateway_patch {
###########################################
    my($ip) = @_;

    my $patcher = Config::Patch->new(
        file => "/etc/sysconfig/network",
        key  => "isp-switch",
    );

    if($patcher->patched()) {
        # patched already? Remove old patch
        $patcher->remove();
    }

    $patcher->replace(qr(^GATEWAY=.*)m, 
                      "GATEWAY=$ip");
}

###########################################
sub dhcp {
###########################################
    my($onoff) = @_;

    DEBUG "Setting dhcp to $onoff";

    my $b = Buffalo::G54->new();
    DEBUG "Connecting";
    $b->connect(password => $P);

    if(defined $onoff) {
        INFO "Setting DHCP to $onoff";
        $b->dhcp($onoff);
    }

    INFO "DHCP is now ", $b->dhcp() ? 
                         "on" : "off";
}

__END__

=head1 NAME

    isp-switch - Cable or DSL?

=head1 SYNOPSIS

    isp-switch [dsl|cable]

=head1 DESCRIPTION

isp-switch switches between Comcast cable 
and Pacbell DSL.

=head1 AUTHOR

2007, Mike Schilli <cpan@perlmeister.com>
