#!/usr/bin/perl
use IO::File;
use File::Copy;
use Getopt::Std;
use DB_File;
use locale;

getopts('ui');              

$SYSLOGCONF = "/etc/syslog.conf";
$LineFound = "FALSE";
$LOGROTATEPATH = "/etc/logrotate.d/";
$LOGROTATENEME = "ale";

if ($opt_u == 1)
{
	CreateBackup($SYSLOGCONF);
	RemoveFromMessages();
	GetRidOfLegacyLocal1();
	UnInstalling();
	if( -f "/etc/logrotate.d/ale")
	{
		unlink("/etc/logrotate.d/ale");
	}
	print "Re-initializing syslogd\n";
	ResartSyslogd();
}
elsif ($opt_i == 1)
{
	CreateBackup($SYSLOGCONF);
	AddToMessages();
	GetRidOfLegacyLocal1();
	Installing();
	CreateLogrotate();
	print "Re-initializing syslogd\n";
	ResartSyslogd();
}
else
{
	print"Usage:\n";
	print"\tUDSyslog -i = Insert ePO strings into syslog.conf\n";
	print"\tUDSyslog -u = Remove ePO strings from syslog.conf\n";
}


sub CreateBackup($){
	my $original = shift;
	my $suffix = ".back.";
	my $i = 1;
	while ($i < 100)
	{
		$LookFor = "$original$suffix$i";
		if ( -f "$LookFor" )
		{
			#Do nothing		
		}else{
			print "Backing up to $LookFor\n";
			copy($original, $LookFor);
			last;
		}
	}
	continue {
    	$i++;
	}
	return;
}

sub GetLineByName($$){
	my $LineText = shift;
	my $TFile = shift;
	my $LineNum = 0;
	$LineFound = "FALSE";
	my $tie = tie(@lines,"DB_File",$TFile,O_RDWR,0666,$DB_RECNO)
		or die "Cannot open $TFile!";
	for ($i = 0 ; $i <= $tie->length; $i++){
		$tie->get($i, $CurLine);
	
     	if($CurLine eq $LineText)
     	{
  		  	$LineNum = $i;
			undef $tie;
			untie @lines;
			$LineFound = "TRUE";
		  	return ($LineNum);
		}
	}
	undef $tie;
	untie @lines;
	$LineFound = "FALSE";
	return ($LineNum);
}

sub CreateLogrotate(){
    my $fh = new IO::File "> $LOGROTATEPATH$LOGROTATENEME";
    if (defined $fh) {
		print $fh "/opt/NETAepoagt/etc/log {\n";
		print $fh "\tdaily\n";
		print $fh "\trotate 5\n";
		print $fh "\tmissingok\n";
		print $fh "\tsize=1000k\n";
		print $fh "\tcreate 0664 ALEusr root\n";
		print $fh "\tpostrotate\n";
		print $fh "\t\t/etc/init.d/ale restart\n";
		print $fh "\tendscript\n";
		print $fh "}\n";
	    $fh->close;
    }
	return;
}

sub GetRidOfLegacyLocal1()
{
	# to get rid of possible local1.* entries
	my $Str1 = "#EPO Agent logging options";
	my $Str2 = "local1.*                                     /opt/NETAepoagt/etc/log";
	
	my $LineNum1 = GetLineByName($Str1, $SYSLOGCONF);
	my $LineNum2 = GetLineByName($Str2, $SYSLOGCONF);
	
	my $tie = tie(@lines,"DB_File",$SYSLOGCONF,O_RDWR,0666,$DB_RECNO)
	  or die "Cannot open $SYSLOGCONF!";
	if ($LineFound eq "TRUE")
		{
			print "Removing ePO entries in $SYSLOGCONF\n";
			$tie->del($LineNum2);
			$tie->del($LineNum1);
		}
	else
		{
			print "No ePO references to local1.* in $SYSLOGCONF\n";
		}
	undef $tie;
	untie(@lines);
	return;
}

sub UnInstalling(){

	my $Str1 = "#EPO Agent logging options";
	my $Str2 = "local1.err                              /opt/NETAepoagt/etc/log";
	
	my $LineNum1 = GetLineByName($Str1, $SYSLOGCONF);
	my $LineNum2 = GetLineByName($Str2, $SYSLOGCONF);
	
	my $tie = tie(@lines,"DB_File",$SYSLOGCONF,O_RDWR,0666,$DB_RECNO)
	  or die "Cannot open $SYSLOGCONF!";
	if ($LineFound eq "TRUE")
		{
			print "Removing ePO entries in $SYSLOGCONF\n";
			$tie->del($LineNum2);
			$tie->del($LineNum1);
		}
	else
		{
			print "No ePO references local1.err in $SYSLOGCONF\n";
		}
	undef $tie;
	untie(@lines);
	return;
}


sub Installing(){

	my $Str1 = "#EPO Agent logging options";
	my $Str2 = "local1.err                              /opt/NETAepoagt/etc/log";
		
	my $LineNum1 = GetLineByName($Str1, $SYSLOGCONF);
	my $LineNum2 = GetLineByName($Str2, $SYSLOGCONF);
	
	my $tie = tie(@lines,"DB_File",$SYSLOGCONF,O_RDWR,0666,$DB_RECNO)
	  or die "Cannot open $SYSLOGCONF!";
	  
	  if ($LineFound eq "FALSE")
	  	{
	  		$LastLine = $tie->length;
	  		print "Updating $SYSLOGCONF\n";
	  		$tie->put($LastLine -1, $Str2, R_IAFTER);
	  		$tie->put($LastLine -1, $Str1, R_IAFTER);
	  	}
	  else
	  	{
		 	print "$SYSLOGCONF is up to date\n";
		}
	undef $tie;
	untie(@lines);
	return;
}

sub AddToMessages()
{
	my $record;
	my @syslog;
	my @msgfile;
	my $element;

	open(FILEIN, "$SYSLOGCONF") || die "Cannot open $SYSLOGCONF: $!\n";
	while($record = <FILEIN>)
	{
		chomp($record);
		if($record =~ "local1.none" && $record !~ /^\#/)
		{
			print "/var/log/messages line up to date!\n";
			close(FILEIN);
			return(0);
		}
		push(@syslog, $record);
	}
	close(FILEIN);
	open(FILEOUT, ">/tmp/syslog.conf.tmp") || die "Cannot open /tmp/syslog.conf.tmp: $!\n";
	foreach $record (@syslog)
	{
		if($record =~ /\t\/var\/log\/messages/gi && $record !~ "local1\.none" && $record !~ /^\#/)
		{
			@msgfile = split(/\;/, $record);
			foreach $element (@msgfile)
			{
				if($element =~ /\t\/var\/log\/messages/gi)
				{
					print FILEOUT "local1.none\;";
					print FILEOUT "$element\n";
				}
				elsif($element !~ /local1.none/gi)
				{
					print FILEOUT "$element\;";
				}
			}
		}
		else
		{
			print FILEOUT "$record\n";
		}
	}
	close(FILEOUT);
	copy("/tmp/syslog.conf.tmp","/etc/syslog.conf");
	unlink("/tmp/syslog.conf.tmp");
	return;
}

sub RemoveFromMessages()
{
	my $record;
	my @syslog;
	my @msgfile;
	my $element;

	open(FILEIN, "$SYSLOGCONF") || die "Cannot open $SYSLOGCONF: $!\n";
	while($record = <FILEIN>)
	{
		chomp($record);
		if($record !~ "local1.none" && $record =~ /\t\/var\/log\/messages/gi && $record !~ /^#/)
		{
			print "/var/log/messages line up to date!\n";
			close(FILEIN);
			return(0);
		}
		push(@syslog, $record);
	}
	close(FILEIN);
	open(FILEOUT, ">/tmp/syslog.conf.tmp") || die "Cannot open /tmp/syslog.conf.tmp: $!\n";
	foreach $record (@syslog)
	{
		if($record =~ /\t\/var\/log\/messages/gi && $record =~ "local1\.none" && $record !~ /^#/)
		{
			@msgfile = split(/\;/, $record);
			foreach $element (@msgfile)
			{
				if($element =~ /\t\/var\/log\/messages/gi)
				{
					print FILEOUT "$element\n";
				}
				elsif($element !~ /local1.none/gi)
				{
					print FILEOUT "$element\;";
				}
			}
		}
		else
		{
			print FILEOUT "$record\n";
		}
	}
	close(FILEOUT);
	copy("/tmp/syslog.conf.tmp","/etc/syslog.conf");
	unlink("/tmp/syslog.conf.tmp");
	return;
}

sub ResartSyslogd()
{
	system("kill -s SIGHUP `cat /var/run/syslogd.pid`");
	return;
}
