#!/usr/bin/perl
#
#  check if master IP is up on this host
#  if master IP is up then create $APL/var/conf/master/s_master
#     else remove $APL/var/conf/master/s_master (if present)
#  update s_master IP in asrv.conf & _obj_attr
#  update tserver entry in processes table
#  hide LOGIN page on node
#

use Socket;
use strict;
use NextCAM::Conf;
use SKM::DB;
use SKM::PM;

use Log::Log4perl "get_logger";
require "$ENV{APL}/common/bin/logger.patrol";
my $log = get_logger('NEXTCAM::CAM::CAM_PATROL');
$log->info('Checking s_master');


my $CONF="$ENV{APL}/var/conf";
my $LOGIN_MASTER="$ENV{APL}/sdi/html/login/index.html";
my $LOGIN_NODE="$ENV{APL}/sdi/html/login/login2node.htm";
my $LOGIN_HTM="$ENV{APL}/www/index.htm";
my $LOGIN_HTML="$ENV{APL}/www/index.html";
my $IP_ADDR="$ENV{APL}/base/bin/ip_addr_show";

# ------------------ get s_master IP
my $iaddr=gethostbyname('s_master');
$log->logdie('s_master has to be defined in /etc/hosts') if not $iaddr;
my $s_master;
# ------------------ check interfaces for a s_master IP
my $ipaddr=inet_ntoa($iaddr);
open(IF,"$IP_ADDR|tee $CONF/interfaces|") or $log->logdie('cannot check ifconfig');
while(<IF>) {
   chomp;
   $s_master=$ipaddr, last if $ipaddr eq $_;
}
close IF;
$s_master=$ipaddr if $ENV{APL_MOD}=~/^(CIRRUS|STRATUS|ClareVision)$/ and $^O=~/Darwin/i;
# ----------------- set s_master in conf if master IP is up
if ( -f "$CONF/master/s_master") {           # place s_master IP addr
     $log->logdie("network interface '$ipaddr s_master' is not running\n") if ! $s_master;
     $log->info('This is MASTER! ');
     open SMASTER,">$CONF/master/s_master"
       or $log->logdie("cannot create $CONF/master/s_master");
     print SMASTER "$s_master\n";
     close SMASTER;
     chmod 0640, "$CONF/master/s_master";
} else {                    # remove s_master if exists
     $log->info('This is a NODE!');
}

eval {
	$log->info('update startup for tserver in processe table');
	my $startup=($s_master)?1:0;
	my $startup_vmuxd=($startup && $ENV{APL_MOD} ne 'CIRRUS')?1:0;

	#----------------- update tserver record in proccesses
	toggleProcess($startup, 'tserver', 'tsrv_patrol');

	#----------------- update scheduler record in proccesses
	toggleProcess($startup, 'scheduler');

	#----------------- update peed record in proccesses
	$log->info('update startup for peed in processe table');
	toggleProcess($startup, 'peed');

	#----------------- update elserver record in proccesses
	$log->info('update startup for elserver in processe table');
	toggleProcess($startup, 'elserver', 'elog_patrol');

	#----------------- update analytics-master record in proccesses
	$log->info('update startup for analytics-master in processe table');
	toggleProcess($startup, 'analytics-master');

	#----------------- update master_collector record in proccesses
	$log->info('update startup for master_collector in processe table');
	toggleProcess($startup, 'master_collector');

	#----------------- update system_status record in proccesses
	$log->info('update startup for system_status in processe table');
	toggleProcess($startup, 'system_status');

	#----------------- update audit_clean record in proccesses
	$log->info('update startup for audit_clean in processe table');
	toggleProcess($startup, 'audit_clean');

	#----------------- update messageServer records in proccesses
	$log->info('update startup for message server in processe table');
	my $start4m=($s_master)?1:0;
	toggleProcess($start4m, 'messageServer', 'mbus_patrol');

	# CIRRUS_REPLACE_CHECK_MASTER_ID001_BEGIN
	#----------------- update advantor master record in proccesses
	$log->info('update startup for advantor in processes table(if exists)');
	toggleProcess($startup, 'advantor_asn_daemon');

	#----------------- update ltsd master record in proccesses
	$log->info('update startup for ltsd in processes table(if exists)');
	toggleProcess($startup, 'ltsd');

	#----------------- update event_exporter master record in proccesses
	$log->info('update startup for event_exporter in processes table(if exists)');
	toggleProcess($startup, 'event_exporter');

	#----------------- update purge_expired_objects master record in proccesses
	$log->info('update startup for purge_expired_objects in processes table(if exists)');
	toggleProcess($startup, 'purge_expired_objects');

	# CIRRUS_REPLACE_CHECK_MASTER_ID001_END
	#----------------- update smx_patrol record in proccesses
	$log->info('update startup for smx_patrol in processes table(if exists)');
	toggleProcess($startup, 'smx_patrol');

	#----------------- start vmuxd (deny for CIRRUS)
	$log->info('update startup for vmuxd in processes table(if exists)');
	toggleProcess($startup_vmuxd, 'vmuxd');

	#----------------- start php_session_clean.php
	$log->info('update startup for php_session_clean.php in processes table(if exists)');
	toggleProcess($startup, 'php_session_clean.php');

	#----------------- start target_zone_ptz.php
	$log->info('update startup for target_zone_ptz.php in processes table(if exists)');
	toggleProcess($startup, 'target_zone_ptz.php');
	
	#----------------- start sm_cloud_wipe
	$log->info('update startup for sm_cloud_wipe in processes table(if exists)');
	toggleProcess($startup, 'sm_cloud_wipe');
	
	#----------------- start sm_cloud_vacuum
	$log->info('update startup for sm_cloud_vacuum in processes table(if exists)');
	toggleProcess($startup, 'sm_cloud_vacuum');
};
$log->logdie("Failed to update process configuraiton: $@") if ($@);

# Update emailer startup (master only)
if ($s_master) {
	my $out = `$ENV{APL}/base/bin/emailer_sighup 2>&1`;
	if ($?) {
		$log->error("emailer_sighup threw error: $out");
	}
	else {
		$log->info("Check emailer: $out");
	}
}

#---------------- update root page
unlink ($LOGIN_HTM,$LOGIN_HTML);
if ($s_master) {
  symlink $LOGIN_MASTER, $LOGIN_HTM;
  symlink $LOGIN_MASTER, $LOGIN_HTML;
}else {
  symlink $LOGIN_NODE, $LOGIN_HTM;
  symlink $LOGIN_NODE, $LOGIN_HTML;
}
#---------------- finish
$log->info('Checking s_master is finished');
