#!/usr/bin/perl -w

use strict;

# Make sure we're dealing with consistent output.
$ENV{'LANG'}="POSIX";

my $ERROR_BADUSAGE  = 1;
my $ERROR_EXECERROR = 2;
my $ERROR_NOGATEWAY = 10;
my $ERROR_NOPIDFILE = 20;
my $ERROR_NOPID     = 21;
my $ERROR_NODEVICE  = 22;

my %info;

sub parseDefaultGateway
{
    my @output = `/sbin/ip route list`;
    exit( $ERROR_EXECERROR ) if( $? );

    for( @output )
    {
        /default via ([0-9.]+) dev (\S+)/
            and do{ $info{'gw'} = $1; $info{'dev'} = $2; }
    }

    exit( $ERROR_NOGATEWAY ) unless( $info{'gw'} );
}

sub getPppDevice
{
    my $linkname = shift;

    my $pidfile = "/var/run/ppp-$linkname.pid";
    my $pid;
    my $dev;

    exit( $ERROR_NOPIDFILE ) unless( -f $pidfile );

    open( PIDFILE, $pidfile );
    chomp( $pid = (readline( PIDFILE ) or 0) );
    chomp( $dev = (readline( PIDFILE ) or "") );
    close( PIDFILE );

    exit( $ERROR_NOPID )    unless( $pid );
    exit( $ERROR_NODEVICE ) unless( $dev );

    $info{'ppp_pid'} = $pid;

    return( $dev );
}

sub parseDeviceInfo
{
    sub mask
    {
        my $mask = shift();
        my $x = ($mask == 32) ? 0xffffffff : ~(0xffffffff >> $mask);
        return( sprintf( "%d.%d.%d.%d", ($x>>24)&0xff, ($x>>16)&0xff, ($x>>8)&0xff, $x&0xff ) );
    }

    my $device = shift;
    my @output = `/sbin/ip addr show dev $device`;
    exit( $ERROR_EXECERROR ) if( $? );

    $info{'dev'} = $device;

    for( @output )
    {
        /UP/                  and $info{'up'}     = 1;
        /mtu (\d+)/           and $info{'mtu'}    = $1;
        /qlen (\d+)/          and $info{'qlen'}   = $1;
        /ether ([0-9a-f:]+)/  and $info{'hwaddr'} = $1;
        /inet ([0-9.]+)/      and $info{'ip'}     = $1;
        /inet [0-9.]+\/(\d+)/ and $info{'mask'}   = mask( $1 );
        /peer ([0-9.]+)/      and $info{'peer'}   = $1;
        /peer [0-9.]+\/(\d+)/ and $info{'pmask'}  = mask( $1 );
        /brd ([0-9.]+)/       and $info{'brd'}    = $1;
    }

    unless( $info{'mask'} ) { $info{'mask'} = mask( 32 ); }
}

sub printXmlProperties
{
    print( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\n" );
    print( "<properties>\n" );

    my( $key, $value );
    while( ($key, $value) = each %info ) {
        print( "    <property key=\"$key\">$value</property>\n" );
    }
    print( "</properties>\n" );
}

my $arg1 = shift;
exit( $ERROR_BADUSAGE ) unless( $arg1 );

if   ( $arg1 eq "--device" )  { parseDeviceInfo( shift ); }
elsif( $arg1 eq "--gateway" ) { parseDefaultGateway(); }
elsif( $arg1 eq "--ppp" )     { parseDeviceInfo( getPppDevice( shift ) ); }
elsif( $arg1 eq "--checkForL2TP" ) { exec( "netstat -upn | grep l2tpd" ); }
else                          { exit( $ERROR_BADUSAGE ); }

printXmlProperties();

exit( 0 );

