#!/usr/bin/perl -w

use File::Path;
use File::Copy;
use File::Basename;
use IO::Socket;


my %params;
my %psa_params;
my @imp_params = qw( vhost_path domain_name install_prefix ssl_target_directory  dbuser dbpasswd dbname admin_email admin_login admin_passwd gallery_language gallery_theme );
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}/include/config.inc.php";
my $config_file_dist = "${root_dir}/include/config.inc.sample.php";

my %config_params = (
	'DBUSER' => php_quote($params{'dbuser'}),
	'DBPASSWD' => php_quote($params{'dbpasswd'}),
	'DBNAME' => php_quote($params{'dbname'})
);
unless (copy($config_file_dist, $config_file)){
	print_out "couldn't copy config file: `$!`\n";
	exit 1;
}
unless (modify_file($config_file, \%config_params)){
    print_out "couldn't change file `${config_file}`\n";
    exit 1;
}

# import sql schema
my $sql_schema_file = "${root_dir}/schema.sql";

my %sql_params = (
	'ADMIN_LOGIN' => mysql_quote($params{'admin_login'}),
	'ADMIN_PASSWD' => mysql_quote($params{'admin_passwd'}),
	'ADMIN_EMAIL' => mysql_quote($params{'admin_email'}),
	'GALLERY_LANG' => mysql_quote($params{'gallery_language'}),
	'GALLERY_THEME' => mysql_quote($params{'gallery_theme'}),
	'SITE_URL'		=> '',
	'GALLERY_NAME'	=> '',
	'GALLERY_DESC'	=> '',
	'THUMB_METHOD'	=> '',
	'IM_PATH'		=> ''
);
# SITE_URL

if (defined $params{'url'}){
	$sql_params{'SITE_URL'} = $params{'url'};
}
if (defined $params{'gallery_name'}){
	$sql_params{'GALLERY_NAME'} = $params{'gallery_name'};
}
if (defined $params{'gallery_description'}){
	$sql_params{'GALLERY_DESC'} = $params{'gallery_description'};
}





########## check GD ##############
my $ge = ''; # ge = "graphics engine"
my $ge_ver = '';
my $ge_path = '';
my $gd_ver = '';

# perform check which graphics engine installed
$test_dir =  $params{'vhost_path'}.'/'.$documents_directory;

my @chars = ("a" .. "z");
my $test_file_name;

while (1){
    $test_file_name = join("", @chars[map {rand @chars}(1..8)]);
    unless (-e $test_dir.'/'.$test_file_name){
        last;
    }
}
$test_file_name .= '.php';
#$test_file_name = "${test_dir}/${test_file_name}";

if (open TEST, ">${test_dir}/${test_file_name}"){
	print TEST <<'EOT';
<?php
/**
* Get which version of GD is installed, if any.
*   
* Returns the version (1 or 2) of the GD extension.
* copyright Hagan Fox
*/  
function gdVersion($user_ver = 0)
{
   if (! extension_loaded('gd')) { return 0; }
   static $gd_ver = 0;
   // Just accept the specified setting if it's 1.
   if ($user_ver == 1) { $gd_ver = 1; return 1; }
   // Use the static variable if function was called previously.
   if ($user_ver !=2 && $gd_ver > 0 ) { return $gd_ver; }
   // Use the gd_info() function if possible.
   if (function_exists('gd_info')) {
       $ver_info = gd_info();
       preg_match('/\d/', $ver_info['GD Version'], $match);
       $gd_ver = $match[0];
       return $match[0];
   }
   // If phpinfo() is disabled use a specified / fail-safe choice...
   if (preg_match('/phpinfo/', ini_get('disable_functions'))) {
       if ($user_ver == 2) {
           $gd_ver = 2;
           return 2;
       } else {
           $gd_ver = 1;
           return 1;
       }
   }
   // ...otherwise use phpinfo().
   ob_start();
   phpinfo(8);
   $info = ob_get_contents();
   ob_end_clean();
   $info = stristr($info, 'gd version');
   preg_match('/\d/', $info, $match);
   $gd_ver = $match[0];
   return $match[0];
} // End gdVersion()

header('X-PSA-HEADER-ENGINE: gd');
header('X-PSA-HEADER-ENGINE-VER: '.gdVersion());

echo gdVersion();

?>
EOT
	close TEST;
	my $socket = IO::Socket::INET->new(PeerAddr => $params{'domain_name'},
									PeerPort => '80',
									Proto    => "tcp",
									Type     => SOCK_STREAM);
	if ($socket){
		print $socket "GET /$test_file_name HTTP/1.0\r\n";
		#print_out "GET /$test_file_name HTTP/1.0\r\n";
		print $socket "Host: ".$params{'domain_name'}."\r\n";
		#print_out "Host: ".$params{'domain_name'}."\r\n";
		print $socket "User-agent: Opera/8.01 (X11; Linux i686; U; en)\r\n\r\n";
		#print_out "User-agent: Opera/8.01 (X11; Linux i686; U; en)\r\n\r\n";



		while (<$socket>){
			print_out $_;
			chomp;
			if (/^X-PSA-HEADER-ENGINE: ([a-z]+)/){
				$ge = $1;
				print_out "sdfds $1\n";
			}
			if (/X-PSA-HEADER-ENGINE-VER: ([0-9a-z-]+)/){
				$ge_ver = $1;

			}
		}
		close $socket;
	}
	unlink "${test_dir}/${test_file_name}";
}


if ($ge ne ''){
	$gd_ver = $ge.$ge_ver;
} else {
	#========== failed to get version
	unless(open PR, $psa_params{'PRODUCT_ROOT_D'} . '/version') {
		print_out "couldn't open plesk VERSION file: " . $!;
		exit 1;
	}
	my $ver_str = '';
	$ver_str = <PR>;

	unless (defined($ver_str) && $ver_str ne '') {
		print_out "couldn't read plesk version: " . $!;
		exit 1;
	}
	chomp $ver_str;

	@psa_version = split / /, $ver_str;


	$len = @psa_version;
	if (4 != $len) {
		print_out "invalid plesk version file format";
		exit 1;
	}

	my $os_name = lc($psa_version[1]);
	my $os_ver = lc($psa_version[2]).'';

	# check version

	if (($os_name eq 'redhat' && $os_ver eq '9') || 
		($os_name eq 'redhat' && $os_ver eq '7.3') ||
		($os_name eq 'redhat' && $os_ver eq 'el2.1') ||
		($os_name eq 'redhat' && $os_ver eq 'el3') ||
		($os_name eq 'fedoracore' && $os_ver eq '1') ||
		($os_name eq 'centos' && $os_ver eq '3.3')
	) {
		# gd1
		$gd_ver = 'gd1';
	} else {
		# gd2
		$gd_ver = 'gd2';
	}
}

$sql_params{'THUMB_METHOD'} = $gd_ver;

unless (modify_file($sql_schema_file, \%sql_params)){
	print_out "couldn't change file `${sql_schema_file}`\n";
	unlink $sql_schema_file;
	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`;
unlink $sql_schema_file;
if ($?){
    # error occured during mysql 
    print_out "unable to import sql data (`${sql_schema_file}`):\n${str_res}\n";
    exit 1;
}

# change permissions
chmod(0777, "${root_dir}/albums");
chmod(0777, "${root_dir}/albums/edit");
chmod(0777, "${root_dir}/albums/userpics");


exit 0;
