#!/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::dmn_task_id = undef;

sub dmn_mngr_start_up {
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_mngr_start_up()', 'Starting...');
    
    # checking for master process;
    
    $rs = check_master();
    
    return $rs if ($rs != 0);
    
    # Let's clear Execution Logs, if any.
    
    if (-e $main::vhcs2_dmn_mngr_el) {
        
        $rs = del_file($main::vhcs2_dmn_mngr_el);
        
        return $rs if ($rs != 0);
        
    }
    
    # config check;
    
    $rs = get_conf();
    
    return $rs if ($rs != 0);
    
    # sql check;
    
    #
    # getting initial data also must be done here;
    #
    
    my $sql = "select * from domain;";
    
    ($rs, $rdata) = doSQL($sql);
    
    return $rs if ($rs != 0);
    
    #
    # getting task id and domain record id;
    #
    
    $main::dmn_task_id = $ARGV[0];
    
    push_el(\@main::el, 'dmn_mngr_start_up()', 'Ending...');
    
    return 0;
    
}

sub dmn_mngr_shut_down {
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_mngr_shut_down()', 'Starting...');
    
    push_el(\@main::el, 'dmn_mngr_shut_down()', 'Ending...');
    
    return 0;
    
}

#
# domain named data managment;
#

sub dmn_add_named_cfg_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_add_named_cfg_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_named_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    #
    # Initial data we need;
    #
    
    my $dmn_name = @$dmn_data[1];
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $sys_cfg = $main::cfg{'BIND_CONF_FILE'};
    
    my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
    
    
    my $tpl_dir = "$conf_dir/bind/parts";
    
    my $backup_dir = "$conf_dir/bind/backup";
    
    my $working_dir = "$conf_dir/bind/working";
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/named.conf.$timestamp";
    
    my $working_cfg = "$working_dir/named.conf";
    
    #
    #  BEGIN/END tags, and templates needed for this config;
    #
    
    my ($dta_b, $dta_e, $entry_b, $entry_e, $entry) = ('', '', '', '', '');
    
    (
     $rs, 
     $dta_b, 
     $dta_e, 
     $entry_b, 
     $entry_e,
     $entry
    ) = get_tpl(
                $tpl_dir,
                'cfg_dta_b.tpl',
                'cfg_dta_e.tpl',
                'cfg_entry_b.tpl',
                'cfg_entry_e.tpl',
                'cfg_entry.tpl'
               );
    
    return $rs if ($rs != 0);
    
    #
    # Let's construct nedded tags and entries;
    #
    
    my %tag_hash = (
                    '{DMN_NAME}' => $dmn_name,
                    '{DB_DIR}' => $named_db_dir
                   );
    
    my ($entry_b_val, $entry_e_val, $entry_val) = ('', '', '');
    
    (
     $rs, 
     $entry_b_val, 
     $entry_e_val,
     $entry_val
    ) = prep_tpl(
                 \%tag_hash,
                 $entry_b,
                 $entry_e,
                 $entry
                );
    
    return $rs if ($rs != 0);
    
    #
    # Let's get Sytem and Workind config files;
    #
    
    my ($sys, $working) = ('', '');
    
    
    ($rs, $sys) = get_file($sys_cfg);
    
    return $rs  if ($rs != 0);
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs  if ($rs != 0);
    
    ($rs, $rdata) = get_tag($dta_b, $dta_e, $working);
    
    return $rs if ($rs != 0);
    
    #
    # Is the new domain entry exists ?
    #
    
    ($rs, $rdata) = get_tag($entry_b_val, $entry_e_val, $working);
    
    if ($rs == 0) {

        # Yes it exists ! Then we must delete it !

        ($rs, $working) = del_tag($entry_b_val, "$entry_e_val\n", $working);

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

    }
    
    ($rs, $rdata) = get_tag($entry_b, $entry_e, $working);
    
    return $rs if ($rs != 0);
    
    #
    # Let's contruct the replacement and do it;
    #
    
    my $entry_repl = "$entry_b_val$entry_val$entry_e_val\n$entry_b$entry_e";
    
    ($rs, $working) = repl_tag($entry_b, $entry_e, $working, $entry_repl);
    
    return $rs if ($rs != 0);
    
    #
    # Here we'll backup production config file;
    #
    
    $rs = sys_command("cp -p $sys_cfg $backup_cfg");
    
    return $rs if ($rs != 0);
    
    #
    # Let's save working copy;
    #
    
    $rs = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    #
    # Here we'll replace data in production config file with data in working 
    # confing file. A little workaround will be done. If working copy data does not exist 
    # in production config then we will add it;
    #
    
    ($rs, $rdata) = get_tag($dta_b, $dta_e, $sys);
    
    if ($rs == 0) { # YES ! Data is here ! /in production config file/;
        
        ($rs, $sys) = repl_tag($dta_b, $dta_e, $sys, $working);
        
        return $rs if ($rs != 0);
        
    } elsif ($rs == -5) {
        
        $sys .= $working;
        
    } else {
        
        return $rs;
            
    }
    
    $rs = store_file($sys_cfg, $sys, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    
    push_el(\@main::el, 'dmn_add_named_cfg_data()', 'Ending...');
    
    return 0;
}

sub dmn_del_named_cfg_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_del_named_cfg_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_named_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    #
    # Initial data we need;
    #
    
    my $dmn_name = @$dmn_data[1];
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $sys_cfg = $main::cfg{'BIND_CONF_FILE'};
    
    my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
    
    
    my $tpl_dir = "$conf_dir/bind/parts";
    
    my $backup_dir = "$conf_dir/bind/backup";
    
    my $working_dir = "$conf_dir/bind/working";
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/named.conf.$timestamp";
    
    my $working_cfg = "$working_dir/named.conf";
    
    #
    #  BEGIN/END tags, and templates needed for this config;
    #
    
    my ($dta_b, $dta_e, $entry_b, $entry_e, $entry) = ('', '', '', '', '');
    
    (
     $rs, 
     $dta_b, 
     $dta_e, 
     $entry_b, 
     $entry_e,
     $entry
    ) = get_tpl(
                $tpl_dir,
                'cfg_dta_b.tpl',
                'cfg_dta_e.tpl',
                'cfg_entry_b.tpl',
                'cfg_entry_e.tpl',
                'cfg_entry.tpl'
               );
    
    return $rs if ($rs != 0);
    
    #
    # Let's construct nedded tags and entries;
    #
    
    my %tag_hash = (
                    '{DMN_NAME}' => $dmn_name,
                    '{DB_DIR}' => $named_db_dir
                   );
    
    my ($entry_b_val, $entry_e_val, $entry_val) = ('', '', '');
    
    (
     $rs, 
     $entry_b_val, 
     $entry_e_val,
     $entry_val
    ) = prep_tpl(
                 \%tag_hash,
                 $entry_b,
                 $entry_e,
                 $entry
                );
    
    return $rs if ($rs != 0);
    
    #
    # Let's get Sytem and Workind config files;
    #
    
    my ($sys, $working) = ('', '');
    
    
    ($rs, $sys) = get_file($sys_cfg);
    
    return $rs  if ($rs != 0);
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs  if ($rs != 0);
    
    ($rs, $rdata) = get_tag($dta_b, $dta_e, $working);
    
    return $rs if ($rs != 0);
    
    #
    # Is the new domain entry exists ?
    #
    
    ($rs, $rdata) = get_tag($entry_b_val, $entry_e_val, $working);
    
    if ($rs == 0) {

        # Yes it exists ! Then we must delete it !

        ($rs, $working) = del_tag($entry_b_val, "$entry_e_val\n", $working);

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

    }
    
    ($rs, $rdata) = get_tag($entry_b, $entry_e, $working);
    
    return $rs if ($rs != 0);
    
    #
    # Let's contruct the replacement and do it;
    #
    #
    #my $entry_repl = "$entry_b_val$entry_val$entry_e_val\n$entry_b$entry_e";
    #
    #($rs, $working) = repl_tag($entry_b, $entry_e, $working, $entry_repl);
    #
    #return $rs if ($rs != 0);
    #
    
    #
    # Here we'll backup production config file;
    #
    
    $rs = sys_command("cp -p $sys_cfg $backup_cfg");
    
    return $rs if ($rs != 0);
    
    #
    # Let's save working copy;
    #
    
    $rs = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    #
    # Here we'll replace data in production config file with data in working 
    # confing file. A little workaround will be done. If working copy data does not exist 
    # in production config then we will add it;
    #
    
    ($rs, $rdata) = get_tag($dta_b, $dta_e, $sys);
    
    if ($rs == 0) { # YES ! Data is here ! /in production config file/;
        
        ($rs, $sys) = repl_tag($dta_b, $dta_e, $sys, $working);
        
        return $rs if ($rs != 0);
        
    } elsif ($rs == -5) {
        
        $sys .= $working;
        
    } else {
        
        return $rs;
            
    }
    
    $rs = store_file($sys_cfg, $sys, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    
    push_el(\@main::el, 'dmn_del_named_cfg_data()', 'Ending...');
    
    return 0;
}

sub dmn_add_named_db_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_add_named_db_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_named_db_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    #
    # Initial data we need;
    #
    
    my $dmn_name = @$dmn_data[1];
    
    my $dmn_ip = @$dmn_data[21];    

    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
    
    
    my $tpl_dir = "$conf_dir/bind/parts";
    
    my $backup_dir = "$conf_dir/bind/backup";
    
    my $working_dir = "$conf_dir/bind/working";
    
    
    my $db_fname = "$dmn_name.db";
    
    
    my $sys_cfg = "$named_db_dir/$db_fname";
    
    my $working_cfg = "$working_dir/$db_fname";
    
    #
    # Let's get needed tags and templates;
    #
    
    my ($entry, $dns2_b, $dns2_e) = ('', '', '');
    
    ($rs, $entry, $dns2_b, $dns2_e) = get_tpl(
                                              $tpl_dir,
                                              'db_e.tpl',
                                              'db_dns2_b.tpl',
                                              'db_dns2_e.tpl'
                                             );
    
    return $rs if ($rs != 0);

	#
	# RFC 1912 template fix by Puuhis ;)
	#

	my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
	
	my $time2 = sprintf "%4d%02d%02d00",$year+1900,$mon+1,$mday;

    #
    # Let's prepare them;
    #

    my %tag_hash = (
                    '{DMN_NAME}' => $dmn_name,
                    '{DMN_IP}' => $dmn_ip,
                    '{TIMESTAMP}' => $time2
                   );
    
    ($rs, $entry, $dns2_b, $dns2_e) = prep_tpl(
                                               \%tag_hash,
                                               $entry,
                                               $dns2_b,
                                               $dns2_e
                                              );
    
    return $rs if ($rs != 0);
    
    #
    # Any secondary DNS defined;
    #
    
    if ($main::cfg{'SECONDARY_DNS'}) {

        my $dns2 = undef;
        
        $dns2 = "\t\t \t NS \t $main::cfg{'SECONDARY_DNS'}.\n";
        
        $dns2 = "$dns2_b$dns2$dns2_e";
        
        ($rs, $entry) = repl_tag($dns2_b, $dns2_e, $entry, $dns2);
    
        return $rs if ($rs != 0);
        
    } else {
        
        ($rs, $entry) = del_tag($dns2_b, $dns2_e, $entry);
    
        return $rs if ($rs != 0);
        
    }
    
    #
    # Let's store generated data;
    #
    
    $rs = store_file($working_cfg, $entry, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    $rs = store_file($sys_cfg, $entry, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_named_db_data()', 'Ending...');
    
    
    return 0;
}

sub dmn_del_named_db_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_del_named_db_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_named_db_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    #
    # Initial data we need;
    #
    
    my $dmn_name = @$dmn_data[1];
    
    my $dmn_ip = @$dmn_data[21];
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
    
    
    my $tpl_dir = "$conf_dir/bind/parts";
    
    my $backup_dir = "$conf_dir/bind/backup";
    
    my $working_dir = "$conf_dir/bind/working";
    
    
    my $db_fname = "$dmn_name.db";
    
    
    my $sys_cfg = "$named_db_dir/$db_fname";
    
    my $working_cfg = "$working_dir/$db_fname";
    
    #
    # Let's remove .db files for this domain;
    #
    
    $rs = del_file($working_cfg);
    
    return $rs if ($rs != 0);
    
    $rs = del_file($sys_cfg);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_named_db_data()', 'Ending...');
    
    
    return 0;
}

sub dmn_add_named_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_add_named_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_named_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_add_named_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_add_named_db_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_named_data()', 'Ending...');
    
    return 0;
}

sub dmn_change_named_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_change_named_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_change_named_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_add_named_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_change_named_data()', 'Ending...');
    
    return 0;
}

sub dmn_del_named_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_del_named_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_named_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_del_named_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_del_named_db_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_named_data()', 'Ending...');
    
    return 0;
}

#
# domain httpd data managment;
#

sub get_auto_num {
    
    my ($rs, $num, $rdata) = (undef, undef, undef);
    
    push_el(\@main::el, 'get_auto_num()', 'Starting...');
    
    my $sql = "insert into auto_num (msg) values ('auto-num')";
    
    ($rs, $rdata) = doSQL($sql);
    
    return $rs if ($rs != 0);
    
    $num = $main::db -> {'mysql_insertid'};
    
    push_el(\@main::el, 'get_auto_num()', 'Ending...');
    
    return $num;
    
}

sub gen_httpd_dmn_group_entry {
    
    my ($dmn_data) = @_;
    
    push_el(\@main::el, 'gen_httpd_dmn_group_entry()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'gen_httpd_dmn_group_entry()', "ERORR: Undefined input data...");
        
        return (-1, '');
        
    }

    my ($rs, $rdata) = (undef, undef);
    
    my $dmn_id = @$dmn_data[0];
    
    my $dmn_name = @$dmn_data[1];

    my $dmn_ip = @$dmn_data[21];
    
    my ($dmn_php, $dmn_cgi) = (@$dmn_data[19], @$dmn_data[20]);
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $tpl_dir = "$conf_dir/apache/parts";
    
    my (
        $dg_b, 
        $dg_entry, 
        $dg_e,
        $dmn_b,
        $dmn_entry,
        $dmn_e,
        $dmn_cgi_b,
        $dmn_cgi_entry,
        $dmn_cgi_e,
        $dmn_php_b,
        $dmn_php_entry,
        $dmn_php_e,
        $dmn_php2_b,
        $dmn_php2_entry,
        $dmn_php2_e
       ) = ('', '', '', '', '', '', '', '', '', '', '', '', '', '', ''); 
    
    (
     $rs,
     $dg_b, 
     $dg_entry, 
     $dg_e,
     $dmn_b,
     $dmn_entry,
     $dmn_e,
     $dmn_cgi_b,
     $dmn_cgi_entry,
     $dmn_cgi_e,
     $dmn_php_b,
     $dmn_php_entry,
     $dmn_php_e,
     $dmn_php2_b,
     $dmn_php2_entry,
     $dmn_php2_e
    ) = get_tpl (
                 $tpl_dir,
                 'dg_b.tpl',
                 'dg_entry.tpl',
                 'dg_e.tpl',
                 'dmn_b.tpl',
                 'dmn_entry.tpl',
                 'dmn_e.tpl',
                 'dmn_cgi_b.tpl',
                 'dmn_cgi_entry.tpl',
                 'dmn_cgi_e.tpl',
                 'dmn_php_b.tpl',
                 'dmn_php_entry.tpl',
                 'dmn_php_e.tpl',
                 'dmn_php2_b.tpl',
                 'dmn_php2_entry.tpl',
                 'dmn_php2_e.tpl'
                );
    
    return ($rs, '') if ($rs != 0);
    
    
    my ($suexec_uid, $suexec_gid) = get_dmn_suexec_user($dmn_id);
    
    my $suexec_user_pref = $main::cfg{'APACHE_SUEXEC_USER_PREF'};
    
    my ($suexec_user, $suexec_group) = ("$suexec_user_pref$suexec_uid", "$suexec_user_pref$suexec_gid");
    
    
    my %tag_hash = 
        
        (
         '{DMN_GRP}' => $dmn_name,
         '{DMN_NAME}' => $dmn_name,
         '{DMN_IP}' => $dmn_ip,
         '{WWW_DIR}' => $main::cfg{'APACHE_WWW_DIR'},
         '{APACHE_LOG_DIR}' => $main::cfg{'APACHE_LOG_DIR'},
         '{GUI_ROOT_DIR}' => $main::cfg{'GUI_ROOT_DIR'},
         '{PEAR_DIR}' => $main::cfg{'PEAR_DIR'},
         '{APACHE_USERS_LOG_DIR}' => $main::cfg{'APACHE_USERS_LOG_DIR'},
         '{SUEXEC_USER}' => $suexec_user,
         '{SUEXEC_GROUP}' => $suexec_group
        );
    
    (
     $rs,
     $dg_b, 
     $dg_entry, 
     $dg_e,
     $dmn_b,
     $dmn_entry,
     $dmn_e,
     $dmn_cgi_b,
     $dmn_cgi_entry,
     $dmn_cgi_e,
     $dmn_php_b,
     $dmn_php_entry,
     $dmn_php_e,
     $dmn_php2_entry
    ) = prep_tpl(
                 \%tag_hash,
                 $dg_b, 
                 $dg_entry, 
                 $dg_e,
                 $dmn_b,
                 $dmn_entry,
                 $dmn_e,
                 $dmn_cgi_b,
                 $dmn_cgi_entry,
                 $dmn_cgi_e,
                 $dmn_php_b,
                 $dmn_php_entry,
                 $dmn_php_e,
                 $dmn_php2_entry
                );
    
    return ($rs, '') if ($rs != 0);
    
    my $cgi_entry = undef;
    
    if ($dmn_cgi eq 'yes') {
        
        $cgi_entry = "$dmn_cgi_b$dmn_cgi_entry$dmn_cgi_e";
        
    } else {
        
        $cgi_entry = "$dmn_cgi_b$dmn_cgi_e";
        
    }

    ($rs, $dmn_entry) = repl_tag(
                                 $dmn_cgi_b,
                                 $dmn_cgi_e,
                                 $dmn_entry,
                                 $cgi_entry
                                );

    return ($rs, '') if ($rs != 0);
    
    my $php_entry = undef;
    
    if ($dmn_php eq 'no') {
        
        $php_entry = "$dmn_php_b$dmn_php_entry$dmn_php_e";

        
    } else {
        
        $php_entry = "$dmn_php_b$dmn_php_e";
        
        my $php2_entry = "$dmn_php2_b$dmn_php2_entry$dmn_php2_e";
        
        ($rs, $dmn_entry) = repl_tag(
                                     $dmn_php2_b,
                                     $dmn_php2_e,
                                     $dmn_entry,
                                     $php2_entry
                                    );

        return ($rs, '') if ($rs != 0);
    
    }
    
    ($rs, $dmn_entry) = repl_tag(
                                 $dmn_php_b,
                                 $dmn_php_e,
                                 $dmn_entry,
                                 $php_entry
                                );

    return ($rs, '') if ($rs != 0);
    
    push_el(\@main::el, 'gen_httpd_dmn_group_entry()', "dmn_entry:\n$dmn_entry");
    
    my $dmn_group_entry = "$dmn_b$dmn_entry$dmn_e";
    
    ($rs, $dg_entry) = repl_tag(
                                 $dmn_b,
                                 $dmn_e,
                                 $dg_entry,
                                 $dmn_group_entry
                               );
    
    push_el(\@main::el, 'gen_httpd_dmn_group_entry()', "\n$dg_entry");
    
    return (0,  $dg_entry);
    
}

sub dmn_add_httpd_cfg_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_add_httpd_cfg_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_httpd_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    my $dmn_id = @$dmn_data[0];
    
    my $dmn_ip = @$dmn_data[21];
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    
    my $tpl_dir = "$conf_dir/apache/parts";
    
    my $working_dir = "$conf_dir/apache/working";
    
    my $backup_dir = "$conf_dir/apache/backup";
    
    
    my $sys_cfg = $main::cfg{'APACHE_CONF_FILE'};
    
    my $working_cfg = "$working_dir/vhcs2.conf";


	if (!(-e $working_cfg)) {
		
		my $vhcs2_base_tpl;

		($rs, $vhcs2_base_tpl) = get_file($tpl_dir."/vhcs2_base.tpl");
                       
        return $rs if ($rs != 0);

		($rs, $rdata) = store_file(
									$working_cfg,
									$vhcs2_base_tpl,
									"root",
									"root",
									0600
								  );

		return $rs if ($rs != 0);
        
    }
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/httpd.conf.$timestamp";
    
    #
    # Getting needed templates;
    #
    
    my (
        $cfg_b,
        $cfg_e,
        $vh_b,
        $vh_entry,
        $vh_e,
        $dg_b,
        $dg_e
       ) = ('', '', '', '', '', '', '');

    (
     $rs,
     $cfg_b,
     $cfg_e,
     $vh_b,
     $vh_entry,
     $vh_e,
     $dg_b,
     $dg_e
    ) = get_tpl (
                 $tpl_dir,
                 'cfg_b.tpl',
                 'cfg_e.tpl',
                 'vh_b.tpl',
                 'vh_entry.tpl',
                 'vh_e.tpl',
                 'dg_b.tpl',
                 'dg_e.tpl'
                );
    
    return $rs if ($rs != 0);
    
    #
    # Create apache suexec user for this domain.
    #
    
    $rs = add_dmn_suexec_user($dmn_data);
    
    return $rs if ($rs != 0);
    
    #
    # Preparing templates;
    #
    
    my (
        $vh_b_val,
        $vh_entry_val,
        $vh_e_val,
        $dg_b_val,
        $dg_e_val
       ) = ('', '', '', '', '');
    
    my %tag_hash = ('{IP}' => $dmn_ip);
    
    ($rs, $vh_entry_val) = prep_tpl (\%tag_hash, $vh_entry);
    
    return $rs if ($rs != 0);
    
    
    %tag_hash = ( 
                  '{IP}' => $dmn_ip,
                  '{DMN_GRP}' => $dmn_name
                );
    
    (
     $rs,
     $vh_b_val,
     $vh_e_val,
     $dg_b_val,
     $dg_e_val
    ) = prep_tpl (
                  \%tag_hash,
                  $vh_b,
                  $vh_e,
                  $dg_b,
                  $dg_e
                );
    
    return $rs if ($rs != 0);
    
    #
    # Let's get some configs;
    #
    
    my ($sys, $working) = ('', '');
    
    
    ($rs, $sys) = get_file($sys_cfg);
                       
    return $rs if ($rs != 0);
    
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs if ($rs != 0);
    
    #
    # Check for $cfg_b, $cfg_e in working config;
    #
    
    ($rs, $rdata) = get_tag($cfg_b, $cfg_e, $working);
    
    return $rs if ($rs != 0);
    
    #
    # Check for $vh_b_val, $vh_e_val in working config; Have we such Virtual Host Entry in working config;
    #
    
    ($rs, $rdata) = get_tag($vh_b_val, $vh_e_val, $working);
    
    if ($rs == -5) { # No, we have not! We must add it here !
        
        my $repl = undef;
            
        $repl = "$vh_b_val$vh_entry_val$vh_e_val\n";
        
        $repl .= "$vh_b$vh_e";
        
        ($rs, $working) = repl_tag(
                                   $vh_b,
                                   $vh_e,
                                   $working,
                                   $repl
                                  );

        return $rs if ($rs != 0);
        
        ($rs, $rdata) = get_tag($vh_b_val, $vh_e_val, $working);
        
        return $rs if ($rs != 0);
        
        push_el(\@main::el, 'dmn_add_httpd_cfg_data()', "working:\n$working");
        
    } elsif ($rs != 0) {
        
        return $rs;
        
    }
    
    #
    # Let's edit Virtual Host Entry;
    #
    
    my $vh_entry_contents = $rdata;
    
    #
    # Check for valued Domain Group Entry in this Virtual Host Entry;
    #
    
    ($rs, $rdata) = get_tag(
                            $dg_b_val, 
                            $dg_e_val,
                            $vh_entry_contents
                           );
    
    if ($rs == 0) {
        
       
        # We have one ! We must delete it because of possible future changes in this Domain Group Entry;
       
        
        ($rs, $vh_entry_contents) = del_tag(
                                            $dg_b_val,
                                            "$dg_e_val\n",
                                            $vh_entry_contents
                                           );
        
        return $rs if ($rs != 0);
        
    }
    
    #
    # Check for extension ($dg_b, $dg_e) Domain Group Entry in this Virtual Host Entry;
    #
    
    ($rs, $rdata) = get_tag($dg_b, $dg_e, $vh_entry_contents);
    
    return $rs if ($rs != 0);
    
    #
    # Let's construct Domain Group Entry and Domain Group valued (with extension tags) Entry;
    #
    
    my ($dg_entry, $dg_entry_val) = ('', '');
    
    
    ($rs, $dg_entry) = gen_httpd_dmn_group_entry($dmn_data);
    
    return $rs if ($rs != 0);
    
    
    $dg_entry_val = "$dg_b_val$dg_entry$dg_e_val\n";
    
    $dg_entry_val .= "$dg_b$dg_e";
    
    #
    # Constructing NEW Virtual Host Entry;
    #
    
    ($rs, $vh_entry_contents) = repl_tag($dg_b, $dg_e, $vh_entry_contents, $dg_entry_val);
    
    return $rs if ($rs != 0);
    
    #
    # Putting NEW Virtual Host Entry in working config;
    #
    
    ($rs, $working) = repl_tag(
                               $vh_b_val,
                               $vh_e_val,
                               $working,
                               $vh_entry_contents
                              );
    
    return $rs if ($rs != 0);
    
    #
    # Check for $cfg_b, $cfg_e data in system config;
    #
    
    ($rs, $rdata) = get_tag($cfg_b, $cfg_e, $sys);
    
    if ($rs == 0) { # Yes, We have some ! We'll replace it;
        
        ($rs, $sys) = repl_tag($cfg_b, $cfg_e, $sys, $working);
        
        return $rs if ($rs != 0);
        
    } elsif ($rs == -5) { # No, We haven't ! We'll add it;
        
        $sys .= $working;
        
    } else { # Some error that should not be happend ! Exitting...
        
        return $rs;
            
    }
    
    #
    # Backuping system config;
    #
    
    ($rs, $rdata) = sys_command("cp -p $sys_cfg $backup_cfg");
    
    return $rs if ($rs != 0);
    
    #
    # Let's store all the stuff;
    #
    
    ($rs, $rdata) = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    ($rs, $rdata) = store_file($sys_cfg, $sys, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_httpd_cfg_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_change_httpd_cfg_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_change_httpd_cfg_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_change_httpd_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_add_httpd_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_change_httpd_cfg_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_del_httpd_cfg_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_del_httpd_cfg_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_httpd_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    my $dmn_ip = @$dmn_data[21];
    
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    
    my $tpl_dir = "$conf_dir/apache/parts";
    
    my $working_dir = "$conf_dir/apache/working";
    
    my $backup_dir = "$conf_dir/apache/backup";
    
    
    my $sys_cfg = $main::cfg{'APACHE_CONF_FILE'};
    
    my $working_cfg = "$working_dir/vhcs2.conf";
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/httpd.conf.$timestamp";
    
    #
    # Getting needed templates;
    #
    
    my (
        $cfg_b,
        $cfg_e,
        $vh_b,
        $vh_entry,
        $vh_e,
        $dg_b,
        $dg_e
       ) = ('', '', '', '', '', '', '');

    (
     $rs,
     $cfg_b,
     $cfg_e,
     $vh_b,
     $vh_entry,
     $vh_e,
     $dg_b,
     $dg_e
    ) = get_tpl (
                 $tpl_dir,
                 'cfg_b.tpl',
                 'cfg_e.tpl',
                 'vh_b.tpl',
                 'vh_entry.tpl',
                 'vh_e.tpl',
                 'dg_b.tpl',
                 'dg_e.tpl'
                );
    
    return $rs if ($rs != 0);
    
    #
    # Delete apache suexec user for this domain.
    #
    
    $rs = del_dmn_suexec_user($dmn_data);
    
    return $rs if ($rs != 0);
    
    #
    # Preparing templates;
    #
    
    my (
        $vh_b_val,
        $vh_entry_val,
        $vh_e_val,
        $dg_b_val,
        $dg_e_val
       ) = ('', '', '', '', '');
    
    my %tag_hash = ('{IP}' => $dmn_ip);
    
    ($rs, $vh_entry_val) = prep_tpl (\%tag_hash, $vh_entry);
    
    return $rs if ($rs != 0);
    
    
    %tag_hash = ( 
                  '{IP}' => $dmn_ip,
                  '{DMN_GRP}' => $dmn_name
                );
    
    (
     $rs,
     $vh_b_val,
     $vh_e_val,
     $dg_b_val,
     $dg_e_val
    ) = prep_tpl (
                  \%tag_hash,
                  $vh_b,
                  $vh_e,
                  $dg_b,
                  $dg_e
                );
    
    return $rs if ($rs != 0);
    
    #
    # Let's get some configs;
    #
    
    my ($sys, $working) = ('', '');
    
    
    ($rs, $sys) = get_file($sys_cfg);
                       
    return $rs if ($rs != 0);
    
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs if ($rs != 0);
    
    #
    # Check for $cfg_b, $cfg_e in working config;
    #
    
    ($rs, $rdata) = get_tag($cfg_b, $cfg_e, $working);
    
    return $rs if ($rs != 0);
    
    #
    # Check for $vh_b_val, $vh_e_val in working config; Have we such Virtual Host Entry in working config;
    #
    
    ($rs, $rdata) = get_tag($vh_b_val, $vh_e_val, $working);
    
    if ($rs == -5) { # No, we have not! We must add it here !
        
        my $repl = undef;
            
        $repl = "$vh_b_val$vh_entry_val$vh_e_val\n";
        
        $repl .= "$vh_b$vh_e";
        
        ($rs, $working) = repl_tag(
                                   $vh_b,
                                   $vh_e,
                                   $working,
                                   $repl
                                  );

        return $rs if ($rs != 0);
    
        ($rs, $rdata) = get_tag($vh_b_val, $vh_e_val, $working);
        
        return $rs if ($rs != 0);
        
    } elsif ($rs != 0) {
        
        return $rs;
        
    }
    
    #
    # Let's edit Virtual Host Entry;
    #
    
    my $vh_entry_contents = $rdata;
    
    #
    # Check for valued Domain Group Entry in this Virtual Host Entry;
    #
    
    ($rs, $rdata) = get_tag(
                            $dg_b_val, 
                            $dg_e_val,
                            $vh_entry_contents
                           );
    
    if ($rs == 0) {
        
       
        # We have one ! We must delete it because of possible future changes in this Domain Group Entry;
       
        
        ($rs, $vh_entry_contents) = del_tag(
                                            $dg_b_val,
                                            "$dg_e_val\n",
                                            $vh_entry_contents
                                           );
        
        return $rs if ($rs != 0);
        
    }
    
    #
    # Check for extension ($dg_b, $dg_e) Domain Group Entry in this Virtual Host Entry;
    #
    
    ($rs, $rdata) = get_tag($dg_b, $dg_b, $vh_entry_contents);
    
    return $rs if ($rs != 0);
    
    #
    # Putting NEW Virtual Host Entry in working config;
    #
    
    ($rs, $working) = repl_tag(
                               $vh_b_val,
                               $vh_e_val,
                               $working,
                               $vh_entry_contents
                              );
    
    return $rs if ($rs != 0);
    
    #
    # Check for $cfg_b, $cfg_e data in system config;
    #
    
    ($rs, $rdata) = get_tag($cfg_b, $cfg_e, $sys);
    
    if ($rs == 0) { # Yes, We have some ! We'll replace it;
        
        ($rs, $sys) = repl_tag($cfg_b, $cfg_e, $sys, $working);
        
        return $rs if ($rs != 0);
        
    } elsif ($rs == -5) { # No, We haven't ! We'll add it;
        
        $sys .= $working;
        
    } else { # Some error that should not be happend ! Exitting...
        
        return $rs;
            
    }
    
    #
    # Backuping system config;
    #
    
    ($rs, $rdata) = sys_command("cp -p $sys_cfg $backup_cfg");
    
    return $rs if ($rs != 0);
    
    #
    # Let's store all the stuff;
    #
    
    ($rs, $rdata) = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    ($rs, $rdata) = store_file($sys_cfg, $sys, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_httpd_cfg_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_add_httpd_file_data {
	
	my ($dmn_data) = @_;
	
	my ($rs, $rdata) = (undef, undef);
	
	push_el(\@main::el, 'dmn_add_httpd_file_data()', 'Starting...');
	
	if (!defined($dmn_data) || $dmn_data eq '') {
		
		push_el(\@main::el, 'dmn_add_httpd_file_data()', 'ERROR: Undefined Input Data...');
		
		return -1;
		
	}
	
	my $dmn_id = @$dmn_data[0];
	
	my $dmn_name = @$dmn_data[1];
	
	my $root_dir = $main::cfg{'ROOT_DIR'};
	
	my $www_dir = $main::cfg{'APACHE_WWW_DIR'};
	
	my $httpd_uid = $main::cfg{'APACHE_USER'};
	
	my $httpd_gid = $main::cfg{'APACHE_GROUP'};
	
	my ($sys_uid, $sys_gid) = get_dmn_suexec_user($dmn_id);
	
	my $suexec_user_pref = $main::cfg{'APACHE_SUEXEC_USER_PREF'};
	
	my $sys_user = "$suexec_user_pref$sys_uid";
	
	my $sys_group = "$suexec_user_pref$sys_gid";
	
	#
	# Domain WWW directories;
	#
	
	$rs = make_dir(
					"$www_dir/$dmn_name",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/htdocs",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/cgi-bin",
					$sys_user,
					$sys_group,
					0755
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/logs",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/backups",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/errors",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/errors/401",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/errors/403",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/errors/404",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	$rs = make_dir(
					"$www_dir/$dmn_name/errors/500",
					$sys_user,
					$httpd_gid,
					0770
					);
	
	return $rs if ($rs != 0);
	
	#
	# Domain WWW files;
	#
	
	($rs, $rdata) = store_file(
								"$www_dir/$dmn_name/.htpasswd",
								"\n",
								$sys_user,
								$httpd_gid,
								0660
								);
	
	return $rs if ($rs != 0);
	
	($rs, $rdata) = store_file(
								"$www_dir/$dmn_name/.htgroup",
								"\n",
								$sys_user,
								$httpd_gid,
								0660
								);
	
	return $rs if ($rs != 0);
	
	#
	# Default error page template;
	#
	
	if (-e "$root_dir/gui/errordocs/index.php") {
		
		my $err_tpl = '';
		
		($rs, $err_tpl) = get_file("$root_dir/gui/errordocs/index.php");
		
		return $rs if ($rs != 0);
		
		if (!(-e "$www_dir/$dmn_name/errors/401/index.php")) {

			($rs, $rdata) = store_file(
										"$www_dir/$dmn_name/errors/401/index.php",
										$err_tpl,
										$sys_user,
										$httpd_gid,
										0660
										);
		
			return $rs if ($rs != 0);
		}
		
		if (!(-e "$www_dir/$dmn_name/errors/403/index.php")) {

			($rs, $rdata) = store_file(
										"$www_dir/$dmn_name/errors/403/index.php",
										$err_tpl,
										$sys_user,
										$httpd_gid,
										0660
										);
		
			return $rs if ($rs != 0);
		}
			
		if (!(-e "$www_dir/$dmn_name/errors/404/index.php")) {

			($rs, $rdata) = store_file(
										"$www_dir/$dmn_name/errors/404/index.php",
										$err_tpl,
										$sys_user,
										$httpd_gid,
										0660
										);
		
			return $rs if ($rs != 0);
		}
			
		if (!(-e "$www_dir/$dmn_name/errors/500/index.php")) {

			($rs, $rdata) = store_file(
										"$www_dir/$dmn_name/errors/500/index.php",
										$err_tpl,
										$sys_user,
										$httpd_gid,
										0660
										);
		
			return $rs if ($rs != 0);
		}
	}
		
	#
	# Default domain page template;
	#
		
	if (!(-e "$www_dir/$dmn_name/htdocs/index.html")) {
	
		my $index_tpl = '';
		
		($rs, $index_tpl) = get_file("$root_dir/gui/domain_default_page/index.html");
		
		return $rs if ($rs != 0);
		
		$index_tpl =~ s/{DOMAIN_NAME}/$dmn_name/gi;
		
		($rs, $rdata) = store_file(
									"$www_dir/$dmn_name/htdocs/index.html",
									$index_tpl,
									$sys_user,
									$httpd_gid,
									0660
									);
		
		return $rs if ($rs != 0);
		
	}
	
	push_el(\@main::el, 'dmn_add_httpd_file_data()', 'Ending...');
	
	return 0;
	
}

sub dmn_change_httpd_file_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_change_httpd_file_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_change_httpd_file_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }

    push_el(\@main::el, 'dmn_change_httpd_file_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_del_httpd_file_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_del_httpd_file_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_httpd_file_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    my $root_dir = $main::cfg{'ROOT_DIR'};
    
    my $www_dir = $main::cfg{'APACHE_WWW_DIR'};
    
    #
    # Domain WWW directories;
    #
    
    ($rs, $rdata) = del_dir("$www_dir/$dmn_name");
    
    return $rs if ($rs != 0);

    push_el(\@main::el, 'dmn_del_httpd_file_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_add_httpd_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_add_httpd_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_httpd_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_add_httpd_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_add_httpd_file_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_httpd_data()', 'Ending...');
    
    return 0;
}

sub dmn_change_httpd_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_change_httpd_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_change_httpd_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_change_httpd_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_change_httpd_file_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_change_httpd_data()', 'Ending...');
    
    return 0;
}

sub dmn_del_httpd_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_del_httpd_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_httpd_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_del_httpd_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_del_httpd_file_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_httpd_data()', 'Ending...');
    
    return 0;
}

sub dmn_add_mta_cfg_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_add_mta_cfg_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_mta_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    
    my $tpl_dir = "$conf_dir/postfix/parts";
    
    my $working_dir = "$conf_dir/postfix/working";
    
    my $backup_dir = "$conf_dir/postfix/backup";
    
    
    my $sys_cfg = "/etc/postfix/vhcs2/domains";
    
    my $working_cfg = "$working_dir/domains";
    
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/domains.$timestamp";
    
    my ($sys, $working) = (undef, undef);
    
    #
    # Getting needed configs;
    #
    
    ($rs, $sys) = get_file($sys_cfg);
    
    return $rs if ($rs != 0);
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs if ($rs != 0);
    
    #
    # Checking for domain entry existance;
    #
    
    $working =~ s/^$dmn_name\t\t\t[^\n]+\n//gim;
    
    $working .= "$dmn_name\t\t\tvdmn_entry\n";
    
    #
    # Let's do some backup first;
    #
    
    $rs = store_file($backup_cfg, $sys, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    #
    # Let's write configs;
    #
    
    $rs = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    $rs = store_file($sys_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    $rs = sys_command("$cmd_postmap $sys_cfg");
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_mta_cfg_data()', 'Ending...');
    
    return 0;
}

sub dmn_del_mta_cfg_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_del_mta_cfg_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_mta_cfg_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $cmd_postmap = $main::cfg{'CMD_POSTMAP'};
    
    
    my $tpl_dir = "$conf_dir/postfix/parts";
    
    my $working_dir = "$conf_dir/postfix/working";
    
    my $backup_dir = "$conf_dir/postfix/backup";
    
    
    my $sys_cfg = "/etc/postfix/vhcs2/domains";
    
    my $working_cfg = "$working_dir/domains";
    
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/domains.$timestamp";
    
    my ($sys, $working) = (undef, undef);
    
    #
    # Getting needed configs;
    #
    
    ($rs, $sys) = get_file($sys_cfg);
    
    return $rs if ($rs != 0);
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs if ($rs != 0);
    
    #
    # Checking for domain entry existance;
    #
    
    $working =~ s/^$dmn_name\t\t\t[^\n]+\n//gim;
    
    #
    # Let's do some backup first;
    #
    
    $rs = store_file($backup_cfg, $sys, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    #
    # Let's write configs;
    #
    
    $rs = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    $rs = store_file($sys_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    $rs = sys_command("$cmd_postmap $sys_cfg");
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_mta_cfg_data()', 'Ending...');
    
    return 0;
}

sub dmn_add_mta_file_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_add_mta_file_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_mta_file_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    
    my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
    
    my $mailbox_uid_name = $main::cfg{'MTA_MAILBOX_UID_NAME'};
    
    my $mailbox_gid_name = $main::cfg{'MTA_MAILBOX_GID_NAME'};
    
    
    $rs = make_dir(
                   "$virtual_mail_dir/$dmn_name",
                   $mailbox_uid_name,
                   $mailbox_gid_name,
                   0700
                  );

    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_mta_file_data()', 'Ending...');
    
    return 0;
}

sub dmn_del_mta_file_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_del_mta_file_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_mta_file_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    
    my $virtual_mail_dir = $main::cfg{'MTA_VIRTUAL_MAIL_DIR'};
    
    my $mailbox_uid_name = $main::cfg{'MTA_MAILBOX_UID_NAME'};
    
    my $mailbox_gid_name = $main::cfg{'MTA_MAILBOX_GID_NAME'};
    
    
    $rs = del_dir("$virtual_mail_dir/$dmn_name");

    return $rs if ($rs != 0);
    
    
    push_el(\@main::el, 'dmn_del_mta_file_data()', 'Ending...');
    
    return 0;
}



sub dmn_add_mta_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_add_mta_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_mta_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_add_mta_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_add_mta_file_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_mta_data()', 'Ending...');
    
    return 0;
}

sub dmn_change_mta_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_change_mta_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_change_mta_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_add_mta_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_change_mta_data()', 'Ending...');
    
    return 0;
}

sub dmn_del_mta_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_del_mta_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_mta_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_del_mta_cfg_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_del_mta_file_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_mta_data()', 'Ending...');
    
    return 0;
}

sub dmn_add_crontab_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_add_crontab_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_crontab_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_id = @$dmn_data[0];
    
    my $dmn_name = @$dmn_data[1];
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $backup_hour = $main::cfg{'BACKUP_HOUR'};
    
    my $backup_minute = $main::cfg{'BACKUP_MINUTE'};
    
    my $backup_root_dir = $main::cfg{'BACKUP_ROOT_DIR'};
    
    my $cmd_crontab = $main::cfg{'CMD_CRONTAB'};
    
    my $log_dir = $main::cfg{'LOG_DIR'};
    
    
    my $tpl_dir = "$conf_dir/crontab/parts";
    
    my $working_dir = "$conf_dir/crontab/working";
    
    my $backup_dir = "$conf_dir/crontab/backup";
    
    
    my $working_cfg = "$working_dir/crontab.conf";
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/crontab.conf.$timestamp";
    
    #
    # Getting needed templates;
    #
    
    my (
        $dt_b,
        $dt_e,
        $dmn_bk_b,
        $dmn_bk_entry,
        $dmn_bk_e
       ) = ('', '', '', '', '');

    (
     $rs,
     $dt_b,
     $dt_e,
     $dmn_bk_b,
     $dmn_bk_entry,
     $dmn_bk_e
    ) = get_tpl (
                 $tpl_dir,
                 'dt_b.tpl',
                 'dt_e.tpl',
                 'dmn_bk_b.tpl',
                 'dmn_bk_entry.tpl',
                 'dmn_bk_e.tpl'
                );
    
    return $rs if ($rs != 0);
    
    #
    # Preparing templates;
    #
    
    my %tag_hash = (
                    '{DMN_NAME}' => $dmn_name,
                    '{DMN_ID}' => $dmn_id,
                    '{MINUTE}' => $backup_minute,
                    '{HOUR}' => $backup_hour,
                    '{BACKUP_ROOT_DIR}' => $backup_root_dir,
                    '{LOG_DIR}' => $log_dir
                   );
    
    my ($dmn_bk_b_val, $dmn_bk_e_val) = (undef, undef);
    
    (
     $rs,
     $dmn_bk_b_val,
     $dmn_bk_entry,
     $dmn_bk_e_val
    ) = prep_tpl (
                  \%tag_hash,
                  $dmn_bk_b,
                  $dmn_bk_entry,
                  $dmn_bk_e
                 );
    
    return $rs if ($rs != 0);
    
    #
    # Creating working config data;
    #
    
    my ($sys, $working) = (undef, undef);
    
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs if ($rs != 0);
    
    
    ($rs, $rdata) = get_tag(
                            $dmn_bk_b_val, 
                            $dmn_bk_e_val, 
                            $working
                           );
    
    if ($rs == 0) {
        
       
        # We have one ! We must delete it because of possible future changes in this Domain Group Entry;
       
        
        ($rs, $working) = del_tag(
                                  $dmn_bk_b_val,
                                  "$dmn_bk_e_val\n",
                                  $working
                                 );
        
        return $rs if ($rs != 0);
        
    }
    
    ($rs, $rdata) = get_tag(
                            $dmn_bk_b, 
                            $dmn_bk_e, 
                            $working
                           );
    
    return $rs if ($rs != 0);
    
    my $dmn_bk_task = "$dmn_bk_b_val$dmn_bk_entry$dmn_bk_e_val\n$dmn_bk_b$dmn_bk_e";
    
    ($rs, $working) = repl_tag(
                               $dmn_bk_b,
                               $dmn_bk_e,
                               $working,
                               $dmn_bk_task
                              );

    return $rs if ($rs != 0);
    
    $rs = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    #
    # Now we'll proceed system config;
    #
    
    $rs = sys_command_rs("$cmd_crontab -u root -l &> $backup_cfg");
    
    $rs = sys_command("$cmd_crontab -u root $working_cfg");
        
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_crontab_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_del_crontab_data {
    
    my ($dmn_data) = @_;
    
    my ($rs, $rdata) = (undef, undef);
    
    push_el(\@main::el, 'dmn_del_crontab_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_crontab_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    my $dmn_name = @$dmn_data[1];
    
    my $conf_dir = $main::cfg{'CONF_DIR'};
    
    my $backup_hour = $main::cfg{'BACKUP_HOUR'};
    
    my $backup_minute = $main::cfg{'BACKUP_MINUTE'};
    
    my $backup_root_dir = $main::cfg{'BACKUP_ROOT_DIR'};
    
    my $cmd_crontab = $main::cfg{'CMD_CRONTAB'};
    
    my $log_dir = $main::cfg{'LOG_DIR'};
    
    
    my $tpl_dir = "$conf_dir/crontab/parts";
    
    my $working_dir = "$conf_dir/crontab/working";
    
    my $backup_dir = "$conf_dir/crontab/backup";
    
    
    my $working_cfg = "$working_dir/crontab.conf";
    
    
    my $timestamp = time;
    
    my $backup_cfg = "$backup_dir/crontab.conf.$timestamp";
    
    #
    # Getting needed templates;
    #
    
    my (
        $dt_b,
        $dt_e,
        $dmn_bk_b,
        $dmn_bk_entry,
        $dmn_bk_e
       ) = ('', '', '', '', '');

    (
     $rs,
     $dt_b,
     $dt_e,
     $dmn_bk_b,
     $dmn_bk_entry,
     $dmn_bk_e
    ) = get_tpl (
                 $tpl_dir,
                 'dt_b.tpl',
                 'dt_e.tpl',
                 'dmn_bk_b.tpl',
                 'dmn_bk_entry.tpl',
                 'dmn_bk_e.tpl'
                );
    
    return $rs if ($rs != 0);
    
    #
    # Preparing templates;
    #
    
    my %tag_hash = (
                    '{DMN_NAME}' => $dmn_name,
                    '{MINUTE}' => $backup_minute,
                    '{HOUR}' => $backup_hour,
                    '{BACKUP_ROOT_DIR}' => $backup_root_dir,
                    '{LOG_DIR}' => $log_dir
                   );
    
    my ($dmn_bk_b_val, $dmn_bk_e_val) = (undef, undef);
    
    (
     $rs,
     $dmn_bk_b_val,
     $dmn_bk_entry,
     $dmn_bk_e_val
    ) = prep_tpl (
                  \%tag_hash,
                  $dmn_bk_b,
                  $dmn_bk_entry,
                  $dmn_bk_e
                 );
    
    return $rs if ($rs != 0);
    
    #
    # Creating working config data;
    #
    
    my ($sys, $working) = (undef, undef);
    
    
    ($rs, $working) = get_file($working_cfg);
    
    return $rs if ($rs != 0);
    
    
    ($rs, $rdata) = get_tag(
                            $dmn_bk_b_val, 
                            $dmn_bk_e_val, 
                            $working
                           );
    
    if ($rs == 0) {
        
        # We have one ! We must delete it because of possible future changes in this Domain Group Entry;
        
        ($rs, $working) = del_tag(
                                  $dmn_bk_b_val,
                                  "$dmn_bk_e_val\n",
                                  $working
                                 );
        
        return $rs if ($rs != 0);
        
    }
    
    ($rs, $rdata) = get_tag(
                            $dmn_bk_b, 
                            $dmn_bk_e, 
                            $working
                           );
    
    return $rs if ($rs != 0);
    
    $rs = store_file($working_cfg, $working, 'root', 'root', 0644);
    
    return $rs if ($rs != 0);
    
    #
    # Now we'll proceed system config;
    #
    
    $rs = sys_command_rs("$cmd_crontab -u root -l &> $backup_cfg");
    
    $rs = sys_command("$cmd_crontab -u root $working_cfg");
        
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_crontab_data()', 'Ending...');
    
    return 0;
    
}
    
#
# domain high level managment functions;
#

sub dmn_add_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_add_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_add_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_add_named_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_add_httpd_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_add_mta_data($dmn_data);
    
    return $rs if ($rs != 0);
    
#     $rs = dmn_add_crontab_data($dmn_data);
#     
#     return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_add_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_change_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_change_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_change_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_change_named_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_change_httpd_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_change_mta_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_change_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_del_data {
    
    my ($dmn_data) = @_;
    
    my $rs = undef;
    
    push_el(\@main::el, 'dmn_del_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_del_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }
    
    $rs = dmn_del_named_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_del_httpd_data($dmn_data);
    
    return $rs if ($rs != 0);
    
    $rs = dmn_del_mta_data($dmn_data);
    
    return $rs if ($rs != 0);
    
#     $rs = dmn_del_crontab_data($dmn_data);
#     
#     return $rs if ($rs != 0);
    
    push_el(\@main::el, 'dmn_del_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_restore_data {
    
    my ($dmn_data) = @_;
    
    push_el(\@main::el, 'dmn_restore_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_restore_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }

    my ($rs, $rdata) = ('', '');

    my $dmn_name = @$dmn_data[1];

    my $www_dir = $main::cfg{'APACHE_WWW_DIR'};

    my $dmn_dir = "$www_dir/$dmn_name";

    my $dmn_bk_dir = "$www_dir/$dmn_name/backups";
    
    my $cmd_tar = $main::cfg{'CMD_TAR'};

    $rs = opendir(DIR, $dmn_bk_dir);

    if (!$rs) {
        
        push_el(\@main::el, 'dmn_restore_data()', "ERROR: Can't open '$dmn_bk_dir' directory.");
        
        return -1;
        
    }

    my @bk_files = readdir(DIR);

    closedir(DIR);

    shift(@bk_files);

    shift(@bk_files);

    return 0 if (scalar(@bk_files) == 0);

    my ($cmd, $fname) = ('', $bk_files[0]);

    $cmd = "$cmd_tar --extract --gzip --directory $dmn_dir --file $dmn_bk_dir/$fname";

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

    push_el(\@main::el, 'dmn_restore_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_enable_data {
    
    my ($dmn_data) = @_;
    
    push_el(\@main::el, 'dmn_enable_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_enable_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }

    my $dmn_name = @$dmn_data[1];

    my $www_dir = $main::cfg{'APACHE_WWW_DIR'};

    my $dmn_dir = "$www_dir/$dmn_name";
    
    my $dmn_disabled_dir = "$www_dir/$dmn_name.disabled";
    
    my $cmd_mv = $main::cfg{'CMD_MV'};
    
    my $cmd = "$cmd_mv $dmn_disabled_dir $dmn_dir";
    
    my $rs = sys_command($cmd);
    
    return $rs if ($rs != 0);

    push_el(\@main::el, 'dmn_enable_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_disable_data {
    
    my ($dmn_data) = @_;
    
    push_el(\@main::el, 'dmn_disable_data()', 'Starting...');
    
    if (!defined($dmn_data) || $dmn_data eq '') {
        
        push_el(\@main::el, 'dmn_disable_data()', 'ERROR: Undefined Input Data...');
        
        return -1;
        
    }

    my ($rs, $rdata) = ('', '');

    my $dmn_name = @$dmn_data[1];

    my $www_dir = $main::cfg{'APACHE_WWW_DIR'};

    my $dmn_dir = "$www_dir/$dmn_name";
    
    my $dmn_disabled_dir = "$www_dir/$dmn_name.disabled";
    
    my $cmd_mv = $main::cfg{'CMD_MV'};
    
    my $cmd = "$cmd_mv $dmn_dir $dmn_disabled_dir";
    
    $rs = sys_command($cmd);
    
    return $rs if ($rs != 0);

    push_el(\@main::el, 'dmn_disable_data()', 'Ending...');
    
    return 0;
    
}

sub dmn_mngr_engine {
    
    my ($rs, $rows, $rdata) = (undef, undef, undef);
    
    push_el(\@main::el, 'dmn_mngr_engine()', 'Starting...');
    
    
    my $sql = "select t1.*, t2.ip_number from domain as t1, server_ips as t2 where t1.domain_ip_id = t2.ip_id and t1.domain_id = $main::dmn_task_id";
    
    ($rs, $rows) = doSQL($sql);
    
    return $rs if ($rs != 0);
    
    
    push_el(\@main::el, 'dmn_mngr_engine()', "proceeding -> $sql");
    
    my $entry = @$rows[0];
    
    
    my ($dmn_status, $dmn_id, $dmn_admin_id) = (@$entry[13], @$entry[0], @$entry[4]);
    
    my $timestamp = undef;
    
    
    if ($dmn_status eq 'toadd') {
        
        $rs = dmn_add_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "update domain set domain_status='ok' where domain_id = $dmn_id";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update domain set domain_status='$sub_name | $msg' where domain_id = $dmn_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    } elsif ($dmn_status eq 'change') {
        
        # Changing domains;
        
        $rs = dmn_change_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "update domain set domain_status='ok' where domain_id = $dmn_id;";
            
            # PHP, CGI support for subdomains also must be changed;
           
            # $sql = "update subdomain set subdomain_status='change' where domain_id = $dmn_id;";
           
            # ($rs, $rdata) = doSQL($sql);
           
            # return $rs if ($rs != 0);
           
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update domain set domain_status='$sub_name | $msg' where domain_id = $dmn_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    } elsif ($dmn_status eq 'delete') {
        
        # Removing domains;
        
        $rs = dmn_del_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "delete from domain where domain_id = $dmn_id;";

            ($rs, $rdata) = doSQL($sql);

            return $rs if ($rs != 0);
            
            $sql = "delete from admin where admin_id = $dmn_admin_id;";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;

            $sql = "update domain set domain_status='$sub_name | $msg' where domain_id = $dmn_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    } elsif ($dmn_status eq 'restore') {
        
        # Changing domains;
        
        $rs = dmn_restore_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "update domain set domain_status='ok' where domain_id = $dmn_id;";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update domain set domain_status='$sub_name | $msg' where domain_id = $dmn_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    } elsif ($dmn_status eq 'toenable') {
        
        $rs = dmn_enable_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "update domain set domain_status='ok' where domain_id = $dmn_id;";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update domain set domain_status='$sub_name | $msg' where domain_id = $dmn_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    } elsif ($dmn_status eq 'todisable') {
        
        # Changing domains;
        
        $rs = dmn_disable_data($entry);
        
        $timestamp = time();
        
        if ($rs == 0) {
            
            $sql = "update domain set domain_status='disabled' where domain_id = $dmn_id;";
            
        } else {
            
            my ($sub_name, $msg) = split(/$main::el_sep/, pop_el(\@main::el));
            
            $msg =~ s/\'/\\\'/g;
            
            $sql = "update domain set domain_status='$sub_name | $msg' where domain_id = $dmn_id;";
            
        }
        
        ($rs, $rdata) = doSQL($sql);

        return $rs if ($rs != 0);
        
    }
    
    sleep(1);
    
    push_el(\@main::el, 'dmn_mngr_engine()', 'Ending...');
    
    return 0;
    
}

my $rs = undef;

$rs = dmn_mngr_start_up();

if ($rs != 0) {
    
    dump_el(\@main::el, $main::vhcs2_dmn_mngr_el);
    
    dmn_mngr_shut_down();
    
    exit 1;
    
}

$rs = dmn_mngr_engine();

if ($rs != 0) {
    
    dump_el(\@main::el, $main::vhcs2_dmn_mngr_el);
    
    dmn_mngr_shut_down();
    
    exit 1;
    
}

$rs = dmn_mngr_shut_down();

if ($rs != 0) {
    
    dump_el(\@main::el, $main::vhcs2_dmn_mngr_el);
    
    exit 1;
    
}

exit 0;

