#!/usr/bin/perl -w
###############################################################################
# $Id$
###############################################################################
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
###############################################################################

=head1 NAME

VCL::monitor_vcld - VCL monitoring utility

=head1 SYNOPSIS

 perl vcld

=head1 DESCRIPTION

 Needs to be written...

=cut

##############################################################################
package VCL::monitor_vcld;

# Specify the lib path using FindBin
use FindBin;
use lib "$FindBin::Bin/../lib";

# Configure inheritance
use base qw();

# Specify the version of this module
our $VERSION = '2.4.2';

# Specify the version of Perl to use
use 5.008000;

use strict;
use warnings;
use diagnostics;

use VCL::utils;
use DBI;
use Getopt::Long;

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

sub main ();
our $LOG     = "/var/log/monitor_vcld.log";
our $STARTUP = "/etc/init.d/vcld";
main();


sub main () {
	my ($managementnodeid, $lci, $mnid, $selh, $updhdle, $rows, $timestamp);
	my %info;
	if ($info{managementnode} = get_management_node_info()) {
                notify($ERRORS{'DEBUG'}, $LOG, "retrieved management node information from database");
        }
        else {
                notify($ERRORS{'WARNING'}, $LOG, "unable to retrieve management node information from database");
                exit;
        }
	my $MN             = $info{managementnode}{hostname};
	my $lastcheckin   = $info{managementnode}{lastcheckin};
	my $pidjuststarted = 0;

	#check if local vcld is running
	my $l;
	my $pidliving = 0;
	if (open(TEST, "$STARTUP status 2>&1 |")) {
		my @file = <TEST>;
		close(TEST);
		foreach $l (@file) {
			# Search for a line matching: vcld (pid 28560 26333 17710) is running...
			if ($l =~ /vcld \(pid [\d\s]*\) is running/) {
				$pidliving = 1;
			}
		}
	} ## end if (open(TEST, "$STARTUP status 2>&1 |"))
	if ($pidliving) {
		notify($ERRORS{'OK'}, $LOG, "monitor_vcld.pl parent pid is alive");
	}
	else {
		#restart vcld
		notify($ERRORS{'OK'}, $LOG, "monitor_vcld.pl parent pid not found, restarting on $MN");
		#on startup vcld sleep 20secs before checking in with db
		$pidjuststarted = 1;
		sleep 25;
	}

	#check on the last checkin time, if older then X, restart vcld core process
	my $currenttime = makedatestring;
	my $ctime       = convert_to_epoch_seconds($currenttime);
	my $lchecktime  = convert_to_epoch_seconds($lastcheckin);
	my $diff        = $ctime - $lchecktime;
	if ($diff >= (3 * 60)) {
		notify($ERRORS{'OK'}, $LOG, "monitor_vcld.pl managementnodeid $managementnodeid checkin time is old currenttime= $currenttime lastcheckintime= $lci");
		#restart kill and start vcld
		if ($pidjuststarted) {
			$pidjuststarted = 0;
			notify($ERRORS{'OK'}, $LOG, "monitor_vcld.pl vcld was just restarted waiting a moment before check db");
			#we may not have waited long enough for a fresh checkin
			goto RECHECK;
		}
		else {
			if (open(RESTART, "$STARTUP restart 2>&1 |")) {
				my @restart = <RESTART>;
				close(RESTART);
				notify($ERRORS{'CRITICAL'}, $LOG, "monitor_vcld.pl lastcheckin is to old restarted vcld on $MN\n restart output= @restart");
			}
		}
	} ## end if ($diff >= (3 * 60))
	else {
		notify($ERRORS{'OK'}, $LOG, "monitor_vcld.pl managementnodeid $MN is fresh lastcheckintime= $lastcheckin");
	}
} ## end sub main ()

#/////////////////////////////////////////////////////////////////////////////

1;
__END__

=head1 SEE ALSO

L<http://cwiki.apache.org/VCL/>

=cut
