Marius Burkard
2016-04-20 4569cae57f127afd093794310ccd290d2d9fdf36
commit | author | age
32d8e9 1 <?php
T 2
3 /*
4 Copyright (c) 2007, Till Brehm, projektfarm Gmbh
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without modification,
8 are permitted provided that the following conditions are met:
9
10     * Redistributions of source code must retain the above copyright notice,
11       this list of conditions and the following disclaimer.
12     * Redistributions in binary form must reproduce the above copyright notice,
13       this list of conditions and the following disclaimer in the documentation
14       and/or other materials provided with the distribution.
15     * Neither the name of ISPConfig nor the names of its contributors
16       may be used to endorse or promote products derived from this software without
17       specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 class installer_dist extends installer_base {
223c56 32     protected $mailman_group = 'mailman';
60b700 33     
MC 34     public function __construct() {
35         //** check apache modules */
36         $mods = getapachemodules();
37         if(in_array('authz_compat', $mods, true)) {
38             swriteln($inst->lng('    WARNING! You are using mod_authz_compat.'));
39             swriteln($inst->lng('    Please make sure that your apache config uses the new auth syntax:'));
40             swriteln($inst->lng('    <Directory />'));
41             swriteln($inst->lng('    Options None'));
42             swriteln($inst->lng('    AllowOverride None'));
43             swriteln($inst->lng('    Require all denied'));
44             swriteln($inst->lng('    </Directory>'."\n"));
45             
46             swriteln($inst->lng('    If it uses the old syntax (deny from all) ISPConfig would fail to work.'));
47         }
526b99 48     }
b1a6a5 49
32d8e9 50     function configure_postfix($options = '')
b1a6a5 51     {
b51c22 52         global $conf,$autoinstall;
32d8e9 53         $cf = $conf['postfix'];
T 54         $config_dir = $cf['config_dir'];
b1a6a5 55
32d8e9 56         if(!is_dir($config_dir)){
b1a6a5 57             $this->error("The postfix configuration directory '$config_dir' does not exist.");
MC 58         }
59
32d8e9 60         //* mysql-virtual_domains.cf
b1a6a5 61         $this->process_postfix_config('mysql-virtual_domains.cf');
32d8e9 62
T 63         //* mysql-virtual_forwardings.cf
b1a6a5 64         $this->process_postfix_config('mysql-virtual_forwardings.cf');
32d8e9 65
T 66         //* mysql-virtual_mailboxes.cf
b1a6a5 67         $this->process_postfix_config('mysql-virtual_mailboxes.cf');
32d8e9 68
T 69         //* mysql-virtual_email2email.cf
b1a6a5 70         $this->process_postfix_config('mysql-virtual_email2email.cf');
32d8e9 71
T 72         //* mysql-virtual_transports.cf
b1a6a5 73         $this->process_postfix_config('mysql-virtual_transports.cf');
32d8e9 74
T 75         //* mysql-virtual_recipient.cf
b1a6a5 76         $this->process_postfix_config('mysql-virtual_recipient.cf');
32d8e9 77
T 78         //* mysql-virtual_sender.cf
b1a6a5 79         $this->process_postfix_config('mysql-virtual_sender.cf');
32d8e9 80
03b633 81         //* mysql-virtual_sender_login_maps.cf
D 82         $this->process_postfix_config('mysql-virtual_sender_login_maps.cf');
83         
32d8e9 84         //* mysql-virtual_client.cf
b1a6a5 85         $this->process_postfix_config('mysql-virtual_client.cf');
MC 86
32d8e9 87         //* mysql-virtual_relaydomains.cf
b1a6a5 88         $this->process_postfix_config('mysql-virtual_relaydomains.cf');
MC 89
429dcf 90         //* mysql-virtual_relayrecipientmaps.cf
b1a6a5 91         $this->process_postfix_config('mysql-virtual_relayrecipientmaps.cf');
32d8e9 92
75722e 93         //* mysql-virtual_policy_greylist.cf
D 94         $this->process_postfix_config('mysql-virtual_policy_greylist.cf');
95
b1a6a5 96         //* postfix-dkim
MC 97         $full_file_name=$config_dir.'/tag_as_originating.re';
98         if(is_file($full_file_name)) {
99             copy($full_file_name, $config_dir.$configfile.'~');
100         }
101         wf($full_file_name, '/^/ FILTER amavis:[127.0.0.1]:10026');
ec5716 102
b1a6a5 103         $full_file_name=$config_dir.'/tag_as_foreign.re';
MC 104         if(is_file($full_file_name)) {
105             copy($full_file_name, $config_dir.$configfile.'~');
106         }
107         wf($full_file_name, '/^/ FILTER amavis:[127.0.0.1]:10024');
ec5716 108
32d8e9 109         //* Changing mode and group of the new created config files.
T 110         caselog('chmod o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null',
b1a6a5 111             __FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed');
MC 112         caselog('chgrp '.$cf['group'].' '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null',
113             __FILE__, __LINE__, 'chgrp on mysql-virtual_*.cf*', 'chgrp on mysql-virtual_*.cf* failed');
114
1ca823 115         if(!is_dir($cf['vmail_mailbox_base'])) mkdir($cf['vmail_mailbox_base']);
b1a6a5 116
32d8e9 117         //* Creating virtual mail user and group
fdb514 118         if(is_group($cf['vmail_groupname'])) {
T 119             $command = 'groupmod -g '.$cf['vmail_groupid'].' '.$cf['vmail_groupname'];
120             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
121         } else {
122             $command = 'groupadd -g '.$cf['vmail_groupid'].' '.$cf['vmail_groupname'];
123             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
124         }
b1a6a5 125
fdb514 126         if(is_user($cf['vmail_username'])) {
T 127             $command = 'usermod -g '.$cf['vmail_groupname'].' -u '.$cf['vmail_userid'].' -d '.$cf['vmail_mailbox_base'].' -s /bin/bash '.$cf['vmail_username'];
128             caselog("$command &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
129         } else {
130             $command = 'useradd -g '.$cf['vmail_groupname'].' -u '.$cf['vmail_userid'].' '.$cf['vmail_username'].' -d '.$cf['vmail_mailbox_base'].' -m';
131             caselog("$command &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
8f898a 132         }
b1a6a5 133
d2e848 134         if($cf['vmail_mailbox_base'] != '' && strlen($cf['vmail_mailbox_base']) >= 10 && $this->is_update === false) exec('chown -R '.$cf['vmail_username'].':'.$cf['vmail_groupname'].' '.$cf['vmail_mailbox_base']);
b1a6a5 135
b67344 136         //* These postconf commands will be executed on installation and update
2af58c 137         $server_ini_rec = $this->db->queryOneRecord("SELECT config FROM server WHERE server_id = ?", $conf['server_id']);
7b47c0 138         $server_ini_array = ini_to_array(stripslashes($server_ini_rec['config']));
T 139         unset($server_ini_rec);
140
141         //* If there are RBL's defined, format the list and add them to smtp_recipient_restrictions to prevent removeal after an update
142         $rbl_list = '';
143         if (@isset($server_ini_array['mail']['realtime_blackhole_list']) && $server_ini_array['mail']['realtime_blackhole_list'] != '') {
b1a6a5 144             $rbl_hosts = explode(",", str_replace(" ", "", $server_ini_array['mail']['realtime_blackhole_list']));
7b47c0 145             foreach ($rbl_hosts as $key => $value) {
T 146                 $rbl_list .= ", reject_rbl_client ". $value;
147             }
148         }
149         unset($rbl_hosts);
b1a6a5 150
75722e 151         //* If Postgrey is installed, configure it
D 152         $greylisting = '';
153         if($conf['postgrey']['installed'] == true) {
20f478 154             $greylisting = ', check_recipient_access mysql:/etc/postfix/mysql-virtual_policy_greylist.cf';
75722e 155         }
D 156         
20f478 157         $reject_sender_login_mismatch = '';
D 158         if(isset($server_ini_array['mail']['reject_sender_login_mismatch']) && ($server_ini_array['mail']['reject_sender_login_mismatch'] == 'y')) {
159             $reject_sender_login_mismatch = ', reject_authenticated_sender_login_mismatch';
160         }
161         unset($server_ini_array);
162         
b1a6a5 163         $postconf_placeholders = array('{config_dir}' => $config_dir,
MC 164             '{vmail_mailbox_base}' => $cf['vmail_mailbox_base'],
165             '{vmail_userid}' => $cf['vmail_userid'],
166             '{vmail_groupid}' => $cf['vmail_groupid'],
75722e 167             '{rbl_list}' => $rbl_list,
D 168             '{greylisting}' => $greylisting,
20f478 169             '{reject_slm}' => $reject_sender_login_mismatch,
75722e 170         );
20f478 171         
b1a6a5 172         $postconf_tpl = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_postfix.conf.master', 'tpl/opensuse_postfix.conf.master');
MC 173         $postconf_tpl = strtr($postconf_tpl, $postconf_placeholders);
174         $postconf_commands = array_filter(explode("\n", $postconf_tpl)); // read and remove empty lines
175
b67344 176         //* These postconf commands will be executed on installation only
T 177         if($this->is_update == false) {
b1a6a5 178             $postconf_commands = array_merge($postconf_commands, array(
MC 179                     'myhostname = '.$conf['hostname'],
180                     'mydestination = '.$conf['hostname'].', localhost, localhost.localdomain',
181                     'mynetworks = 127.0.0.0/8 [::1]/128'
182                 ));
b67344 183         }
b1a6a5 184
32d8e9 185         //* Create the header and body check files
T 186         touch($config_dir.'/header_checks');
187         touch($config_dir.'/mime_header_checks');
188         touch($config_dir.'/nested_header_checks');
189         touch($config_dir.'/body_checks');
b1a6a5 190
3f478f 191         //* Create the mailman files
T 192         if(!is_dir('/var/lib/mailman/data')) exec('mkdir -p /var/lib/mailman/data');
193         if(!is_file('/var/lib/mailman/data/aliases')) touch('/var/lib/mailman/data/aliases');
194         exec('postalias /var/lib/mailman/data/aliases');
195         if(!is_file('/var/lib/mailman/data/virtual-mailman')) touch('/var/lib/mailman/data/virtual-mailman');
196         exec('postmap /var/lib/mailman/data/virtual-mailman');
197         if(!is_file('/var/lib/mailman/data/transport-mailman')) touch('/var/lib/mailman/data/transport-mailman');
198         exec('/usr/sbin/postmap /var/lib/mailman/data/transport-mailman');
b1a6a5 199
32d8e9 200         //* Make a backup copy of the main.cf file
T 201         copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
b1a6a5 202
32d8e9 203         //* Executing the postconf commands
T 204         foreach($postconf_commands as $cmd) {
205             $command = "postconf -e '$cmd'";
206             caselog($command." &> /dev/null", __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
207         }
b1a6a5 208
MC 209         if(!stristr($options, 'dont-create-certs')) {
32d8e9 210             //* Create the SSL certificate
b04e82 211             if(AUTOINSTALL){
TB 212                 $command = 'cd '.$config_dir.'; '
213                     ."openssl req -new -subj '/C=".escapeshellcmd($autoinstall['ssl_cert_country'])."/ST=".escapeshellcmd($autoinstall['ssl_cert_state'])."/L=".escapeshellcmd($autoinstall['ssl_cert_locality'])."/O=".escapeshellcmd($autoinstall['ssl_cert_organisation'])."/OU=".escapeshellcmd($autoinstall['ssl_cert_organisation_unit'])."/CN=".escapeshellcmd($autoinstall['ssl_cert_common_name'])."' -outform PEM -out smtpd.cert -newkey rsa:4096 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509";
214             } else {
215                 $command = 'cd '.$config_dir.'; '
216                     .'openssl req -new -outform PEM -out smtpd.cert -newkey rsa:4096 -nodes -keyout smtpd.key -keyform PEM -days 3650 -x509';
217             }
32d8e9 218             exec($command);
b1a6a5 219
32d8e9 220             $command = 'chmod o= '.$config_dir.'/smtpd.key';
T 221             caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
222         }
b1a6a5 223
32d8e9 224         //** We have to change the permissions of the courier authdaemon directory to make it accessible for maildrop.
T 225         $command = 'chmod 755  /var/run/authdaemon.courier-imap';
226         caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
b1a6a5 227
bd5d26 228         //* Check maildrop service in posfix master.cf
FS 229         $regex = "/^maildrop   unix.*pipe flags=DRhu user=vmail argv=\\/usr\\/bin\\/maildrop -d ".$cf['vmail_username']." \\$\{extension} \\$\{recipient} \\$\{user} \\$\{nexthop} \\$\{sender}/";
32d8e9 230         $configfile = $config_dir.'/master.cf';
9c6782 231         if($this->get_postfix_service('maildrop', 'unix')) {
ea30e1 232             exec ("postconf -M maildrop.unix &> /dev/null", $out, $ret);
bd5d26 233             $change_maildrop_flags = @(preg_match($regex, $out[0]) && $out[0] !='')?false:true;
9c6782 234         } else {
bd5d26 235             $change_maildrop_flags = @(preg_match($regex, $configfile))?false:true;
FS 236         }
237         if ($change_maildrop_flags) {
238             //* Change maildrop service in posfix master.cf
239             if(is_file($config_dir.'/master.cf')) {
240                 copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
241             }
242             if(is_file($config_dir.'/master.cf~')) {
243                 chmod($config_dir.'/master.cf~', 0400);
244             }
245             $configfile = $config_dir.'/master.cf';
246             $content = rf($configfile);
247             $content =    str_replace('  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}',
248                         'flags=DRhu user='.$cf['vmail_username'].' argv=/usr/bin/maildrop -d '.$cf['vmail_username'].' ${extension} ${recipient} ${user} ${nexthop} ${sender}',
249                         $content);
250             $content =    str_replace('  flags=DRhu user=vmail argv=/usr/local/bin/maildrop -d ${recipient}',
251                         'flags=DRhu user='.$cf['vmail_username'].' argv=/usr/bin/maildrop -d '.$cf['vmail_username'].' ${extension} ${recipient} ${user} ${nexthop} ${sender}',
252                         $content);
253         }
fdb514 254         // enable tlsmanager
b1a6a5 255         $content = str_replace('#tlsmgr    unix  -       -       n       1000?   1       tlsmgr', 'tlsmgr    unix  -       -       n       1000?   1       tlsmgr', $content);
32d8e9 256         wf($configfile, $content);
b1a6a5 257
32d8e9 258         //* Writing the Maildrop mailfilter file
T 259         $configfile = 'mailfilter';
260         if(is_file($cf['vmail_mailbox_base'].'/.'.$configfile)){
b1a6a5 261             copy($cf['vmail_mailbox_base'].'/.'.$configfile, $cf['vmail_mailbox_base'].'/.'.$configfile.'~');
MC 262         }
615a0a 263         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
32d8e9 264         $content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content);
T 265         wf($cf['vmail_mailbox_base'].'/.'.$configfile, $content);
b1a6a5 266
32d8e9 267         //* Create the directory for the custom mailfilters
T 268         $command = 'mkdir '.$cf['vmail_mailbox_base'].'/mailfilters';
269         caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 270
32d8e9 271         //* Chmod and chown the .mailfilter file
T 272         $command = 'chown -R '.$cf['vmail_username'].':'.$cf['vmail_groupname'].' '.$cf['vmail_mailbox_base'].'/.mailfilter';
273         caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 274
32d8e9 275         $command = 'chmod -R 600 '.$cf['vmail_mailbox_base'].'/.mailfilter';
T 276         caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 277
32d8e9 278     }
b1a6a5 279
32d8e9 280     public function configure_saslauthd() {
T 281         global $conf;
b1a6a5 282
32d8e9 283         // Edit the file /etc/init.d/saslauthd
T 284         $configfile = $conf["init_scripts"].'/'.$conf["saslauthd"]["init_script"];
285         $content = rf($configfile);
b1a6a5 286         $content = str_replace('/sbin/startproc $AUTHD_BIN -a $SASLAUTHD_AUTHMECH -n $SASLAUTHD_THREADS > /dev/null 2>&1', '/sbin/startproc $AUTHD_BIN -r -a $SASLAUTHD_AUTHMECH -n $SASLAUTHD_THREADS > /dev/null 2>&1', $content);
MC 287         $content = str_replace('/sbin/startproc $AUTHD_BIN $SASLAUTHD_PARAMS -a $SASLAUTHD_AUTHMECH -n $SASLAUTHD_THREADS > /dev/null 2>&1', '/sbin/startproc $AUTHD_BIN $SASLAUTHD_PARAMS -r -a $SASLAUTHD_AUTHMECH -n $SASLAUTHD_THREADS > /dev/null 2>&1', $content);
288
289
290         if(is_file($configfile)) wf($configfile, $content);
291
32d8e9 292     }
b1a6a5 293
32d8e9 294     public function configure_pam()
b1a6a5 295     {
32d8e9 296         global $conf;
T 297         $pam = $conf['pam'];
298         //* configure pam for SMTP authentication agains the ispconfig database
299         $configfile = 'pamd_smtp';
300         if(is_file("$pam/smtp"))    copy("$pam/smtp", "$pam/smtp~");
301         if(is_file("$pam/smtp~"))   exec("chmod 400 $pam/smtp~");
302
615a0a 303         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
32d8e9 304         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
T 305         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
306         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
307         $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
308         wf("$pam/smtp", $content);
03bff7 309         // On some OSes smtp is world readable which allows for reading database information.  Removing world readable rights should have no effect.
T 310         if(is_file("$pam/smtp"))    exec("chmod o= $pam/smtp");
32d8e9 311     }
b1a6a5 312
32d8e9 313     public function configure_courier()
b1a6a5 314     {
32d8e9 315         global $conf;
T 316         $config_dir = $conf['courier']['config_dir'];
317         //* authmysqlrc
318         $configfile = 'authmysqlrc';
319         if(is_file("$config_dir/$configfile")){
b1a6a5 320             copy("$config_dir/$configfile", "$config_dir/$configfile~");
MC 321         }
32d8e9 322         exec("chmod 400 $config_dir/$configfile~");
615a0a 323         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
b1a6a5 324         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
MC 325         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
326         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
327         $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
82e9b9 328         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
32d8e9 329         wf("$config_dir/$configfile", $content);
b1a6a5 330
32d8e9 331         exec("chmod 660 $config_dir/$configfile");
T 332         exec("chown root:root $config_dir/$configfile");
b1a6a5 333
32d8e9 334         //* authdaemonrc
T 335         $configfile = $conf['courier']['config_dir'].'/authdaemonrc';
336         if(is_file($configfile)){
b1a6a5 337             copy($configfile, $configfile.'~');
MC 338         }
32d8e9 339         if(is_file($configfile.'~')){
b1a6a5 340             exec('chmod 400 '.$configfile.'~');
MC 341         }
32d8e9 342         $content = rf($configfile);
T 343         $content = str_replace('authmodulelist=', 'authmodulelist="authmysql"', $content);
344         wf($configfile, $content);
345     }
b1a6a5 346
fdb514 347     public function configure_dovecot()
b1a6a5 348     {
fdb514 349         global $conf;
b1a6a5 350
a8aad2 351         $virtual_transport = 'dovecot';
8b23f8 352
FS 353         $configure_lmtp = false;
a8aad2 354         
DM 355         // check if virtual_transport must be changed
356         if ($this->is_update) {
2af58c 357             $tmp = $this->db->queryOneRecord("SELECT * FROM ?? WHERE server_id = ?", $conf["mysql"]["database"] . ".server", $conf['server_id']);
a8aad2 358             $ini_array = ini_to_array(stripslashes($tmp['config']));
DM 359             // ini_array needs not to be checked, because already done in update.php -> updateDbAndIni()
360             
361             if(isset($ini_array['mail']['mailbox_virtual_uidgid_maps']) && $ini_array['mail']['mailbox_virtual_uidgid_maps'] == 'y') {
362                 $virtual_transport = 'lmtp:unix:private/dovecot-lmtp';
8b23f8 363                 $configure_lmtp = true;
a8aad2 364             }
DM 365         }
366
bd5d26 367         $config_dir = $conf['postfix']['config_dir'];
9c6782 368
fdb514 369         //* Configure master.cf and add a line for deliver
9c6782 370         if(!$this->get_postfix_service('dovecot', 'unix')) {
bd5d26 371             //* backup
FS 372             if(is_file($config_dir.'/master.cf')){
373                 copy($config_dir.'/master.cf', $config_dir.'/master.cf~2');
374             }
375             if(is_file($config_dir.'/master.cf~')){
376                 chmod($config_dir.'/master.cf~2', 0400);
377             }
378             //* Configure master.cf and add a line for deliver
379             $content = rf($conf["postfix"]["config_dir"].'/master.cf');
9c6782 380             $deliver_content = 'dovecot   unix  -       n       n       -       -       pipe'."\n".'  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}'."\n";
b1a6a5 381             af($conf["postfix"]["config_dir"].'/master.cf', $deliver_content);
bd5d26 382             unset($content);
FS 383             unset($deliver_content);
fdb514 384         }
b1a6a5 385
fdb514 386         //* Reconfigure postfix to use dovecot authentication
T 387         // Adding the amavisd commands to the postfix configuration
388         $postconf_commands = array (
389             'dovecot_destination_recipient_limit = 1',
a8aad2 390             'virtual_transport = '.$virtual_transport,
fdb514 391             'smtpd_sasl_type = dovecot',
T 392             'smtpd_sasl_path = private/auth',
393         );
b1a6a5 394
fdb514 395         // Make a backup copy of the main.cf file
b1a6a5 396         copy($conf["postfix"]["config_dir"].'/main.cf', $conf["postfix"]["config_dir"].'/main.cf~3');
MC 397
fdb514 398         // Executing the postconf commands
T 399         foreach($postconf_commands as $cmd) {
400             $command = "postconf -e '$cmd'";
401             caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
402         }
bd5d26 403
FS 404         $config_dir = $conf['dovecot']['config_dir'];
b1a6a5 405
31e0d1 406         //* backup dovecot.conf
fdb514 407         $configfile = 'dovecot.conf';
T 408         if(is_file("$config_dir/$configfile")){
b1a6a5 409             copy("$config_dir/$configfile", "$config_dir/$configfile~");
MC 410         }
411
31e0d1 412         //* Get the dovecot version
b1a6a5 413         exec('dovecot --version', $tmp);
MC 414         $parts = explode('.', trim($tmp[0]));
31e0d1 415         $dovecot_version = $parts[0];
T 416         unset($tmp);
417         unset($parts);
b1a6a5 418
31e0d1 419         //* Copy dovecot configuration file
T 420         if($dovecot_version == 2) {
b1a6a5 421             if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot2.conf.master')) {
MC 422                 copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot2.conf.master', $config_dir.'/'.$configfile);
423             } else {
424                 copy('tpl/opensuse_dovecot2.conf.master', $config_dir.'/'.$configfile);
425             }
31e0d1 426         } else {
b1a6a5 427             if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot.conf.master')) {
MC 428                 copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot.conf.master', $config_dir.'/'.$configfile);
429             } else {
430                 copy('tpl/opensuse_dovecot.conf.master', $config_dir.'/'.$configfile);
431             }
31e0d1 432         }
b1a6a5 433
8b23f8 434         //* dovecot-lmtpd
FS 435         if($configure_lmtp) {
436             replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0);
437         }
438
fdb514 439         //* dovecot-sql.conf
T 440         $configfile = 'dovecot-sql.conf';
441         if(is_file("$config_dir/$configfile")){
b1a6a5 442             copy("$config_dir/$configfile", "$config_dir/$configfile~");
b67344 443             exec("chmod 400 $config_dir/$configfile~");
b1a6a5 444         }
MC 445
615a0a 446         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot-sql.conf.master', "tpl/opensuse_dovecot-sql.conf.master");
b1a6a5 447         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
MC 448         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
449         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
450         $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
82e9b9 451         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
032b86 452         $content = str_replace('{server_id}', $conf['server_id'], $content);
fdb514 453         wf("$config_dir/$configfile", $content);
b1a6a5 454
fdb514 455         exec("chmod 600 $config_dir/$configfile");
T 456         exec("chown root:root $config_dir/$configfile");
5e7306 457         
TB 458         // Dovecot shall ignore mounts in website directory
f9d95c 459         if(is_installed('doveadm')) exec("doveadm mount add '/srv/www/*' ignore > /dev/null 2> /dev/null");
fdb514 460
T 461     }
b1a6a5 462
32d8e9 463     public function configure_amavis() {
T 464         global $conf;
b1a6a5 465
32d8e9 466         // amavisd user config file
T 467         $configfile = 'opensuse_amavisd_conf';
b1a6a5 468         if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf')) @copy($conf["amavis"]["config_dir"].'/amavisd.conf', $conf["amavis"]["config_dir"].'/amavisd.conf~');
32d8e9 469         if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/amavisd.conf~');
615a0a 470         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
b1a6a5 471         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
MC 472         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
473         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
474         $content = str_replace('{mysql_server_port}', $conf["mysql"]["port"], $content);
475         $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
223c56 476         $content = str_replace('{hostname}', $conf['hostname'], $content);
b1a6a5 477         wf($conf["amavis"]["config_dir"].'/amavisd.conf', $content);
c83951 478         chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640);
b1a6a5 479
MC 480
32d8e9 481         // Adding the amavisd commands to the postfix configuration
T 482         $postconf_commands = array (
483             'content_filter = amavis:[127.0.0.1]:10024',
484             'receive_override_options = no_address_mappings'
485         );
b1a6a5 486
32d8e9 487         // Make a backup copy of the main.cf file
b1a6a5 488         copy($conf["postfix"]["config_dir"].'/main.cf', $conf["postfix"]["config_dir"].'/main.cf~2');
MC 489
32d8e9 490         // Executing the postconf commands
T 491         foreach($postconf_commands as $cmd) {
492             $command = "postconf -e '$cmd'";
493             caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
494         }
b1a6a5 495
bd5d26 496         $config_dir = $conf['postfix']['config_dir'];
FS 497
498         // Adding amavis-services to the master.cf file if the service does not already exists
9c6782 499         $add_amavis = !$this->get_postfix_service('amavis','unix');
FS 500         $add_amavis_10025 = !$this->get_postfix_service('127.0.0.1:10025','inet');
501         $add_amavis_10027 = !$this->get_postfix_service('127.0.0.1:10027','inet');
bd5d26 502
FS 503         if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
504             //* backup master.cf
505             if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
506             // adjust amavis-config
507             if($add_amavis) {
508                 $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
509                 af($config_dir.'/master.cf', $content);
510                 unset($content);
511             }
512             if ($add_amavis_10025) {
513                 $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
514                 af($config_dir.'/master.cf', $content);
515                 unset($content);
516             }
517             if ($add_amavis_10027) {
518                 $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
519                 af($config_dir.'/master.cf', $content);
520                 unset($content);
521             }
8100f2 522         }
b1a6a5 523
32d8e9 524         // Add the clamav user to the vscan group
5edf40 525         //exec('groupmod --add-user clamav vscan');
TB 526         $command = 'usermod -a -G clamav vscan';
527         caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 528
MC 529
32d8e9 530     }
b1a6a5 531
32d8e9 532     public function configure_spamassassin()
b1a6a5 533     {
32d8e9 534         global $conf;
b1a6a5 535
32d8e9 536         //* Enable spamasasssin on debian and ubuntu
T 537         /*
538         $configfile = '/etc/default/spamassassin';
539         if(is_file($configfile)){
540             copy($configfile, $configfile.'~');
541         }
542         $content = rf($configfile);
543         $content = str_replace('ENABLED=0', 'ENABLED=1', $content);
544         wf($configfile, $content);
545         */
546     }
b1a6a5 547
32d8e9 548     public function configure_getmail()
b1a6a5 549     {
32d8e9 550         global $conf;
b1a6a5 551
32d8e9 552         $config_dir = $conf['getmail']['config_dir'];
b1a6a5 553
32d8e9 554         if(!is_dir($config_dir)) exec("mkdir -p ".escapeshellcmd($config_dir));
T 555
556         $command = "useradd -d $config_dir getmail";
557         if(!is_user('getmail')) caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 558
32d8e9 559         $command = "chown -R getmail $config_dir";
T 560         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 561
32d8e9 562         $command = "chmod -R 700 $config_dir";
T 563         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
564     }
b1a6a5 565
MC 566
32d8e9 567     public function configure_pureftpd()
b1a6a5 568     {
32d8e9 569         global $conf;
b1a6a5 570
32d8e9 571         $config_dir = $conf['pureftpd']['config_dir'];
T 572
573         //* configure pam for SMTP authentication agains the ispconfig database
574         $configfile = 'db/mysql.conf';
575         if(is_file("$config_dir/$configfile")){
b1a6a5 576             copy("$config_dir/$configfile", "$config_dir/$configfile~");
MC 577         }
32d8e9 578         if(is_file("$config_dir/$configfile~")){
b1a6a5 579             exec("chmod 400 $config_dir/$configfile~");
MC 580         }
615a0a 581         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/pureftpd_mysql.conf.master', 'tpl/pureftpd_mysql.conf.master');
32d8e9 582         $content = str_replace('{mysql_server_ispconfig_user}', $conf["mysql"]["ispconfig_user"], $content);
T 583         $content = str_replace('{mysql_server_ispconfig_password}', $conf["mysql"]["ispconfig_password"], $content);
584         $content = str_replace('{mysql_server_database}', $conf["mysql"]["database"], $content);
585         $content = str_replace('{mysql_server_ip}', $conf["mysql"]["ip"], $content);
586         $content = str_replace('{server_id}', $conf["server_id"], $content);
587         wf("$config_dir/$configfile", $content);
588         exec("chmod 600 $config_dir/$configfile");
589         exec("chown root:root $config_dir/$configfile");
b1a6a5 590
32d8e9 591         // copy our customized copy of pureftpd.conf to the pure-ftpd config directory
615a0a 592         if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_pureftpd_conf.master')) {
b1a6a5 593             exec("cp " . $conf['ispconfig_install_dir']."/server/conf-custom/install/opensuse_pureftpd_conf.master $config_dir/pure-ftpd.conf");
MC 594         } else {
595             exec("cp tpl/opensuse_pureftpd_conf.master $config_dir/pure-ftpd.conf");
596         }
597
32d8e9 598     }
b1a6a5 599
32d8e9 600     public function configure_mydns()
b1a6a5 601     {
32d8e9 602         global $conf;
b1a6a5 603
223c56 604         // configure mydns
32d8e9 605         $configfile = 'mydns.conf';
b1a6a5 606         if(is_file($conf["mydns"]["config_dir"].'/'.$configfile)) copy($conf["mydns"]["config_dir"].'/'.$configfile, $conf["mydns"]["config_dir"].'/'.$configfile.'~');
32d8e9 607         if(is_file($conf["mydns"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["mydns"]["config_dir"].'/'.$configfile.'~');
615a0a 608         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
b1a6a5 609         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
MC 610         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
611         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
612         $content = str_replace('{mysql_server_host}', $conf["mysql"]["host"], $content);
82e9b9 613         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
b1a6a5 614         $content = str_replace('{server_id}', $conf["server_id"], $content);
MC 615         wf($conf["mydns"]["config_dir"].'/'.$configfile, $content);
32d8e9 616         exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
T 617         exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
b1a6a5 618
32d8e9 619     }
b1a6a5 620
32d8e9 621     public function configure_apache()
b1a6a5 622     {
32d8e9 623         global $conf;
b1a6a5 624
1bd269 625         if($conf['apache']['installed'] == false) return;
32d8e9 626         //* Create the logging directory for the vhost logfiles
T 627         exec('mkdir -p /var/log/ispconfig/httpd');
6c9bc3 628         
TB 629         //* enable apache logio module
630         exec('a2enmod logio');
b1a6a5 631
32d8e9 632         //if(is_file('/etc/suphp.conf')) {
b1a6a5 633         replaceLine('/etc/suphp.conf', 'php=php', 'x-httpd-suphp="php:/srv/www/cgi-bin/php5"', 0, 0);
MC 634         replaceLine('/etc/suphp.conf', 'php="php', 'x-httpd-suphp="php:/srv/www/cgi-bin/php5"', 0, 0);
635         replaceLine('/etc/suphp.conf', 'docroot=', 'docroot=/srv/www', 0, 0);
636         replaceLine('/etc/suphp.conf', 'umask=0077', 'umask=0022', 0);
32d8e9 637         //}
b1a6a5 638
26c0fc 639         if(!file_exists('/srv/www/cgi-bin/php5') && file_exists('/srv/www/cgi-bin/php')) {
b1a6a5 640             symlink('/srv/www/cgi-bin/php', '/srv/www/cgi-bin/php5');
26c0fc 641         }
b1a6a5 642
dbe5b0 643         // Sites enabled and available dirs
32d8e9 644         exec('mkdir -p '.$conf['apache']['vhost_conf_enabled_dir']);
T 645         exec('mkdir -p '.$conf['apache']['vhost_conf_dir']);
b1a6a5 646
32d8e9 647         $content = rf('/etc/apache2/httpd.conf');
b1a6a5 648         if(!stristr($content, 'Include /etc/apache2/sites-enabled/')) {
5545f1 649             af('/etc/apache2/httpd.conf', "\n<Directory /srv/www>\n    Options +FollowSymlinks\n</Directory>\n\nInclude /etc/apache2/sites-enabled/\n\n");
32d8e9 650         }
T 651         unset($content);
b1a6a5 652
32d8e9 653         //* Copy the ISPConfig configuration include
b1a6a5 654         $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
MC 655         $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
656
ccbf14 657         $tpl = new tpl('apache_ispconfig.conf.master');
TB 658         $tpl->setVar('apache_version',getapacheversion());
659         
2af58c 660         $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']);
ccbf14 661         $ip_addresses = array();
TB 662         
fb3a98 663         if(is_array($records) && count($records) > 0) {
32d8e9 664             foreach($records as $rec) {
a2156e 665                 if($rec['ip_type'] == 'IPv6') {
T 666                     $ip_address = '['.$rec['ip_address'].']';
667                 } else {
668                     $ip_address = $rec['ip_address'];
669                 }
b1a6a5 670                 $ports = explode(',', $rec['virtualhost_port']);
a2156e 671                 if(is_array($ports)) {
T 672                     foreach($ports as $port) {
673                         $port = intval($port);
674                         if($port > 0 && $port < 65536 && $ip_address != '') {
ccbf14 675                             $ip_addresses[] = array('ip_address' => $ip_address, 'port' => $port);
a2156e 676                         }
T 677                     }
678                 }
32d8e9 679             }
T 680         }
855547 681         
3de838 682         if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses);
223c56 683
ccbf14 684         wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab());
TB 685         unset($tpl);
b1a6a5 686
32d8e9 687         if(!@is_link($vhost_conf_enabled_dir."/000-ispconfig.conf")) {
T 688             exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
689         }
b1a6a5 690
99d5dc 691         //* make sure that webalizer finds its config file when it is directly in /etc
T 692         if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
693             exec('mkdir /etc/webalizer');
694             exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
695         }
b1a6a5 696
99d5dc 697         if(is_file('/etc/webalizer/webalizer.conf')) {
T 698             // Change webalizer mode to incremental
b1a6a5 699             replaceLine('/etc/webalizer/webalizer.conf', '#IncrementalName', 'IncrementalName webalizer.current', 0, 0);
MC 700             replaceLine('/etc/webalizer/webalizer.conf', '#Incremental', 'Incremental     yes', 0, 0);
701             replaceLine('/etc/webalizer/webalizer.conf', '#HistoryName', 'HistoryName     webalizer.hist', 0, 0);
99d5dc 702         }
b1a6a5 703
6b029a 704         //* add a sshusers group
T 705         $command = 'groupadd sshusers';
706         if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 707
526b99 708         // create PHP-FPM pool dir
T 709         exec('mkdir -p '.$conf['nginx']['php_fpm_pool_dir']);
b1a6a5 710
526b99 711         $content = rf('/etc/php5/fpm/php-fpm.conf');
T 712         if(stripos($content, 'include=/etc/php5/fpm/pool.d/*.conf') === false){
b1a6a5 713             af('/etc/php5/fpm/php-fpm.conf', "\ninclude=/etc/php5/fpm/pool.d/*.conf");
526b99 714         }
T 715         unset($content);
716         if(!@is_file($conf['nginx']['php_fpm_ini_path'])){
717             if(@is_file('/etc/php5/cli/php.ini')){
718                 exec('cp -f /etc/php5/cli/php.ini '.$conf['nginx']['php_fpm_ini_path']);
719             } elseif(@is_file('/etc/php5/fastcgi/php.ini')){
720                 exec('cp -f /etc/php5/fastcgi/php.ini '.$conf['nginx']['php_fpm_ini_path']);
721             } elseif(@is_file('/etc/php5/apache2/php.ini')){
722                 exec('cp -f /etc/php5/apache2/php.ini '.$conf['nginx']['php_fpm_ini_path']);
723             }
724         }
b1a6a5 725
32d8e9 726     }
b1a6a5 727
2d86e1 728     public function configure_nginx(){
F 729         global $conf;
b1a6a5 730
2d86e1 731         if($conf['nginx']['installed'] == false) return;
F 732         //* Create the logging directory for the vhost logfiles
733         if(!@is_dir($conf['ispconfig_log_dir'].'/httpd')) mkdir($conf['ispconfig_log_dir'].'/httpd', 0755, true);
b1a6a5 734
dbe5b0 735         // Sites enabled and available dirs
2d86e1 736         exec('mkdir -p '.$conf['nginx']['vhost_conf_enabled_dir']);
F 737         exec('mkdir -p '.$conf['nginx']['vhost_conf_dir']);
b1a6a5 738
dbe5b0 739         $content = rf('/etc/nginx/nginx.conf');
F 740         if(stripos($content, 'include /etc/nginx/sites-enabled/*.vhost;') === false){
741             $content = trim($content);
b1a6a5 742             $content = substr($content, 0, -1)."\n    include /etc/nginx/sites-enabled/*.vhost;\n}";
MC 743             wf('/etc/nginx/nginx.conf', $content);
dbe5b0 744         }
2d86e1 745         unset($content);
b1a6a5 746
2d86e1 747         // create PHP-FPM pool dir
F 748         exec('mkdir -p '.$conf['nginx']['php_fpm_pool_dir']);
b1a6a5 749
2d86e1 750         $content = rf('/etc/php5/fpm/php-fpm.conf');
F 751         if(stripos($content, 'include=/etc/php5/fpm/pool.d/*.conf') === false){
b1a6a5 752             af('/etc/php5/fpm/php-fpm.conf', "\ninclude=/etc/php5/fpm/pool.d/*.conf");
2d86e1 753         }
F 754         unset($content);
59feb7 755         if(!@is_file($conf['nginx']['php_fpm_ini_path'])){
F 756             if(@is_file('/etc/php5/cli/php.ini')){
757                 exec('cp -f /etc/php5/cli/php.ini '.$conf['nginx']['php_fpm_ini_path']);
758             } elseif(@is_file('/etc/php5/fastcgi/php.ini')){
759                 exec('cp -f /etc/php5/fastcgi/php.ini '.$conf['nginx']['php_fpm_ini_path']);
760             } elseif(@is_file('/etc/php5/apache2/php.ini')){
761                 exec('cp -f /etc/php5/apache2/php.ini '.$conf['nginx']['php_fpm_ini_path']);
762             }
763         }
2d86e1 764
F 765         //* make sure that webalizer finds its config file when it is directly in /etc
766         if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
767             mkdir('/etc/webalizer');
b1a6a5 768             symlink('/etc/webalizer.conf', '/etc/webalizer/webalizer.conf');
2d86e1 769         }
F 770
771         if(is_file('/etc/webalizer/webalizer.conf')) {
772             // Change webalizer mode to incremental
b1a6a5 773             replaceLine('/etc/webalizer/webalizer.conf', '#IncrementalName', 'IncrementalName webalizer.current', 0, 0);
MC 774             replaceLine('/etc/webalizer/webalizer.conf', '#Incremental', 'Incremental     yes', 0, 0);
775             replaceLine('/etc/webalizer/webalizer.conf', '#HistoryName', 'HistoryName     webalizer.hist', 0, 0);
2d86e1 776         }
b1a6a5 777
2d86e1 778         // Check the awsatst script
F 779         if(!is_dir('/usr/share/awstats/tools')) exec('mkdir -p /usr/share/awstats/tools');
b1a6a5 780         if(!file_exists('/usr/share/awstats/tools/awstats_buildstaticpages.pl') && file_exists('/usr/share/doc/awstats/examples/awstats_buildstaticpages.pl')) symlink('/usr/share/doc/awstats/examples/awstats_buildstaticpages.pl', '/usr/share/awstats/tools/awstats_buildstaticpages.pl');
MC 781         if(file_exists('/etc/awstats/awstats.conf.local')) replaceLine('/etc/awstats/awstats.conf.local', 'LogFormat=4', 'LogFormat=1', 0, 1);
782
2d86e1 783         //* add a sshusers group
F 784         $command = 'groupadd sshusers';
785         if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
786     }
b1a6a5 787
ca2165 788     public function configure_bastille_firewall()
32d8e9 789     {
T 790         global $conf;
b1a6a5 791
32d8e9 792         $dist_init_scripts = $conf['init_scripts'];
b1a6a5 793
32d8e9 794         if(is_dir("/etc/Bastille.backup")) caselog("rm -rf /etc/Bastille.backup", __FILE__, __LINE__);
T 795         if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
b1a6a5 796         @mkdir("/etc/Bastille", octdec($directory_mode));
MC 797         if(is_dir("/etc/Bastille.backup/firewall.d")) caselog("cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/", __FILE__, __LINE__);
798         if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/bastille-firewall.cfg.master')) {
799             caselog("cp -f " . $conf['ispconfig_install_dir']."/server/conf-custom/install/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
800         } else {
801             caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
802         }
803         caselog("chmod 644 /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
804         $content = rf("/etc/Bastille/bastille-firewall.cfg");
805         $content = str_replace("{DNS_SERVERS}", "", $content);
32d8e9 806
b1a6a5 807         $tcp_public_services = '';
MC 808         $udp_public_services = '';
809
2af58c 810         $row = $this->db->queryOneRecord('SELECT * FROM ?? WHERE server_id = ?', $conf["mysql"]["database"] . '.firewall', $conf['server_id']);
b1a6a5 811
MC 812         if(trim($row["tcp_port"]) != '' || trim($row["udp_port"]) != ''){
813             $tcp_public_services = trim(str_replace(',', ' ', $row["tcp_port"]));
814             $udp_public_services = trim(str_replace(',', ' ', $row["udp_port"]));
815         } else {
816             $tcp_public_services = '21 22 25 53 80 110 443 3306 8080 10000';
817             $udp_public_services = '53';
818         }
32d8e9 819         if(!stristr($tcp_public_services, $conf['apache']['vhost_port'])) {
T 820             $tcp_public_services .= ' '.intval($conf['apache']['vhost_port']);
2af58c 821             if($row["tcp_port"] != '') $this->db->query("UPDATE firewall SET tcp_port = tcp_port + ? WHERE server_id = ?", ',' . intval($conf['apache']['vhost_port']), $conf['server_id']);
32d8e9 822         }
T 823
b1a6a5 824         $content = str_replace("{TCP_PUBLIC_SERVICES}", $tcp_public_services, $content);
MC 825         $content = str_replace("{UDP_PUBLIC_SERVICES}", $udp_public_services, $content);
32d8e9 826
b1a6a5 827         wf("/etc/Bastille/bastille-firewall.cfg", $content);
32d8e9 828
b1a6a5 829         if(is_file($dist_init_scripts."/bastille-firewall")) caselog("mv -f $dist_init_scripts/bastille-firewall $dist_init_scripts/bastille-firewall.backup", __FILE__, __LINE__);
MC 830         caselog("cp -f apps/bastille-firewall $dist_init_scripts", __FILE__, __LINE__);
831         caselog("chmod 700 $dist_init_scripts/bastille-firewall", __FILE__, __LINE__);
32d8e9 832
b1a6a5 833         if(is_file("/sbin/bastille-ipchains")) caselog("mv -f /sbin/bastille-ipchains /sbin/bastille-ipchains.backup", __FILE__, __LINE__);
MC 834         caselog("cp -f apps/bastille-ipchains /sbin", __FILE__, __LINE__);
835         caselog("chmod 700 /sbin/bastille-ipchains", __FILE__, __LINE__);
836
837         if(is_file("/sbin/bastille-netfilter")) caselog("mv -f /sbin/bastille-netfilter /sbin/bastille-netfilter.backup", __FILE__, __LINE__);
838         caselog("cp -f apps/bastille-netfilter /sbin", __FILE__, __LINE__);
839         caselog("chmod 700 /sbin/bastille-netfilter", __FILE__, __LINE__);
840
32d8e9 841         if(!@is_dir('/var/lock/subsys')) caselog("mkdir /var/lock/subsys", __FILE__, __LINE__);
T 842
b1a6a5 843         exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
MC 844         if(!is_file("/sbin/ipchains") && !is_link("/sbin/ipchains") && $ret_val == 0) phpcaselog(@symlink(shell_exec("which ipchains"), "/sbin/ipchains"), 'create symlink', __FILE__, __LINE__);
845         unset($ipchains_location);
846         exec("which iptables &> /dev/null", $iptables_location, $ret_val);
847         if(!is_file("/sbin/iptables") && !is_link("/sbin/iptables") && $ret_val == 0) phpcaselog(@symlink(trim(shell_exec("which iptables")), "/sbin/iptables"), 'create symlink', __FILE__, __LINE__);
848         unset($iptables_location);
32d8e9 849
T 850     }
4ae2a0 851
32d8e9 852     public function install_ispconfig()
b1a6a5 853     {
32d8e9 854         global $conf;
b1a6a5 855
32d8e9 856         $install_dir = $conf['ispconfig_install_dir'];
T 857
858         //* Create the ISPConfig installation directory
859         if(!@is_dir("$install_dir")) {
860             $command = "mkdir $install_dir";
861             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
862         }
b1a6a5 863
32d8e9 864         //* Create a ISPConfig user and group
T 865         $command = 'groupadd ispconfig';
866         if(!is_group('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 867
32d8e9 868         $command = "useradd -g ispconfig -d $install_dir ispconfig";
T 869         if(!is_user('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 870
32d8e9 871         //* copy the ISPConfig interface part
T 872         $command = "cp -rf ../interface $install_dir";
873         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 874
32d8e9 875         //* copy the ISPConfig server part
T 876         $command = "cp -rf ../server $install_dir";
877         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
a13af2 878         
fb6c56 879         //* Make a backup of the security settings
TB 880         if(is_file('/usr/local/ispconfig/security/security_settings.ini')) copy('/usr/local/ispconfig/security/security_settings.ini','/usr/local/ispconfig/security/security_settings.ini~');
881         
a13af2 882         //* copy the ISPConfig security part
TB 883         $command = 'cp -rf ../security '.$install_dir;
884         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
fb6c56 885         
TB 886         //* Apply changed security_settings.ini values to new security_settings.ini file
887         if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) {
888             $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~'));
889             $security_settings_new = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini'));
890             if(is_array($security_settings_new) && is_array($security_settings_old)) {
891                 foreach($security_settings_new as $section => $sval) {
892                     if(is_array($sval)) {
893                         foreach($sval as $key => $val) {
894                             if(isset($security_settings_old[$section]) && isset($security_settings_old[$section][$key])) {
895                                 $security_settings_new[$section][$key] = $security_settings_old[$section][$key];
896                             }
897                         }
898                     }
899                 }
900                 file_put_contents('/usr/local/ispconfig/security/security_settings.ini',array_to_ini($security_settings_new));
901             }
902         }
b1a6a5 903
32d8e9 904         //* Create a symlink, so ISPConfig is accessible via web
T 905         // Replaced by a separate vhost definition for port 8080
906         // $command = "ln -s $install_dir/interface/web/ /var/www/ispconfig";
907         // caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 908
32d8e9 909         //* Create the config file for ISPConfig interface
T 910         $configfile = 'config.inc.php';
911         if(is_file($install_dir.'/interface/lib/'.$configfile)){
b1a6a5 912             copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
MC 913         }
615a0a 914         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
32d8e9 915         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
T 916         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
917         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
918         $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
82e9b9 919         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
b1a6a5 920
32d8e9 921         $content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
T 922         $content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
923         $content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
924         $content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
82e9b9 925         $content = str_replace('{mysql_master_server_port}', $conf['mysql']['master_port'], $content);
b1a6a5 926
32d8e9 927         $content = str_replace('{server_id}', $conf['server_id'], $content);
T 928         $content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
5898e6 929         $content = str_replace('{language}', $conf['language'], $content);
8cf78b 930         $content = str_replace('{timezone}', $conf['timezone'], $content);
41eaa8 931         $content = str_replace('{theme}', $conf['theme'], $content);
992797 932         $content = str_replace('{language_file_import_enabled}', ($conf['language_file_import_enabled'] == true)?'true':'false', $content);
b1a6a5 933
MC 934         wf("$install_dir/interface/lib/$configfile", $content);
935
936         //* Create the config file for ISPConfig server
937         $configfile = 'config.inc.php';
938         if(is_file($install_dir.'/server/lib/'.$configfile)){
939             copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
940         }
941         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
942         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
943         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
944         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
945         $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
82e9b9 946         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
b1a6a5 947
MC 948         $content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
949         $content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
950         $content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
951         $content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
82e9b9 952         $content = str_replace('{mysql_master_server_port}', $conf['mysql']['master_port'], $content);
b1a6a5 953
MC 954         $content = str_replace('{server_id}', $conf['server_id'], $content);
955         $content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
956         $content = str_replace('{language}', $conf['language'], $content);
957         $content = str_replace('{timezone}', $conf['timezone'], $content);
958         $content = str_replace('{theme}', $conf['theme'], $content);
959         $content = str_replace('{language_file_import_enabled}', ($conf['language_file_import_enabled'] == true)?'true':'false', $content);
960
32d8e9 961         wf("$install_dir/server/lib/$configfile", $content);
b1a6a5 962
fb3a98 963         //* Create the config file for remote-actions (but only, if it does not exist, because
T 964         //  the value is a autoinc-value and so changed by the remoteaction_core_module
965         if (!file_exists($install_dir.'/server/lib/remote_action.inc.php')) {
966             $content = '<?php' . "\n" . '$maxid_remote_action = 0;' . "\n" . '?>';
967             wf($install_dir.'/server/lib/remote_action.inc.php', $content);
968         }
b1a6a5 969
32d8e9 970         //* Enable the server modules and plugins.
T 971         // TODO: Implement a selector which modules and plugins shall be enabled.
972         $dir = $install_dir.'/server/mods-available/';
973         if (is_dir($dir)) {
974             if ($dh = opendir($dir)) {
975                 while (($file = readdir($dh)) !== false) {
b1a6a5 976                     if($file != '.' && $file != '..' && substr($file, -8, 8) == '.inc.php') {
MC 977                         include_once $install_dir.'/server/mods-available/'.$file;
978                         $module_name = substr($file, 0, -8);
32d8e9 979                         $tmp = new $module_name;
T 980                         if($tmp->onInstall()) {
981                             if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
982                             if (strpos($file, '_core_module') !== false) {
983                                 if(!@is_link($install_dir.'/server/mods-core/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-core/'.$file);
984                             }
985                         }
986                         unset($tmp);
987                     }
988                 }
989                 closedir($dh);
990             }
991         }
b1a6a5 992
32d8e9 993         $dir = $install_dir.'/server/plugins-available/';
T 994         if (is_dir($dir)) {
995             if ($dh = opendir($dir)) {
996                 while (($file = readdir($dh)) !== false) {
1bd269 997                     if($conf['apache']['installed'] == true && $file == 'nginx_plugin.inc.php') continue;
F 998                     if($conf['nginx']['installed'] == true && $file == 'apache2_plugin.inc.php') continue;
b1a6a5 999                     if($file != '.' && $file != '..' && substr($file, -8, 8) == '.inc.php') {
MC 1000                         include_once $install_dir.'/server/plugins-available/'.$file;
1001                         $plugin_name = substr($file, 0, -8);
32d8e9 1002                         $tmp = new $plugin_name;
T 1003                         if($tmp->onInstall()) {
1004                             if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
1005                             if (strpos($file, '_core_plugin') !== false) {
1006                                 if(!@is_link($install_dir.'/server/plugins-core/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-core/'.$file);
1007                             }
1008                         }
1009                         unset($tmp);
1010                     }
1011                 }
1012                 closedir($dh);
1013             }
1014         }
b1a6a5 1015
32d8e9 1016         // Update the server config
T 1017         $mail_server_enabled = ($conf['services']['mail'])?1:0;
1018         $web_server_enabled = ($conf['services']['web'])?1:0;
1019         $dns_server_enabled = ($conf['services']['dns'])?1:0;
1020         $file_server_enabled = ($conf['services']['file'])?1:0;
1021         $db_server_enabled = ($conf['services']['db'])?1:0;
1022         $vserver_server_enabled = ($conf['services']['vserver'])?1:0;
2af58c 1023         $sql = "UPDATE `server` SET mail_server = ?, web_server = ?, dns_server = ?, file_server = ?, db_server = ?, vserver_server = ? WHERE server_id = ?";
b1a6a5 1024
a6e3ae 1025         $this->db->query($sql, $mail_server_enabled, $web_server_enabled, $dns_server_enabled, $file_server_enabled, $db_server_enabled, $vserver_server_enabled, $conf['server_id']);
32d8e9 1026         if($conf['mysql']['master_slave_setup'] == 'y') {
a6e3ae 1027             $this->dbmaster->query($sql, $mail_server_enabled, $web_server_enabled, $dns_server_enabled, $file_server_enabled, $db_server_enabled, $vserver_server_enabled, $conf['server_id']);
32d8e9 1028         }
b1a6a5 1029
3e0fc8 1030         // chown install dir to root and chmod 755
TB 1031         $command = 'chown root:root '.$install_dir;
1032         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1033         $command = 'chmod 755 '.$install_dir;
32d8e9 1034         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
T 1035
fa029b 1036         //* Chmod the files and directories in the install dir
3e0fc8 1037         $command = 'chmod -R 750 '.$install_dir.'/*';
TB 1038         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1039
1040         //* chown the interface files to the ispconfig user and group
1041         $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface';
1042         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1043         
1044         //* chown the server files to the root user and group
1045         $command = 'chown -R root:root '.$install_dir.'/server';
32d8e9 1046         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
fa029b 1047         
TB 1048         //* chown the security files to the root user and group
1049         $command = 'chown -R root:root '.$install_dir.'/security';
1050         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1051         
1052         //* chown the security directory and security_settings.ini to root:ispconfig
1053         $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini';
1054         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1055         $command = 'chown root:ispconfig '.$install_dir.'/security';
1056         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
cb1221 1057         $command = 'chown root:ispconfig '.$install_dir.'/security/ids.whitelist';
TB 1058         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1059         $command = 'chown root:ispconfig '.$install_dir.'/security/ids.htmlfield';
1060         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1061         $command = 'chown root:ispconfig '.$install_dir.'/security/apache_directives.blacklist';
32d8e9 1062         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 1063
32d8e9 1064         //* Make the global language file directory group writable
T 1065         exec("chmod -R 770 $install_dir/interface/lib/lang");
b1a6a5 1066
32d8e9 1067         //* Make the temp directory for language file exports writable
T 1068         exec("chmod -R 770 $install_dir/interface/web/temp");
b1a6a5 1069
32d8e9 1070         //* Make all interface language file directories group writable
T 1071         $handle = @opendir($install_dir.'/interface/web');
b1a6a5 1072         while ($file = @readdir($handle)) {
MC 1073             if ($file != '.' && $file != '..') {
1074                 if(@is_dir($install_dir.'/interface/web'.'/'.$file.'/lib/lang')) {
32d8e9 1075                     $handle2 = opendir($install_dir.'/interface/web'.'/'.$file.'/lib/lang');
b1a6a5 1076                     chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang', 0770);
MC 1077                     while ($lang_file = @readdir($handle2)) {
32d8e9 1078                         if ($lang_file != '.' && $lang_file != '..') {
b1a6a5 1079                             chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang/'.$lang_file, 0770);
32d8e9 1080                         }
T 1081                     }
1082                 }
1083             }
1084         }
b1a6a5 1085
477d4e 1086         //* Make the APS directories group writable
T 1087         exec("chmod -R 770 $install_dir/interface/web/sites/aps_meta_packages");
1088         exec("chmod -R 770 $install_dir/server/aps_packages");
b1a6a5 1089
32d8e9 1090         //* make sure that the server config file (not the interface one) is only readable by the root user
bfcdef 1091         chmod($install_dir.'/server/lib/config.inc.php', 0600);
T 1092         chown($install_dir.'/server/lib/config.inc.php', 'root');
1093         chgrp($install_dir.'/server/lib/config.inc.php', 'root');
b1a6a5 1094
bfcdef 1095         //* Make sure thet the interface config file is readable by user ispconfig only
T 1096         chmod($install_dir.'/interface/lib/config.inc.php', 0600);
1097         chown($install_dir.'/interface/lib/config.inc.php', 'ispconfig');
1098         chgrp($install_dir.'/interface/lib/config.inc.php', 'ispconfig');
b1a6a5 1099
32d8e9 1100         if(@is_file("$install_dir/server/lib/mysql_clientdb.conf")) {
T 1101             exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf");
1102             exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf");
1103         }
980485 1104         
TB 1105         if(is_dir($install_dir.'/interface/invoices')) {
1106             exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices'));
1107             exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices'));
1108         }
1109         
1110         exec('chown -R root:root /usr/local/ispconfig/interface/ssl');
b1a6a5 1111
32d8e9 1112         // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing
T 1113         // and must be fixed as this will allow the apache user to read the ispconfig files.
1114         // Later this must run as own apache server or via suexec!
63b369 1115         if($conf['apache']['installed'] == true){
5edf40 1116             $command = 'usermod -a -G ispconfig '.$conf['apache']['user'];
63b369 1117             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
272aec 1118             if(is_group('ispapps')){
5edf40 1119                 $command = 'usermod -a -G ispapps '.$conf['apache']['user'];
272aec 1120                 caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
F 1121             }
63b369 1122         }
F 1123         if($conf['nginx']['installed'] == true){
223c56 1124             $command = 'usermod -a -G ispconfig '.$conf['nginx']['user'];
63b369 1125             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
272aec 1126             if(is_group('ispapps')){
5edf40 1127                 $command = 'usermod -a -G ispapps '.$conf['nginx']['user'];
272aec 1128                 caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
F 1129             }
5c93f0 1130             // add nobody user to www group, as the default php-fpm pool from opensuse runs as nobody
TB 1131             $command = 'usermod -a -G www nobody';
1132             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
63b369 1133         }
b1a6a5 1134
32d8e9 1135         //* Make the shell scripts executable
T 1136         $command = "chmod +x $install_dir/server/scripts/*.sh";
1137         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 1138
7e1cfb 1139         if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){
1bd269 1140             //* Copy the ISPConfig vhost for the controlpanel
F 1141             // TODO: These are missing! should they be "vhost_dist_*_dir" ?
1142             $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
1143             $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
b1a6a5 1144
MC 1145
1bd269 1146             // Dont just copy over the virtualhost template but add some custom settings
ccbf14 1147             $tpl = new tpl('apache_ispconfig.vhost.master');
TB 1148             $tpl->setVar('vhost_port',$conf['apache']['vhost_port']);
b1a6a5 1149
1bd269 1150             // comment out the listen directive if port is 80 or 443
F 1151             if($conf['apache']['vhost_port'] == 80 or $conf['apache']['vhost_port'] == 443) {
ccbf14 1152                 $tpl->setVar('vhost_port_listen','#');
1bd269 1153             } else {
ccbf14 1154                 $tpl->setVar('vhost_port_listen','');
1bd269 1155             }
b1a6a5 1156
ccbf14 1157             if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
TB 1158                 $tpl->setVar('ssl_comment','');
1bd269 1159             } else {
ccbf14 1160                 $tpl->setVar('ssl_comment','#');
1bd269 1161             }
10b4c8 1162             if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key') && is_file($install_dir.'/interface/ssl/ispserver.bundle')) {
ccbf14 1163                 $tpl->setVar('ssl_bundle_comment','');
10b4c8 1164             } else {
ccbf14 1165                 $tpl->setVar('ssl_bundle_comment','#');
10b4c8 1166             }
ccbf14 1167             
TB 1168             $tpl->setVar('apache_version',getapacheversion());
b1a6a5 1169
8c9637 1170             $content = $tpl->grab();
MS 1171             $content = str_replace('/var/www/', '/srv/www/', $content);
1172             wf($vhost_conf_dir.'/ispconfig.vhost', $content);
b1a6a5 1173
cc6568 1174             //if(!is_file('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) {
b1a6a5 1175             $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master');
MC 1176             $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
1177             $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
1178             exec('mkdir -p /srv/www/php-fcgi-scripts/ispconfig');
1179             wf('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content);
1180             exec('chmod +x /srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter');
1181             exec('ln -s /usr/local/ispconfig/interface/web /srv/www/ispconfig');
1182             exec('chown -R ispconfig:ispconfig /srv/www/php-fcgi-scripts/ispconfig');
1183
cc6568 1184             //}
b1a6a5 1185
1bd269 1186             //copy('tpl/apache_ispconfig.vhost.master', "$vhost_conf_dir/ispconfig.vhost");
F 1187             //* and create the symlink
7e1cfb 1188             if($this->is_update == false) {
1bd269 1189                 if(@is_link("$vhost_conf_enabled_dir/ispconfig.vhost")) unlink("$vhost_conf_enabled_dir/ispconfig.vhost");
F 1190                 if(!@is_link("$vhost_conf_enabled_dir/000-ispconfig.vhost")) {
1191                     exec("ln -s $vhost_conf_dir/ispconfig.vhost $vhost_conf_enabled_dir/000-ispconfig.vhost");
1192                 }
b1a6a5 1193
1bd269 1194             }
b1a6a5 1195
1bd269 1196             // Fix a setting in vhost master file for suse
b1a6a5 1197             replaceLine('/usr/local/ispconfig/server/conf/vhost.conf.master', "suPHP_UserGroup", "        suPHP_UserGroup <tmpl_var name='system_user'> <tmpl_var name='system_group'>", 0);
1bd269 1198         }
F 1199
7e1cfb 1200         if($conf['nginx']['installed'] == true && $this->install_ispconfig_interface == true){
1bd269 1201             //* Copy the ISPConfig vhost for the controlpanel
F 1202             $vhost_conf_dir = $conf['nginx']['vhost_conf_dir'];
1203             $vhost_conf_enabled_dir = $conf['nginx']['vhost_conf_enabled_dir'];
1204
1205             // Dont just copy over the virtualhost template but add some custom settings
615a0a 1206             $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_ispconfig.vhost.master', 'tpl/nginx_ispconfig.vhost.master');
1bd269 1207             $content = str_replace('{vhost_port}', $conf['nginx']['vhost_port'], $content);
b1a6a5 1208
1bd269 1209             if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
10b4c8 1210                 $content = str_replace('{ssl_on}', ' on', $content);
1bd269 1211                 $content = str_replace('{ssl_comment}', '', $content);
F 1212                 $content = str_replace('{fastcgi_ssl}', 'on', $content);
1213             } else {
10b4c8 1214                 $content = str_replace('{ssl_on}', ' off', $content);
1bd269 1215                 $content = str_replace('{ssl_comment}', '#', $content);
F 1216                 $content = str_replace('{fastcgi_ssl}', 'off', $content);
32d8e9 1217             }
b1a6a5 1218
ca0b77 1219             $socket_dir = escapeshellcmd($conf['nginx']['php_fpm_socket_dir']);
b1a6a5 1220             if(substr($socket_dir, -1) != '/') $socket_dir .= '/';
ca0b77 1221             if(!is_dir($socket_dir)) exec('mkdir -p '.$socket_dir);
F 1222             $fpm_socket = $socket_dir.'ispconfig.sock';
b1a6a5 1223
ca0b77 1224             //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
F 1225             $content = str_replace('{fpm_socket}', $fpm_socket, $content);
1bd269 1226
F 1227             wf($vhost_conf_dir.'/ispconfig.vhost', $content);
b1a6a5 1228
1bd269 1229             unset($content);
b1a6a5 1230
1bd269 1231             // PHP-FPM
F 1232             // Dont just copy over the php-fpm pool template but add some custom settings
615a0a 1233             $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/php_fpm_pool.conf.master', 'tpl/php_fpm_pool.conf.master');
1bd269 1234             $content = str_replace('{fpm_pool}', 'ispconfig', $content);
ca0b77 1235             //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
F 1236             $content = str_replace('{fpm_socket}', $fpm_socket, $content);
1bd269 1237             $content = str_replace('{fpm_user}', 'ispconfig', $content);
F 1238             $content = str_replace('{fpm_group}', 'ispconfig', $content);
1239             wf($conf['nginx']['php_fpm_pool_dir'].'/ispconfig.conf', $content);
1240
1241             //copy('tpl/nginx_ispconfig.vhost.master', $vhost_conf_dir.'/ispconfig.vhost');
1242             //* and create the symlink
7e1cfb 1243             if($this->is_update == false) {
1bd269 1244                 if(@is_link($vhost_conf_enabled_dir.'/ispconfig.vhost')) unlink($vhost_conf_enabled_dir.'/ispconfig.vhost');
F 1245                 if(!@is_link($vhost_conf_enabled_dir.'/000-ispconfig.vhost')) {
b1a6a5 1246                     symlink($vhost_conf_dir.'/ispconfig.vhost', $vhost_conf_enabled_dir.'/000-ispconfig.vhost');
1bd269 1247                 }
F 1248             }
b1a6a5 1249
9aec3d 1250             // create symlinks from /usr/share to phpMyAdmin and SquirrelMail, if they are installed
b1a6a5 1251             if(!@file_exists('/usr/share/phpmyadmin') && @is_dir('/srv/www/htdocs/phpMyAdmin')) symlink('/srv/www/htdocs/phpMyAdmin/', '/usr/share/phpmyadmin');
MC 1252             if(!@file_exists('/usr/share/squirrelmail') && @is_dir('/srv/www/htdocs/squirrelmail')) symlink('/srv/www/htdocs/squirrelmail/', '/usr/share/squirrelmail');
32d8e9 1253         }
b1a6a5 1254
32d8e9 1255         // Make the Clamav log files readable by ISPConfig
T 1256         //exec('chmod +r /var/log/clamav/clamav.log');
1257         //exec('chmod +r /var/log/clamav/freshclam.log');
b1a6a5 1258
32d8e9 1259         //* Install the update script
b34f99 1260         if(is_file('/usr/local/bin/ispconfig_update_from_dev.sh')) unlink('/usr/local/bin/ispconfig_update_from_dev.sh');
MC 1261         exec('chown root /usr/local/ispconfig/server/scripts/update_from_dev.sh');
1262         exec('chmod 700 /usr/local/ispconfig/server/scripts/update_from_dev.sh');
32d8e9 1263         exec('chown root /usr/local/ispconfig/server/scripts/update_from_tgz.sh');
T 1264         exec('chmod 700 /usr/local/ispconfig/server/scripts/update_from_tgz.sh');
1265         exec('chown root /usr/local/ispconfig/server/scripts/ispconfig_update.sh');
1266         exec('chmod 700 /usr/local/ispconfig/server/scripts/ispconfig_update.sh');
b34f99 1267         if(!is_link('/usr/local/bin/ispconfig_update_from_dev.sh')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_update.sh /usr/local/bin/ispconfig_update_from_dev.sh');
32d8e9 1268         if(!is_link('/usr/local/bin/ispconfig_update.sh')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_update.sh /usr/local/bin/ispconfig_update.sh');
b1a6a5 1269
32d8e9 1270         //set the fast cgi starter script to executable
T 1271         //exec('chmod 755 '.$install_dir.'/interface/bin/php-fcgi');
b1a6a5 1272
32d8e9 1273         //* Make the logs readable for the ispconfig user
T 1274         if(@is_file('/var/log/mail.log')) exec('chmod +r /var/log/mail.log');
1275         if(@is_file('/var/log/mail.warn')) exec('chmod +r /var/log/mail.warn');
1276         if(@is_file('/var/log/mail.err')) exec('chmod +r /var/log/mail.err');
1277         if(@is_file('/var/log/messages')) exec('chmod +r /var/log/messages');
b1a6a5 1278
32d8e9 1279         //To enable apache to read the directories
T 1280         exec('chmod a+rx /usr/local/ispconfig');
1281         exec('chmod -R 751 /usr/local/ispconfig/interface');
1282         exec('chmod a+rx /usr/local/ispconfig/interface/web');
b1a6a5 1283
32d8e9 1284         //* Create the ispconfig log directory
e38d14 1285         if(!is_dir($conf['ispconfig_log_dir'])) mkdir($conf['ispconfig_log_dir']);
J 1286         if(!is_file($conf['ispconfig_log_dir'].'/ispconfig.log')) exec('touch '.$conf['ispconfig_log_dir'].'/ispconfig.log');
b1a6a5 1287
0c5b42 1288         if(is_user('getmail')) {
T 1289             exec('mv /usr/local/ispconfig/server/scripts/run-getmail.sh /usr/local/bin/run-getmail.sh');
1290             exec('chown getmail /usr/local/bin/run-getmail.sh');
1291             exec('chmod 744 /usr/local/bin/run-getmail.sh');
1292         }
b1a6a5 1293
8cf78b 1294         if(is_dir($install_dir.'/interface/invoices')) {
e94a9f 1295             exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices'));
T 1296             exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices'));
edf806 1297         }
b1a6a5 1298
0799f8 1299         //* Create the ispconfig auth log file and set uid/gid
T 1300         if(!is_file($conf['ispconfig_log_dir'].'/auth.log')) {
1301             touch($conf['ispconfig_log_dir'].'/auth.log');
1302         }
1303         exec('chown ispconfig:ispconfig '. $conf['ispconfig_log_dir'].'/auth.log');
1304         exec('chmod 660 '. $conf['ispconfig_log_dir'].'/auth.log');
b1a6a5 1305
d71bae 1306         //* Remove Domain module as its functions are available in the client module now
T 1307         if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain');
021aec 1308         
TB 1309         // Add symlink for patch tool
1310         if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch');
c83951 1311         
TB 1312         // Change mode of a few files from amavisd
1313         if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640);
1314         if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400);
1315         if(is_file($conf['amavis']['config_dir'].'/amavisd.conf')) chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640);
1316         if(is_file($conf['amavis']['config_dir'].'/amavisd.conf~')) chmod($conf['amavis']['config_dir'].'/amavisd.conf~', 0400);
32d8e9 1317     }
T 1318 }
1319
e38d14 1320 ?>