root/trunk/engine/ispcp-dmn-mngr

Revision 1405, 95.4 kB (checked in by scitech, 5 days ago)

Fixed #837: AWStats password protection

Line 
1 #!/usr/bin/perl
2 # ispCP ω (OMEGA) a Virtual Hosting Control Panel
3 # Copyright (c) 2001-2006 by moleSoftware GmbH
4 # http://www.molesoftware.com
5 # Copyright (c) 2006-2008 by isp Control Panel
6 # http://isp-control.net
7 #
8 #
9 # License:
10 #    This program is free software; you can redistribute it and/or
11 #    modify it under the terms of the MPL Mozilla Public License
12 #    as published by the Free Software Foundation; either version 1.1
13 #    of the License, or (at your option) any later version.
14 #
15 #    This program is distributed in the hope that it will be useful,
16 #    but WITHOUT ANY WARRANTY; without even the implied warranty of
17 #    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 #    MPL Mozilla Public License for more details.
19 #
20 #    You may have received a copy of the MPL Mozilla Public License
21 #    along with this program.
22 #
23 #    An on-line copy of the MPL Mozilla Public License can be found
24 #    http://www.mozilla.org/MPL/MPL-1.1.html
25 #
26 #
27 # The ISPCP ω Home Page is at:
28 #
29 #    http://isp-control.net
30 #
31
32 use FindBin;
33 use lib "$FindBin::Bin/";
34 require 'ispcp_common_code.pl';
35 use strict;
36 use warnings;
37 use Net::LibIDN ':all';
38 $main::dmn_task_id = undef;
39
40 ################################################################################
41 ##                                SUBROUTINES                                 ##
42 ################################################################################
43 ##
44 ## Start Up!
45 ##
46 sub dmn_mngr_start_up {
47         my ($rs, $rdata) = (undef, undef);
48
49         push_el(\@main::el, 'dmn_mngr_start_up()', 'Starting...');
50
51         # checking for master process;
52         $rs = check_master();
53         return $rs if ($rs != 0);
54
55         # Let's clear Execution Logs, if any.
56         if (-e $main::ispcp_dmn_mngr_el) {
57                 $rs = del_file($main::ispcp_dmn_mngr_el);
58                 return $rs if ($rs != 0);
59         }
60
61         # config check;
62         $rs = get_conf();
63         return $rs if ($rs != 0);
64
65         # sql check;
66         #
67         # getting initial data also must be done here;
68         #
69         my $sql = "select admin_id from admin where admin_id = 1;";
70         ($rs, $rdata) = doSQL($sql);
71         return $rs if ($rs != 0);
72
73         #
74         # getting task id and domain record id;
75         #
76         $main::dmn_task_id = $ARGV[0];
77
78         push_el(\@main::el, 'dmn_mngr_start_up()', 'Ending...');
79         return 0;
80 }
81
82 ################################################################################
83 ##
84 ## Shut Down!
85 ##
86 sub dmn_mngr_shut_down {
87         return 0;
88 }
89
90 ###################################### DNS #####################################
91 ################################################################################
92 ##
93 ## Add DNS CFG Data
94 ##
95 sub dmn_add_named_cfg_data {
96         my ($dmn_data) = @_;
97         my ($rs, $rdata) = (undef, undef);
98
99         push_el(\@main::el, 'dmn_add_named_cfg_data()', 'Starting...');
100         if (!defined($dmn_data) || $dmn_data eq '') {
101                 push_el(\@main::el, 'dmn_add_named_cfg_data()', 'ERROR: Undefined Input Data...');
102                 return -1;
103         }
104
105         #
106         # Initial data we need;
107         #
108         my $dmn_name     = @$dmn_data[1];
109         my $conf_dir     = $main::cfg{'CONF_DIR'};
110         my $sys_cfg      = $main::cfg{'BIND_CONF_FILE'};
111         my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
112         my $tpl_dir      = "$conf_dir/bind/parts";
113         my $backup_dir   = "$conf_dir/bind/backup";
114         my $working_dir  = "$conf_dir/bind/working";
115         my $timestamp    = time;
116         my $backup_cfg   = "$backup_dir/named.conf.$timestamp";
117         my $working_cfg  = "$working_dir/named.conf";
118
119         #
120         #  BEGIN/END tags, and templates needed for this config;
121         #
122         my ($dta_b, $dta_e, $entry_b, $entry_e, $entry) = ('', '', '', '', '');
123         (
124                 $rs,
125                 $dta_b,
126                 $dta_e,
127                 $entry_b,
128                 $entry_e,
129                 $entry
130         ) = get_tpl(
131                 $tpl_dir,
132                 'cfg_dta_b.tpl',
133                 'cfg_dta_e.tpl',
134                 'cfg_entry_b.tpl',
135                 'cfg_entry_e.tpl',
136                 'cfg_entry.tpl'
137         );
138         return $rs if ($rs != 0);
139
140         #
141         # Let's construct needed tags and entries;
142         #
143         my %tag_hash = (
144                 '{DMN_NAME}' => $dmn_name,
145                 '{DB_DIR}'   => $named_db_dir
146         );
147         my ($entry_b_val, $entry_e_val, $entry_val) = ('', '', '');
148         (
149                 $rs,
150                 $entry_b_val,
151                 $entry_e_val,
152                 $entry_val
153         ) = prep_tpl(
154                 \%tag_hash,
155                 $entry_b,
156                 $entry_e,
157                 $entry
158         );
159         return $rs if ($rs != 0);
160
161         #
162         # Let's get System and Working config files;
163         #
164         my ($sys, $working) = ('', '');
165
166         ($rs, $sys) = get_file($sys_cfg);
167         return $rs  if ($rs != 0);
168
169         ($rs, $working) = get_file($working_cfg);
170         return $rs  if ($rs != 0);
171
172         ($rs, $rdata) = get_tag($dta_b, $dta_e, $working);
173         return $rs if ($rs != 0);
174
175         #
176         # Does the new domain entry exists ?
177         #
178         ($rs, $rdata) = get_tag($entry_b_val, $entry_e_val, $working);
179         if ($rs == 0) {
180                 # Yes it exists ! Then we must delete it !
181                 ($rs, $working) = del_tag($entry_b_val, "$entry_e_val\n", $working);
182                 return $rs if ($rs != 0);
183         }
184         ($rs, $rdata) = get_tag($entry_b, $entry_e, $working);
185         return $rs if ($rs != 0);
186
187         #
188         # Let's construct the replacement and do it;
189         #
190         my $entry_repl = "$entry_b_val$entry_val$entry_e_val\n$entry_b$entry_e";
191         ($rs, $working) = repl_tag($entry_b, $entry_e, $working, $entry_repl, "dmn_add_named_cfg_data");
192         return $rs if ($rs != 0);
193
194         #
195         # Here we'll backup production config file;
196         #
197         $rs = sys_command("$main::cfg{'CMD_CP'} -p $sys_cfg $backup_cfg");
198         return $rs if ($rs != 0);
199
200         #
201         # Let's save working copy;
202         #
203         $rs = store_file($working_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
204         return $rs if ($rs != 0);
205
206         #
207         # Here we'll replace data in production config file with data in working
208         # confing file. A little workaround will be done. If working copy data does not exist
209         # in production config then we will add it;
210         #
211         ($rs, $rdata) = get_tag($dta_b, $dta_e, $sys);
212         if ($rs == 0) { # YES ! Data is here ! /in production config file/;
213                 ($rs, $sys) = repl_tag($dta_b, $dta_e, $sys, $working, "dmn_add_named_cfg_data");
214                 return $rs if ($rs != 0);
215                 } elsif ($rs == -5) {
216                 $sys .= $working;
217         } else {
218                 return $rs;
219         }
220         $rs = store_file($sys_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
221         return $rs if ($rs != 0);
222
223         push_el(\@main::el, 'dmn_add_named_cfg_data()', 'Ending...');
224         return 0;
225 }
226
227 ################################################################################
228 ##
229 ## Delete DNS CFG Data
230 ##
231 sub dmn_del_named_cfg_data {
232         my ($dmn_data) = @_;
233         my ($rs, $rdata) = (undef, undef);
234
235         push_el(\@main::el, 'dmn_del_named_cfg_data()', 'Starting...');
236         if (!defined($dmn_data) || $dmn_data eq '') {
237                 push_el(\@main::el, 'dmn_del_named_cfg_data()', 'ERROR: Undefined Input Data...');
238                 return -1;
239         }
240
241         #
242         # Initial data we need;
243         #
244         my $dmn_name     = @$dmn_data[1];
245         my $conf_dir     = $main::cfg{'CONF_DIR'};
246         my $sys_cfg      = $main::cfg{'BIND_CONF_FILE'};
247         my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
248         my $tpl_dir      = "$conf_dir/bind/parts";
249         my $backup_dir   = "$conf_dir/bind/backup";
250         my $working_dir  = "$conf_dir/bind/working";
251         my $timestamp    = time;
252         my $backup_cfg   = "$backup_dir/named.conf.$timestamp";
253         my $working_cfg  = "$working_dir/named.conf";
254
255         #
256         #  BEGIN/END tags, and templates needed for this config;
257         #
258         my ($dta_b, $dta_e, $entry_b, $entry_e, $entry) = ('', '', '', '', '');
259         (
260                 $rs,
261                 $dta_b,
262                 $dta_e,
263                 $entry_b,
264                 $entry_e,
265                 $entry
266         ) = get_tpl(
267                 $tpl_dir,
268                 'cfg_dta_b.tpl',
269                 'cfg_dta_e.tpl',
270                 'cfg_entry_b.tpl',
271                 'cfg_entry_e.tpl',
272                 'cfg_entry.tpl'
273         );
274         return $rs if ($rs != 0);
275
276         #
277         # Let's construct needed tags and entries;
278         #
279         my %tag_hash = (
280                 '{DMN_NAME}' => $dmn_name,
281                 '{DB_DIR}'   => $named_db_dir
282         );
283         my ($entry_b_val, $entry_e_val, $entry_val) = ('', '', '');
284         (
285                 $rs,
286                 $entry_b_val,
287                 $entry_e_val,
288                 $entry_val
289         ) = prep_tpl(
290                 \%tag_hash,
291                 $entry_b,
292                 $entry_e,
293                 $entry
294         );
295         return $rs if ($rs != 0);
296
297         #
298         # Let's get Sytem and Working config files;
299         #
300         my ($sys, $working) = ('', '');
301
302         ($rs, $sys) = get_file($sys_cfg);
303         return $rs  if ($rs != 0);
304
305         ($rs, $working) = get_file($working_cfg);
306         return $rs  if ($rs != 0);
307
308         ($rs, $rdata) = get_tag($dta_b, $dta_e, $working);
309         return $rs if ($rs != 0);
310
311         #
312         # Does the new domain entry exists ?
313         #
314         ($rs, $rdata) = get_tag($entry_b_val, $entry_e_val, $working);
315         if ($rs == 0) {
316                 # Yes it exists ! Then we must delete it !
317                 ($rs, $working) = del_tag($entry_b_val, "$entry_e_val\n", $working);
318                 return $rs if ($rs != 0);
319         }
320         ($rs, $rdata) = get_tag($entry_b, $entry_e, $working);
321         return $rs if ($rs != 0);
322
323         #
324         # Let's construct the replacement and do it;
325         #
326         #
327         #my $entry_repl = "$entry_b_val$entry_val$entry_e_val\n$entry_b$entry_e";
328         #
329         #($rs, $working) = repl_tag($entry_b, $entry_e, $working, $entry_repl);
330         #
331         #return $rs if ($rs != 0);
332         #
333         #
334         # Here we'll backup production config file;
335         #
336         $rs = sys_command("$main::cfg{'CMD_CP'} -p $sys_cfg $backup_cfg");
337         return $rs if ($rs != 0);
338
339         #
340         # Let's save working copy;
341         #
342         $rs = store_file($working_cfg, $working, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
343         return $rs if ($rs != 0);
344
345         #
346         # Here we'll replace data in production config file with data in working
347         # confing file. A little workaround will be done. If working copy data does not exist
348         # in production config then we will add it;
349         #
350         ($rs, $rdata) = get_tag($dta_b, $dta_e, $sys);
351         if ($rs == 0) { # YES ! Data is here ! /in production config file/;
352                 ($rs, $sys) = repl_tag($dta_b, $dta_e, $sys, $working, "dmn_del_named_cfg_data");
353                 return $rs if ($rs != 0);
354                 } elsif ($rs == -5) {
355                 $sys .= $working;
356         } else {
357                 return $rs;
358         }
359         $rs = store_file($sys_cfg, $sys, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
360         return $rs if ($rs != 0);
361
362         push_el(\@main::el, 'dmn_del_named_cfg_data()', 'Ending...');
363         return 0;
364 }
365
366 ################################################################################
367 ##
368 ## Add DNS DB Data
369 ##
370 sub dmn_add_named_db_data {
371         my ($dmn_data) = @_;
372         my ($rs, $rdata) = (undef, undef);
373
374         push_el(\@main::el, 'dmn_add_named_db_data()', 'Starting...');
375         if (!defined($dmn_data) || $dmn_data eq '') {
376                 push_el(\@main::el, 'dmn_add_named_db_data()', 'ERROR: Undefined Input Data...');
377                 return -1;
378         }
379
380         #
381         # Initial data we need;
382         #
383         my $dmn_name     = @$dmn_data[1];
384         my $dmn_ip       = @$dmn_data[21];
385         my $conf_dir     = $main::cfg{'CONF_DIR'};
386         my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
387         my $base_svr_ip  = $main::cfg{'BASE_SERVER_IP'};
388         my $sec_dns_ip   = $main::cfg{'SECONDARY_DNS'};
389
390         #
391         # Any secondary DNS defined;
392         #
393         if (!$sec_dns_ip) {
394                 $sec_dns_ip = $base_svr_ip;
395         }
396
397         my $tpl_dir     = "$conf_dir/bind/parts";
398         my $backup_dir  = "$conf_dir/bind/backup";
399         my $working_dir = "$conf_dir/bind/working";
400         my $db_fname    = "$dmn_name.db";
401         my $sys_cfg     = "$named_db_dir/$db_fname";
402         my $working_cfg = "$working_dir/$db_fname";
403
404         #
405         # Let's get needed tags and templates;
406         #
407         my ($entry, $dns2_b, $dns2_e) = ('', '', '');
408         ($rs, $entry, $dns2_b, $dns2_e) = get_tpl(
409                 $tpl_dir,
410                 'db_e.tpl',
411                 'db_dns2_b.tpl',
412                 'db_dns2_e.tpl'
413         );
414         return $rs if ($rs != 0);
415
416         my $seq = 0;
417
418         #
419         # RFC 1912
420         #
421         my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
422         my $time2 = sprintf "%4d%02d%02d00",$year+1900,$mon+1,$mday,$seq;
423
424         #
425         # Let's prepare them;
426         #
427         my %tag_hash = (
428                 '{DMN_NAME}'            => $dmn_name,
429                 '{DMN_IP}'              => $dmn_ip,
430                 '{BASE_SERVER_IP}'      => $base_svr_ip,
431                 '{SECONDARY_DNS_IP}'    => $sec_dns_ip,
432                 '{TIMESTAMP}'           => $time2
433         );
434         ($rs, $entry, $dns2_b, $dns2_e) = prep_tpl(
435                 \%tag_hash,
436                 $entry,
437                 $dns2_b,
438                 $dns2_e
439         );
440         return $rs if ($rs != 0);
441
442         #if ($main::cfg{'SECONDARY_DNS'}) {
443         #    my $dns2 = undef;
444         #    $dns2 = "\t\t \t NS \t $main::cfg{'SECONDARY_DNS'}.\n";
445         #    $dns2 = "$dns2_b$dns2$dns2_e";
446         #    ($rs, $entry) = repl_tag($dns2_b, $dns2_e, $entry, $dns2);
447         #    return $rs if ($rs != 0);
448         #} else {
449         #   ($rs, $entry) = del_tag($dns2_b, $dns2_e, $entry);
450         #    return $rs if ($rs != 0);
451         #}
452         #
453         # Let's store generated data;
454         #
455         $rs = store_file($working_cfg, $entry, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
456         return $rs if ($rs != 0);
457
458         $rs = store_file($sys_cfg, $entry, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
459         return $rs if ($rs != 0);
460
461         push_el(\@main::el, 'dmn_add_named_db_data()', 'Ending...');
462         return 0;
463 }
464
465 ################################################################################
466 ##
467 ## Delete DNS DB Data
468 ##
469 sub dmn_del_named_db_data {
470         my ($dmn_data) = @_;
471         my ($rs, $rdata) = (undef, undef);
472
473         push_el(\@main::el, 'dmn_del_named_db_data()', 'Starting...');
474         if (!defined($dmn_data) || $dmn_data eq '') {
475                 push_el(\@main::el, 'dmn_del_named_db_data()', 'ERROR: Undefined Input Data...');
476                 return -1;
477         }
478
479         #
480         # Initial data we need;
481         #
482         my $dmn_name     = @$dmn_data[1];
483         my $dmn_ip       = @$dmn_data[21];
484         my $conf_dir     = $main::cfg{'CONF_DIR'};
485         my $named_db_dir = $main::cfg{'BIND_DB_DIR'};
486         my $tpl_dir      = "$conf_dir/bind/parts";
487         my $backup_dir   = "$conf_dir/bind/backup";
488         my $working_dir  = "$conf_dir/bind/working";
489         my $db_fname     = "$dmn_name.db";
490         my $sys_cfg      = "$named_db_dir/$db_fname";
491         my $working_cfg  = "$working_dir/$db_fname";
492
493         #
494         # Let's remove .db files for this domain;
495         #
496         $rs = del_file($working_cfg);
497         return $rs if ($rs != 0);
498
499         $rs = del_file($sys_cfg);
500         return $rs if ($rs != 0);
501
502         push_el(\@main::el, 'dmn_del_named_db_data()', 'Ending...');
503         return 0;
504 }
505
506 ################################################################################
507 ##
508 ## Add DNS Data
509 ##
510 sub dmn_add_named_data {
511         my ($dmn_data) = @_;
512         my $rs = undef;
513
514         push_el(\@main::el, 'dmn_add_named_data()', 'Starting...');
515         if (!defined($dmn_data) || $dmn_data eq '') {
516                 push_el(\@main::el, 'dmn_add_named_data()', 'ERROR: Undefined Input Data...');
517                 return -1;
518         }
519         return 0 if ($main::cfg{'CMD_NAMED'} eq 'no');
520
521         $rs = dmn_add_named_cfg_data($dmn_data);
522         return $rs if ($rs != 0);
523
524         $rs = dmn_add_named_db_data($dmn_data);
525         return $rs if ($rs != 0);
526
527         push_el(\@main::el, 'dmn_add_named_data()', 'Ending...');
528         return 0;
529 }
530
531 ################################################################################
532 ##
533 ## Change DNS Data
534 ##
535 sub dmn_change_named_data {
536         my ($dmn_data) = @_;
537         my $rs = undef;
538
539         push_el(\@main::el, 'dmn_change_named_data()', 'Starting...');
540         if (!defined($dmn_data) || $dmn_data eq '') {
541                 push_el(\@main::el, 'dmn_change_named_data()', 'ERROR: Undefined Input Data...');
542                 return -1;
543         }
544
545         $rs = dmn_add_named_data($dmn_data);
546         return $rs if ($rs != 0);
547
548         push_el(\@main::el, 'dmn_change_named_data()', 'Ending...');
549         return 0;
550 }
551
552 ################################################################################
553 ##
554 ## Delete DNS Data
555 ##
556 sub dmn_del_named_data {
557         my ($dmn_data) = @_;
558         my $rs = undef;
559
560         push_el(\@main::el, 'dmn_del_named_data()', 'Starting...');
561         if (!defined($dmn_data) || $dmn_data eq '') {
562                 push_el(\@main::el, 'dmn_del_named_data()', 'ERROR: Undefined Input Data...');
563                 return -1;
564         }
565
566         return 0 if ($main::cfg{'CMD_NAMED'} eq 'no');
567
568         $rs = dmn_del_named_cfg_data($dmn_data);
569         return $rs if ($rs != 0);
570
571         $rs = dmn_del_named_db_data($dmn_data);
572         return $rs if ($rs != 0);
573
574         push_el(\@main::el, 'dmn_del_named_data()', 'Ending...');
575         return 0;
576 }
577
578 ##################################### HTTPd ####################################
579 ################################################################################
580 ##
581 ## Generate Auto Number
582 ##
583 sub get_auto_num {
584         my ($rs, $num, $rdata) = (undef, undef, undef);
585
586         push_el(\@main::el, 'get_auto_num()', 'Starting...');
587
588         my $sql = "insert into auto_num (msg) values ('auto-num')";
589         ($rs, $rdata) = doSQL($sql);
590         return $rs if ($rs != 0);
591
592         $num = $main::db -> {'mysql_insertid'};
593         push_el(\@main::el, 'get_auto_num()', 'Ending...');
594
595         return $num;            # FIXME (ispcomm): close will be never reached!
596         close('db');
597 }
598
599 ################################################################################
600 ##
601 ## Generate HTTPd Domain Group Entry
602 ##
603 sub gen_httpd_dmn_group_entry {
604         my ($dmn_data) = @_;
605
606         push_el(\@main::el, 'gen_httpd_dmn_group_entry()', 'Starting...');
607         if (!defined($dmn_data) || $dmn_data eq '') {
608                 push_el(\@main::el, 'gen_httpd_dmn_group_entry()', "ERORR: Undefined input data...");
609                 return (-1, '');
610         }
611
612         my ($rs, $rdata)        = (undef, undef);
613         my $dmn_id              = @$dmn_data[0];
614         my $dmn_name            = @$dmn_data[1];
615         my $dmn_grp             = $dmn_name;
616         my $dmn_ip              = @$dmn_data[21];
617         my $dmn_traffic_limit   = @$dmn_data[10];
618         my ($dmn_php, $dmn_cgi) = (@$dmn_data[19], @$dmn_data[20]);
619         my $conf_dir            = $main::cfg{'CONF_DIR'};
620         my $tpl_dir             = "$conf_dir/apache/parts";
621         my $bw_disabled         = '';
622
623         if ($dmn_traffic_limit eq 0) {
624                 $bw_disabled = '#';
625         }
626
627         my (
628                 $dg_b,
629                 $dg_entry,
630                 $dg_e,
631                 $dmn_b,
632                 $dmn_entry,
633                 $dmn_e,
634                 $dmn_cgi_b,
635                 $dmn_cgi_entry,
636                 $dmn_cgi_e,
637                 $dmn_php_b,
638                 $dmn_php_entry,
639                 $dmn_php_e,
640                 $dmn_php2_b,
641                 $dmn_php2_entry,
642                 $dmn_php2_e,
643                 $dmn_awstats_b,
644                 $dmn_awstats_dynamic_entry,
645                 $dmn_awstats_static_entry,
646                 $dmn_awstats_e,
647                 $dmn_custom
648         ) = ('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '');
649         (
650                 $rs,
651                 $dg_b,
652                 $dg_entry,
653                 $dg_e,
654                 $dmn_b,
655                 $dmn_entry,
656                 $dmn_e,
657                 $dmn_cgi_b,
658                 $dmn_cgi_entry,
659                 $dmn_cgi_e,
660                 $dmn_php_b,
661                 $dmn_php_entry,
662                 $dmn_php_e,
663                 $dmn_php2_b,
664                 $dmn_php2_entry,
665                 $dmn_php2_e,
666                 $dmn_awstats_b,
667                 $dmn_awstats_dynamic_entry,
668                 $dmn_awstats_static_entry,
669                 $dmn_awstats_e,
670                 $dmn_custom
671         ) = get_tpl (
672                 $tpl_dir,
673                 'dg_b.tpl',
674                 'dg_entry.tpl',
675                 'dg_e.tpl',
676                 'dmn_b.tpl',
677                 'dmn_entry.tpl',
678                 'dmn_e.tpl',
679                 'dmn_cgi_b.tpl',
680                 'dmn_cgi_entry.tpl',
681                 'dmn_cgi_e.tpl',
682                 'dmn_php_b.tpl',
683                 'dmn_php_entry.tpl',
684                 'dmn_php_e.tpl',
685                 'dmn_php2_b.tpl',
686                 'dmn_php2_entry.tpl',
687                 'dmn_php2_e.tpl',
688                 'dmn_awstats_b.tpl',
689                 'dmn_awstats_dynamic_entry.tpl',
690                 'dmn_awstats_static_entry.tpl',
691                 'dmn_awstats_e.tpl',
692                 'custom.conf.tpl'
693         );
694         return ($rs, '') if ($rs != 0);
695
696         my ($suexec_uid, $suexec_gid)    = get_dmn_suexec_user($dmn_id);
697         my $suexec_user_pref             = $main::cfg{'APACHE_SUEXEC_USER_PREF'};
698         my ($suexec_user, $suexec_group) = ("$suexec_user_pref$suexec_uid", "$suexec_user_pref$suexec_gid");
699         my %tag_hash =
700         (
701                 '{DMN_GRP}'                   => $dmn_grp,
702                 '{DMN_NAME}'                  => $dmn_name,
703                 '{SELF}'                      => $dmn_name,
704                 '{DMN_IP}'                    => $dmn_ip,
705                 '{BASE_SERVER_VHOST}'         => $main::cfg{'BASE_SERVER_VHOST'},
706                 '{WWW_DIR}'                   => $main::cfg{'APACHE_WWW_DIR'},
707                 '{STARTER_DIR}'               => $main::cfg{'PHP_STARTER_DIR'},
708                 '{PHP_VERSION}'               => $main::cfg{'PHP_VERSION'},
709                 '{APACHE_LOG_DIR}'            => $main::cfg{'APACHE_LOG_DIR'},
710                 '{GUI_ROOT_DIR}'              => $main::cfg{'GUI_ROOT_DIR'},
711                 '{SCOREBOARDS_DIR}'           => $main::cfg{'SCOREBOARDS_DIR'},
712                 '{PEAR_DIR}'                  => $main::cfg{'PEAR_DIR'},
713                 '{APACHE_USERS_LOG_DIR}'      => $main::cfg{'APACHE_USERS_LOG_DIR'},
714                 '{CUSTOM_SITES_CONFIG_DIR}'   => $main::cfg{'APACHE_CUSTOM_SITES_CONFIG_DIR'},
715                
716                 '{AWSTATS_GROUP_AUTH}'        => $main::cfg{'AWSTATS_GROUP_AUTH'},
717                 '{HTACCESS_USERS_FILE_NAME}'  => $main::cfg{'HTACCESS_USERS_FILE_NAME'},
718                 '{HTACCESS_GROUPS_FILE_NAME}' => $main::cfg{'HTACCESS_GROUPS_FILE_NAME'},
719                
720                 '{SUEXEC_USER}'               => $suexec_user,
721                 '{SUEXEC_GROUP}'              => $suexec_group,
722                 '{BWLIMIT}'                   => $dmn_traffic_limit,
723                 '{BWLIMIT_DISABLED}'          => $bw_disabled,
724                 '##TEMPLATE'                  => ''                     #Used to prevent apache from parsing commands which are part of the template
725         );
726         (
727                 $rs,
728                 $dg_b,
729                 $dg_entry,
730                 $dg_e,
731                 $dmn_b,
732                 $dmn_entry,
733                 $dmn_e,
734                 $dmn_cgi_b,
735                 $dmn_cgi_entry,
736                 $dmn_cgi_e,
737                 $dmn_php_b,
738                 $dmn_php_entry,
739                 $dmn_php_e,
740                 $dmn_php2_entry,
741                 $dmn_awstats_dynamic_entry,
742                 $dmn_awstats_static_entry,
743                 $dmn_custom
744         ) = prep_tpl(
745                 \%tag_hash,
746                 $dg_b,
747                 $dg_entry,
748                 $dg_e,
749                 $dmn_b,
750                 $dmn_entry,
751                 $dmn_e,
752                 $dmn_cgi_b,
753                 $dmn_cgi_entry,
754                 $dmn_cgi_e,
755                 $dmn_php_b,
756                 $dmn_php_entry,
757                 $dmn_php_e,
758                 $dmn_php2_entry,
759                 $dmn_awstats_dynamic_entry,
760                 $dmn_awstats_static_entry,
761                 $dmn_custom
762         );
763         return ($rs, '') if ($rs != 0);
764
765         #
766         # Add AWStats data
767         #
768         my $awstats_entry = undef;
769
770         # AWStats Dynamic
771         if ($main::cfg{'AWSTATS_ACTIVE'} eq 'yes' && $main::cfg{'AWSTATS_MODE'} eq 0) {
772                         $awstats_entry = "$dmn_awstats_b\n$dmn_awstats_dynamic_entry\n$dmn_awstats_e";
773         } elsif ($main::cfg{'AWSTATS_ACTIVE'} eq 'yes' && $main::cfg{'AWSTATS_MODE'} eq 1) {
774                 # AWStats Static
775                 $awstats_entry = "$dmn_awstats_b\n$dmn_awstats_static_entry\n$dmn_awstats_e";
776         } else {
777                 # No AWStats
778                 $awstats_entry = "$dmn_awstats_b\n$dmn_awstats_e";
779         }
780         ($rs, $dmn_entry) = repl_tag(
781                 $dmn_awstats_b,
782                 $dmn_awstats_e,
783                 $dmn_entry,
784                 $awstats_entry,
785                 "gen_httpd_dmn_group_entry"
786         );
787         return ($rs, '') if ($rs != 0);
788
789         my $cgi_entry = undef;
790         if ($dmn_cgi eq 'yes') {
791                 $cgi_entry = "$dmn_cgi_b$dmn_cgi_entry$dmn_cgi_e";
792         } else {
793                 $cgi_entry = "$dmn_cgi_b$dmn_cgi_e";
794         }
795         ($rs, $dmn_entry) = repl_tag(
796                 $dmn_cgi_b,
797                 $dmn_cgi_e,
798                 $dmn_entry,
799                 $cgi_entry,
800                 "gen_httpd_dmn_group_entry"
801         );
802         return ($rs, '') if ($rs != 0);
803
804         my $php_entry = undef;
805         if ($dmn_php eq 'no') {
806                 $php_entry = "$dmn_php_b$dmn_php_entry$dmn_php_e";
807         } else {
808                 $php_entry        = "$dmn_php_b$dmn_php_e";
809                 my $php2_entry    = "$dmn_php2_b$dmn_php2_entry$dmn_php2_e";
810                 ($rs, $dmn_entry) = repl_tag(
811                 $dmn_php2_b,
812                 $dmn_php2_e,
813                 $dmn_entry,
814                 $php2_entry,
815                 "gen_httpd_dmn_group_entry"
816                 );
817                 return ($rs, '') if ($rs != 0);
818         }
819         ($rs, $dmn_entry) = repl_tag(
820                 $dmn_php_b,
821                 $dmn_php_e,
822                 $dmn_entry,
823                 $php_entry,
824                 "gen_httpd_dmn_group_entry"
825         );
826         return ($rs, '') if ($rs != 0);
827
828         push_el(\@main::el, 'gen_httpd_dmn_group_entry()', "dmn_entry:\n$dmn_entry");
829
830         my $dmn_group_entry = "$dmn_b$dmn_entry$dmn_e";
831         ($rs, $dg_entry) = repl_tag(
832                 $dmn_b,
833                 $dmn_e,
834                 $dg_entry,
835                 $dmn_group_entry,
836                 "gen_httpd_dmn_group_entry"
837         );
838
839         #
840         # Create mod_cband scoreboard for domain group
841         #
842         my $scoreboard_file = "$main::cfg{'SCOREBOARDS_DIR'}/$dmn_grp";
843         $rs = sys_command_rs("$main::cfg{'CMD_TOUCH'} $scoreboard_file");
844         return $rs if ($rs != 0);
845
846         $rs = sys_command_rs("$main::cfg{'CMD_CHOWN'} $main::cfg{'APACHE_USER'}:$main::cfg{'APACHE_GROUP'} $scoreboard_file");
847         return $rs if ($rs != 0);
848
849         #
850         # Custom domain config file
851         #
852         if ( ! -e "$main::cfg{'APACHE_CUSTOM_SITES_CONFIG_DIR'}/$dmn_name.conf" ){
853                         $rs = store_file("$main::cfg{'APACHE_CUSTOM_SITES_CONFIG_DIR'}/$dmn_name.conf", $dmn_custom, $main::cfg{'ROOT_USER'}, $main::cfg{'ROOT_GROUP'}, 0644);
854                         return $rs if ($rs != 0);
855         }
856
857         push_el(\@main::el, 'gen_httpd_dmn_group_entry()', "\n$dg_entry");
858         return (0,  $dg_entry);
859 }
860
861 ################################################################################
862 ##
863 ## Add HTTPd CFG Data
864 ##
865 sub dmn_add_httpd_cfg_data {
866         my ($dmn_data)   = @_;
867         my ($rs, $rdata) = (undef, undef);
868
869         push_el(\@main::el, 'dmn_add_httpd_cfg_data()', 'Starting...');
870         if (!defined($dmn_data) || $dmn_data eq '') {
871                 push_el(\@main::el, 'dmn_add_httpd_cfg_data()', 'ERROR: Undefined Input Data...');
872                 return -1;
873         }
874
875         my $dmn_name    = @$dmn_data[1];
876         my $dmn_grp     = $dmn_name;
877         my $dmn_id      = @$dmn_data[0];
878         my $dmn_ip      = @$dmn_data[21];
879         my $conf_dir    = $main::cfg{'CONF_DIR'};
880         my $tpl_dir     = "$conf_dir/apache/parts";
881         my $working_dir = "$conf_dir/apache/working";
882         my $backup_dir  = "$conf_dir/apache/backup";
883         my $sys_cfg     = "$main::cfg{'APACHE_SITES_DIR'}/ispcp.conf";
884         my $working_cfg = "$working_dir/ispcp.conf";
885
886         if (!(-e $working_cfg)) {
887                 my $ispcp_base_tpl;
888
889                 ($rs, $ispcp_base_tpl) = get_file($tpl_dir."/ispcp_base.tpl");
890                 return $rs if ($rs != 0);
891
892                 ($rs, $rdata) = store_file(
893                         $working_cfg,
894                         $ispcp_base_tpl,
895                         "root",
896                         "root",
897                         0600
898                 );
899                 return $rs if ($rs != 0);
900         }
901
902         my $timestamp = time;
903         my $backup_cfg = "$backup_dir/httpd.conf.$timestamp";
904
905         #
906         # Getting needed templates;
907         #
908         my (
909                 $cfg_b,
910                 $cfg_e,
911                 $vh_b,
912                 $vh_entry,
913                 $vh_e,
914                 $dg_b,
915                 $dg_e
916         ) = ('', '', '', '', '', '', '');
917         (
918                 $rs,
919                 $cfg_b,
920                 $cfg_e,
921                 $vh_b,
922                 $vh_entry,
923                 $vh_e,
924                 $dg_b,
925                 $dg_e
926         ) = get_tpl (
927                 $tpl_dir,
928                 'cfg_b.tpl',
929                 'cfg_e.tpl',
930                 'vh_b.tpl',
931                 'vh_entry.tpl',
932                 'vh_e.tpl',
933                 'dg_b.tpl',
934                 'dg_e.tpl'
935         );
936         return $rs if ($rs != 0);
937
938         #
939         # Create apache suexec user for this domain.
940         #
941         $rs = add_dmn_suexec_user($dmn_data);
942         return $rs if ($rs != 0);
943
944         #
945         # Preparing templates;
946         #
947         my (
948                 $vh_b_val,
949                 $vh_entry_val,
950                 $vh_e_val,
951                 $dg_b_val,
952                 $dg_e_val
953         ) = ('', '', '', '', '');
954         my %tag_hash = ('{IP}' => $dmn_ip);
955
956         ($rs, $vh_entry_val) = prep_tpl (\%tag_hash, $vh_entry);
957         return $rs if ($rs != 0);
958
959         %tag_hash = (
960                 '{IP}' => $dmn_ip,
961                 '{DMN_GRP}' => $dmn_grp
962         );
963         (
964                 $rs,
965                 $vh_b_val,
966                 $vh_e_val,
967                 $dg_b_val,
968                 $dg_e_val
969         ) = prep_tpl (
970                 \%tag_hash,
971                 $vh_b,
972                 $vh_e,
973                 $dg_b,
974                 $dg_e
975         );
976         return $rs if ($rs != 0);
977         #
978         # Let's get some configs;
979         #
980         my ($sys, $working) = ('', '');
981
982         ($rs, $sys) = get_file($sys_cfg);
983         return $rs if ($rs != 0);
984
985         ($rs, $working) = get_file($working_cfg);
986         return $rs if ($rs != 0);
987
988         #
989         # Check for $cfg_b, $cfg_e in working config;
990         #
991         ($rs, $rdata) = get_tag($cfg_b, $cfg_e, $working);
992         return $rs if ($rs != 0);
993
994         #
995         # Check for $vh_b_val, $vh_e_val in working config; Have we such Virtual Host Entry in working config;
996         #
997         ($rs, $rdata) = get_tag($vh_b_val, $vh_e_val, $working);
998         if ($rs == -5) { # No, we have not! We must add it here !
999                 my $repl = undef;
1000                 $repl = "$vh_b_val$vh_entry_val$vh_e_val\n";
1001                 $repl .= "$vh_b$vh_e";
1002                 ($rs, $working) = repl_tag(
1003                         $vh_b,
1004                         $vh_e,
1005                         $working,
1006                         $repl,
1007                         "dmn_add_httpd_cfg_data"
1008                 );
1009                 return $rs if ($rs != 0);
1010
1011                 ($rs, $rdata) = get_tag($vh_b_val, $vh_e_val, $working);
1012                 return $rs if ($rs != 0);
1013
1014                 push_el(\@main::el, 'dmn_add_httpd_cfg_data()', "working:\n$working");
1015         } elsif ($rs != 0) {
1016                 return $rs;
1017         }
1018
1019         #
1020         # Let's edit Virtual Host Entry;
1021         #
1022         my $vh_entry_contents = $rdata;
1023
1024         #
1025         # Check for valued Domain Group Entry in this Virtual Host Entry;
1026         #
1027         ($rs, $rdata) = get_tag(
1028                 $dg_b_val,
1029                 $dg_e_val,
1030                 $vh_entry_contents
1031         );
1032         if ($rs == 0) {
1033                 # We have one ! We must delete it because of possible future changes in this Domain Group Entry;
1034                 ($rs, $vh_entry_contents) = del_tag(
1035                         $dg_b_val,
1036                         "$dg_e_val\n",
1037                         $vh_entry_contents
1038                 );
1039                 return $rs if ($rs != 0);
1040         }
1041
1042         #