#!/usr/bin/perl

# -----------------------------------------------------------------------------
# Hardened DB installation
# -----------------------------------------------------------------------------
#  Author: Alexey Tsibulnik
#  Edited by: 
#  QA by:  Christopher C Gettings
#  Copyright: (c) videoNEXT LLC, 2004-2012
# -----------------------------------------------------------------------------

use strict;
use Getopt::Long;
use Data::Dumper;

# CONS ------------
my $APL=$ENV{APL} || die "APL is not defined\n";
my $DB_USR=$ENV{APL_DB_USR};
my $LOGPATH="$ENV{APL_VAR}/log/update/db";
my $SQLPATH="$APL/db/sql";
my $PSQL = "/usr/bin/psql";
my $FORTIFIED_MARK = "$ENV{APL_VAR}/db/fortified";

my $DBProps;

# VARS ------------
my $dbl;

# ARGS ------------
my $db='fortify';

# FUNC ------------

sub write2log {
   my $log=shift;
   if(open LOG, $log) {
     print LOG @_;
     close LOG;
   }
   print @_;
   print "\n";
}

sub Log {
   write2log(">>$LOGPATH/db_fortify.log",@_);
} 

sub Fatal {
  Log('FATAL ERROR:',@_);
  exit 1;
}

sub Error {
  Log('ERROR:',@_);
}

sub get_db_conf
{
	my $dbConfName = shift;
	my $dbConfFile = "$ENV{APL}/etc/${dbConfName}.db.conf";
	
	open(DB_CONF_FILE, "<$dbConfFile")
    	    or die "unable to open configuration file $dbConfFile";

	my %mcfg = map{/(^.+?)=(.*)/} grep {/^.+=.*/} <DB_CONF_FILE>;
	close(DB_CONF_FILE);
	
	$DBProps = \%mcfg;
}

sub apply {
  my ($db,$sql)=@_;
  my $log="$LOGPATH/$db-$sql.log";
  my $cmd="$PSQL -U $DB_USR -a -f $SQLPATH/$db/$sql $DBProps->{name} 2>&1 | tee -a $log | egrep '^psql:.+ERROR:|No such file'";
  #write2log(">$log","====COMMAND:====\n$cmd\n\n====OUTPUT:====\n\n");
  Log("APPLYING: $sql ");
  my $errors=`$cmd`;
  Fatal("\n$errors") if $errors;
  Log "\t\t\tSUCCESS\n";
}

# MAIN ==================================
  Log scalar(localtime).": STARTED db_fortify \n";
  if (-f $FORTIFIED_MARK) {
    Log("System is already fortified. Nothing to do");
    exit 0;
  }
  
  get_db_conf("skm_local");
  
  opendir(SQL,"$SQLPATH/$db") || Fatal("Cannot read SQLPATH/$db");
  my @scripts= sort {
                  my @a=$a=~/^(\d+)\.(\d+)\.(\d+)-(\d+)-(\S+)\.sql$/;
                  my @b=$b=~/^(\d+)\.(\d+)\.(\d+)-(\d+)-(\S+)\.sql$/;
                  ($a[0] <=> $b[0]) || ($a[1] <=> $b[1]) || ($a[2] <=> $b[2]) || ($a[3] <=> $b[3]) || ($a[4] cmp $b[4])
               }  grep   {  /^(\d+)\.(\d+)\.(\d+)-(\d+)-(\S+)\.sql$/ } readdir(SQL);
  close SQL;
  foreach my $sql (@scripts) {
    $sql=~/^(\d+)\.(\d+)\.(\d+)-(\d+)-(\S+)\.sql$/;
    apply($db,$sql);
  }
  
  # Set 'fortified' mark
  open FH, ">$FORTIFIED_MARK";
  print FH "FORTIFIED=OK\n";
  close FH;

END {
 Log scalar(localtime).": FINISHED db_update \n";
}
