Marius Cramer
2015-08-06 37b29231e47a0c4458dc1c15d98588f16f07e1e2
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';
bd5d26 231         if ($this->postfix_master()) {
FS 232             exec ("postconf -M maildrop.unix", $out, $ret);
233             $change_maildrop_flags = @(preg_match($regex, $out[0]) && $out[0] !='')?false:true;
234         } else { //* fallback - postfix < 2.9
235             $change_maildrop_flags = @(preg_match($regex, $configfile))?false:true;
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'];
fdb514 368         //* Configure master.cf and add a line for deliver
bd5d26 369         if ($this->postfix_master()) {
FS 370             exec ("postconf -M dovecot.unix", $out, $ret);
371             $add_dovecot_service = @($out[0]=='')?true:false;
372         } else { //* fallback - postfix < 2.9
373             $content = rf($config_dir.'/master.cf');
374             $add_dovecot_service = @(!stristr($content, "dovecot/deliver"))?true:false;
b1a6a5 375         }
bd5d26 376         if($add_dovecot_service) {
FS 377             //* backup
378             if(is_file($config_dir.'/master.cf')){
379                 copy($config_dir.'/master.cf', $config_dir.'/master.cf~2');
380             }
381             if(is_file($config_dir.'/master.cf~')){
382                 chmod($config_dir.'/master.cf~2', 0400);
383             }
384             //* Configure master.cf and add a line for deliver
385             $content = rf($conf["postfix"]["config_dir"].'/master.cf');
386             $deliver_content = 'dovecot   unix  -       n       n       -       -       pipe'."\n".'  flags=DRhu user=vmail:vmail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${user}@${nexthop}';
b1a6a5 387             af($conf["postfix"]["config_dir"].'/master.cf', $deliver_content);
bd5d26 388             unset($content);
FS 389             unset($deliver_content);
fdb514 390         }
b1a6a5 391
fdb514 392         //* Reconfigure postfix to use dovecot authentication
T 393         // Adding the amavisd commands to the postfix configuration
394         $postconf_commands = array (
395             'dovecot_destination_recipient_limit = 1',
a8aad2 396             'virtual_transport = '.$virtual_transport,
fdb514 397             'smtpd_sasl_type = dovecot',
T 398             'smtpd_sasl_path = private/auth',
399         );
b1a6a5 400
fdb514 401         // Make a backup copy of the main.cf file
b1a6a5 402         copy($conf["postfix"]["config_dir"].'/main.cf', $conf["postfix"]["config_dir"].'/main.cf~3');
MC 403
fdb514 404         // Executing the postconf commands
T 405         foreach($postconf_commands as $cmd) {
406             $command = "postconf -e '$cmd'";
407             caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
408         }
bd5d26 409
FS 410         $config_dir = $conf['dovecot']['config_dir'];
b1a6a5 411
31e0d1 412         //* backup dovecot.conf
fdb514 413         $configfile = 'dovecot.conf';
T 414         if(is_file("$config_dir/$configfile")){
b1a6a5 415             copy("$config_dir/$configfile", "$config_dir/$configfile~");
MC 416         }
417
31e0d1 418         //* Get the dovecot version
b1a6a5 419         exec('dovecot --version', $tmp);
MC 420         $parts = explode('.', trim($tmp[0]));
31e0d1 421         $dovecot_version = $parts[0];
T 422         unset($tmp);
423         unset($parts);
b1a6a5 424
31e0d1 425         //* Copy dovecot configuration file
T 426         if($dovecot_version == 2) {
b1a6a5 427             if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot2.conf.master')) {
MC 428                 copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot2.conf.master', $config_dir.'/'.$configfile);
429             } else {
430                 copy('tpl/opensuse_dovecot2.conf.master', $config_dir.'/'.$configfile);
431             }
31e0d1 432         } else {
b1a6a5 433             if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot.conf.master')) {
MC 434                 copy($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot.conf.master', $config_dir.'/'.$configfile);
435             } else {
436                 copy('tpl/opensuse_dovecot.conf.master', $config_dir.'/'.$configfile);
437             }
31e0d1 438         }
b1a6a5 439
8b23f8 440         //* dovecot-lmtpd
FS 441         if($configure_lmtp) {
442             replaceLine($config_dir.'/'.$configfile, 'protocols = imap pop3', 'protocols = imap pop3 lmtp', 1, 0);
443         }
444
fdb514 445         //* dovecot-sql.conf
T 446         $configfile = 'dovecot-sql.conf';
447         if(is_file("$config_dir/$configfile")){
b1a6a5 448             copy("$config_dir/$configfile", "$config_dir/$configfile~");
b67344 449             exec("chmod 400 $config_dir/$configfile~");
b1a6a5 450         }
MC 451
615a0a 452         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_dovecot-sql.conf.master', "tpl/opensuse_dovecot-sql.conf.master");
b1a6a5 453         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
MC 454         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
455         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
456         $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
82e9b9 457         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
032b86 458         $content = str_replace('{server_id}', $conf['server_id'], $content);
fdb514 459         wf("$config_dir/$configfile", $content);
b1a6a5 460
fdb514 461         exec("chmod 600 $config_dir/$configfile");
T 462         exec("chown root:root $config_dir/$configfile");
5e7306 463         
TB 464         // Dovecot shall ignore mounts in website directory
f9d95c 465         if(is_installed('doveadm')) exec("doveadm mount add '/srv/www/*' ignore > /dev/null 2> /dev/null");
fdb514 466
T 467     }
b1a6a5 468
32d8e9 469     public function configure_amavis() {
T 470         global $conf;
b1a6a5 471
32d8e9 472         // amavisd user config file
T 473         $configfile = 'opensuse_amavisd_conf';
b1a6a5 474         if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf')) @copy($conf["amavis"]["config_dir"].'/amavisd.conf', $conf["amavis"]["config_dir"].'/amavisd.conf~');
32d8e9 475         if(is_file($conf["amavis"]["config_dir"].'/amavisd.conf~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/amavisd.conf~');
615a0a 476         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
b1a6a5 477         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
MC 478         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
479         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
480         $content = str_replace('{mysql_server_port}', $conf["mysql"]["port"], $content);
481         $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
223c56 482         $content = str_replace('{hostname}', $conf['hostname'], $content);
b1a6a5 483         wf($conf["amavis"]["config_dir"].'/amavisd.conf', $content);
c83951 484         chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640);
b1a6a5 485
MC 486
32d8e9 487         // Adding the amavisd commands to the postfix configuration
T 488         $postconf_commands = array (
489             'content_filter = amavis:[127.0.0.1]:10024',
490             'receive_override_options = no_address_mappings'
491         );
b1a6a5 492
32d8e9 493         // Make a backup copy of the main.cf file
b1a6a5 494         copy($conf["postfix"]["config_dir"].'/main.cf', $conf["postfix"]["config_dir"].'/main.cf~2');
MC 495
32d8e9 496         // Executing the postconf commands
T 497         foreach($postconf_commands as $cmd) {
498             $command = "postconf -e '$cmd'";
499             caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
500         }
b1a6a5 501
bd5d26 502         $config_dir = $conf['postfix']['config_dir'];
FS 503
504         // Adding amavis-services to the master.cf file if the service does not already exists
505         if ($this->postfix_master()) {
506             exec ("postconf -M amavis.unix", $out, $ret);
507             $add_amavis = @($out[0]=='')?true:false;
508             unset($out);
509             exec ("postconf -M 127.0.0.1:10025.inet", $out, $ret);
510             $add_amavis_10025 = @($out[0]=='')?true:false;
511             unset($out);
512             exec ("postconf -M 127.0.0.1:10027.inet", $out, $ret);
513             $add_amavis_10027 = @($out[0]=='')?true:false;
514             unset($out);
515         } else { //* fallback - postfix < 2.9
8100f2 516             $content = rf($conf['postfix']['config_dir'].'/master.cf');
bd5d26 517             $add_amavis = @(!preg_match('/^amavis\s+unix\s+/m', $content))?true:false;
FS 518             $add_amavis_10025 = @(!preg_match('/^127.0.0.1:10025\s+/m', $content))?true:false;
519             $add_amavis_10027 = @(!preg_match('/^127.0.0.1:10027\s+/m', $content))?true:false;
8100f2 520         }
bd5d26 521
FS 522         if ($add_amavis || $add_amavis_10025 || $add_amavis_10027) {
523             //* backup master.cf
524             if(is_file($config_dir.'/master.cf')) copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
525             // adjust amavis-config
526             if($add_amavis) {
527                 $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis.master', 'tpl/master_cf_amavis.master');
528                 af($config_dir.'/master.cf', $content);
529                 unset($content);
530             }
531             if ($add_amavis_10025) {
532                 $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10025.master', 'tpl/master_cf_amavis10025.master');
533                 af($config_dir.'/master.cf', $content);
534                 unset($content);
535             }
536             if ($add_amavis_10027) {
537                 $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/master_cf_amavis10027.master', 'tpl/master_cf_amavis10027.master');
538                 af($config_dir.'/master.cf', $content);
539                 unset($content);
540             }
8100f2 541         }
b1a6a5 542
32d8e9 543         // Add the clamav user to the vscan group
5edf40 544         //exec('groupmod --add-user clamav vscan');
TB 545         $command = 'usermod -a -G clamav vscan';
546         caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 547
MC 548
32d8e9 549     }
b1a6a5 550
32d8e9 551     public function configure_spamassassin()
b1a6a5 552     {
32d8e9 553         global $conf;
b1a6a5 554
32d8e9 555         //* Enable spamasasssin on debian and ubuntu
T 556         /*
557         $configfile = '/etc/default/spamassassin';
558         if(is_file($configfile)){
559             copy($configfile, $configfile.'~');
560         }
561         $content = rf($configfile);
562         $content = str_replace('ENABLED=0', 'ENABLED=1', $content);
563         wf($configfile, $content);
564         */
565     }
b1a6a5 566
32d8e9 567     public function configure_getmail()
b1a6a5 568     {
32d8e9 569         global $conf;
b1a6a5 570
32d8e9 571         $config_dir = $conf['getmail']['config_dir'];
b1a6a5 572
32d8e9 573         if(!is_dir($config_dir)) exec("mkdir -p ".escapeshellcmd($config_dir));
T 574
575         $command = "useradd -d $config_dir getmail";
576         if(!is_user('getmail')) caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 577
32d8e9 578         $command = "chown -R getmail $config_dir";
T 579         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 580
32d8e9 581         $command = "chmod -R 700 $config_dir";
T 582         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
583     }
b1a6a5 584
MC 585
32d8e9 586     public function configure_pureftpd()
b1a6a5 587     {
32d8e9 588         global $conf;
b1a6a5 589
32d8e9 590         $config_dir = $conf['pureftpd']['config_dir'];
T 591
592         //* configure pam for SMTP authentication agains the ispconfig database
593         $configfile = 'db/mysql.conf';
594         if(is_file("$config_dir/$configfile")){
b1a6a5 595             copy("$config_dir/$configfile", "$config_dir/$configfile~");
MC 596         }
32d8e9 597         if(is_file("$config_dir/$configfile~")){
b1a6a5 598             exec("chmod 400 $config_dir/$configfile~");
MC 599         }
615a0a 600         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/pureftpd_mysql.conf.master', 'tpl/pureftpd_mysql.conf.master');
32d8e9 601         $content = str_replace('{mysql_server_ispconfig_user}', $conf["mysql"]["ispconfig_user"], $content);
T 602         $content = str_replace('{mysql_server_ispconfig_password}', $conf["mysql"]["ispconfig_password"], $content);
603         $content = str_replace('{mysql_server_database}', $conf["mysql"]["database"], $content);
604         $content = str_replace('{mysql_server_ip}', $conf["mysql"]["ip"], $content);
605         $content = str_replace('{server_id}', $conf["server_id"], $content);
606         wf("$config_dir/$configfile", $content);
607         exec("chmod 600 $config_dir/$configfile");
608         exec("chown root:root $config_dir/$configfile");
b1a6a5 609
32d8e9 610         // copy our customized copy of pureftpd.conf to the pure-ftpd config directory
615a0a 611         if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/opensuse_pureftpd_conf.master')) {
b1a6a5 612             exec("cp " . $conf['ispconfig_install_dir']."/server/conf-custom/install/opensuse_pureftpd_conf.master $config_dir/pure-ftpd.conf");
MC 613         } else {
614             exec("cp tpl/opensuse_pureftpd_conf.master $config_dir/pure-ftpd.conf");
615         }
616
32d8e9 617     }
b1a6a5 618
32d8e9 619     public function configure_mydns()
b1a6a5 620     {
32d8e9 621         global $conf;
b1a6a5 622
223c56 623         // configure mydns
32d8e9 624         $configfile = 'mydns.conf';
b1a6a5 625         if(is_file($conf["mydns"]["config_dir"].'/'.$configfile)) copy($conf["mydns"]["config_dir"].'/'.$configfile, $conf["mydns"]["config_dir"].'/'.$configfile.'~');
32d8e9 626         if(is_file($conf["mydns"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["mydns"]["config_dir"].'/'.$configfile.'~');
615a0a 627         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/".$configfile.".master");
b1a6a5 628         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
MC 629         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
630         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
631         $content = str_replace('{mysql_server_host}', $conf["mysql"]["host"], $content);
82e9b9 632         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
b1a6a5 633         $content = str_replace('{server_id}', $conf["server_id"], $content);
MC 634         wf($conf["mydns"]["config_dir"].'/'.$configfile, $content);
32d8e9 635         exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
T 636         exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
b1a6a5 637
32d8e9 638     }
b1a6a5 639
32d8e9 640     public function configure_apache()
b1a6a5 641     {
32d8e9 642         global $conf;
b1a6a5 643
1bd269 644         if($conf['apache']['installed'] == false) return;
32d8e9 645         //* Create the logging directory for the vhost logfiles
T 646         exec('mkdir -p /var/log/ispconfig/httpd');
6c9bc3 647         
TB 648         //* enable apache logio module
649         exec('a2enmod logio');
b1a6a5 650
32d8e9 651         //if(is_file('/etc/suphp.conf')) {
b1a6a5 652         replaceLine('/etc/suphp.conf', 'php=php', 'x-httpd-suphp="php:/srv/www/cgi-bin/php5"', 0, 0);
MC 653         replaceLine('/etc/suphp.conf', 'php="php', 'x-httpd-suphp="php:/srv/www/cgi-bin/php5"', 0, 0);
654         replaceLine('/etc/suphp.conf', 'docroot=', 'docroot=/srv/www', 0, 0);
655         replaceLine('/etc/suphp.conf', 'umask=0077', 'umask=0022', 0);
32d8e9 656         //}
b1a6a5 657
26c0fc 658         if(!file_exists('/srv/www/cgi-bin/php5') && file_exists('/srv/www/cgi-bin/php')) {
b1a6a5 659             symlink('/srv/www/cgi-bin/php', '/srv/www/cgi-bin/php5');
26c0fc 660         }
b1a6a5 661
dbe5b0 662         // Sites enabled and available dirs
32d8e9 663         exec('mkdir -p '.$conf['apache']['vhost_conf_enabled_dir']);
T 664         exec('mkdir -p '.$conf['apache']['vhost_conf_dir']);
b1a6a5 665
32d8e9 666         $content = rf('/etc/apache2/httpd.conf');
b1a6a5 667         if(!stristr($content, 'Include /etc/apache2/sites-enabled/')) {
5545f1 668             af('/etc/apache2/httpd.conf', "\n<Directory /srv/www>\n    Options +FollowSymlinks\n</Directory>\n\nInclude /etc/apache2/sites-enabled/\n\n");
32d8e9 669         }
T 670         unset($content);
b1a6a5 671
32d8e9 672         //* Copy the ISPConfig configuration include
b1a6a5 673         $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
MC 674         $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
675
ccbf14 676         $tpl = new tpl('apache_ispconfig.conf.master');
TB 677         $tpl->setVar('apache_version',getapacheversion());
678         
2af58c 679         $records = $this->db->queryAllRecords("SELECT * FROM ?? WHERE server_id = ? AND virtualhost = 'y'", $conf['mysql']['master_database'] . '.server_ip', $conf['server_id']);
ccbf14 680         $ip_addresses = array();
TB 681         
fb3a98 682         if(is_array($records) && count($records) > 0) {
32d8e9 683             foreach($records as $rec) {
a2156e 684                 if($rec['ip_type'] == 'IPv6') {
T 685                     $ip_address = '['.$rec['ip_address'].']';
686                 } else {
687                     $ip_address = $rec['ip_address'];
688                 }
b1a6a5 689                 $ports = explode(',', $rec['virtualhost_port']);
a2156e 690                 if(is_array($ports)) {
T 691                     foreach($ports as $port) {
692                         $port = intval($port);
693                         if($port > 0 && $port < 65536 && $ip_address != '') {
ccbf14 694                             $ip_addresses[] = array('ip_address' => $ip_address, 'port' => $port);
a2156e 695                         }
T 696                     }
697                 }
32d8e9 698             }
T 699         }
855547 700         
3de838 701         if(count($ip_addresses) > 0) $tpl->setLoop('ip_adresses',$ip_addresses);
223c56 702
ccbf14 703         wf($vhost_conf_dir.'/ispconfig.conf', $tpl->grab());
TB 704         unset($tpl);
b1a6a5 705
32d8e9 706         if(!@is_link($vhost_conf_enabled_dir."/000-ispconfig.conf")) {
T 707             exec("ln -s ".$vhost_conf_dir."/ispconfig.conf ".$vhost_conf_enabled_dir."/000-ispconfig.conf");
708         }
b1a6a5 709
99d5dc 710         //* make sure that webalizer finds its config file when it is directly in /etc
T 711         if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
712             exec('mkdir /etc/webalizer');
713             exec('ln -s /etc/webalizer.conf /etc/webalizer/webalizer.conf');
714         }
b1a6a5 715
99d5dc 716         if(is_file('/etc/webalizer/webalizer.conf')) {
T 717             // Change webalizer mode to incremental
b1a6a5 718             replaceLine('/etc/webalizer/webalizer.conf', '#IncrementalName', 'IncrementalName webalizer.current', 0, 0);
MC 719             replaceLine('/etc/webalizer/webalizer.conf', '#Incremental', 'Incremental     yes', 0, 0);
720             replaceLine('/etc/webalizer/webalizer.conf', '#HistoryName', 'HistoryName     webalizer.hist', 0, 0);
99d5dc 721         }
b1a6a5 722
6b029a 723         //* add a sshusers group
T 724         $command = 'groupadd sshusers';
725         if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 726
526b99 727         // create PHP-FPM pool dir
T 728         exec('mkdir -p '.$conf['nginx']['php_fpm_pool_dir']);
b1a6a5 729
526b99 730         $content = rf('/etc/php5/fpm/php-fpm.conf');
T 731         if(stripos($content, 'include=/etc/php5/fpm/pool.d/*.conf') === false){
b1a6a5 732             af('/etc/php5/fpm/php-fpm.conf', "\ninclude=/etc/php5/fpm/pool.d/*.conf");
526b99 733         }
T 734         unset($content);
735         if(!@is_file($conf['nginx']['php_fpm_ini_path'])){
736             if(@is_file('/etc/php5/cli/php.ini')){
737                 exec('cp -f /etc/php5/cli/php.ini '.$conf['nginx']['php_fpm_ini_path']);
738             } elseif(@is_file('/etc/php5/fastcgi/php.ini')){
739                 exec('cp -f /etc/php5/fastcgi/php.ini '.$conf['nginx']['php_fpm_ini_path']);
740             } elseif(@is_file('/etc/php5/apache2/php.ini')){
741                 exec('cp -f /etc/php5/apache2/php.ini '.$conf['nginx']['php_fpm_ini_path']);
742             }
743         }
b1a6a5 744
32d8e9 745     }
b1a6a5 746
2d86e1 747     public function configure_nginx(){
F 748         global $conf;
b1a6a5 749
2d86e1 750         if($conf['nginx']['installed'] == false) return;
F 751         //* Create the logging directory for the vhost logfiles
752         if(!@is_dir($conf['ispconfig_log_dir'].'/httpd')) mkdir($conf['ispconfig_log_dir'].'/httpd', 0755, true);
b1a6a5 753
dbe5b0 754         // Sites enabled and available dirs
2d86e1 755         exec('mkdir -p '.$conf['nginx']['vhost_conf_enabled_dir']);
F 756         exec('mkdir -p '.$conf['nginx']['vhost_conf_dir']);
b1a6a5 757
dbe5b0 758         $content = rf('/etc/nginx/nginx.conf');
F 759         if(stripos($content, 'include /etc/nginx/sites-enabled/*.vhost;') === false){
760             $content = trim($content);
b1a6a5 761             $content = substr($content, 0, -1)."\n    include /etc/nginx/sites-enabled/*.vhost;\n}";
MC 762             wf('/etc/nginx/nginx.conf', $content);
dbe5b0 763         }
2d86e1 764         unset($content);
b1a6a5 765
2d86e1 766         // create PHP-FPM pool dir
F 767         exec('mkdir -p '.$conf['nginx']['php_fpm_pool_dir']);
b1a6a5 768
2d86e1 769         $content = rf('/etc/php5/fpm/php-fpm.conf');
F 770         if(stripos($content, 'include=/etc/php5/fpm/pool.d/*.conf') === false){
b1a6a5 771             af('/etc/php5/fpm/php-fpm.conf', "\ninclude=/etc/php5/fpm/pool.d/*.conf");
2d86e1 772         }
F 773         unset($content);
59feb7 774         if(!@is_file($conf['nginx']['php_fpm_ini_path'])){
F 775             if(@is_file('/etc/php5/cli/php.ini')){
776                 exec('cp -f /etc/php5/cli/php.ini '.$conf['nginx']['php_fpm_ini_path']);
777             } elseif(@is_file('/etc/php5/fastcgi/php.ini')){
778                 exec('cp -f /etc/php5/fastcgi/php.ini '.$conf['nginx']['php_fpm_ini_path']);
779             } elseif(@is_file('/etc/php5/apache2/php.ini')){
780                 exec('cp -f /etc/php5/apache2/php.ini '.$conf['nginx']['php_fpm_ini_path']);
781             }
782         }
2d86e1 783
F 784         //* make sure that webalizer finds its config file when it is directly in /etc
785         if(@is_file('/etc/webalizer.conf') && !@is_dir('/etc/webalizer')) {
786             mkdir('/etc/webalizer');
b1a6a5 787             symlink('/etc/webalizer.conf', '/etc/webalizer/webalizer.conf');
2d86e1 788         }
F 789
790         if(is_file('/etc/webalizer/webalizer.conf')) {
791             // Change webalizer mode to incremental
b1a6a5 792             replaceLine('/etc/webalizer/webalizer.conf', '#IncrementalName', 'IncrementalName webalizer.current', 0, 0);
MC 793             replaceLine('/etc/webalizer/webalizer.conf', '#Incremental', 'Incremental     yes', 0, 0);
794             replaceLine('/etc/webalizer/webalizer.conf', '#HistoryName', 'HistoryName     webalizer.hist', 0, 0);
2d86e1 795         }
b1a6a5 796
2d86e1 797         // Check the awsatst script
F 798         if(!is_dir('/usr/share/awstats/tools')) exec('mkdir -p /usr/share/awstats/tools');
b1a6a5 799         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 800         if(file_exists('/etc/awstats/awstats.conf.local')) replaceLine('/etc/awstats/awstats.conf.local', 'LogFormat=4', 'LogFormat=1', 0, 1);
801
2d86e1 802         //* add a sshusers group
F 803         $command = 'groupadd sshusers';
804         if(!is_group('sshusers')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
805     }
b1a6a5 806
ca2165 807     public function configure_bastille_firewall()
32d8e9 808     {
T 809         global $conf;
b1a6a5 810
32d8e9 811         $dist_init_scripts = $conf['init_scripts'];
b1a6a5 812
32d8e9 813         if(is_dir("/etc/Bastille.backup")) caselog("rm -rf /etc/Bastille.backup", __FILE__, __LINE__);
T 814         if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
b1a6a5 815         @mkdir("/etc/Bastille", octdec($directory_mode));
MC 816         if(is_dir("/etc/Bastille.backup/firewall.d")) caselog("cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/", __FILE__, __LINE__);
817         if(is_file($conf['ispconfig_install_dir'].'/server/conf-custom/install/bastille-firewall.cfg.master')) {
818             caselog("cp -f " . $conf['ispconfig_install_dir']."/server/conf-custom/install/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
819         } else {
820             caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
821         }
822         caselog("chmod 644 /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
823         $content = rf("/etc/Bastille/bastille-firewall.cfg");
824         $content = str_replace("{DNS_SERVERS}", "", $content);
32d8e9 825
b1a6a5 826         $tcp_public_services = '';
MC 827         $udp_public_services = '';
828
2af58c 829         $row = $this->db->queryOneRecord('SELECT * FROM ?? WHERE server_id = ?', $conf["mysql"]["database"] . '.firewall', $conf['server_id']);
b1a6a5 830
MC 831         if(trim($row["tcp_port"]) != '' || trim($row["udp_port"]) != ''){
832             $tcp_public_services = trim(str_replace(',', ' ', $row["tcp_port"]));
833             $udp_public_services = trim(str_replace(',', ' ', $row["udp_port"]));
834         } else {
835             $tcp_public_services = '21 22 25 53 80 110 443 3306 8080 10000';
836             $udp_public_services = '53';
837         }
32d8e9 838         if(!stristr($tcp_public_services, $conf['apache']['vhost_port'])) {
T 839             $tcp_public_services .= ' '.intval($conf['apache']['vhost_port']);
2af58c 840             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 841         }
T 842
b1a6a5 843         $content = str_replace("{TCP_PUBLIC_SERVICES}", $tcp_public_services, $content);
MC 844         $content = str_replace("{UDP_PUBLIC_SERVICES}", $udp_public_services, $content);
32d8e9 845
b1a6a5 846         wf("/etc/Bastille/bastille-firewall.cfg", $content);
32d8e9 847
b1a6a5 848         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 849         caselog("cp -f apps/bastille-firewall $dist_init_scripts", __FILE__, __LINE__);
850         caselog("chmod 700 $dist_init_scripts/bastille-firewall", __FILE__, __LINE__);
32d8e9 851
b1a6a5 852         if(is_file("/sbin/bastille-ipchains")) caselog("mv -f /sbin/bastille-ipchains /sbin/bastille-ipchains.backup", __FILE__, __LINE__);
MC 853         caselog("cp -f apps/bastille-ipchains /sbin", __FILE__, __LINE__);
854         caselog("chmod 700 /sbin/bastille-ipchains", __FILE__, __LINE__);
855
856         if(is_file("/sbin/bastille-netfilter")) caselog("mv -f /sbin/bastille-netfilter /sbin/bastille-netfilter.backup", __FILE__, __LINE__);
857         caselog("cp -f apps/bastille-netfilter /sbin", __FILE__, __LINE__);
858         caselog("chmod 700 /sbin/bastille-netfilter", __FILE__, __LINE__);
859
32d8e9 860         if(!@is_dir('/var/lock/subsys')) caselog("mkdir /var/lock/subsys", __FILE__, __LINE__);
T 861
b1a6a5 862         exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
MC 863         if(!is_file("/sbin/ipchains") && !is_link("/sbin/ipchains") && $ret_val == 0) phpcaselog(@symlink(shell_exec("which ipchains"), "/sbin/ipchains"), 'create symlink', __FILE__, __LINE__);
864         unset($ipchains_location);
865         exec("which iptables &> /dev/null", $iptables_location, $ret_val);
866         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__);
867         unset($iptables_location);
32d8e9 868
T 869     }
4ae2a0 870
32d8e9 871     public function install_ispconfig()
b1a6a5 872     {
32d8e9 873         global $conf;
b1a6a5 874
32d8e9 875         $install_dir = $conf['ispconfig_install_dir'];
T 876
877         //* Create the ISPConfig installation directory
878         if(!@is_dir("$install_dir")) {
879             $command = "mkdir $install_dir";
880             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
881         }
b1a6a5 882
32d8e9 883         //* Create a ISPConfig user and group
T 884         $command = 'groupadd ispconfig';
885         if(!is_group('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 886
32d8e9 887         $command = "useradd -g ispconfig -d $install_dir ispconfig";
T 888         if(!is_user('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 889
32d8e9 890         //* copy the ISPConfig interface part
T 891         $command = "cp -rf ../interface $install_dir";
892         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 893
32d8e9 894         //* copy the ISPConfig server part
T 895         $command = "cp -rf ../server $install_dir";
896         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
a13af2 897         
fb6c56 898         //* Make a backup of the security settings
TB 899         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~');
900         
a13af2 901         //* copy the ISPConfig security part
TB 902         $command = 'cp -rf ../security '.$install_dir;
903         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
fb6c56 904         
TB 905         //* Apply changed security_settings.ini values to new security_settings.ini file
906         if(is_file('/usr/local/ispconfig/security/security_settings.ini~')) {
907             $security_settings_old = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini~'));
908             $security_settings_new = ini_to_array(file_get_contents('/usr/local/ispconfig/security/security_settings.ini'));
909             if(is_array($security_settings_new) && is_array($security_settings_old)) {
910                 foreach($security_settings_new as $section => $sval) {
911                     if(is_array($sval)) {
912                         foreach($sval as $key => $val) {
913                             if(isset($security_settings_old[$section]) && isset($security_settings_old[$section][$key])) {
914                                 $security_settings_new[$section][$key] = $security_settings_old[$section][$key];
915                             }
916                         }
917                     }
918                 }
919                 file_put_contents('/usr/local/ispconfig/security/security_settings.ini',array_to_ini($security_settings_new));
920             }
921         }
b1a6a5 922
32d8e9 923         //* Create a symlink, so ISPConfig is accessible via web
T 924         // Replaced by a separate vhost definition for port 8080
925         // $command = "ln -s $install_dir/interface/web/ /var/www/ispconfig";
926         // caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 927
32d8e9 928         //* Create the config file for ISPConfig interface
T 929         $configfile = 'config.inc.php';
930         if(is_file($install_dir.'/interface/lib/'.$configfile)){
b1a6a5 931             copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
MC 932         }
615a0a 933         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
32d8e9 934         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
T 935         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
936         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
937         $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
82e9b9 938         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
b1a6a5 939
32d8e9 940         $content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
T 941         $content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
942         $content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
943         $content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
82e9b9 944         $content = str_replace('{mysql_master_server_port}', $conf['mysql']['master_port'], $content);
b1a6a5 945
32d8e9 946         $content = str_replace('{server_id}', $conf['server_id'], $content);
T 947         $content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
5898e6 948         $content = str_replace('{language}', $conf['language'], $content);
8cf78b 949         $content = str_replace('{timezone}', $conf['timezone'], $content);
41eaa8 950         $content = str_replace('{theme}', $conf['theme'], $content);
992797 951         $content = str_replace('{language_file_import_enabled}', ($conf['language_file_import_enabled'] == true)?'true':'false', $content);
b1a6a5 952
MC 953         wf("$install_dir/interface/lib/$configfile", $content);
954
955         //* Create the config file for ISPConfig server
956         $configfile = 'config.inc.php';
957         if(is_file($install_dir.'/server/lib/'.$configfile)){
958             copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
959         }
960         $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/'.$configfile.'.master', "tpl/$configfile.master");
961         $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
962         $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
963         $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
964         $content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
82e9b9 965         $content = str_replace('{mysql_server_port}', $conf['mysql']['port'], $content);
b1a6a5 966
MC 967         $content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
968         $content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
969         $content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
970         $content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
82e9b9 971         $content = str_replace('{mysql_master_server_port}', $conf['mysql']['master_port'], $content);
b1a6a5 972
MC 973         $content = str_replace('{server_id}', $conf['server_id'], $content);
974         $content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
975         $content = str_replace('{language}', $conf['language'], $content);
976         $content = str_replace('{timezone}', $conf['timezone'], $content);
977         $content = str_replace('{theme}', $conf['theme'], $content);
978         $content = str_replace('{language_file_import_enabled}', ($conf['language_file_import_enabled'] == true)?'true':'false', $content);
979
32d8e9 980         wf("$install_dir/server/lib/$configfile", $content);
b1a6a5 981
fb3a98 982         //* Create the config file for remote-actions (but only, if it does not exist, because
T 983         //  the value is a autoinc-value and so changed by the remoteaction_core_module
984         if (!file_exists($install_dir.'/server/lib/remote_action.inc.php')) {
985             $content = '<?php' . "\n" . '$maxid_remote_action = 0;' . "\n" . '?>';
986             wf($install_dir.'/server/lib/remote_action.inc.php', $content);
987         }
b1a6a5 988
32d8e9 989         //* Enable the server modules and plugins.
T 990         // TODO: Implement a selector which modules and plugins shall be enabled.
991         $dir = $install_dir.'/server/mods-available/';
992         if (is_dir($dir)) {
993             if ($dh = opendir($dir)) {
994                 while (($file = readdir($dh)) !== false) {
b1a6a5 995                     if($file != '.' && $file != '..' && substr($file, -8, 8) == '.inc.php') {
MC 996                         include_once $install_dir.'/server/mods-available/'.$file;
997                         $module_name = substr($file, 0, -8);
32d8e9 998                         $tmp = new $module_name;
T 999                         if($tmp->onInstall()) {
1000                             if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
1001                             if (strpos($file, '_core_module') !== false) {
1002                                 if(!@is_link($install_dir.'/server/mods-core/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-core/'.$file);
1003                             }
1004                         }
1005                         unset($tmp);
1006                     }
1007                 }
1008                 closedir($dh);
1009             }
1010         }
b1a6a5 1011
32d8e9 1012         $dir = $install_dir.'/server/plugins-available/';
T 1013         if (is_dir($dir)) {
1014             if ($dh = opendir($dir)) {
1015                 while (($file = readdir($dh)) !== false) {
1bd269 1016                     if($conf['apache']['installed'] == true && $file == 'nginx_plugin.inc.php') continue;
F 1017                     if($conf['nginx']['installed'] == true && $file == 'apache2_plugin.inc.php') continue;
b1a6a5 1018                     if($file != '.' && $file != '..' && substr($file, -8, 8) == '.inc.php') {
MC 1019                         include_once $install_dir.'/server/plugins-available/'.$file;
1020                         $plugin_name = substr($file, 0, -8);
32d8e9 1021                         $tmp = new $plugin_name;
T 1022                         if($tmp->onInstall()) {
1023                             if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
1024                             if (strpos($file, '_core_plugin') !== false) {
1025                                 if(!@is_link($install_dir.'/server/plugins-core/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-core/'.$file);
1026                             }
1027                         }
1028                         unset($tmp);
1029                     }
1030                 }
1031                 closedir($dh);
1032             }
1033         }
b1a6a5 1034
32d8e9 1035         // Update the server config
T 1036         $mail_server_enabled = ($conf['services']['mail'])?1:0;
1037         $web_server_enabled = ($conf['services']['web'])?1:0;
1038         $dns_server_enabled = ($conf['services']['dns'])?1:0;
1039         $file_server_enabled = ($conf['services']['file'])?1:0;
1040         $db_server_enabled = ($conf['services']['db'])?1:0;
1041         $vserver_server_enabled = ($conf['services']['vserver'])?1:0;
2af58c 1042         $sql = "UPDATE `server` SET mail_server = ?, web_server = ?, dns_server = ?, file_server = ?, db_server = ?, vserver_server = ? WHERE server_id = ?";
b1a6a5 1043
a6e3ae 1044         $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 1045         if($conf['mysql']['master_slave_setup'] == 'y') {
a6e3ae 1046             $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 1047         }
b1a6a5 1048
3e0fc8 1049         // chown install dir to root and chmod 755
TB 1050         $command = 'chown root:root '.$install_dir;
1051         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1052         $command = 'chmod 755 '.$install_dir;
32d8e9 1053         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
T 1054
fa029b 1055         //* Chmod the files and directories in the install dir
3e0fc8 1056         $command = 'chmod -R 750 '.$install_dir.'/*';
TB 1057         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1058
1059         //* chown the interface files to the ispconfig user and group
1060         $command = 'chown -R ispconfig:ispconfig '.$install_dir.'/interface';
1061         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1062         
1063         //* chown the server files to the root user and group
1064         $command = 'chown -R root:root '.$install_dir.'/server';
32d8e9 1065         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
fa029b 1066         
TB 1067         //* chown the security files to the root user and group
1068         $command = 'chown -R root:root '.$install_dir.'/security';
1069         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1070         
1071         //* chown the security directory and security_settings.ini to root:ispconfig
1072         $command = 'chown root:ispconfig '.$install_dir.'/security/security_settings.ini';
1073         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1074         $command = 'chown root:ispconfig '.$install_dir.'/security';
1075         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
cb1221 1076         $command = 'chown root:ispconfig '.$install_dir.'/security/ids.whitelist';
TB 1077         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1078         $command = 'chown root:ispconfig '.$install_dir.'/security/ids.htmlfield';
1079         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
1080         $command = 'chown root:ispconfig '.$install_dir.'/security/apache_directives.blacklist';
32d8e9 1081         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 1082
32d8e9 1083         //* Make the global language file directory group writable
T 1084         exec("chmod -R 770 $install_dir/interface/lib/lang");
b1a6a5 1085
32d8e9 1086         //* Make the temp directory for language file exports writable
T 1087         exec("chmod -R 770 $install_dir/interface/web/temp");
b1a6a5 1088
32d8e9 1089         //* Make all interface language file directories group writable
T 1090         $handle = @opendir($install_dir.'/interface/web');
b1a6a5 1091         while ($file = @readdir($handle)) {
MC 1092             if ($file != '.' && $file != '..') {
1093                 if(@is_dir($install_dir.'/interface/web'.'/'.$file.'/lib/lang')) {
32d8e9 1094                     $handle2 = opendir($install_dir.'/interface/web'.'/'.$file.'/lib/lang');
b1a6a5 1095                     chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang', 0770);
MC 1096                     while ($lang_file = @readdir($handle2)) {
32d8e9 1097                         if ($lang_file != '.' && $lang_file != '..') {
b1a6a5 1098                             chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang/'.$lang_file, 0770);
32d8e9 1099                         }
T 1100                     }
1101                 }
1102             }
1103         }
b1a6a5 1104
477d4e 1105         //* Make the APS directories group writable
T 1106         exec("chmod -R 770 $install_dir/interface/web/sites/aps_meta_packages");
1107         exec("chmod -R 770 $install_dir/server/aps_packages");
b1a6a5 1108
32d8e9 1109         //* make sure that the server config file (not the interface one) is only readable by the root user
bfcdef 1110         chmod($install_dir.'/server/lib/config.inc.php', 0600);
T 1111         chown($install_dir.'/server/lib/config.inc.php', 'root');
1112         chgrp($install_dir.'/server/lib/config.inc.php', 'root');
b1a6a5 1113
bfcdef 1114         //* Make sure thet the interface config file is readable by user ispconfig only
T 1115         chmod($install_dir.'/interface/lib/config.inc.php', 0600);
1116         chown($install_dir.'/interface/lib/config.inc.php', 'ispconfig');
1117         chgrp($install_dir.'/interface/lib/config.inc.php', 'ispconfig');
b1a6a5 1118
32d8e9 1119         if(@is_file("$install_dir/server/lib/mysql_clientdb.conf")) {
T 1120             exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf");
1121             exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf");
1122         }
980485 1123         
TB 1124         if(is_dir($install_dir.'/interface/invoices')) {
1125             exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices'));
1126             exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices'));
1127         }
1128         
1129         exec('chown -R root:root /usr/local/ispconfig/interface/ssl');
b1a6a5 1130
32d8e9 1131         // TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing
T 1132         // and must be fixed as this will allow the apache user to read the ispconfig files.
1133         // Later this must run as own apache server or via suexec!
63b369 1134         if($conf['apache']['installed'] == true){
5edf40 1135             $command = 'usermod -a -G ispconfig '.$conf['apache']['user'];
63b369 1136             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
272aec 1137             if(is_group('ispapps')){
5edf40 1138                 $command = 'usermod -a -G ispapps '.$conf['apache']['user'];
272aec 1139                 caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
F 1140             }
63b369 1141         }
F 1142         if($conf['nginx']['installed'] == true){
223c56 1143             $command = 'usermod -a -G ispconfig '.$conf['nginx']['user'];
63b369 1144             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
272aec 1145             if(is_group('ispapps')){
5edf40 1146                 $command = 'usermod -a -G ispapps '.$conf['nginx']['user'];
272aec 1147                 caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
F 1148             }
5c93f0 1149             // add nobody user to www group, as the default php-fpm pool from opensuse runs as nobody
TB 1150             $command = 'usermod -a -G www nobody';
1151             caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
63b369 1152         }
b1a6a5 1153
32d8e9 1154         //* Make the shell scripts executable
T 1155         $command = "chmod +x $install_dir/server/scripts/*.sh";
1156         caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
b1a6a5 1157
7e1cfb 1158         if($conf['apache']['installed'] == true && $this->install_ispconfig_interface == true){
1bd269 1159             //* Copy the ISPConfig vhost for the controlpanel
F 1160             // TODO: These are missing! should they be "vhost_dist_*_dir" ?
1161             $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
1162             $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
b1a6a5 1163
MC 1164
1bd269 1165             // Dont just copy over the virtualhost template but add some custom settings
ccbf14 1166             $tpl = new tpl('apache_ispconfig.vhost.master');
TB 1167             $tpl->setVar('vhost_port',$conf['apache']['vhost_port']);
b1a6a5 1168
1bd269 1169             // comment out the listen directive if port is 80 or 443
F 1170             if($conf['apache']['vhost_port'] == 80 or $conf['apache']['vhost_port'] == 443) {
ccbf14 1171                 $tpl->setVar('vhost_port_listen','#');
1bd269 1172             } else {
ccbf14 1173                 $tpl->setVar('vhost_port_listen','');
1bd269 1174             }
b1a6a5 1175
ccbf14 1176             if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
TB 1177                 $tpl->setVar('ssl_comment','');
1bd269 1178             } else {
ccbf14 1179                 $tpl->setVar('ssl_comment','#');
1bd269 1180             }
10b4c8 1181             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 1182                 $tpl->setVar('ssl_bundle_comment','');
10b4c8 1183             } else {
ccbf14 1184                 $tpl->setVar('ssl_bundle_comment','#');
10b4c8 1185             }
ccbf14 1186             
TB 1187             $tpl->setVar('apache_version',getapacheversion());
b1a6a5 1188
8c9637 1189             $content = $tpl->grab();
MS 1190             $content = str_replace('/var/www/', '/srv/www/', $content);
1191             wf($vhost_conf_dir.'/ispconfig.vhost', $content);
b1a6a5 1192
cc6568 1193             //if(!is_file('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter')) {
b1a6a5 1194             $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/apache_ispconfig_fcgi_starter.master', 'tpl/apache_ispconfig_fcgi_starter.master');
MC 1195             $content = str_replace('{fastcgi_bin}', $conf['fastcgi']['fastcgi_bin'], $content);
1196             $content = str_replace('{fastcgi_phpini_path}', $conf['fastcgi']['fastcgi_phpini_path'], $content);
1197             exec('mkdir -p /srv/www/php-fcgi-scripts/ispconfig');
1198             wf('/srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter', $content);
1199             exec('chmod +x /srv/www/php-fcgi-scripts/ispconfig/.php-fcgi-starter');
1200             exec('ln -s /usr/local/ispconfig/interface/web /srv/www/ispconfig');
1201             exec('chown -R ispconfig:ispconfig /srv/www/php-fcgi-scripts/ispconfig');
1202
cc6568 1203             //}
b1a6a5 1204
1bd269 1205             //copy('tpl/apache_ispconfig.vhost.master', "$vhost_conf_dir/ispconfig.vhost");
F 1206             //* and create the symlink
7e1cfb 1207             if($this->is_update == false) {
1bd269 1208                 if(@is_link("$vhost_conf_enabled_dir/ispconfig.vhost")) unlink("$vhost_conf_enabled_dir/ispconfig.vhost");
F 1209                 if(!@is_link("$vhost_conf_enabled_dir/000-ispconfig.vhost")) {
1210                     exec("ln -s $vhost_conf_dir/ispconfig.vhost $vhost_conf_enabled_dir/000-ispconfig.vhost");
1211                 }
b1a6a5 1212
1bd269 1213             }
b1a6a5 1214
1bd269 1215             // Fix a setting in vhost master file for suse
b1a6a5 1216             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 1217         }
F 1218
7e1cfb 1219         if($conf['nginx']['installed'] == true && $this->install_ispconfig_interface == true){
1bd269 1220             //* Copy the ISPConfig vhost for the controlpanel
F 1221             $vhost_conf_dir = $conf['nginx']['vhost_conf_dir'];
1222             $vhost_conf_enabled_dir = $conf['nginx']['vhost_conf_enabled_dir'];
1223
1224             // Dont just copy over the virtualhost template but add some custom settings
615a0a 1225             $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/nginx_ispconfig.vhost.master', 'tpl/nginx_ispconfig.vhost.master');
1bd269 1226             $content = str_replace('{vhost_port}', $conf['nginx']['vhost_port'], $content);
b1a6a5 1227
1bd269 1228             if(is_file($install_dir.'/interface/ssl/ispserver.crt') && is_file($install_dir.'/interface/ssl/ispserver.key')) {
10b4c8 1229                 $content = str_replace('{ssl_on}', ' on', $content);
1bd269 1230                 $content = str_replace('{ssl_comment}', '', $content);
F 1231                 $content = str_replace('{fastcgi_ssl}', 'on', $content);
1232             } else {
10b4c8 1233                 $content = str_replace('{ssl_on}', ' off', $content);
1bd269 1234                 $content = str_replace('{ssl_comment}', '#', $content);
F 1235                 $content = str_replace('{fastcgi_ssl}', 'off', $content);
32d8e9 1236             }
b1a6a5 1237
ca0b77 1238             $socket_dir = escapeshellcmd($conf['nginx']['php_fpm_socket_dir']);
b1a6a5 1239             if(substr($socket_dir, -1) != '/') $socket_dir .= '/';
ca0b77 1240             if(!is_dir($socket_dir)) exec('mkdir -p '.$socket_dir);
F 1241             $fpm_socket = $socket_dir.'ispconfig.sock';
b1a6a5 1242
ca0b77 1243             //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
F 1244             $content = str_replace('{fpm_socket}', $fpm_socket, $content);
1bd269 1245
F 1246             wf($vhost_conf_dir.'/ispconfig.vhost', $content);
b1a6a5 1247
1bd269 1248             unset($content);
b1a6a5 1249
1bd269 1250             // PHP-FPM
F 1251             // Dont just copy over the php-fpm pool template but add some custom settings
615a0a 1252             $content = rfsel($conf['ispconfig_install_dir'].'/server/conf-custom/install/php_fpm_pool.conf.master', 'tpl/php_fpm_pool.conf.master');
1bd269 1253             $content = str_replace('{fpm_pool}', 'ispconfig', $content);
ca0b77 1254             //$content = str_replace('{fpm_port}', $conf['nginx']['php_fpm_start_port'], $content);
F 1255             $content = str_replace('{fpm_socket}', $fpm_socket, $content);
1bd269 1256             $content = str_replace('{fpm_user}', 'ispconfig', $content);
F 1257             $content = str_replace('{fpm_group}', 'ispconfig', $content);
1258             wf($conf['nginx']['php_fpm_pool_dir'].'/ispconfig.conf', $content);
1259
1260             //copy('tpl/nginx_ispconfig.vhost.master', $vhost_conf_dir.'/ispconfig.vhost');
1261             //* and create the symlink
7e1cfb 1262             if($this->is_update == false) {
1bd269 1263                 if(@is_link($vhost_conf_enabled_dir.'/ispconfig.vhost')) unlink($vhost_conf_enabled_dir.'/ispconfig.vhost');
F 1264                 if(!@is_link($vhost_conf_enabled_dir.'/000-ispconfig.vhost')) {
b1a6a5 1265                     symlink($vhost_conf_dir.'/ispconfig.vhost', $vhost_conf_enabled_dir.'/000-ispconfig.vhost');
1bd269 1266                 }
F 1267             }
b1a6a5 1268
9aec3d 1269             // create symlinks from /usr/share to phpMyAdmin and SquirrelMail, if they are installed
b1a6a5 1270             if(!@file_exists('/usr/share/phpmyadmin') && @is_dir('/srv/www/htdocs/phpMyAdmin')) symlink('/srv/www/htdocs/phpMyAdmin/', '/usr/share/phpmyadmin');
MC 1271             if(!@file_exists('/usr/share/squirrelmail') && @is_dir('/srv/www/htdocs/squirrelmail')) symlink('/srv/www/htdocs/squirrelmail/', '/usr/share/squirrelmail');
32d8e9 1272         }
b1a6a5 1273
32d8e9 1274         // Make the Clamav log files readable by ISPConfig
T 1275         //exec('chmod +r /var/log/clamav/clamav.log');
1276         //exec('chmod +r /var/log/clamav/freshclam.log');
b1a6a5 1277
32d8e9 1278         //* Install the update script
b34f99 1279         if(is_file('/usr/local/bin/ispconfig_update_from_dev.sh')) unlink('/usr/local/bin/ispconfig_update_from_dev.sh');
MC 1280         exec('chown root /usr/local/ispconfig/server/scripts/update_from_dev.sh');
1281         exec('chmod 700 /usr/local/ispconfig/server/scripts/update_from_dev.sh');
32d8e9 1282         exec('chown root /usr/local/ispconfig/server/scripts/update_from_tgz.sh');
T 1283         exec('chmod 700 /usr/local/ispconfig/server/scripts/update_from_tgz.sh');
1284         exec('chown root /usr/local/ispconfig/server/scripts/ispconfig_update.sh');
1285         exec('chmod 700 /usr/local/ispconfig/server/scripts/ispconfig_update.sh');
b34f99 1286         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 1287         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 1288
32d8e9 1289         //set the fast cgi starter script to executable
T 1290         //exec('chmod 755 '.$install_dir.'/interface/bin/php-fcgi');
b1a6a5 1291
32d8e9 1292         //* Make the logs readable for the ispconfig user
T 1293         if(@is_file('/var/log/mail.log')) exec('chmod +r /var/log/mail.log');
1294         if(@is_file('/var/log/mail.warn')) exec('chmod +r /var/log/mail.warn');
1295         if(@is_file('/var/log/mail.err')) exec('chmod +r /var/log/mail.err');
1296         if(@is_file('/var/log/messages')) exec('chmod +r /var/log/messages');
b1a6a5 1297
32d8e9 1298         //To enable apache to read the directories
T 1299         exec('chmod a+rx /usr/local/ispconfig');
1300         exec('chmod -R 751 /usr/local/ispconfig/interface');
1301         exec('chmod a+rx /usr/local/ispconfig/interface/web');
b1a6a5 1302
32d8e9 1303         //* Create the ispconfig log directory
e38d14 1304         if(!is_dir($conf['ispconfig_log_dir'])) mkdir($conf['ispconfig_log_dir']);
J 1305         if(!is_file($conf['ispconfig_log_dir'].'/ispconfig.log')) exec('touch '.$conf['ispconfig_log_dir'].'/ispconfig.log');
b1a6a5 1306
0c5b42 1307         if(is_user('getmail')) {
T 1308             exec('mv /usr/local/ispconfig/server/scripts/run-getmail.sh /usr/local/bin/run-getmail.sh');
1309             exec('chown getmail /usr/local/bin/run-getmail.sh');
1310             exec('chmod 744 /usr/local/bin/run-getmail.sh');
1311         }
b1a6a5 1312
8cf78b 1313         if(is_dir($install_dir.'/interface/invoices')) {
e94a9f 1314             exec('chmod -R 770 '.escapeshellarg($install_dir.'/interface/invoices'));
T 1315             exec('chown -R ispconfig:ispconfig '.escapeshellarg($install_dir.'/interface/invoices'));
edf806 1316         }
b1a6a5 1317
0799f8 1318         //* Create the ispconfig auth log file and set uid/gid
T 1319         if(!is_file($conf['ispconfig_log_dir'].'/auth.log')) {
1320             touch($conf['ispconfig_log_dir'].'/auth.log');
1321         }
1322         exec('chown ispconfig:ispconfig '. $conf['ispconfig_log_dir'].'/auth.log');
1323         exec('chmod 660 '. $conf['ispconfig_log_dir'].'/auth.log');
b1a6a5 1324
d71bae 1325         //* Remove Domain module as its functions are available in the client module now
T 1326         if(@is_dir('/usr/local/ispconfig/interface/web/domain')) exec('rm -rf /usr/local/ispconfig/interface/web/domain');
021aec 1327         
TB 1328         // Add symlink for patch tool
1329         if(!is_link('/usr/local/bin/ispconfig_patch')) exec('ln -s /usr/local/ispconfig/server/scripts/ispconfig_patch /usr/local/bin/ispconfig_patch');
c83951 1330         
TB 1331         // Change mode of a few files from amavisd
1332         if(is_file($conf['amavis']['config_dir'].'/conf.d/50-user')) chmod($conf['amavis']['config_dir'].'/conf.d/50-user', 0640);
1333         if(is_file($conf['amavis']['config_dir'].'/50-user~')) chmod($conf['amavis']['config_dir'].'/50-user~', 0400);
1334         if(is_file($conf['amavis']['config_dir'].'/amavisd.conf')) chmod($conf['amavis']['config_dir'].'/amavisd.conf', 0640);
1335         if(is_file($conf['amavis']['config_dir'].'/amavisd.conf~')) chmod($conf['amavis']['config_dir'].'/amavisd.conf~', 0400);
32d8e9 1336     }
T 1337 }
1338
e38d14 1339 ?>