#!/usr/bin/perl
#
# SAPHanaSR-checks
# (c) 2014 SUSE Linux Products GmbH, Nuremberg Germany 
# (c) 2015 SUSE Linux GmbH, Nuremberg Germany 
# Author: Fabian Herschel
# License: GPL v2 
# Version: 0.5.2015.05.07.1
#
##################################################################

use POSIX;
use strict;
use Getopt::Long;
use SAPHanaSRTools;

my $SID;
my $INO;
my $DIR;
my $version="0.5";

my @FailedTests;
my @PassedTests;
my $hanacount=0;
my $hostcontrolanswer=0;

sub init()
{
    #  Inst Info : HA3 - 14 - sles4sap22 - 740, patch 36, changelist 1444691
	my $result = GetOptions ("sid=s" => \$SID,
	                      "ino=s" => \$INO,
	                      "dir=s" => \$DIR,
		 );
    if ( ! defined ($SID) || ! defined ($INO)) {
        my $sid=""; my $noDAACount = 0; my $gotAnswer = 0;
        ( $sid, $INO, $noDAACount, $gotAnswer ) = get_sid_and_InstNr;
        # printf "ListInstances: GOT %s\n", join(",", ( $sid, $INO, $noDAACount, $gotAnswer ));
        if ( $sid eq "" ) {
           push(@FailedTests, "checkFoundSAPHostControl");
        } else {
           push(@PassedTests, "checkFoundSAPHostControl");
           $SID=toupper($sid);
           $DIR="/usr/sap/$SID/HDB$INO/exe";
        }
        if ( $gotAnswer == 0 ) {
           push(@FailedTests, "checkConnectSAPHostControl");
        } else {
           push(@PassedTests, "checkConnectSAPHostControl");
        }
        if ( $noDAACount == 1 ) {
           push(@PassedTests, "checkAutodetectSAP");
        } else {
           push(@FailedTests, "checkAutodetectSAP");
        }
    } elsif ( defined ($SID) && defined ($INO)) {
        push(@PassedTests, "checkCommandLineParameters");
    } else {
        push(@FailedTests, "checkCommandLineParameters");
    }
    if ( ! defined ($DIR) ) {
        $DIR="/usr/sap/$SID/HDB$INO/exe";
    }
    

    $ENV{PATH} = "$ENV{PATH}:$DIR";
    return 0;
}

sub checkUSERKEY($ $ $) 
{
    my $rc=1;
    my $found=0;
    my ( $cSID, $cINO, $cUKEY ) = @_;
    open (ListKey, "-|", "hdbuserstore list $cUKEY");
    while (<ListKey>) {
        if (/^KEY\s+(\w+)$/) {
            # KEY SLEHALOC
            if ( $1 eq $cUKEY ) {
               $found=1;
            }
            #print $1, $2;
        } elsif (/ENV\s+:\s+(\w+):(\w+)/) {
            if ( $1 ne "localhost" ) {
               $rc=0; printf "%s is not assigned to localhost\n", $cUKEY;
            }
            if ( $2 != 30015 + $cINO * 100 ) {
               $rc=0; printf "%s is not assigned to port %i\n", $cUKEY, 30015 + $cINO * 100;
            }
        }
    }
    close ListKeyM;
    if ( $found == 0 ) {
       $rc=0; printf "KEY %s not defined for user root\n", $cUKEY;
    }
    return $rc;
}

sub checkDBAccess($ $ $)
{
    my ( $cUKEY, $cTABLE, $cCOLUMN ) = @_;
    my $rc=0;
    open (SQL, "-|", "hdbsql -U $cUKEY 'select * from $cTABLE'");
    while (<SQL>) {
       if (/$cCOLUMN/) {
          $rc=1;
       }
    }
    if ( $rc == 0 ) {
        printf "SAMPLE SQL failed\n";
    }
    return $rc;
}

sub checkLinuxUser($)
{
    my ( $cUSER ) = @_;
    my $rc=0;
    if ( $ENV{USER} eq $cUSER ) {
        $rc=1;
    } 
    return $rc;
}
    
sub sayno() {
    return 0;
}

sub sayyes {
    return 1;
}

printf("SAPHana-checks %s\n", $version);
init();
printf "Checking for system %s(%s) directory %s\n"  , $SID, $INO, $DIR;

checkLinuxUser("root") 
and push(@PassedTests, "checkRoot")
or push(@FailedTests, "checkRoot");

checkUSERKEY($SID, $INO, "SLEHALOC") 
and push(@PassedTests, "checkUserKey")
or push(@FailedTests, "checkUserKey");

checkDBAccess("SLEHALOC", "DUMMY", "DUMMY") 
and push(@PassedTests, "checkDBAccess")
or push(@FailedTests, "checkDBAccess");

checkDBAccess("SLEHALOC", "SYS.M_SERVICE_REPLICATION", "REPLICATION_STATUS")
and push(@PassedTests, "checkDBViewSRS")
or push(@FailedTests, "checkDBViewSRS");

#sayyes() 
#and push(@PassedTests, "XXXXXXXXY") 
#or push(@FailedTests, "XXXXXXXXN");


if ( @PassedTests != 0 ) {
   printf "The following tests have passed: %s\n", join("," , @PassedTests);
}
if ( @FailedTests != 0 ) {
   printf "The following tests have failed: %s\n", join("," , @FailedTests);
}
