#!/usr/bin/perl -w

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_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 "reconfigure: 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 "reconfigure: 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;
}

sub clean_gallery_cache
{
	my ($checkfile) = @_;
	my $domain_name = $params{'domain_name'};
	# use sockets to perform this task
	
	$socket = IO::Socket::INET->new(PeerAddr => $domain_name,
                                PeerPort => '80',
                                Proto    => "tcp",
                                Type     => SOCK_STREAM);
    unless (defined $socket){
		return 0;
	}
	print $socket "GET /".$params{'install_prefix'}."/psa-clean-cache.php?type=1&code=${checkfile} HTTP/1.0\r\n";
	print $socket "Host: ${domain_name}\r\n\r\n";
	my $res = 0;
	while (<$socket>){
		if (/^X-PSAINFO-HEADER: TRUE/){
			$res = 1;
			last;
		}
	}
	close $socket;
	return $res;
}
# 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 "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 "reconfigure: 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 $mysql_query_file = "${root_dir}/mysql-reconfig.sql";

# perform database changes

#my $dbh = DBI->connect('DBI:mysql:'.$params{'dbname'}.':localhost:3306i',
#                        $params{'dbuser'}, $params{'dbpasswd'},
#                        { PrintError => 0, RaiseError => 0, AutoCommit => 1 });
unless(open (MYSQL_FILE, ">${mysql_query_file}")){
    print_out "couldn't init mysql queries file\n";
    exit 1;
}

my $mysql_bin = $psa_params{'MYSQL_BIN_D'}.'/mysql';
my $m_dbuser = shell_quote($params{'dbuser'});
my $m_dbpass = shell_quote($params{'dbpasswd'});
my $m_dbname = shell_quote($params{'dbname'});

my $m_admin_login = mysql_quote($params{'admin_login'});
my $m_admin_fullname = mysql_quote($params{'admin_fullname'});
my $m_admin_email = mysql_quote($params{'admin_email'});
my $m_admin_hash = mysql_quote($params{'admin_hash'});
my $m_gallery_name;

if (defined $params{'gallery_name'}){
	$m_gallery_name = mysql_quote($params{'gallery_name'});
} else {
	$m_gallery_name = '';
}
$m_locale = mysql_quote($params{'locale'});


my $query = "UPDATE g2_User SET g_userName ='${m_admin_login}', g_fullName='${m_admin_fullname}', g_email='${m_admin_email}' ";
if ($params{'admin_passwd'} ne 'None'){
	$query .= ", g_hashedPassword='${m_admin_hash}'";
}
$query .= " WHERE g_id='6';\n";
$query .= "UPDATE g2_Item SET g_title='${m_gallery_name}' WHERE g_id='7';\n";
#$query .= "UPDATE g2_PluginParameterMap SET WHERE g_pluginType='module' AND g_pluginId='core' AND  g_itemId='0' AND g_parameterName='default.language';\n";
print MYSQL_FILE $query;
close MYSQL_FILE;


my $mysql_cmd = "${mysql_bin} -u\"${m_dbuser}\" -p\"${m_dbpass}\" \"${m_dbname}\" <${mysql_query_file}";
my $mysql_res = `$mysql_cmd`;
unlink($mysql_query_file);

if ($?){
    print_out "couldn't modify data in the database:\n${mysql_res}\n";
	exit 1;
}

# call clean cache script
# create random file
my @alpha = ('a'..'z', 'A'..'Z', 0..9);
my $checkfile = join '', map $alpha[rand @alpha], 1..8;
$checkfilename = "${root_dir}/${checkfile}.checkfile";
unless (open F, ">$checkfilename"){
	print_out("Unable to open file `${root_dir}/${checkfilename}` for writing\n");
	exit 1;
}
print F '0';
close F;
unless (clean_gallery_cache($checkfile)){
	print_out("couldn't clean gallery cache. Please clean cache via Gallery web interface.");
	unlink ($checkfilename);
	exit 1;
}
unlink ($checkfilename);

exit 0;
