#!/usr/bin/perl -w

use File::Copy;
use File::Find;

my %params;
my %psa_params;
my @imp_params = qw( vhost_path domain_name install_prefix ssl_target_directory  dbuser dbpasswd dbname admin_fullname admin_login admin_email admin_hash admin_passwd );
my $is_error=0;

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

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

    unless (open F, $fname){
        print_out "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_out "postinstall: can't open file `$fname` for writing\n";
        return 0;
    }
    print F $file_content;
    close F;
    return 1;
}
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;
}

# parse input to hash
while (<STDIN>){
    my ($k,$v);
    if (/^([^=]+)=(.+)$/){
        $v = $2;
        chomp $v;
        $k = $1;
        $params{"$k"} = $v;
        print_out $_;
    }
}

# parse plesk config file

open PSACONF, '/etc/psa/psa.conf';
print_out "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;

# check important parameters
foreach (@imp_params){
    unless (check_parameter($_)){
        print_out "postinstall: no parameter $_ specified for application\n";
        $is_error = 1;
    }
}
if ($is_error){
    exit 1;
}

my $documents_directory;
if ($params{'ssl_target_directory'} eq 'true'){
    $documents_directory = 'httpsdocs';
} else {
    $documents_directory = 'httpdocs';
}

my $root_dir = $params{'vhost_path'}.'/'.$documents_directory.'/'.$params{'install_prefix'};
my $config_file = "${root_dir}/config.php";
my $config_file_dist = "${root_dir}/config.dist.php";
unless (copy($config_file_dist, $config_file)){
	print_out "couldn't create config file - copy failed:\n$!\n";
	exit 1;
}

# modify application configuration file
my %ph = (
	'ADMIN_SETUP_PASS' => php_quote($params{'setup_admin_pass'}),
	'GALLERY_ROOT' => php_quote($root_dir),
	'DB_NAME'	=> php_quote($params{'dbname'}),
	'DB_USER'	=> php_quote($params{'dbuser'}),
	'DB_PASSWD'	=> php_quote($params{'dbpasswd'}),
	'GALLERY_ID' => php_quote($root_dir)
);
unless (modify_file($config_file, \%ph)){
    print_out "couldn't change file mt.cfg\n";
    exit 1;
}


# import initial database
unless (defined $params{'gallery_name'}){
	$params{'gallery_name'} = 'Gallery';
}
my $sql_schema_file = "${root_dir}/schema.sql";

my %sql_params = (
	'ADMIN_LOGIN' => mysql_quote($params{'admin_login'}),
	'ADMIN_PASSWD' => mysql_quote($params{'admin_hash'}),
	'ADMIN_NAME' => mysql_quote($params{'admin_fullname'}),
	'ADMIN_EMAIL'	=> mysql_quote($params{'admin_email'}),
	'LOCALE' => mysql_quote($params{'locale'}),
	'GALLERY_NAME' => mysql_quote($params{'gallery_name'})
);

unless (modify_file($sql_schema_file, \%sql_params)){
	print_out "couldn't change file index.html\n";
	exit 1;
}

my $mysql_bin = $psa_params{'MYSQL_BIN_D'}.'/mysql';
$m_dbuser = shell_quote($params{'dbuser'});
$m_dbpass = shell_quote($params{'dbpasswd'});
$m_dbname = shell_quote($params{'dbname'});
my $mysql_cmd = "${mysql_bin} -u\"${m_dbuser}\" -p\"${m_dbpass}\" \"${m_dbname}\" <${sql_schema_file}";
$str_res = `$mysql_cmd`;
if ($?){
    # error occured during mysql 
    print_out "unable to import sql data:\n${str_res}\n";
    print_out "$mysql_cmd\n";
    exit 1;
}
# create addidional dirs
my $base_dir = "${root_dir}/g2data";
unless (mkdir "${base_dir}/locks", 0777) {
	print_out "unable to create directory `${base_dir}/locks`: " . $!;
	exit 1;
}
$base_dir = "${base_dir}/locks";
my $i;
for ($i=0; $i<10; $i++) {
	mkdir("${base_dir}/${i}", 0777);
	my $j;
	for ($j=0; $j<10; $j++) {
		mkdir("${base_dir}/${i}/${j}", 0777);
	}
} 

# set valid permissions for directory g2data
find (sub {
	my $fname = $File::Find::name;
	my $fmod = 0;
	
	if (-d $fname){
		$fmod = 0777;
#		$fmod = 02777;
	} else {
#		$fmod = 02666;
		$fmod = 0666;
	}
	unless (chmod $fmod, $fname) {
		print_out "unable to set permissions `$fmod` to file `$fname`: $!\n";
		exit 1;
	}
			
}, "${root_dir}/g2data");

unlink($sql_schema_file);
exit 0;
