#!/usr/bin/perl -w
#  $Id: activate 33542 2016-01-27 00:42:34Z atsybulnik $
# -----------------------------------------------------------------------------
#  Name:    Module activate script.
#  Purpose: manage activate steps for skm system
#
#
#  Note:    should be started as root !
#
#  params:
#           base/etc/modules_list.conf - list of modules
#           base/etc/env.conf          - defines folowing vars:
#                APL          APL_DB_USR
#                APL_CONF     APL_DB_DATA
#                APL_USR      APL_HTTPD_GRP
#                APL_VAR      APL_HTTPD_USR
#           base/etc/install.conf - env vars will be visible in all modules (export)
#                TARGET_OS                           TOMCAT_DIR
#                DYLIB_SUFFIX   PHP_INI              TOMCAT_CFG
#                HTTPD_DIRS     HTTPD_CONF           TOMCAT_USR
#                HTTPD_MOD_DIR  HTTPD_SHORT_MOD_DIR  AXIS2_HOME
#  env:
#           APL_ROLE  (NODE/MASTER)
# -----------------------------------------------------------------------------
#  Author: Alex Teetov
#  Edited by:
#  QA by:  Mark Currell
#  Copyright: videoNEXT LLC
# -----------------------------------------------------------------------------

use File::Basename qw(dirname);
use strict;

# CONS ------------------------------------------------------------------------
my $MODULES_LIST = 'base/etc/modules_list.conf'; # APL will be added later
my $dirname=dirname(__FILE__);
my $NAME='base';

# VARS -------------------------------------------------------------------------
my $mission='ACTIVATE';
my $APL_ROLE=$ENV{APL_ROLE};
my $local_err=0;
my $total_err=0;
my $step;

# ENV
my ($APL,$APL_CONF,$APL_VAR,$APL_HTTPD_USR,$APL_HTTPD_GRP,$APL_DB_USR);

# PROC -------------------------------------------------------------------------

# Set owner, group and permission on file or directory
sub set_perm
{
	my ($obj, $usr, $grp, $mod) = @_;

	`chmod -f $mod $obj 2>/dev/null`;
	$grp = $ENV{APL_HTTPD_GRP} if not $grp;
	$usr = $ENV{APL_USR} if not $usr;
	`chown -f $usr:$grp   $obj >/dev/null 2>&1` if $grp;
}

# Decorative routines
#
sub Announce
{
	$step = shift;
	$local_err = 0;
}

sub Err
{
	printf "%-10.10sERR: @_\n",$step;
	$local_err++;
}

sub Info
{
	printf "%-10.10sINFO:@_\n",$step;
}

sub Complete
{
	my $status = ($local_err) ? 'FAIL' : 'SUCCESS';
	printf "%-10.10s\t\t\t\t\t\t\t$status\n","$step:";
	$total_err += $local_err;
}

sub Finish
{
	my $status=($total_err) ? 'FAIL' : 'SUCCESS';
	print "===========================\n";
	print "$mission FINISHED EXECUTING. RESULT:\t\t\t\t$status\n";

	`mkdir -p $ENV{APL}/var/log/activate` if not -d "$ENV{APL}/var/log/activate";
	if(open RESULT, ">$ENV{APL}/var/log/activate/result") {
		print RESULT "INSTALL_RESULT=$status\n";
		close RESULT;
	}
	`/bin/chown -R $ENV{APL_USR} $ENV{APL}/var/log/activate`;

	exit 1 if $total_err;
	exit 0;
}

sub ErrFinish
{
	Err(@_);
	$total_err += $local_err;
	Finish;
}

# Load global system configuration from base/etc/env.conf and base/etc/install.conf
# Verify environment variables
#
sub SetupEnv
{
	Announce "LoadConf";

	ErrFinish(" $0 should be started by root!") if $>!=0;
	ErrFinish(" Expected variable APL_ROLE=MASTER|NODE") if not defined $APL_ROLE or not $APL_ROLE=~/^(MASTER|NODE)$/;
	open (ICF,"$dirname/../etc/install.conf") || ErrFinish("Cannot read install.conf");
	open (ECF,"$dirname/../etc/env.conf")     || ErrFinish("Cannot read env.conf");
	map {$ENV{$1}=$2 if /^(\w+)=(\S+)/} grep {/^\w+=\S+/} (<ICF>,<ECF>);
	close ICF;
	close ECF;

	ErrFinish("APL           is not defined in env.conf") if ! $ENV{APL};
	ErrFinish("APL_VAR       is not defined in env.conf") if ! $ENV{APL_VAR};
	ErrFinish("APL_USR       is not defined in env.conf") if ! $ENV{APL_USR};
	ErrFinish("APL_CONF      is not defined in env.conf") if ! $ENV{APL_CONF};
	ErrFinish("APL_DB_USR    is not defined in env.conf") if ! $ENV{APL_DB_USR};
	ErrFinish("APL_HTTPD_USR is not defined in env.conf") if ! $ENV{APL_HTTPD_USR};
	ErrFinish("APL_HTTPD_GRP is not defined in env.conf") if ! $ENV{APL_HTTPD_GRP};
	ErrFinish("HTTPD_CONF    is not defined in install.conf") if ! $ENV{HTTPD_CONF};
	ErrFinish("HTTPD_DIRS    is not defined in install.conf") if ! $ENV{HTTPD_DIRS};
	ErrFinish("PHP_INI       is not defined in install.conf") if ! $ENV{PHP_INI};

	($APL,$APL_CONF,$APL_VAR,$APL_HTTPD_USR,$APL_HTTPD_GRP,$APL_DB_USR) =
	    ($ENV{APL},$ENV{APL_CONF},$ENV{APL_VAR},$ENV{APL_HTTPD_USR},$ENV{APL_HTTPD_GRP},$ENV{APL_DB_USR});

	Complete;

} # SetupEnv


# Add VN staff to /etc/sudoers
#
sub PatchSudoers
{
	Announce "sysExec";

# temporary till we reinstall all dev systems
`if ! grep -q /etc/sudoers.d /etc/sudoers
then
  mkdir -p /etc/sudoers.d
  chmod 750 /etc/sudoers.d
  echo '#includedir /etc/sudoers.d' >> /etc/sudoers
fi
`;


 `/bin/cp $APL/*/etc/va-*-sudo /etc/sudoers.d/ && chmod 440 /etc/sudoers.d/va-*-sudo`;
 ErrFinish(" Cannot copy to /etc/sudoers.d/") if $?;
 if($APL_ROLE eq 'MASTER') { #TBD: master with nodes
  `/bin/cp $APL/base/etc/sos-master-sudo /etc/sudoers.d/ && chmod 440 /etc/sudoers.d/sos-master-sudo`;
  ErrFinish(" Cannot copy to /etc/sudoers.d/") if $?;
  }
 Complete;

} # PatchSudoers

# Correct version in DBD module for Darwin
#
sub CorrectDBD
{
	system("$APL/base/bin/correct_perl_dbd") if -e "$APL/base/bin/correct_perl_dbd";
}


# Create APL_VAR area if doesn't exist
# Populate it with necessary subdirs
#
sub PopulateVarArea
{
	Announce "dirLayout";

	# Create VAR area if not created yet
	mkdir $APL_VAR,        0750 if ! -d $APL_VAR;

	# Populate VAR area with pre-defined subdirs
	mkdir "$APL_VAR/log",       0750 if ! -d "$APL_VAR/log";
	mkdir "$APL_VAR/dev",       0750 if ! -d "$APL_VAR/dev";
	mkdir "$APL_VAR/alert",     0750 if ! -d "$APL_VAR/alert";
	mkdir "$APL_VAR/conf",      0750 if ! -d "$APL_VAR/conf";
	mkdir "$APL_VAR/conf/conf", 0750 if ! -d "$APL_VAR/conf/conf";
	mkdir "$APL_VAR/par",       0750 if ! -d "$APL_VAR/par";
	mkdir "$APL_VAR/nss",       0750 if ! -d "$APL_VAR/nss";
	mkdir "$APL_VAR/tmp",       0770;
	mkdir "$APL_VAR/tmp/php",   0770;
	mkdir "$APL_VAR/tmp/backup",0770;
	mkdir "$APL_VAR/tmp/conf",  0750;
	mkdir "$APL_VAR/alert/emailer",    0750 if ! -d "$APL_VAR/alert/emailer";

	# Remove old aplbase
	# TBD: Find out if this code is still needed by anyone
	unlink "$APL_VAR/sys/adm_p"            if -e "$APL_VAR/sys/adm_p";
	unlink "/etc/rc.d/init.d/aplbase_init" if -e "/etc/rc.d/init.d/aplbase_init";
	unlink "/etc/rc.d/rc3.d/S99aplbase"    if -e "/etc/rc.d/rc3.d/S99aplbase";

	# Grant permissions for VAR area
	set_perm("$APL_VAR",                      '', $APL_HTTPD_GRP,'750');
	set_perm("$APL_VAR/dev",                  '', $APL_HTTPD_GRP,'750');
	set_perm("$APL_VAR/tmp/php",              '', $APL_HTTPD_GRP,'770');
	set_perm("$APL_VAR/tmp/backup",           '', $APL_HTTPD_GRP,'770');
	set_perm("$APL_VAR/log",                  '', $APL_HTTPD_GRP,'770');
	set_perm("$APL_VAR/tmp",                  '', $APL_HTTPD_GRP,'770');
	set_perm("$APL_VAR/conf",                 '', $APL_HTTPD_GRP,'770');
	set_perm("$APL_VAR/conf/conf",            '', $APL_HTTPD_GRP,'770');
	set_perm("$APL_VAR/alert",                '', '',            '750');
	set_perm("$APL_VAR/alert/emailer",        '', '',            '750');
	set_perm("$APL_VAR/par",                  '', '',            '750');
	set_perm("$APL_VAR/nss",                  'root', '$APL_HTTPD_GRP','750');

	$ENV{APACHEGRP}=$APL_HTTPD_GRP;

	Complete;

} # PopulateVarArea

sub Apache2Config
{
	Announce "Apache2";

	mkdir($ENV{HTTPD_DIRS},0750) if ! -d $ENV{HTTPD_DIRS}; # needs for OSX server

	`$APL/base/bin/httpd_conf_patches.pl` if $ENV{TARGET_OS} eq "Darwin";
	
	# Turn off PrivateTmp option for systemd service
	`perl -pi -e 's/^PrivateTmp=.*\$/PrivateTmp=false/' /usr/lib/systemd/system/httpd.service`;
	`systemctl daemon-reload`;

	`/bin/cp $APL/base/etc/va-base-apache.conf $ENV{HTTPD_DIRS}/
	/bin/cp $APL/base/etc/va-base-apache.inc $ENV{HTTPD_DIRS}/
	/bin/cp $APL/base/etc/va-silverlight-apache.inc $ENV{HTTPD_DIRS}/
	[ -f $APL/base/etc/va-ssl.conf ] && /bin/cp $APL/base/etc/va-ssl.conf $ENV{HTTPD_DIRS}/
	rm -f $ENV{HTTPD_DIRS}/mrtg.conf        # conflicts with skm mrtg
	$APL/base/bin/apache2_patch.pl
	`;

	# tune httpd for performance
	`perl -pi -e 'if(m!<IfModule prefork.c>! .. m!</IfModule>!) {
      \$_="MaxSpareServers 10\\n" if m!^MaxSpareServers!;
}' $ENV{HTTPD_CONF}`;
	# disable access log. TBD: remove after switch2virtual
	`perl -pi -e '\$_="#mod-by-skm#\$_"."CustomLog /dev/null \$1\\n"
                     if /^\\s*CustomLog\\s+\\S+\\s+(combined|common)/
                     and not m|^\\s*CustomLog /dev/null combined|
'  $ENV{HTTPD_CONF}`;
	# remove previously added multiple blank lines
	`perl -i -p00e0 $ENV{HTTPD_CONF}`;
    # Apache config for production servers
	`/bin/sed -i "s/ServerTokens\ OS/ServerTokens\ Prod/" $ENV{HTTPD_CONF}`;
	`/bin/sed -i "s/ServerSignature\ On/ServerSignature\ Off/" $ENV{HTTPD_CONF}`;
	`/bin/sed -i "s/KeepAlive Off/KeepAlive On/" $ENV{HTTPD_CONF}`;
	# Restrict default Apache Options
	`/bin/sed -i "s/^[ \t]*Options.*/Options None/g" $ENV{HTTPD_CONF}`;
	## Disable various Apache modules
	`/bin/sed -i -e "s/^LoadModule dav_module /#&/" \\
                 -e "s/^LoadModule dav_fs_module /#&/" \\
                 -e "s/^LoadModule info_module /#&/" \\
                 -e "s/^LoadModule status_module /#&/" \\
                 -e "s/^LoadModule userdir_module /#&/" \\
                 -e "s/^LoadModule autoindex_module /#&/" \\
                 -e "s/^LoadModule auth_basic_module /#&/" \\
                 -e "s/^LoadModule auth_digest_module /#&/" \\
                 -e "s/^LoadModule authn_file_module /#&/" \\
                 -e "s/^LoadModule authn_alias_module /#&/" \\
                 -e "s/^LoadModule authn_anon_module /#&/" \\
                 -e "s/^LoadModule authn_dbm_module /#&/" \\
                 -e "s/^LoadModule authn_default_module /#&/" \\
                 -e "s/^LoadModule authz_user_module /#&/" \\
                 -e "s/^LoadModule authz_owner_module /#&/" \\
                 -e "s/^LoadModule authz_groupfile_module /#&/" \\
                 -e "s/^LoadModule authz_dbm_module /#&/" \\
                 -e "s/^LoadModule authz_default_module /#&/" \\
                 -e "s/^LoadModule ldap_module /#&/" \\
                 -e "s/^LoadModule authnz_ldap_module /#&/" \\
                 -e "s/^LoadModule include_module /#&/" \\
                 -e "s/^LoadModule logio_module /#&/" \\
                 -e "s/^LoadModule ext_filter_module /#&/" \\
                 -e "s/^LoadModule usertrack_module /#&/" \\
                 -e "s/^LoadModule vhost_alias_module /#&/" \\
                 -e "s/^LoadModule actions_module /#&/" \\
                 -e "s/^LoadModule speling_module /#&/" \\
                 -e "s/^LoadModule proxy_balancer_module /#&/" \\
                 -e "s/^LoadModule proxy_ftp_module /#&/" \\
                 -e "s/^LoadModule cache_module /#&/" \\
                 -e "s/^LoadModule suexec_module /#&/" \\
                 -e "s/^LoadModule disk_cache_module /#&/" \\
                 -e "s/^LoadModule file_cache_module /#&/" \\
                 -e "s/^LoadModule mem_cache_module /#&/" \\
                 -e "s/^LoadModule version_module /#&/" \\
                 $ENV{HTTPD_CONF}`;
    # Clean up after Autoindex module removal
    `/bin/sed -i "s/^IndexOptions /#IndexOptions /g" $ENV{HTTPD_CONF}`;
    `/bin/sed -i "s/^AddIconByEncoding /#AddIconByEncoding /g" $ENV{HTTPD_CONF}`;
    `/bin/sed -i "s/^AddIconByType /#AddIconByType /g" $ENV{HTTPD_CONF}`;
    `/bin/sed -i "s/^AddIcon /#AddIcon /g" $ENV{HTTPD_CONF}`;
    `/bin/sed -i "s/^DefaultIcon /#DefaultIcon /g" $ENV{HTTPD_CONF}`;
    `/bin/sed -i "s/^ReadmeName /#ReadmeName /g" $ENV{HTTPD_CONF}`;
    `/bin/sed -i "s/^HeaderName /#HeaderName /g" $ENV{HTTPD_CONF}`;
    `/bin/sed -i "s/^IndexIgnore /#IndexIgnore /g" $ENV{HTTPD_CONF}`;
    # Explict deny of root directory
    `/bin/sed -i "s|^<Directory />|<Directory />\\nOrder deny,allow\\nDeny from all|" $ENV{HTTPD_CONF}`;
	# patch SSL configuration
	`$APL/base/bin/httpd_enable_ssl`;
        if($ENV{APL_MOD} ne 'SKMHA' and $ENV{TARGET_OS} ne "Darwin") {   # do not configure httpd start for HA or Darwin
          ` systemctl disable httpd`;
          ` systemctl enable httpd` if $APL_ROLE eq 'MASTER'; # only master has apache
        }
	my $SYSHTTPD='/etc/sysconfig/httpd';
	my $ENVCONF="$ENV{APL}/base/etc/env.conf";
	`perl -ni -e 'print if not m|$ENVCONF|' $SYSHTTPD`;# remove va-env.conf if alredy present
	open SYSHTTPD,">>$SYSHTTPD";
	print SYSHTTPD "[ -e $ENVCONF ] && . $ENVCONF\n";
	close SYSHTTPD;
	Complete;

} # sub Apache2Config

# Previous configurations files in $APL_VAR/conf are moved to $APL_VAR/tmp/conf and zipped
#
sub CleanConf
{
	Announce "CleanConf";

	my @rmdevs;
	my $clean=0;
	opendir(APLCONF,$APL_CONF);
	foreach my $f (readdir APLCONF) {
		if(-d "$APL_CONF/$f" && -f "$APL_CONF/$f/conf" && $f=~/^[asrvwj]?\d+$/) {
			$clean=1;
			push(@rmdevs,"$APL_CONF/$f");
		}
	}
	closedir APLCONF;
	if($clean) {
		my $ts=time;
		`tar --exclude still -czf $APL_VAR/tmp/conf/apl_conf.$ts.tgz -C $APL_CONF . >/dev/null 2>&1`;
		system("rm -rf @rmdevs");
		system("rm -rf $APL_CONF/conf/*");
	}

	Complete;

} # CleanConf

# Activate other modules
# TDB: Remove install and install.root script calls when activate scripts are stable enough
#
sub ActivateModules
{
	# Remove lod activate logs except stage.log
	`find $APL_VAR/log/activate -not -name 'stage.log' -and -not -name 'activate' -delete`
		if -d "$APL_VAR/log/activate";
	mkdir "$APL_VAR/log/activate",0750;
	mkdir "$APL_VAR/log/update",0750;
	set_perm("$APL_VAR/log/activate",           '','',              '750');
	set_perm("$APL_VAR/log/update",            '','',              '750');

	open MOD,"$APL/$MODULES_LIST";
	while (<MOD>) {
		chomp;
		next if not $_;
		next if $_ eq $NAME; # Skip 'base' module

		Announce "$_";
		mkdir "$APL_VAR/log/$_", 0750 if ! -d "$APL_VAR/log/$_";
		mkdir "$APL_VAR/log/activate/$_", 0750;
		mkdir("$APL_VAR/log/update/$_",   0750)   if -d "$APL/$_/update";
		set_perm("$APL_VAR/log/$_",         '','','750');
		set_perm("$APL_VAR/log/activate/$_",'','','750');
		set_perm("$APL_VAR/log/update/$_",  '','','750') if "$APL_VAR/log/update/$_";

    		if ( -f "$APL/$_/bin/activate") {
    			print "          execute $_:activate\n";
    			`cd $APL/$_/bin && ./activate </dev/null >$APL_VAR/log/activate/$_/activate.log 2>&1`;
			Err("activate fails. See $APL_VAR/log/activate/$_/activate.log") if $?;
    			#AT: keep script for debug#   unlink "$APL/$_/bin/install.root";
		}

		Complete; # message SUCCESS/FAIL for current module
	}

	close MOD;

} # sub ActivateModules

# Patch /etc/php.ini
#
sub PatchPHPConfig
{
	`perl -pi -e '
   \$_="spgsql.max_persistent = 5\\n"        if /^\\s*pgsql.max_persistent\\s*=/;
   \$_="upload_tmp_dir = $APL_VAR/tmp/php\\n"if /^\\s*;?\\s*upload_tmp_dir\\s*=/;
   \$_="expose_php = Off\\n"                 if /^\\s*;?\\s*expose_php\\s*=/;
' $ENV{PHP_INI}`;

	# -- setting session file access permissionns to rw-r----
	`perl -pi -e '
   \$_="session.save_path = \\x22\\x30;640;\$1\\x22\\n"   if /^\\s*session.save_path\\s*=\\s*\\x22?[\\d;]*([^\\x22\\x23\\s\\n]*)/;
  ' $ENV{PHP_INI}`;

	# -- upgrade php 5.1 to php 5.3
	`perl -pi -e '
  \$_="error_reporting = E_ALL & (~E_DEPRECATED | ~E_NOTICE)\\n"  if /^\\s*error_reporting\\s*=/;
  \$_="short_open_tag = On\\n"  if /^\\s*short_open_tag\\s*=/;
' $ENV{PHP_INI}`;

  `perl -pi -e 's|php_value session.save_path    "/var/lib/php/session"|php_value session.save_path   "0;640;/var/lib/php/session"|' /etc/httpd/conf.d/php.conf`;
        
} # sub PatchPHPConfig


# s_master stuff
# Check /etc/hosts for a s_master
# Add s_master into /etc/hosts if not present
#              (use first IP value from ifconfig list)
# IP4 only!
#
sub PatchHosts
{
	Announce "s_master";

	my $iaddr=gethostbyname('s_master');
	my $s_master;
	if (! $iaddr) {
		print "need s_master!\n";
		#------------- Get first phisical interface IP addr
		open(IF, '/sbin/ifconfig|');
		while(<IF>) {
			$s_master = $1, last if /^\s+inet\s(\S+)\s/;
		}
		close IF;
		#------------ Update /etc/hosts
		#print "need put $s_master into /etc/hosts\n";
		open HOSTS, '/etc/hosts';
		my @hosts = <HOSTS>;
		close HOSTS;
		open HOSTS, '>/etc/hosts';
		my $notset = 1; # shows that s_master is not set
		foreach (@hosts) {
			$notset = 0 if s/^s*\Q$s_master\E/$s_master\ts_master/;
			print HOSTS $_;
		}
		print HOSTS "$s_master\ts_master\n" if $notset;
		close HOSTS;
	}
	else {
		    #print "s_master is present!\n";
	}

	Complete;

} # sub PatchHosts

sub CleanTmpData
{
	# Cleanup images and clips from /tmp
	`rm -f /tmp/*.jpg.*  /tmp/*.jpg /tmp/*.m4v /tmp/*.pcm`;

	# Remove old sessions
	if ($ENV{TARGET_OS} ne "Darwin") {
		`rm -f /var/lib/php/session/sess_*`;
	}
	else {
		`rm -f /tmp/sess_*`;
	}
} # sub CleanTmpData


sub StartEngines
{
	Announce "engines";

        if($APL_ROLE eq 'MASTER') {
	   	`systemctl restart httpd`;
        }else {
                `systemctl stop httpd`;
	}
	Err("apache fails") if $?;

	Complete;

} # sub StartEngines

sub SysctlConfig 
{
	Announce "Patching /etc/sysctl.conf";

	`/usr/bin/patch /etc/sysctl.conf $APL/base/etc/sysctl/patch-1.patch | grep -v 'missing header'`;
	`/usr/bin/patch /etc/sysctl.conf $APL/base/etc/sysctl/patch-2.patch | grep -v 'missing header'`;
	`rm -f /etc/sysctl.conf.orig /etc/sysctl.conf.rej &>/dev/null`;
	`sysctl -p &>/dev/null`;

	Complete;
}

# Install specific logrotate policies
#
sub LogrotatePolicy
{
	Announce "logrotate";

        # change permissions to system_ws.log
        `touch $ENV{APL_VAR}/log/system_ws.log`;
        `chown apl:apache $ENV{APL_VAR}/log/system_ws.log`;
        `chmod ug+rw $ENV{APL_VAR}/log/system_ws.log`;
        
	`/usr/bin/patch /etc/logrotate.d/syslog $APL/base/etc/logrotate/syslog.patch &>/dev/null`;
	`rm -f /etc/logrotate.d/syslog.orig /etc/logrotate.d/syslog.rej`;

	`[ -d /etc/logrotate.d ] && (/bin/cp -f $APL/base/etc/logrotate/sarch.logrotate /etc/logrotate.d/sarch)`;
	`[ -d /etc/rsyslog.d ] && (/bin/cp -f $APL/base/etc/rsyslog/sarch_log.conf /etc/rsyslog.d/sarch_log.conf)`;
	`[ -d /etc/cron.daily ] && /bin/cp -f  $APL/base/etc/logrotate/sarch.daily /etc/cron.daily/sarch && chmod 700 /etc/cron.daily/sarch`;
        `[ -d /etc/cron.d ] && echo "*/5 * * * * root . /etc/cron.daily/logrotate" > /etc/cron.d/logrotate`;
	`[ -d /etc/periodic ] && /bin/cp -f $APL/base/etc/logrotate/daily.local /etc/daily.local`;
        `cp /etc/cron.daily/logrotate /etc/cron.hourly/`;

        `systemctl restart crond`;
        `systemctl start rsyslog`;
        `systemctl enable rsyslog`;

	Complete;

} # sub LogrotatePolicy

sub ServicemixCleanup
{
	`[ -f /etc/cron.daily/cleanup.sh ] && /bin/rm -f /etc/cron.daily/cleanup.sh`;
}

# Install rpms if present
#
sub InstallRpms
{
    Announce "additional rpms";

    `[ -d $APL/base/rpms ] && [ \$(find $APL/base/rpms -maxdepth 1 -name '*.rpm' | wc -l) -gt 0 ] && (/bin/rpm -Uvh $APL/base/rpms/*.rpm)`;
} # sub InstallRpms

# Install patch if present
#
sub InstallPatch
{

	Announce "patches";

	`/bin/bash $APL/vpatch/bin/autovpatch >$APL_VAR/log/install/autovpatch.log 2>&1`;

	Complete;

} # sub InstallPatch

# Patch ServiceMix SSH agent conf file.
# Change listen address from 0.0.0.0 to 127.0.0.1 
#
sub PatchSmixSSHConfig
{
	`perl -i -p -e 's{sshHost\\s*=\\s*0.0.0.0}{sshHost=127.0.0.1}g' /opt/apache/servicemix/etc/org.apache.karaf.shell.cfg`
}

sub CheckDevBuild
{
	unlink("$APL_CONF/.dev_build");
	my $build = `$APL/vpatch/bin/vctl build 2>/dev/null`;
	chomp $build;
	if ($build =~ /_/) {
		`touch $APL_CONF/.dev_build`;
	}
	`chown apl.apache $APL_CONF/.dev_build 2>/dev/null` if -f "$APL_CONF/.dev_build";
}

# Check if net.ifnames=0 kernel param is present in grub kernel command line
sub CheckGrubCfg
{
	my %cfg;
	open(FH, "/etc/default/grub");
	%cfg = map {/^(\w+)=(.*)$/} grep {/^\w+=/} <FH>;
	close FH;
	if ($cfg{GRUB_CMDLINE_LINUX}) {
		if ($cfg{GRUB_CMDLINE_LINUX} !~ /net\.ifnames=0/) {
			$cfg{GRUB_CMDLINE_LINUX} =~ s/\"$/ net.ifnames=0\"/;
			open(FH, ">/etc/default/grub");
			print FH "$_=$cfg{$_}\n" foreach keys %cfg;
			close FH;
			`grub2-mkconfig -o /boot/grub2/grub.cfg 2>/dev/null`;
			warn "WARNING! GRUB configuration was changed! You must reboot system after activation\n";
		}
	}
}

sub main
{
	SetupEnv;

	PatchSudoers;

	CorrectDBD;

	PopulateVarArea;

	InstallRpms;

	Apache2Config;

	#CleanConf;

	ActivateModules;

	PatchPHPConfig;

	if ($ENV{TARGET_OS} ne "Darwin" and $ENV{APL_MOD} ne 'SKMHA') {
		PatchHosts;
	}

	CleanTmpData;

	if ($ENV{TARGET_OS} ne "Darwin" and $ENV{APL_MOD} ne 'SKMHA') {
		StartEngines;
	}

	SysctlConfig;

	LogrotatePolicy;
	
	ServicemixCleanup;
	
	PatchSmixSSHConfig;

	if (-f "$APL/vpatch/bin/autovpatch") {
		InstallPatch;
	}

	CheckDevBuild;
	
	CheckGrubCfg;
        
	Finish;
}

main;
