#!/usr/bin/perl -w -I/usr/local/positive/Perl  -I.

use strict;
use Pos::db;

my $dbinfo = Pos::defaults::db_info( name => 'policy' );
$dbinfo =~ s/policy1/policy/g;
my $db = Pos::db->new( user=> $dbinfo );

my $userName = $ARGV[0];

my $userId = 0;
my $vpnIP = 0;
my $iface = "";
my $xml = "<?xml version='1.0'?><root><steps>";
my $seq = 0;

sub printExit
{
	my( $code ) = @{{@_}}{qw/code/};

	$xml .= '</steps></root>';
	print "$xml";

	exit($code);
}

sub buildStep
{
	my( $method, $status, $task, $reason, $hidden ) = @{{@_}}{qw/method status task reason hidden/};
	$hidden = 0 unless( defined ( $hidden ) && length( $hidden ) );

	$xml .= '<step seq="' . $seq . '" method="' . $method .  '" status="' . $status . '" task="' . $task . '" reason="' . $reason . '" hidden="' . $hidden . '" />';	

	printExit() unless( $status == 1 );

	$seq++;
}

sub checkUser
{
	my $rc = 0;

	( $userId ) = $db->query( sql=> "SELECT user_id FROM users WHERE user_name='${userName}'" );
 	buildStep( method=>"checkUser", status=>"0", task=>"validate user", reason=>"NO SESSION" ) unless( length( $userId ) );
		
	buildStep( method=>"checkUser", status=>"1", task=>"validate user ", reason=>"" );
	$rc = 1;

	return( $rc );
}

sub checkSession
{
	my $rc = 0;

	my( $cnt ) = $db->query( sql=> "SELECT COUNT(1) FROM client_sessions WHERE user_id=$userId AND client_session_type_id IN (1,4)" );
	buildStep( method=>"checkSession", status=>"0", task=>"validate session", reason=>"NO SESSION" ) unless( $cnt == 1 );
		
	buildStep( method=>"checkSession", status=>"1", task=>"validate session", reason=>"" );
	$rc = 1;

	return( $rc );
}

sub checkVpnAdapter
{
	my $rc = 0;

	( $iface ) = $db->query( sql=> "SELECT tunnel_name FROM client_sessions WHERE user_id=$userId AND client_session_type_id IN (1,4)" );

	buildStep( method=>"checkVpnAdapter", status=>"0", task=>"validate session", reason=>"NO SESSION" ) unless( length( $iface ) );

	my( @cmd ) = `/usr/sbin/ifconfig $iface`;
	buildStep( method=>"checkVpnAdapter", status=>"0", task=>"virtual adapter is present", reason=>"NO ADAPTER" ) unless( scalar( @cmd ) );
		

	my( $dbVpnIP ) = $db->query( sql=> "
						SELECT rawip32_to_dotted_quad(private_ip_address) 
							FROM client_sessions
								WHERE user_id=$userId AND client_session_type_id=4

						" );

	buildStep( method=>"checkVpnAdapter", status=>"0", task=>"virtual adapter check cannot find VPN IP address", reason=>"MISSING" ) unless( length( $dbVpnIP ) );

	foreach ( @cmd ) {
		if( $_ =~ m/inet/ ) {
			my( @line ) = split( " ", $_ );
			$vpnIP = $line[1];	

			my $buf = `/usr/sbin/fping $vpnIP`;
			if( $buf =~ m/alive/ ) {
				buildStep( method=>"checkVpnAdapter", status=>"1", task=>"virtual adapter is alive", reason=>"" );
				$rc = 1;
			}
			else {
				buildStep( method=>"checkVpnAdapter", status=>"0", task=>"virtual adapter is alive", reason=>"NO REPLY" );
			}	
				
			last;
		}
	}

	return($rc);
}

sub checkIpRoute
{
	my $rc = 0;

	( $iface ) = $db->query( sql=> "SELECT tunnel_name FROM client_sessions WHERE user_id=$userId AND client_session_type_id=4" );

	buildStep( method=>"checkIpRoute", status=>"0", task=>"validate session", reason=>"NO SESSION" ) unless( length( $iface ) );

	my $buf = `/usr/sbin/ip route | grep "^default dev ${iface}"`;

	#	
	#XXFIXME
	#	
	$buf = "A";
	buildStep( method=>"checkIpRoute", status=>"0", task=>"validate default route", reason=>"MISSING" ) unless( length( $buf ) ) ;

	( $vpnIP ) = $db->query( sql=> "
					SELECT rawip32_to_dotted_quad(private_ip_address) 
						FROM client_sessions	
							WHERE user_id=$userId AND client_session_type_id=4
					" );

	$buf = `/usr/sbin/ip route show table all | grep "link src ${vpnIP}"`;
	buildStep( method=>"checkIpRoute", status=>"0", task=>"validate link route", reason=>"MISSING" ) unless( length( $buf ) );

				
	$buf = `/usr/sbin/ip route show table all | grep "^local ${vpnIP} dev ${iface}"`;
	buildStep( method=>"checkIpRoute", status=>"0", task=>"validate source route", reason=>"MISSING" ) unless( length( $buf ) );

	buildStep( method=>"checkIpRoute", status=>"1", task=>"validate routes", reason=>"" );
	$rc = 1;

	return($rc);
}

sub checkIpRule
{
	my $rc = 0;

	( $iface ) = $db->query( sql=> "SELECT tunnel_name FROM client_sessions WHERE user_id=$userId AND client_session_type_id=4" );

	buildStep( method=>"checkIpRule", status=>"0", task=>"validate session", reason=>"NO SESSION" ) unless( length( $iface ) );

	my $buf = `/usr/sbin/ip rule list | grep ${iface}.rule`;
	buildStep( method=>"checkIpRule", status=>"0", task=>"validate rule interface", reason=>"MISSING" ) unless( length( $buf ) );

	( $vpnIP ) = $db->query( sql=> "		
					SELECT rawip32_to_dotted_quad(private_ip_address) 
						FROM client_sessions
						WHERE user_id=$userId AND client_session_type_id=4
					" );

	$buf = `/usr/sbin/ip rule list | grep ${vpnIP}`;
	buildStep( method=>"checkIpRule", status=>"0", task=>"validate rule VPN IP address", reason=>"MISSING" ) unless( length( $buf ) );

	$buf = `/usr/sbin/ip rule list | grep ${iface}.rule | grep ${vpnIP}`;
	buildStep( method=>"checkIpRule", status=>"0", task=>"validate rule interface and VPN IP address", reason=>"MISSING" ) unless( length( $buf ) );
		
	buildStep( method=>"checkIpRule", status=>"1", task=>"validate rule", reason=>"" );
	$rc = 1;

	return($rc);
}

sub checkL2TPGateway
{

}

sub checkConcentratorGateway
{

}

sub checkNetconGateway
{

}

sub checkEndpoint
{


}

checkUser();
checkSession();
checkVpnAdapter();
checkIpRule();
checkIpRoute();

printExit(1);
