#!/usr/bin/perl -w

use strict;
use File::Path;
use File::Copy;
use File::Find;

my @imp_params = qw( vhost_path domain_name install_prefix ssl_target_directory bbc_mainsite );
my $is_error=0;

sub print_out
{
    my ($text) = @_;
    print STDERR $text;
}

sub modify_file
{
    my ($fname, $fparams) = @_;

    unless (open F, $fname){
        print STDERR "postinstall: can't open file `$fname` for reading\n";
        return 0;
    }

    my $file_content;
    while (<F>){
        $file_content .= $_;
    }
    close F;

    my ($k,$v);
    while (($k,$v)=each(%$fparams)){
        $file_content =~ s/\@\@${k}\@\@/$v/g;
    }

    unless (open F, ">$fname"){
        print STDERR "postinstall: can't open file `$fname` for writing\n";
        return 0;
    }
    print F $file_content;
    close F;
    return 1;
}


######################### 
#       Quote Section   # 
######################### 

sub mysql_quote
{
    my ($qstr) = @_;
    # replace ' for \'
    # replace \ for \\
    $qstr =~ s/\\/\\\\/g;
    $qstr =~ s/'/\\'/g;
    return $qstr;
}

sub php_quote
{
    my ($qstr) = @_;
    # replace ' for \'
    # replace \ for \\
    $qstr =~ s/\\/\\\\/g;
    $qstr =~ s/'/\\'/g;
    return $qstr;
}

sub shell_quote
{
    my ($qstr) = @_;
    # replace ' for \'
    # replace \ for \\
    $qstr =~ s/\\/\\\\/g;
    $qstr =~ s/"/\\\"/g;
    $qstr =~ s/\$/\\\$/g;
    return $qstr;
}

sub parse_input_to_hash
{
    my %params = ();
    while (<STDIN>){
        my ($k,$v);
        if (/^([^=]+)=(.+)$/){
            $v = $2;
            chomp $v;
            $k = $1;
            $params{"$k"} = $v;
            print STDERR $_;
        }
    }
    return %params;
}

sub parse_plesk_config_file
{
    my %psa_params = ();
    open PSACONF, '/etc/psa/psa.conf';
    print "opening psa config\n";
    while (<PSACONF>){
        chomp;
        unless (/^#/){
            if (/^(\s*[_a-zA-Z]+)\s+(.+?)\s*$/){
                # print "$1 : $2\n";
                $psa_params{$1} = $2;
            }
        }
    }
    close PSACONF;
    return %psa_params;
}

sub check_parameter
{
    my ($param, %params) = @_;
    unless (defined $params{$param}){
        return 0;
    } else {
        return 1;
    }
}

sub check_parameters
{
    my ($imp_params, %params) = @_;
    my $is_error = 0;
    foreach (@$imp_params){
        unless (check_parameter($_, %params)){
            print "postinstall: no parameter $_ specified for application\n";
            $is_error = 1;
        }
    }
    if ($is_error){
        exit 1;
    }
}


############################# 
#       SSL Section         # 
############################# 

sub get_proto
{
    my ($p_ssl_target_directory) = @_;
    my $proto;
    if ($p_ssl_target_directory eq 'true'){
            $proto = 'https://';
    } else {
            $proto = 'http://';
    }
    return $proto;
}

sub get_documents_directory
{
    my ($p_ssl_target_directory) = @_;
    my $documents_directory;
    if ($p_ssl_target_directory eq 'true'){
            $documents_directory = 'httpsdocs';
    } else {
            $documents_directory = 'httpdocs';
    }
    return $documents_directory;
}

sub get_ssl_enabled
{
    my ($p_ssl_target_directory) = @_;
    my $ssl_enabled;
    if ($p_ssl_target_directory eq 'true'){
            $ssl_enabled = 1;
    } else {
            $ssl_enabled = 0;
    }
    return $ssl_enabled;
}


################################# 
#       Remote Databese Section # 
################################# 

sub get_dbhost
{
    my ($p_dbhost) = @_;
    my $dbhost;
    if (defined $p_dbhost && $p_dbhost ne '') {
        $dbhost = $p_dbhost;
    } else {
        $dbhost = 'localhost';
    }
    return $dbhost;
}

sub get_dbport
{
    my ($p_dbport) = @_;
    my $dbport;
    if (defined $p_dbport && $p_dbport ne '') {
        $dbport = $p_dbport;
    } else {
        $dbport = '3306';
    }
    return $dbport;
}

sub get_dbremote_params
{
    my ($p_dbhost, $p_dbport) = @_;
    my $dbremote_params = '';
    my ($m_dbhost, $m_dbport);
    if (defined $p_dbhost && $p_dbhost ne '') {
        $m_dbhost = shell_quote($p_dbhost);
        $dbremote_params .= " --host=\"${m_dbhost}\" ";
    } else {
        $m_dbhost = shell_quote('localhost');
        $dbremote_params .= " --host=\"${m_dbhost}\" ";
    }
    if (defined $p_dbport && $p_dbport ne '') {
        $m_dbport = shell_quote($p_dbport);
        $dbremote_params .= " --port=\"${m_dbport}\" ";
    }
    return $dbremote_params;
}

sub get_dbstring
{
    my ($p_dbhost, $p_dbport) = @_;
    my $dbstring = '';
    my $dbhost = '';
    my $dbport = '';

    if (defined $p_dbhost && $p_dbhost ne '') {
        $dbhost = $p_dbhost;
    } else {
        $dbhost = 'localhost';
    }
    $dbstring .= $dbhost;
    if (defined $p_dbport && $p_dbport ne '') {
        $dbport = $p_dbport;
        $dbstring .= ":$dbport";
    }
    return $dbstring;
}


################################# 
#       Path to root directory  # 
################################# 

sub get_root_dir
{
    my ($documents_directory, $p_vhost_path, $p_install_prefix) = @_;
    my $root_dir = '';
    $root_dir = $p_vhost_path.'/'.$documents_directory.'/'.$p_install_prefix;

    if($p_install_prefix eq "."){
        $root_dir =~ s/\/\.//g;
    }
    return $root_dir;
}

sub get_root_url
{
    my ($proto, $documents_directory, $p_domain_name, $p_install_prefix) = @_;
    my $root_url = '';
    $root_url = $proto.$p_domain_name."/".$p_install_prefix;

    if($p_install_prefix eq "."){
        $root_url =~ s/\/\.//g;
    }
    return $root_url;
}

sub get_root_url_cgi
{
    my ($proto, $documents_directory, $p_domain_name, $p_install_prefix) = @_;
    my $root_url_cgi = '';
    $root_url_cgi = $proto.$p_domain_name.'/'.'cgi-bin'.'/'.$p_install_prefix;

    if($p_install_prefix eq "."){
	$root_url_cgi =~ s/\/\.//g;
    }
    return $root_url_cgi;
}
				
				
sub get_root_dir_cgi
{
    my ($p_vhost_path, $p_install_prefix) = @_;
    my $root_dir_cgi = $p_vhost_path.'/'.'cgi-bin'.'/'.$p_install_prefix;

    if($p_install_prefix eq "."){
        $root_dir_cgi =~ s/\/\.//g;
    }
    return $root_dir_cgi;
}

sub get_install_prefix
{
    my ($p_install_prefix) = @_;
    my $install_prefix;
    if($p_install_prefix eq "."){
        $install_prefix = "";
    }
    else{
        $install_prefix = $p_install_prefix;
    }
    return $install_prefix;
}


######################### 
#       Quote Section   # 
######################### 

my %params = parse_input_to_hash();
my %psa_params = parse_plesk_config_file();
check_parameters(\@imp_params, %params);

############################# 
#       SSL Section         # 
############################# 

my $proto = get_proto($params{'ssl_target_directory'});
my $documents_directory = get_documents_directory($params{'ssl_target_directory'});
my $ssl_enabled = get_ssl_enabled($params{'ssl_target_directory'});

################################# 
#       Remote Databese Section # 
################################# 

my $dbhost = get_dbhost($params{'dbhost'});
my $dbport = get_dbport($params{'port'});
my $dbremote_params = get_dbremote_params($params{'dbhost'}, $params{'port'});
my $dbstring = get_dbstring($params{'dbhost'}, $params{'dbport'});

################################# 
#       Path to root directory  # 
################################# 

my $root_dir = get_root_dir($documents_directory, $params{'vhost_path'}, $params{'install_prefix'});
my $root_url = get_root_url($proto, $documents_directory, $params{'domain_name'}, $params{'install_prefix'});
my $root_url_cgi = get_root_url_cgi($proto, $documents_directory, $params{'domain_name'}, $params{'install_prefix'});
my $root_dir_cgi = get_root_dir_cgi($params{'vhost_path'}, $params{'install_prefix'});
my $install_prefix = get_install_prefix($params{'install_prefix'});

# generate config file
my $config_file = "${root_dir}/conf/config.php";
my $config_file_content = '';

sub check_and_generate_param
{
	my ($param_name, $param_value, $param_default_value) = @_;
	my $res = "\$${param_name} = '";
	if ((!defined $param_value || $param_value eq '') && defined $param_default_value) {
		$res .= php_quote($param_default_value);
	} else {
		$res .= php_quote($param_value);
	}
	$res .= "';\n";
	return $res;
}

$config_file_content = "<?php\n";
$config_file_content .= check_and_generate_param('BBC_SHOW_CONFIG', $params{bbc_show_config}, '1');
$config_file_content .= check_and_generate_param('BBC_TITLEBAR', $params{bbc_titlebar}, 'Statistics for %SERVER generated the %DATE');
$config_file_content .= check_and_generate_param('BBC_LANGUAGE', $params{bbc_language}, 'en');
$config_file_content .= check_and_generate_param('BBC_MAXTIME', $params{bbc_maxtime}, '1800');
$config_file_content .= check_and_generate_param('BBC_MAXVISIBLE', $params{bbc_maxvisible}, '100');
$config_file_content .= check_and_generate_param('BBC_MAXOS', $params{bbc_maxos}, '10');
$config_file_content .= check_and_generate_param('BBC_MAXBROWSER', $params{bbc_maxbrowser}, '10');
$config_file_content .= check_and_generate_param('BBC_MAXEXTENSION', $params{max_extension}, '10');
$config_file_content .= check_and_generate_param('BBC_MAXROBOT', $params{bbc_maxrobot}, '10');
$config_file_content .= check_and_generate_param('BBC_MAXPAGE', $params{bbc_maxpage}, '10');
$config_file_content .= check_and_generate_param('BBC_MAXORIGIN', $params{bbc_maxorigin}, '10');
$config_file_content .= check_and_generate_param('BBC_IGNOREIP', $params{bbc_ignoreip});
$config_file_content .= check_and_generate_param('BBC_IGNORE_REFER', $params{bbc_ignore_refer}, '');
$config_file_content .= check_and_generate_param('BBC_OWN_REFER', $params{bbc_own_refer}, '1');

my @detailed_stat_fields = qw( id time visits ext dns refer os browser ip page search );
my @params_stat_fields = ();
foreach my $field (@detailed_stat_fields) {
	if (defined $params{'bbc_stat_field_' . $field} && $params{'bbc_stat_field_' . $field} ne '') {
		push @params_stat_fields, $field;
	}
}

$config_file_content .= check_and_generate_param('BBC_DETAILED_STAT_FIELDS', join(', ', @params_stat_fields));

$config_file_content .= check_and_generate_param('BBC_GENERAL_ALIGN_STYLE', $params{bbc_general_align_style}, 'center');
$config_file_content .= check_and_generate_param('BBC_TITLE_SIZE', $params{bbc_title_size}, '12');
$config_file_content .= check_and_generate_param('BBC_SUBTITLE_SIZE', $params{bbc_subtitle_size}, '8');
$config_file_content .= check_and_generate_param('BBC_TEXT_SIZE', $params{bbc_text_size}, '10');
$config_file_content .= "\n?>";

unless (open F, ">${config_file}") {
	print_out "Unable to open config file `${config_file}`\n";
	exit 1;
}

print F $config_file_content;
close F;


# chmod files
$! = '';
chmod 0777, "${root_dir}/var/";
if ("$!" ne '') {
	print_out "Unable to set permissions for directory `${root_dir}/var/`: $!\n";
	exit 1;
}

find sub {
	my $fname = $File::Find::name;
	if ($fname =~ m/(^access\.php$|\^.htalock$|^last\.php$|^counter.+\.inc$)/) {
		$! = '';
		chmod 0666, $fname;
		if ("$!" ne '') {
			print_out "Unable to set permissions for file `${fname}`\n";
		}
	}
}, "${root_dir}/var/";

