#!/usr/bin/perl

# VHCS(tm) - Virtual Hosting Control System
# Copyright (c) 2001-2004 by moleSoftware GmbH
# http://www.molesoftware.com
#
#
# License:
#    This program is free software; you can redistribute it and/or
#    modify it under the terms of the MPL Mozilla Public License
#    as published by the Free Software Foundation; either version 1.1    
#    of the License, or (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
#    MPL Mozilla Public License for more details.
#    
#    You may have received a copy of the MPL Mozilla Public License
#    along with this program.
#    
#    An on-line copy of the MPL Mozilla Public License can be found
#    http://www.mozilla.org/MPL/MPL-1.1.html
#
#
# The VHCS Home Page is at:
#
#    http://www.vhcs.net

use FindBin;
use lib "$FindBin::Bin/..";
require 'vhcs2_common_code.pl';

use strict;

use warnings;

%main::ua = ();

sub welcome_note {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'welcome_note()', 'Starting...');
    
    my $welcome_message = <<MSG;
    
    Welcome to VHCS2 '$main::cfg{'VersionH'}' Setup Dialog.
    
    This program will set up VHCS2 system on your server.
    
    
    Please press 'Enter' to continue.
    
MSG
    
    print STDOUT $welcome_message;
    
    push_el(\@main::el, 'welcome_note()', 'Ending...');
    
    return 0;
    
}

sub full_hostname {
    
    my ($sys_hostname) = @_;
    
    if ($sys_hostname =~ /\./) {
        
        return substr($sys_hostname, 0, index($sys_hostname, '.'));
        
    } else {
        
        return $sys_hostname;
        
    }
    
}

sub get_sys_hostname {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'get_sys_hostname()', 'Starting...');
    
    my $cmd = "$main::cfg{'CMD_HOSTNAME'} 1>/tmp/vhcs2-setup.hostname";
    
    $rs = sys_command($cmd);
    
    return ($rs, '') if ($rs != 0);
    
    ($rs, $rdata) = get_file("/tmp/vhcs2-setup.hostname");
    
    return ($rs, '') if ($rs != 0);
    
    chop($rdata);
    
    $rdata = full_hostname($rdata);
    
    $rs = del_file("/tmp/vhcs2-setup.hostname");
    
    push_el(\@main::el, 'get_sys_hostname()', 'Ending...');
    
    return (0, $rdata);
    
}

sub ask_hostname {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_hostname()', 'Starting...');
    
    my $hostname = undef;
    
    ($rs, $hostname) = get_sys_hostname();
    
    return $rs if ($rs != 0);
    
    my $qmsg = "    Please enter system hostname (Enter for defaults) [$hostname]: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        $main::ua{'hostname'} = $hostname;
        
    } else {
        
        $main::ua{'hostname'} = full_hostname($rdata);
        
    }
    
    push_el(\@main::el, 'ask_hostname()', 'Ending...');
    
    return 0;
    
}

sub ask_eth {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_eth()', 'Starting...');

    my $cmd = "/sbin/ifconfig |awk \'BEGIN{FS=\":\";}{print \$2}\'|awk \'{if(NR==2)print \$1}\' 1>/tmp/vhcs2-setup.ip";

    $rs = sys_command($cmd);
    
    return ($rs, '') if ($rs != 0);
    
    ($rs, $rdata) = get_file("/tmp/vhcs2-setup.ip");
    
    return ($rs, '') if ($rs != 0);
    
    chop($rdata);
    
    $rs = del_file("/tmp/vhcs2-setup.ip");
    
    $rs = sys_command($cmd);

    return $rs if ($rs != 0);

    my $eth = $rdata;

#    my $eth = '192.168.0.128';
    
    my $qmsg = "\n    Please enter system network address (Enter for defaults) [$eth]: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        $main::ua{'eth_ip'} = $eth;
        
    } else {
        
        $main::ua{'eth_ip'} = $rdata;
        
    }
    
    push_el(\@main::el, 'ask_eth()', 'Ending...');
    
    return 0;
    
}

sub check_eth {
    
    return 0 unless $main::ua{'eth_ip'} =~ /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/;
    
    my ($d1, $d2, $d3, $d4) = ($1, $2, $3, $4);
        
    return 0 if (($d1 <= 0) || ($d1 >= 255));
        
    return 0 if (($d2 < 0) || ($d2 > 255));
        
    return 0 if (($d3 < 0) || ($d3 > 255));

    return 0 if (($d4 <= 0) || ($d4 >= 255));

    return 1;
        
}

sub ask_db_host {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_db_host()', 'Starting...');
    
    my $db_host = 'localhost';
    
    my $qmsg = "\n    Please enter SQL server host (Enter for defaults) [$db_host]: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        $main::ua{'db_host'} = $db_host;
        
    } else {
        
        $main::ua{'db_host'} = $rdata;
        
    }
    
    push_el(\@main::el, 'ask_db_host()', 'Ending...');
    
    return 0;
    
}

sub ask_db_name {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_db_name()', 'Starting...');
    
    my $db_name = 'vhcs2';
    
    my $qmsg = "\n    Please enter system SQL database (Enter for defaults) [$db_name]: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        $main::ua{'db_name'} = $db_name;
        
    } else {
        
        $main::ua{'db_name'} = $rdata;
        
    }
    
    push_el(\@main::el, 'ask_db_name()', 'Ending...');
    
    return 0;
    
}


sub ask_db_user {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_db_user()', 'Starting...');
    
    my $db_user = 'root';
    
    my $qmsg = "\n    Please enter system SQL user (Enter for defaults) [$db_user]: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        $main::ua{'db_user'} = $db_user;
        
    } else {
        
        $main::ua{'db_user'} = $rdata;
        
    }
    
    push_el(\@main::el, 'ask_db_user()', 'Ending...');
    
    return 0;
    
}

sub ask_db_password {
    
    my ($rs, $pass1, $pass2) = (undef, undef, undef);
    
    push_el(\@main::el, 'ask_db_password()', 'Starting...');
    
    my $db_password = 'none';
    
    my $qmsg = "\n    Please enter system SQL password (Enter for defaults) [$db_password]: ";
    
    $pass1 = read_password($qmsg); 
    
    if (!defined($pass1) || $pass1 eq '') {
        
        $main::ua{'db_password'} = '';
        
    } else {
        
        $qmsg = "    Please repeat system SQL password: ";
        
        $pass2 = read_password($qmsg);
        
        if ($pass1 eq $pass2) {
            
            $main::ua{'db_password'} = $pass1;
            
        } else {
            
            return 1;
            
        }
        
    }
    
    push_el(\@main::el, 'ask_db_password()', 'Ending...');
    
    return 0;
    
}

sub ask_db_ftp_user {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_db_ftp_user()', 'Starting...');
    
    my $db_user = 'vftp';
    
    my $qmsg = "\n    Please enter VHCS ftp SQL user (Enter for defaults) [$db_user]: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        $main::ua{'db_ftp_user'} = $db_user;
        
    } else {
        
        $main::ua{'db_ftp_user'} = $rdata;
        
    }
    
    push_el(\@main::el, 'ask_db_ftp_user()', 'Ending...');
    
    return 0;
    
}

sub ask_db_ftp_password {
    
    my ($rs, $pass1, $pass2) = (undef, undef, undef);
    
    push_el(\@main::el, 'ask_db_ftp_password()', 'Starting...');
    
    my $db_password = 'none';
    
    my $qmsg = "\n    Please enter VHCS ftp SQL user password (Enter for defaults) [$db_password]: ";
    
    $pass1 = read_password($qmsg); 
    
    if (!defined($pass1) || $pass1 eq '') {
        
        $main::ua{'db_ftp_password'} = '';
        
    } else {
        
        $qmsg = "    Please repeat VHCS ftp SQL user password: ";
        
        $pass2 = read_password($qmsg);
        
        if ($pass1 eq $pass2) {
            
            $main::ua{'db_ftp_password'} = $pass1;
            
        } else {
            
            return 1;
            
        }
        
    }
    
    push_el(\@main::el, 'ask_db_ftp_password()', 'Ending...');
    
    return 0;
    
}

sub ask_admin {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_admin()', 'Starting...');
    
    my $admin = 'admin';
    
    my $qmsg = "\n    Please enter administrator login name (Enter for defaults) [$admin]: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        $main::ua{'admin'} = $admin;
        
    } else {
        
        $main::ua{'admin'} = $rdata;
        
    }
    
    push_el(\@main::el, 'ask_admin()', 'Ending...');
    
    return 0;
    
}

sub ask_admin_password {
    
    my ($rs, $pass1, $pass2) = (undef, undef, undef);
    
    push_el(\@main::el, 'ask_admin_password()', 'Starting...');
    
    my $qmsg = "\n    Please enter administrator password: ";
    
    $pass1 = read_password($qmsg); 
    
    if (!defined($pass1) || $pass1 eq '') {
        
        return 1;
        
    } else {
        
        $qmsg = "    Please repeat administrator password: ";
        
        $pass2 = read_password($qmsg);
        
        if ($pass1 eq $pass2) {
            
            if (length($pass1) > 5) {
                
                $main::ua{'admin_password'} = $pass1;
                
            } else {
                
                return 1;
                
            }
            
        } else {
            
            return 1;
            
        }
        
    }
    
    push_el(\@main::el, 'ask_admin_password()', 'Ending...');
    
    return 0;
    
}

sub ask_admin_email {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'ask_admin_email()', 'Starting...');
    
    my $qmsg = "\n    Please enter admininistrator email address: ";
    
    print STDOUT $qmsg;
    
    $rdata = readline(\*STDIN); chop($rdata);
    
    if (!defined($rdata) || $rdata eq '') {
        
        return 1;
        
    } else {
        
        if ($rdata =~ /^([\W\w-]+)\@([\W\w]+\.){1}[\W\w]+$/ || 
            $rdata =~ /^([\W\w-]+)\@([\W\w]+\.){2}[\W\w]+$/ || 
            $rdata =~ /^([\W\w-]+)\@([\W\w]+\.){3}[\W\w]+$/) {
        
            $main::ua{'admin_email'} = $rdata;
            
        } else {
            
            return 1;
            
        }
        
    }
    
    push_el(\@main::el, 'ask_admin_email()', 'Ending...');
    
    return 0;
    
}


sub user_dialog {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'user_dialog()', 'Starting...');
    
    $rs = welcome_note();
    
    return $rs if ($rs != 0);
    
    $rs = ask_hostname();
    
    return $rs if ($rs != 0);
    
    do {
        
        $rs = ask_eth();
    
        return $rs if ($rs != 0);
        
    } while (check_eth() == 0);
    
    $rs = ask_db_host();
    
    return $rs if ($rs != 0);
    
    $rs = ask_db_name();
    
    return $rs if ($rs != 0);
    
    $rs = ask_db_user();
    
    return $rs if ($rs != 0);
    
    do {
        
        $rs = ask_db_password();
        
    } while ($rs == 1);
	
	#
	# VHCS ftp SQL user questions;
	#
	
	$rs = ask_db_ftp_user();
	
	return $rs if ($rs != 0);
	
	do {
		
		$rs = ask_db_ftp_password();
		
	} while ($rs == 1);
	
	    
    $rs = ask_admin();
    
    return $rs if ($rs != 0);
    
    do {
        
        $rs = ask_admin_password();
        
    } while ($rs == 1);
    
    do {
        
        $rs = ask_admin_email();
        
    } while ($rs == 1);
    
    push_el(\@main::el, 'user_dialog()', "hostname: $main::ua{'hostname'}");
    
    #push_el(\@main::el, 'user_dialog()',  "eth: $main::ua{'eth'}");
    
    push_el(\@main::el, 'user_dialog()',  "db_host: $main::ua{'db_host'}");
    
    push_el(\@main::el, 'user_dialog()',  "db_name: $main::ua{'db_name'}");
    
    push_el(\@main::el, 'user_dialog()',  "db_user: $main::ua{'db_user'}");
    
    push_el(\@main::el, 'user_dialog()',  "db_password: $main::ua{'db_password'}");
    
    push_el(\@main::el, 'user_dialog()',  "admin: $main::ua{'admin'}");
    
    push_el(\@main::el, 'user_dialog()',  "admin_password: $main::ua{'admin_password'}");

    push_el(\@main::el, 'user_dialog()',  "admin_email: $main::ua{'admin_email'}");
    
    push_el(\@main::el, 'user_dialog()', 'Ending...');
    
    return 0;
    
}

sub setup_start_up {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_start_up()', 'Starting...');
    
    # config check;
    
    $rs = get_conf();
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_start_up()', 'Ending...');
    
    return 0;
    
}

sub setup_shut_down {
    
    my ($rs, $rdata) = (undef, undef);

    my $cmd = "/bin/sh $main::cfg{'ROOT_DIR'}/engine/setup/set-gui-permissions.sh";

    $rs = sys_command($cmd);

    return $rs if ($rs != 0);

	$cmd = "/bin/sh $main::cfg{'ROOT_DIR'}/engine/setup/set-engine-permissions.sh";
    
    $rs = sys_command($cmd);

    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_shut_down()', 'Starting...');
    
    my $shut_down_message = <<MSG;
    
    Congratulations !

    VHCS2 '$main::cfg{'VersionH'}' Setup completed successfully !

    Please type http://$main::ua{'eth_ip'}/vhcs2/ in your
    browser!
    
MSG
    print STDOUT $shut_down_message;
    
    push_el(\@main::el, 'setup_shut_down()', 'Ending...');
    
    return 0;
    
}

sub check_host_interface {
    
    push_el(\@main::el, 'check_host_interface()', 'Starting...');
    
    my ($rs, $rdata, $cmd) = (undef, undef, undef);
    
    $cmd = "$main::cfg{'CMD_IFCONFIG'} $main::ua{'eth'} 1>/tmp/vhcs2-setup-iface.stdout 2>/tmp/vhcs2-setup-iface.stderr";
    
    $rs = sys_command($cmd);
    
    if ($rs != 0) {
        
        push_el(\@main::el, 'check_host_interface()', "ERROR: Can't find $main::ua{'eth'} device!");
        
        return $rs;
    }
    
    $cmd = "$main::cfg{'CMD_CAT'} /tmp/vhcs2-setup-iface.stdout | awk 'BEGIN { i=0 } { i++ } { if (i == 1) { print \$5 } } { if (i == 2) { print substr(\$2, 6) } }' 1>/tmp/vhcs2-setup-iface-data.stdout 2>/tmp/vhcs2-setup-iface-data.stderr";
    
    $rs = sys_command($cmd);
    
    ($rs, $rdata) = get_file("/tmp/vhcs2-setup-iface-data.stdout");
    
    return $rs if ($rs != 0);
    
    $rdata =~ /([^\n]+)\n([^\n]+)\n/;
    
    $main::ua{'eth_hwaddr'} = $1;
    
    $main::ua{'eth_ip'} = $2;
    
    $rs = del_file("/tmp/vhcs2-setup-iface.stdout");
    
    return $rs if ($rs != 0);
    
    $rs = del_file("/tmp/vhcs2-setup-iface.stderr");
    
    return $rs if ($rs != 0);
    
    $rs = del_file("/tmp/vhcs2-setup-iface-data.stdout");
    
    return $rs if ($rs != 0);
    
    $rs = del_file("/tmp/vhcs2-setup-iface-data.stderr");
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'check_host_interface()', 'Ending...');
    
    return 0;
}

sub check_host_sql {
    
    push_el(\@main::el, 'check_host_sql()', 'Starting...');
    
    my ($rs, $rdata, $sql) = (undef, undef, undef);
    
    $sql = "show databases;";
    
    $main::db_host = $main::ua{'db_host'};
    
    $main::db_user = $main::ua{'db_user'};
    
    $main::db_pwd = $main::ua{'db_password'};
    
    $main::db_name = "";
    
    @main::db_connect = (
                         "DBI:mysql:$main::db_name:$main::db_host",
                         $main::db_user,
                         $main::db_pwd
                        );
    
    ($rs, $rdata) = doSQL($sql);
    
    return $rs if ($rs != 0);
    
    $main::db = undef;
    
    push_el(\@main::el, 'check_host_sql()', 'Ending...');
    
    return 0;
}

sub check_host_system {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'check_host_system()', 'Starting...');
    
    #$rs = check_host_interface();
    
    #return $rs if ($rs != 0);
    
    $rs = check_host_sql();
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'check_host_system()', 'Ending...');
    
    return 0;
    
}

sub setup_system_users {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_system_users()', 'Starting...');
    
    my ($fuid, $fgid) = ($main::cfg{'MTA_MAILBOX_UID_NAME'}, $main::cfg{'MTA_MAILBOX_GID_NAME'});
    
    my ($uid, $gid) = (undef, undef);
    
    
    my @udata = ();
    
    my @gdata = ();
    
    
    @gdata = getgrnam($fgid);
    
    if (scalar(@gdata) == 0) { # we have not this one group data;
        
        my $cmd = "$main::cfg{'CMD_GROUPADD'} $fgid";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        @gdata = getgrnam($fgid);
        
    }
    
    $gid = $gdata[2];
    
    
    @udata = getpwnam($fuid);
    
    if (scalar(@udata) == 0) { # we have not this one user data;
        
        my $cmd = "$main::cfg{'CMD_USERADD'} -c vmail-user -g $gid -s /bin/false $fuid";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        @udata = getpwnam($fuid);
    }
    
    $uid = $udata[2];
    
    $main::ua{'su_uid'} = $uid;
    
    $main::ua{'su_gid'} = $gid;
    
    push_el(\@main::el, 'setup_system_users()', 'Ending...');
    
    return 0;
    
}

sub setup_system_dirs {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_system_dirs()', 'Starting...');
    
    $rs = make_dir($main::cfg{'APACHE_WWW_DIR'}, $main::cfg{'APACHE_USER'}, $main::cfg{'APACHE_GROUP'}, 0755);
    
    return $rs if ($rs != 0);
    
    $rs = make_dir($main::cfg{'APACHE_USERS_LOG_DIR'}, $main::cfg{'APACHE_USER'}, $main::cfg{'APACHE_GROUP'}, 0755);
    
    return $rs if ($rs != 0);    
    
    $rs = make_dir($main::cfg{'APACHE_BACKUP_LOG_DIR'}, 'root', 'root', 0755);
    
    return $rs if ($rs != 0);
    
    $rs = make_dir($main::cfg{'MTA_VIRTUAL_CONF_DIR'}, 'root', 'root', 0755);
    
    return $rs if ($rs != 0);
    
    $rs = make_dir($main::cfg{'MTA_VIRTUAL_MAIL_DIR'}, 'root', 'root', 0755);
    
    return $rs if ($rs != 0);
    
    $rs = make_dir($main::cfg{'LOG_DIR'}, 'root', 'root', 0755);
    
    return $rs if ($rs != 0);
    
	$rs = make_dir($main::cfg{'BACKUP_FILE_DIR'}, 'root', 'root', 0755);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_system_dirs()', 'Ending...');
    
    return 0;
    
}

sub setup_config {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_config()', 'Starting...');
    
    $rs = set_conf_val('SERVER_HOSTNAME', $main::ua{'hostname'});
    
    return $rs if ($rs != 0);
    
    $rs = set_conf_val('BASE_SERVER_IP', $main::ua{'eth_ip'});
    
    return $rs if ($rs != 0);
    
    $rs = set_conf_val('DATABASE_HOST', $main::ua{'db_host'});
    
    return $rs if ($rs != 0);
    
    $rs = set_conf_val('DATABASE_NAME', $main::ua{'db_name'});
    
    return $rs if ($rs != 0);
    
    $rs = set_conf_val('DATABASE_USER', $main::ua{'db_user'});
    
    return $rs if ($rs != 0);
    
    if ($main::ua{'db_password'} ne '') {
        
        ($rs, $rdata) = encrypt_db_password($main::ua{'db_password'});
        
        return $rs if ($rs != 0);
        
        $rs = set_conf_val('DATABASE_PASSWORD', $rdata);
    
        return $rs if ($rs != 0);
        
    }
    
    $rs = set_conf_val('MTA_MAILBOX_MIN_UID', $main::ua{'su_uid'});
    
    return $rs if ($rs != 0);
    
    $rs = set_conf_val('MTA_MAILBOX_UID', $main::ua{'su_uid'});
    
    return $rs if ($rs != 0);
    
    $rs = set_conf_val('MTA_MAILBOX_GID', $main::ua{'su_gid'});
    
    return $rs if ($rs != 0);
    
    $rs = store_conf();
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_config()', 'Ending...');
    
    return 0;
    
}

sub setup_sql {
	
	my ($rs, $rdata) = (undef, undef);
	
	push_el(\@main::el, 'setup_sql()', 'Starting...');
	
	#
	# check for existing database;
	#
	
	my $sql = "show tables;";
	
	($rs, $rdata) = doSQL($sql);
	
	if ($rs == 0) { # Yes, we have one ! Let's drop it;
		
		my $store_db_name = $main::db_name;
		
		
		# Let's reset data;
		
			
		$main::db = undef;
		
		$main::db_name = '';
		
		@main::db_connect = (
								"DBI:mysql:$main::db_name:$main::db_host",
								$main::db_user,
								$main::db_pwd
							);
		
		$sql = "drop database $store_db_name;";
		
		($rs, $rdata) = doSQL($sql);
		
		return $rs if ($rs != 0);
		
		
		# Let's reset data;
		
			
		$main::db = undef;
		
		$main::db_name = $store_db_name;
		
		@main::db_connect = (
								"DBI:mysql:$main::db_name:$main::db_host",
								$main::db_user,
								$main::db_pwd
							);
		
	}
	
	#
	# Now we'll create our database; 
	#
	
	($rs, $rdata) = get_file("$main::cfg{'CONF_DIR'}/database/database.sql");
	
	return $rs if ($rs != 0);
	
	$rdata =~ s/\{DATABASE_NAME\}/$main::db_name/gi;
	
	$rs = store_file("/tmp/db.sql", $rdata, 'root', 'root', 0644);
	
	return $rs if ($rs != 0);
	
	my $cmd = "$main::cfg{'CMD_MYSQL'} --user=$main::db_user --pass=$main::db_pwd < /tmp/db.sql 1>/tmp/db.sql.stdout 2>/tmp/db.sql.stderr";
	
	$rs = sys_command($cmd);
	return $rs if ($rs != 0);
	
	# 
	# htaccess sql tables;
	#
	
	my $htaccess_sql = "$main::cfg{'CONF_DIR'}/database/htaccess.sql";
	
	$cmd = "$main::cfg{'CMD_MYSQL'} --user=$main::db_user --pass=$main::db_pwd $main::db_name < $htaccess_sql 1>/tmp/db.sql.stdout 2>/tmp/db.sql.stderr";
	
	$rs = sys_command($cmd);
	return $rs if ($rs != 0);    
		
	# 
	# languages tables;
	#

	my $languages_sql = "$main::cfg{'CONF_DIR'}/database/languages.sql";
	
	$cmd = "$main::cfg{'CMD_MYSQL'} --user=$main::db_user --pass=$main::db_pwd $main::db_name < $languages_sql 1>/tmp/db.sql.stdout 2>/tmp/db.sql.stderr";
	
	$rs = sys_command($cmd);
	return $rs if ($rs != 0);    

	
	$rs = del_file("/tmp/db.sql");
	return $rs if ($rs != 0);
		
	$rs = del_file("/tmp/db.sql.stdout");
	return $rs if ($rs != 0);
		
	$rs = del_file("/tmp/db.sql.stderr");
	return $rs if ($rs != 0);
	
	#
	# Let's populate our base with some data;
	#
	
	my $admin_password = crypt_data($main::ua{'admin_password'});
	
	$sql = "INSERT INTO admin VALUES  (1, '$main::ua{'admin'}','$admin_password', 'admin', 0, '', 0, '', '', '', '', '', '','$main::ua{'admin_email'}', '', '', '', '', '')";	

	($rs, $rdata) = doSQL($sql);
		
	return $rs if ($rs != 0);
	
	$sql = "INSERT INTO server_ips VALUES (1, '$main::ua{'eth_ip'}', '$main::ua{'hostname'}', '$main::ua{'hostname'}');";
	
	($rs, $rdata) = doSQL($sql);
		
	return $rs if ($rs != 0);
	
	#
	# we'll add VHCS ftp SQL user here.
	#
	$main::db = undef;
	
	@main::db_connect = (
							"DBI:mysql:mysql:$main::db_host",
							$main::db_user,
							$main::db_pwd
						);
	
	my $vftp_sql_user = $main::ua{'db_ftp_user'};
	my $vftp_sql_password = $main::ua{'db_ftp_password'};
	
	$sql = "delete from tables_priv where Host = '$main::db_host' and Db = '$main::db_name' and User = '$vftp_sql_user'";
	
	($rs, $rdata) = doSQL($sql);
	return $rs if ($rs != 0);
	
	$sql = " delete from user where Host = '$main::db_host' and User = '$vftp_sql_user'";
	
	($rs, $rdata) = doSQL($sql);
	return $rs if ($rs != 0);
	
	$sql = "flush privileges";
	
	($rs, $rdata) = doSQL($sql);
	return $rs if ($rs != 0);
	
	$sql = "grant select,insert,update,delete on $main::db_name.ftp_group to '$vftp_sql_user'\@'$main::db_host' identified by '$vftp_sql_password'";
	
	($rs, $rdata) = doSQL($sql);
	return $rs if ($rs != 0);
	
	$sql = "grant select,insert,update,delete on $main::db_name.ftp_users to '$vftp_sql_user'\@'$main::db_host' identified by '$vftp_sql_password'";
	
	($rs, $rdata) = doSQL($sql);
	return $rs if ($rs != 0);
	
	$sql = "grant select,insert,update,delete on $main::db_name.quotalimits to '$vftp_sql_user'\@'$main::db_host' identified by '$vftp_sql_password'";
	
	($rs, $rdata) = doSQL($sql);
	return $rs if ($rs != 0);
	
	$sql = "grant select,insert,update,delete on $main::db_name.quotatallies to '$vftp_sql_user'\@'$main::db_host' identified by '$vftp_sql_password'";
	
	($rs, $rdata) = doSQL($sql);
	return $rs if ($rs != 0);
	
	push_el(\@main::el, 'setup_sql()', 'Ending...');
	
	return 0;
	
}

sub setup_crontab {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_crontab()', 'Starting...');
    
    my $cfg_dir = "$main::cfg{'CONF_DIR'}/crontab";
    
    my $bk_dir = "$cfg_dir/backup";
    
    my $wrk_dir = "$cfg_dir/working";
    
    my ($cfg_tpl, $cfg, $cmd) = (undef, undef, undef);
    
    if (! -e "$bk_dir/crontab.conf.vhcs2") { # We are running setup for the first time.
       
        # Let's backup system crontab (if any);
        
        $cmd = "$main::cfg{'CMD_CRONTAB'} -u root -l &> $bk_dir/crontab.conf.system";
        
        $rs = sys_command_rs($cmd);
        
        $cmd = "$main::cfg{'CMD_CRONTAB'} -u root -r &> /tmp/vhcs2-setup-crontab.log";
        
        $rs = sys_command_rs($cmd);
        
        $rs = del_file("/tmp/vhcs2-setup-crontab.log");
        
        return $rs if ($rs != 0);
        
        ($rs, $cfg_tpl) = get_tpl($cfg_dir, 'crontab.conf');
        
        return $rs if ($rs != 0);
        
        my %tag_hash = (
                        '{LOG_DIR}' => $main::cfg{'LOG_DIR'},
                        '{QUOTA_ROOT_DIR}' => $main::cfg{'QUOTA_ROOT_DIR'},
                        '{TRAFF_ROOT_DIR}' => $main::cfg{'TRAFF_ROOT_DIR'},
                        '{TOOLS_ROOT_DIR}' => $main::cfg{'TOOLS_ROOT_DIR'},
                        '{BACKUP_ROOT_DIR}' => $main::cfg{'BACKUP_ROOT_DIR'}
                       );
        
        ($rs, $cfg) = prep_tpl(\%tag_hash, $cfg_tpl);
        
        return $rs if ($rs != 0);
        
        $rs = store_file("$bk_dir/crontab.conf.vhcs2", $cfg, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        $rs = store_file("$wrk_dir/crontab.conf", $cfg, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    }
    
    $cmd = "$main::cfg{'CMD_CRONTAB'} -u root -r &> /tmp/vhcs2-setup-crontab.log";
    
    $rs = sys_command_rs($cmd);
    
    $cmd = "$main::cfg{'CMD_CRONTAB'} -u root $bk_dir/crontab.conf.vhcs2";
    
    $rs = sys_command($cmd);
    
    return $rs if ($rs != 0);
    
    $rs = del_file("/tmp/vhcs2-setup-crontab.log");
        
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_crontab()', 'Ending...');
    
    return 0;
    
}

sub setup_resolver {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_resolver()', 'Starting...');
    
    $rs = store_file("/etc/resolv.conf", "nameserver 127.0.0.1\n", 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_resolver()', 'Ending...');
    
    return 0;
    
}

sub setup_hosts {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_hosts()', 'Starting...');
    
    my $hostname = $main::ua{'hostname'};
    
    my $hostname_local = "$hostname.local";
    
    my $ip = $main::ua{'eth_ip'};
    
    $rs = store_file("/etc/hosts", "\n# 'hosts' file configuration.\n\n127.0.0.1\t$hostname_local\tlocalhost\n$ip\t$hostname\t$hostname\n", 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_hosts()', 'Ending...');
    
    return 0;
    
}

sub setup_named {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_named()', 'Starting...');
    
    my $cfg_dir = "$main::cfg{'CONF_DIR'}/bind";
    
    my $bk_dir = "$cfg_dir/backup";
    
    my $wrk_dir = "$cfg_dir/working";
    
    my ($cfg_tpl, $cfg, $cmd) = (undef, undef, undef);
    
    if ($main::cfg{'CMD_NAMED'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_NAMED'} stop &> /tmp/vhcs2-setup-services.log");
        
    }
    
    ($rs, $cfg_tpl) = get_file("$cfg_dir/named.conf");
        
    return $rs if ($rs != 0);
    
    if (! -e "$bk_dir/named.conf.vhcs2") {
        
        $cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'BIND_CONF_FILE'} $bk_dir/named.conf.system";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        $cfg = get_file($main::cfg{'BIND_CONF_FILE'});
        
        return $rs if ($rs != 0);
        
        $rs = store_file("$bk_dir/named.conf.vhcs2", "$cfg$cfg_tpl", 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
    }
    
    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/named.conf.vhcs2 $main::cfg{'BIND_CONF_FILE'}";
        
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    $rs = store_file("$wrk_dir/named.conf", "$cfg_tpl", 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    if ($main::cfg{'CMD_NAMED'} ne 'no') {
    
        sys_command_rs("$main::cfg{'CMD_NAMED'} start &> /tmp/vhcs2-setup-services.log");
        
    }
    
    push_el(\@main::el, 'setup_named()', 'Ending...');
    
    return 0;
    
}

sub setup_php {
    
    my ($rs, $rdata, $cmd) = (undef, undef, undef);
    
    push_el(\@main::el, 'setup_php()', 'Starting...');
    
    #
    # Let's regenerate config;
    #
    
    #$cmd = "$main::cfg{'CMD_CAT'} /etc/php.ini | $main::cfg{'CMD_AWK'} -v sfor='zend_extension' -v rwith='zend_extension = /var/lib/vhcs2/gui_plugins/ioncube_loader_so' -f /var/lib/vhcs2/engine/setup/vhcs2-cfg-subst > /tmp/php.ini";
    
    #$rs = sys_command($cmd);
        
    #return $rs if ($rs != 0);
    
    #
    # Let's move it to it's original place;
    #
    
    #$cmd = "$main::cfg{'CMD_MV'} -f /tmp/php.ini /etc/php.ini";
    
    #$rs = sys_command($cmd);
        
    #return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_php()', 'Ending...');
    
    return 0;
    
}

sub setup_httpd {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_httpd()', 'Starting...');
    
    my $cfg_dir = "$main::cfg{'CONF_DIR'}/apache";
    
    my $bk_dir = "$cfg_dir/backup";
    
    my $wrk_dir = "$cfg_dir/working";
    
    my ($cfg_tpl, $cfg, $cmd) = (undef, undef, undef);
    
    if ($main::cfg{'CMD_HTTPD'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_HTTPD'} stop &> /tmp/vhcs2-setup-services.log");
        
    }
    
    ($rs, $cfg_tpl) = get_file("$cfg_dir/httpd.conf");
        
    return $rs if ($rs != 0);

    $rs = store_file($main::cfg{'APACHE_CONF_FILE'}, $cfg_tpl, 'root', 'root', 0644);
        
    return $rs if ($rs != 0);

    sys_command_rs("/usr/sbin/a2ensite vhcs2.conf &> /tmp/vhcs2-setup-services.log");

    
    #
    # Here we'll manage some permission;
    #
    
    my $gui_root_dir = "$main::cfg{'ROOT_DIR'}/gui";
    
    $cmd = "$main::cfg{'CMD_CHOWN'} -R $main::cfg{'APACHE_USER'}:$main::cfg{'APACHE_GROUP'} $gui_root_dir";
    
    $rs = sys_command($cmd);
    
    return $rs if ($rs != 0);
    
    sleep(5);
    
    if ($main::cfg{'CMD_HTTPD'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_HTTPD'} start &> /tmp/vhcs2-setup-services.log");
        
    }
    
    push_el(\@main::el, 'setup_httpd()', 'Ending...');
    
    return 0;
    
}

sub setup_mta {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_mta()', 'Starting...');
    
    my $cfg_dir = "$main::cfg{'CONF_DIR'}/postfix";
    
    my $bk_dir = "$cfg_dir/backup";
    
    my $wrk_dir = "$cfg_dir/working";
    
    my $vrl_dir = "$cfg_dir/vhcs2";
    
    my ($cfg_tpl, $cfg, $cmd) = (undef, undef, undef);
    
    if ($main::cfg{'CMD_MTA'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_MTA'} stop &> /tmp/vhcs2-setup-services.log");
        
    }
    
    if (! -e "$bk_dir/main.cf.vhcs2") {
        
        $cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'POSTFIX_CONF_FILE'} $bk_dir/main.cf.system";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        $cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'POSTFIX_MASTER_CONF_FILE'} $bk_dir/master.cf.system";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        ($rs, $cfg_tpl) = get_tpl($cfg_dir, 'main.cf');
        
        return $rs if ($rs != 0);
        
        my %tag_hash = (
                        '{MTA_HOSTNAME}' => $main::cfg{'SERVER_HOSTNAME'},
                        '{MTA_LOCAL_DOMAIN}' => "$main::cfg{'SERVER_HOSTNAME'}.local",
                        '{MTA_VERSION}' => $main::cfg{'VersionH'},
                        '{MTA_HOST_TYPE}' => $main::cfg{'Version'},
                        '{MTA_TRANSPORT_HASH}' => $main::cfg{'MTA_TRANSPORT_HASH'},
                        '{MTA_LOCAL_MAIL_DIR}' => $main::cfg{'MTA_LOCAL_MAIL_DIR'},
                        '{MTA_LOCAL_ALIAS_HASH}' => $main::cfg{'MTA_LOCAL_ALIAS_HASH'},
                        '{MTA_VIRTUAL_MAIL_DIR}' => $main::cfg{'MTA_VIRTUAL_MAIL_DIR'},
                        '{MTA_VIRTUAL_DMN_HASH}' => $main::cfg{'MTA_VIRTUAL_DMN_HASH'},
                        '{MTA_VIRTUAL_MAILBOX_HASH}' => $main::cfg{'MTA_VIRTUAL_MAILBOX_HASH'},
                        '{MTA_VIRTUAL_ALIAS_HASH}' => $main::cfg{'MTA_VIRTUAL_ALIAS_HASH'},
                        '{MTA_MAILBOX_MIN_UID}' => $main::cfg{'MTA_MAILBOX_MIN_UID'},
                        '{MTA_MAILBOX_UID}' => $main::cfg{'MTA_MAILBOX_UID'},
                        '{MTA_MAILBOX_GID}' => $main::cfg{'MTA_MAILBOX_GID'}
                       );
        
        ($rs, $cfg) = prep_tpl(\%tag_hash, $cfg_tpl);
        
        return $rs if ($rs != 0);
        
        $rs = store_file("$bk_dir/main.cf.vhcs2", $cfg, 'root', 'root', 0644);
        
        return $rs if ($rs != 0);
        
        $cmd = "$main::cfg{'CMD_CP'} -p $cfg_dir/master.cf $bk_dir/master.cf.vhcs2";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
    }
    
    
    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/main.cf.vhcs2 $main::cfg{'POSTFIX_CONF_FILE'}";
    
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    
    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/master.cf.vhcs2 $main::cfg{'POSTFIX_MASTER_CONF_FILE'}";
    
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    
    $rs = setfmode("$main::cfg{'ROOT_DIR'}/engine/messager/vhcs2-arpl-msgr", $main::cfg{'MTA_MAILBOX_UID_NAME'}, $main::cfg{'MTA_MAILBOX_GID_NAME'}, 0755);
    
    return $rs if ($rs != 0);
    
    
    $cmd = "$main::cfg{'CMD_CP'} -p $vrl_dir/{aliases,domains,mailboxes,transport,sender-access} $main::cfg{'MTA_VIRTUAL_CONF_DIR'}";
    
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    
    $cmd = "$main::cfg{'CMD_CP'} -p $vrl_dir/{aliases,domains,mailboxes,transport,sender-access} $wrk_dir";
    
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    
    $cmd = "$main::cfg{'CMD_POSTMAP'} $main::cfg{'MTA_VIRTUAL_CONF_DIR'}/{aliases,domains,mailboxes,transport,sender-access} &> /tmp/vhcs2-setup-services.log";
    
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    
    $rs = sys_command("$main::cfg{'CMD_NEWALIASES'} &> /tmp/vhcs2-setup-services.log");
        
    return $rs if ($rs != 0);
    
    
    if ($main::cfg{'CMD_MTA'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_MTA'} start &> /tmp/vhcs2-setup-services.log");
        
    }
    
    #
    # SASL password database;
    #
    #
    #if (-e $main::cfg{'MTA_SASLDB_FILE'}) {
    #    
    #    $rs = del_file($main::cfg{'MTA_SASLDB_FILE'});
    #    return $rs if ($rs != 0);
    #    
    #}
    #
    #$cmd = "$main::cfg{'CMD_LN'} -s $main::cfg{'MTA_SASLDB_FILE'} /etc/sasldb2";
    #$rs = sys_command($cmd);
    #return $rs if ($rs != 0);
    #
    
    push_el(\@main::el, 'setup_mta()', 'Ending...');
    
    return 0;
    
}

sub setup_po {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_po()', 'Starting...');
    
    my $cfg_dir = "$main::cfg{'CONF_DIR'}/courier";
   
    my $bk_dir = "$cfg_dir/backup";
    
    my $wrk_dir = "$cfg_dir/working";
    
    my ($cfg_tpl, $cfg, $cmd) = (undef, undef, undef);
    
    if ($main::cfg{'CMD_AUTHD'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_AUTHD'} stop &> /tmp/vhcs2-setup-services.log");
        
    }
    
    if ($main::cfg{'CMD_IMAP'} ne 'no') {
    
        sys_command_rs("$main::cfg{'CMD_IMAP'} stop &> /tmp/vhcs2-setup-services.log");
        
    }
    
    if ($main::cfg{'CMD_POP'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_POP'} stop &> /tmp/vhcs2-setup-services.log");
        
    }
    
    if (! -e "$bk_dir/imapd.vhcs2") {
        
       
        # Let's backup system configs;
       
        
        $cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'COURIER_CONF_DIR'}/imapd $bk_dir/imapd.system";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        $cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'COURIER_CONF_DIR'}/pop3d $bk_dir/pop3d.system";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
    
	if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {
    
        	$cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'AUTHLIB_CONF_DIR'}/authdaemonrc $bk_dir/authdaemonrc.system";
        
        	$rs = sys_command($cmd);
        
        	return $rs if ($rs != 0);

		$cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'AUTHLIB_CONF_DIR'}/authmodulelist $bk_dir/authmodulelist.system";

	        $rs = sys_command($cmd);

        	return $rs if ($rs != 0);

	} else {

		$cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'COURIER_CONF_DIR'}/authdaemonrc $bk_dir/authdaemonrc.system";

		$rs = sys_command($cmd);
	
		return $rs if ($rs != 0);

		$cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'COURIER_CONF_DIR'}/authmodulelist $bk_dir/authmodulelist.system";

	        $rs = sys_command($cmd);

        	return $rs if ($rs != 0);

	}
	
	if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {

	        if (-e "$main::cfg{'AUTHLIB_CONF_DIR'}/userdb") {
        	    
	            $cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'AUTHLIB_CONF_DIR'}/userdb $bk_dir/userdb.system";
        
        	    $rs = sys_command($cmd);
        
	            return $rs if ($rs != 0);
	
            	}

        } else {

		if (-e "$main::cfg{'COURIER_CONF_DIR'}/userdb") {

			$cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'COURIER_CONF_DIR'}/userdb $bk_dir/userdb.system";
			
			$rs = sys_command($cmd);
	
			return $rs if ($rs != 0);

		}
	
        }

        $cmd = "$main::cfg{'CMD_CP'} -p $cfg_dir/imapd $bk_dir/imapd.vhcs2";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        $cmd = "$main::cfg{'CMD_CP'} -p $cfg_dir/pop3d $bk_dir/pop3d.vhcs2";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        $cmd = "$main::cfg{'CMD_CP'} -p $cfg_dir/authdaemonrc $bk_dir/authdaemonrc.vhcs2";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        $cmd = "$main::cfg{'CMD_CP'} -p $cfg_dir/authmodulelist $bk_dir/authmodulelist.vhcs2";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
    }
    
    $cmd = "$main::cfg{'CMD_CP'} -p $cfg_dir/userdb $wrk_dir";
        
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    $cmd = "$main::cfg{'CMD_CP'} -p $cfg_dir/userdb $main::cfg{'COURIER_CONF_DIR'}";
        
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);

    if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {
    
	    $rs = setfmode("$main::cfg{'AUTHLIB_CONF_DIR'}/userdb", 'root', 'root', 0600);
	
    } else {
	
	    $rs = setfmode("$main::cfg{'COURIER_CONF_DIR'}/userdb", 'root', 'root', 0600);

    }
        
    return $rs if ($rs != 0);
    
    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/imapd.vhcs2 $main::cfg{'COURIER_CONF_DIR'}/imapd";
        
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/pop3d.vhcs2 $main::cfg{'COURIER_CONF_DIR'}/pop3d";
        
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    if (exists $main::cfg{'AUTHLIB_CONF_DIR'} && $main::cfg{'AUTHLIB_CONF_DIR'}) {

	    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/authdaemonrc.vhcs2 $main::cfg{'AUTHLIB_CONF_DIR'}/authdaemonrc";
        
	    $rs = sys_command($cmd);
        
	    return $rs if ($rs != 0);
    
	    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/authmodulelist.vhcs2 $main::cfg{'AUTHLIB_CONF_DIR'}/authmodulelist";
        
	    $rs = sys_command($cmd);
        
	    return $rs if ($rs != 0);
	
   } else {

	    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/authdaemonrc.vhcs2 $main::cfg{'COURIER_CONF_DIR'}/authdaemonrc";

            $rs = sys_command($cmd);

            return $rs if ($rs != 0);

            $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/authmodulelist.vhcs2 $main::cfg{'COURIER_CONF_DIR'}/authmodulelist";

            $rs = sys_command($cmd);

            return $rs if ($rs != 0);   

    } 

    $rs = sys_command($main::cfg{'CMD_MAKEUSERDB'});
        
    return $rs if ($rs != 0);
    
    if ($main::cfg{'CMD_AUTHD'} ne 'no') {
    
        sys_command_rs("$main::cfg{'CMD_AUTHD'} start &> /tmp/vhcs2-setup-services.log");
        
    }
    
    if ($main::cfg{'CMD_IMAP'} ne 'no') {
    
        sys_command_rs("$main::cfg{'CMD_IMAP'} start &> /tmp/vhcs2-setup-services.log");
        
    }
    
    if ($main::cfg{'CMD_POP'} ne 'no') {
    
        sys_command_rs("$main::cfg{'CMD_POP'} start &> /tmp/vhcs2-setup-services.log");
        
    }
    
    push_el(\@main::el, 'setup_po()', 'Ending...');
    
    return 0;
    
}

sub setup_ftpd {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_ftpd()', 'Starting...');
    
    my $cfg_dir = "$main::cfg{'CONF_DIR'}/proftpd";
    
    my $bk_dir = "$cfg_dir/backup";
    
    my ($cfg_tpl, $cfg, $cmd) = (undef, undef, undef);
    
    if ($main::cfg{'CMD_FTPD'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_FTPD'} stop &> /tmp/vhcs2-setup-services.log");
        
    }
    
    if (! -e "$bk_dir/proftpd.conf.vhcs2") {

        $cmd = "$main::cfg{'CMD_CP'} -p $main::cfg{'FTPD_CONF_FILE'} $bk_dir/proftpd.conf.system";
        
        $rs = sys_command($cmd);
        
        return $rs if ($rs != 0);
        
        ($rs, $cfg_tpl) = get_tpl($cfg_dir, 'proftpd.conf');
        
        return $rs if ($rs != 0);
        
        my %tag_hash = (
                        '{HOST_NAME}' => $main::cfg{'SERVER_HOSTNAME'},
                        '{DATABASE_NAME}' => $main::db_name,
                        '{DATABASE_HOST}' => $main::db_host,
                        '{DATABASE_USER}' => $main::ua{'db_ftp_user'},
                        '{DATABASE_PASS}' => $main::ua{'db_ftp_password'}
                       );
        
        ($rs, $cfg) = prep_tpl(\%tag_hash, $cfg_tpl);
        
        return $rs if ($rs != 0);
        
        $rs = store_file("$bk_dir/proftpd.conf.vhcs2", $cfg, 'root', 'root', 0600);
        
        return $rs if ($rs != 0);

    }
    
    $cmd = "$main::cfg{'CMD_CP'} -p $bk_dir/proftpd.conf.vhcs2 $main::cfg{'FTPD_CONF_FILE'}";
    
    $rs = sys_command($cmd);
        
    return $rs if ($rs != 0);
    
    #
    # To fill ftp_traff.log file with somethign. ;)
    #
    
    $rs = store_file("$main::cfg{'TRAFF_LOG_DIR'}/$main::cfg{'FTP_TRAFF_LOG'}", "\n", 'root', 'root', 0644);
        
    return $rs if ($rs != 0);
    
    #
    # Let's start service;
    #
    
    if ($main::cfg{'CMD_FTPD'} ne 'no') {
        
        sys_command_rs("$main::cfg{'CMD_FTPD'} start &> /tmp/vhcs2-setup-services.log");
        
    }
    
    push_el(\@main::el, 'setup_ftpd()', 'Ending...');
    
    return 0;
    
}

sub setup_vhcs2d {
    
    my ($rs, $rdata) = (undef, undef);

    push_el(\@main::el, 'setup_vhcs2d()', 'Starting...');

    sys_command_rs("$main::cfg{'CMD_CHOWN'} root:root $main::cfg{'CMD_VHCS2D'} $main::cfg{'CMD_VHCS2N'} &> /tmp/vhcs2-setup-services.log");

    sys_command_rs("/usr/chmod 0755 $main::cfg{'CMD_VHCS2D'} $main::cfg{'CMD_VHCS2N'} &> /tmp/vhcs2-setup-services.log");

    sys_command_rs("update-rc.d vhcs2_daemon defaults 99 &> /tmp/vhcs2-setup-services.log");
    
    sys_command_rs("$main::cfg{'CMD_VHCS2D'} stop &> /tmp/vhcs2-setup-services.log");
    
    sleep(3);
    
    sys_command_rs("$main::cfg{'CMD_VHCS2D'} start &> /tmp/vhcs2-setup-services.log");
    
    $rs = del_file("/tmp/vhcs2-setup-services.log");
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_vhcs2d()', 'Ending...');
    
    return 0;
    
}

sub setup_host_system {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'setup_host_system()', 'Starting...');
    
    $rs = setup_system_users();
    
    return $rs if ($rs != 0);
    
    $rs = setup_system_dirs();
    
    return $rs if ($rs != 0);
    
    $rs = setup_config();
    
    return $rs if ($rs != 0);
    
    $rs = setup_sql();
    
    return $rs if ($rs != 0);
    
    $rs = setup_crontab();
    
    return $rs if ($rs != 0);
    
    $rs = setup_resolver();
    
    return $rs if ($rs != 0);
    
    $rs = setup_hosts();
    
    return $rs if ($rs != 0);
    
    $rs = setup_named();
    
    return $rs if ($rs != 0);
    
    $rs = setup_httpd();
    
    return $rs if ($rs != 0);
    
    $rs = setup_mta();
    
    return $rs if ($rs != 0);
    
    $rs = setup_po();
    
    return $rs if ($rs != 0);
    
    $rs = setup_ftpd();
    
    return $rs if ($rs != 0);
    
    $rs = setup_vhcs2d();
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'setup_host_system()', 'Ending...');
    
    return 0;
    
}

my $rs = undef;

$rs = setup_start_up();

if ($rs != 0) {
        
    my $el_data = pop_el(\@main::el);

    my ($sub_name, $msg) = split(/$main::el_sep/, $el_data);

    print STDERR "$msg\n";

    exit 1;

}

$rs = user_dialog();

if ($rs != 0) {
        
    my $el_data = pop_el(\@main::el);

    my ($sub_name, $msg) = split(/$main::el_sep/, $el_data);

    print STDERR "$msg\n";

    exit 1;

}

$rs = check_host_system();

if ($rs != 0) {
        
    my $el_data = pop_el(\@main::el);

    my ($sub_name, $msg) = split(/$main::el_sep/, $el_data);

    print STDERR "$msg\n";

    exit 1;

}

$rs = setup_host_system();

if ($rs != 0) {
        
    my $el_data = pop_el(\@main::el);

    my ($sub_name, $msg) = split(/$main::el_sep/, $el_data);

    print STDERR "$msg\n";

    exit 1;

}

$rs = setup_shut_down();

if ($rs != 0) {
        
    my $el_data = pop_el(\@main::el);

    my ($sub_name, $msg) = split(/$main::el_sep/, $el_data);

    print STDERR "$msg\n";

    exit 1;

}
