Ticket #1249: ispcp-dmn-mngr

File ispcp-dmn-mngr, 93.2 kB (added by ispcomm, 5 months ago)

the final result

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