#!/usr/bin/perl
#
# Vaktbikkje som varsler hvis lynx ikke klarer å hente ned en side på serveren.
# Sjekker om det fins en httpd.
# Sender mail, og skriver ut en status (tekst) fil (for admin siden)


# Hvem som skal få mailen hvis noe går galt. (husk \ forran @!)
$MAIL_TO = "almashriq\@hiof.no";

# Navnet på serveren som sjekkes. (for dns test)
$SERVER = "almashriq.hiof.no";

# Hva skal lynx prøve å hente ned: (for lynx test)
$SERVER_URL = "http://almashriq.hiof.no/";

# Inneholder siste melding
$STATUS_FILE = "/var/tmp/oppslag_status.txt";

# Denne filen flagger om alarmen allerede er gått:
$ALARM_FILE = "/var/tmp/oppslag.alarm";



########################################################################


# Sjekk om serveren ($SERVER_URL) kan nås med lynx. (1 == ok)
sub lynxTest {
	$lynx_status = system("lynx -dump $SERVER_URL 2>/dev/null >/dev/null");
	if( $lynx_status > 0 ) {
		return; #error
	}
	return 1; #ok
}

# Sjekker om det går noen httpd prossesser. (1 == ok)
sub httpdTest {
	#Finn ant. httpd prossesser
	$httpd_count = `ps aux|grep httpd|wc -l`;
	$httpd_count--;	#Trekk fra 'grep' kommando
	if( $httpd_count == 0 ) {
		return; #error
	}
	return 1; #ok
}

# Sjekker om serveren kan slås opp i DNS. (1 == ok)
sub DNSTest {
    $nslookup = `nslookup $SERVER 2>&1`;
    if( $nslookup =~ /can't find/ ) {
	return; #error
    }
    return 1; #ok
}


# Lagrer status filen, slik at den kan bli sett fra adminsiden
sub save_status {
	my $status = $_[0];
	open STATUSFILE, ">$STATUS_FILE";
	print STATUSFILE $status;
	print STATUSFILE "\n";
	print STATUSFILE `date`;
	close STATUSFILE;
}

# Sender en mail
sub send_mail {
	my ($subject, $mail) = @_;
	open MAIL, "|mail -s \"$subject\" $MAIL_TO";
	print MAIL $mail;
	print MAIL "\n\n[Denne meldingen ble generert av cron-jobben $0 på $hostname]\n";
	close MAIL;
}


# Finn navnet på maskinen dette scriptet går på.
$hostname = `hostname`; 
chomp $hostname;


# Har alarmen allerede gått?
if( not -f $ALARM_FILE ) {
	#Nei. Sjekk om vi har et "alarm-tilfelle":
 	# Kan man lynx'e?
   	if( !lynxTest() ) {
		#Lynx fungerer ikke
		$status = "$SERVER_URL er ikke tilgjengelig... (fra $hostname.)\n";

		#Går httpd prossessen?
		if( httpdTest() ) {
			$status .= "httpd prossessen(e) ser ok ut.\n";
		}
		else {
			$status .= "... ikke så rart siden httpd prossessen ikke går!\n";
		}

		#Kan det være at DNS'en er nede?
		if( DNSTest() ) {
		        $status .= "nslookup $SERVER ser ok ut.\n";
		}
		else {
		        $status .= "nslookup $SERVER fungerer ikke (fra $hostname).\n";
		}

		save_status($status); #lagre filen (så den kan nås fra admin siden)
		send_mail("$hostname er nede",$status); #Send mail

		# Flagg: alarmen har gått
		`touch $ALARM_FILE`;
	}
}
# Vi har hatt en alarm. Finn ut om den er over.
else {
        # Har loggene-normal aktivitet igjen?
        if( lynxTest() ) {
	    #Ja - Send "fare over" beskjed til statusfilen.
	    $status = "$SERVER_URL fungerer som normalt igjen.\n";
	    save_status($status); #lagrer statusfil.
	    send_mail("$hostname er oppe", $status); #Send mail
	    `rm $ALARM_FILE`;  # Flagg: alarmen over...
	}
}












