installer_base.lib.php 46.1 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php

/*
Copyright (c) 2007, Till Brehm, projektfarm Gmbh
All rights reserved.

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

    * Redistributions of source code must retain the above copyright notice,
      this list of conditions and the following disclaimer.
    * Redistributions in binary form must reproduce the above copyright notice,
      this list of conditions and the following disclaimer in the documentation
      and/or other materials provided with the distribution.
    * Neither the name of ISPConfig nor the names of its contributors
      may be used to endorse or promote products derived from this software without
      specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

class installer_base {
	
	var $wb = array();
	var $language = 'en';
	var $db;
oliver's avatar
oliver committed
36
	public $conf;
tbrehm's avatar
tbrehm committed
37
	public $install_ispconfig_interface = true;
38
	
39
40


pedro_morgan's avatar
pedro_morgan committed
41
    public function __construct()
42
    {
pedro_morgan's avatar
pedro_morgan committed
43
        global $conf; //TODO: maybe $conf  should be passed to constructor
44
        //$this->conf = $conf;
45
    }
46
	
47
    //: TODO  Implement the translation function and language files for the installer.
pedro_morgan's avatar
pedro_morgan committed
48
49
	public function lng($text)
    {
tbrehm's avatar
tbrehm committed
50
		return $text;
51
52
	}
	
pedro_morgan's avatar
pedro_morgan committed
53
54
	public function error($msg)
    {
55
56
57
		die("ERROR: ".$msg."\n");
	}
	
pedro_morgan's avatar
pedro_morgan committed
58
59
	public function simple_query($query, $answers, $default)
    {		
tbrehm's avatar
tbrehm committed
60
61
		$finished = false;
		do {
pedro_morgan's avatar
pedro_morgan committed
62
			$answers_str = implode(',', $answers);
tbrehm's avatar
tbrehm committed
63
			swrite($this->lng($query).' ('.$answers_str.') ['.$default.']: ');
tbrehm's avatar
tbrehm committed
64
65
			$input = sread();
			
pedro_morgan's avatar
pedro_morgan committed
66
			//* Stop the installation
tbrehm's avatar
tbrehm committed
67
			if($input == 'quit') {
pedro_morgan's avatar
pedro_morgan committed
68
				swriteln($this->lng("Installation terminated by user.\n"));
tbrehm's avatar
tbrehm committed
69
				die();
tbrehm's avatar
tbrehm committed
70
71
			}
			
pedro_morgan's avatar
pedro_morgan committed
72
			//* Select the default
tbrehm's avatar
tbrehm committed
73
74
75
76
77
			if($input == '') {
				$answer = $default;
				$finished = true;
			}
			
pedro_morgan's avatar
pedro_morgan committed
78
79
            //* Set answer id valid
			if(in_array($input, $answers)) {
tbrehm's avatar
tbrehm committed
80
81
82
83
84
				$answer = $input;
				$finished = true;
			}
			
		} while ($finished == false);
tbrehm's avatar
tbrehm committed
85
		swriteln();
tbrehm's avatar
tbrehm committed
86
87
88
		return $answer;
	}
	
pedro_morgan's avatar
pedro_morgan committed
89
90
	public function free_query($query,$default)
    {		
tbrehm's avatar
tbrehm committed
91
		swrite($this->lng($query).' ['.$default.']: ');
tbrehm's avatar
tbrehm committed
92
93
		$input = sread();
			
pedro_morgan's avatar
pedro_morgan committed
94
		//* Stop the installation
tbrehm's avatar
tbrehm committed
95
		if($input == 'quit') {
pedro_morgan's avatar
pedro_morgan committed
96
97
            swriteln($this->lng("Installation terminated by user.\n"));
            die();
tbrehm's avatar
tbrehm committed
98
99
		}
			
pedro_morgan's avatar
pedro_morgan committed
100
        $answer =  ($input == '') ? $default : $input;
tbrehm's avatar
tbrehm committed
101
		swriteln();
tbrehm's avatar
tbrehm committed
102
103
104
		return $answer;
	}
	
105
	/*
pedro_morgan's avatar
pedro_morgan committed
106
107
	// TODO: this function is not used atmo I think - pedro
	function request_language(){
108
109
110
111
112
		
		swriteln(lng('Enter your language'));
		swriteln(lng('de, en'));
		
	}
113
	*/
114
	
tbrehm's avatar
tbrehm committed
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
	//** Detect installed applications
	public function find_installed_apps() {
		global $conf;
		
		if(is_installed('mysql') || is_installed('mysqld')) $conf['mysql']['installed'] = true;
		if(is_installed('postfix')) $conf['postfix']['installed'] = true;
		if(is_installed('apache') || is_installed('apache2') || is_installed('httpd')) $conf['apache']['installed'] = true;
		if(is_installed('getmail')) $conf['getmail']['installed'] = true;
		if(is_installed('couriertcpd')) $conf['courier']['installed'] = true;
		if(is_installed('saslsauthd')) $conf['saslauthd']['installed'] = true;
		if(is_installed('amavisd-new')) $conf['amavis']['installed'] = true;
		if(is_installed('clamdscan')) $conf['clamav']['installed'] = true;
		if(is_installed('pure-ftpd') || is_installed('pure-ftpd-wrapper')) $conf['pureftpd']['installed'] = true;
		if(is_installed('mydns') || is_installed('mydns-ng')) $conf['mydns']['installed'] = true;
		if(is_installed('jk_chrootsh')) $conf['jailkit']['installed'] = true;
		
		
	}
	
134
	/** Create the database for ISPConfig */ 
tbrehm's avatar
tbrehm committed
135
	public function configure_database() {
136
		global $conf;
tbrehm's avatar
tbrehm committed
137
		
138
		//** Create the database
139
140
		if(!$this->db->query('CREATE DATABASE IF NOT EXISTS '.$conf['mysql']['database'].' DEFAULT CHARACTER SET '.$conf['mysql']['charset'])) {
			$this->error('Unable to create MySQL database: '.$conf['mysql']['database'].'.');
141
142
		}
		
143
		//* Set the database name in the DB library
144
		$this->db->dbName = $conf['mysql']['database'];
145
		
146
		//* Load the database dump into the database, if database contains no tables
147
148
		$db_tables = $this->db->getTables();
		if(count($db_tables) > 0) {
149
			$this->error('Stopped: Database already contains some tables.');
150
		} else {
151
152
			if($conf['mysql']['admin_password'] == '') {
				caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' '".$conf['mysql']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/ispconfig3.sql' &> /dev/null", 
153
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
154
			} else {
155
				caselog("mysql --default-character-set=".$conf['mysql']['charset']." -h '".$conf['mysql']['host']."' -u '".$conf['mysql']['admin_user']."' -p'".$conf['mysql']['admin_password']."' '".$conf['mysql']['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/ispconfig3.sql' &> /dev/null", 
156
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
157
158
159
160
161
162
163
164
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
		}
	}
	
165
	//** Create the server record in the database
166
167
	public function add_database_server_record() {
		
168
		global $conf;
tbrehm's avatar
tbrehm committed
169
		
170
		if($conf['mysql']['host'] == 'localhost') {
tbrehm's avatar
tbrehm committed
171
172
			$from_host = 'localhost';
		} else {
173
			$from_host = $conf['hostname'];
tbrehm's avatar
tbrehm committed
174
175
		}
		
176
177
178
		// Delete ISPConfig user in the local database, in case that it exists
		$this->db->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['ispconfig_user']."' AND Host = '".$from_host."';");
		$this->db->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['database']."' AND Host = '".$from_host."';");
179
180
		$this->db->query('FLUSH PRIVILEGES;');
		
181
182
183
184
		//* Create the ISPConfig database user in the local database
        $query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['database'].".* "
                ."TO '".$conf['mysql']['ispconfig_user']."'@'".$from_host."' "
                ."IDENTIFIED BY '".$conf['mysql']['ispconfig_password']."';";
185
		if(!$this->db->query($query)) {
186
			$this->error('Unable to create database user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage);
187
188
189
190
191
		}
		
		//* Reload database privelages
		$this->db->query('FLUSH PRIVILEGES;');
		
tbrehm's avatar
tbrehm committed
192
		//* Set the database name in the DB library
193
		$this->db->dbName = $conf['mysql']['database'];
194
		
tbrehm's avatar
tbrehm committed
195
196
197
198
199
200
201
		$tpl_ini_array = ini_to_array(rf('tpl/server.ini.master'));
		
		// TODO: Update further distribution specific parameters for server config here
		$tpl_ini_array['web']['vhost_conf_dir'] = $conf['apache']['vhost_conf_dir'];
		$tpl_ini_array['web']['vhost_conf_enabled_dir'] = $conf['apache']['vhost_conf_enabled_dir'];
		
		$server_ini_content = array_to_ini($tpl_ini_array);
202
		$server_ini_content = mysql_real_escape_string($server_ini_content);
203
		
tbrehm's avatar
tbrehm committed
204
205
206
207
208
209
210
		$mail_server_enabled = ($conf['services']['mail'])?1:0;
		$web_server_enabled = ($conf['services']['web'])?1:0;
		$dns_server_enabled = ($conf['services']['dns'])?1:0;
		$file_server_enabled = ($conf['services']['file'])?1:0;
		$db_server_enabled = ($conf['services']['db'])?1:0;
		$vserver_server_enabled = ($conf['services']['vserver'])?1:0;
		
211
212
213
		if($conf['mysql']['master_slave_setup'] == 'y') {
			
			//* Insert the server record in master DB
tbrehm's avatar
tbrehm committed
214
			$sql = "INSERT INTO `server` (`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES (1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
215
216
217
218
219
			$this->dbmaster->query($sql);
			$conf['server_id'] = $this->dbmaster->insertID();
			$conf['server_id'] = $conf['server_id'];
			
			//* Insert the same record in the local DB
tbrehm's avatar
tbrehm committed
220
			$sql = "INSERT INTO `server` (`server_id`, `sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES ('".$conf['server_id']."',1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
			$this->db->query($sql);
			
			//* insert the ispconfig user in the remote server
			$from_host = $conf['hostname'];
			
			//* username for the ispconfig user
			$conf['mysql']['master_ispconfig_user'] = 'ispconfigserver'.$conf['server_id'];
		
			//* Delete ISPConfig user in the local database, in case that it exists
			$this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_host."';");
			$this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_host."';");
			$this->dbmaster->query('FLUSH PRIVILEGES;');
		
			//* Create the ISPConfig database user in the local database
        	$query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
                	."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_host."' "
                	."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
			if(!$this->dbmaster->query($query)) {
				$this->error('Unable to create database user in master database: '.$conf['mysql']['master_ispconfig_user'].' Error: '.$this->dbmaster->errorMessage);
			}
		
		} else {
			//* Insert the server, if its not a mster / slave setup
tbrehm's avatar
tbrehm committed
244
			$sql = "INSERT INTO `server` (`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES (1, 1, 'riud', 'riud', 'r', '".$conf['hostname']."', '$mail_server_enabled', '$web_server_enabled', '$dns_server_enabled', '$file_server_enabled', '$db_server_enabled', '$vserver_server_enabled', '$server_ini_content', 0, 1);";
245
246
247
248
249
250
			$this->db->query($sql);
			$conf['server_id'] = $this->db->insertID();
			$conf['server_id'] = $conf['server_id'];
		}
		
		
251
252
	}
	
253

254
    //** writes postfix configuration files
tbrehm's avatar
tbrehm committed
255
    public function process_postfix_config($configfile)
tbrehm's avatar
tbrehm committed
256
257
258
    {	
		global $conf;
		
259
        $config_dir = $conf['postfix']['config_dir'].'/';
260
261
262
263
264
265
        $full_file_name = $config_dir.$configfile; 
        //* Backup exiting file
        if(is_file($full_file_name)){
            copy($full_file_name, $config_dir.$configfile.'~');
        }
        $content = rf('tpl/'.$configfile.'.master');
266
267
268
269
270
        $content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
        $content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
        $content = str_replace('{server_id}', $conf['server_id'], $content);
271
272
273
        wf($full_file_name, $content);
    }

274
275
	public function configure_jailkit()
    {
tbrehm's avatar
tbrehm committed
276
277
278
        global $conf;
		
		$cf = $conf['jailkit'];
279
280
281
282
		$config_dir = $cf['config_dir'];
		$jk_init = $cf['jk_init'];
		$jk_chrootsh = $cf['jk_chrootsh'];
		
283
		if (is_dir($config_dir))
284
		{
285
286
			if(is_file($config_dir.'/'.$jk_init)) copy($config_dir.'/'.$jk_init, $config_dir.'/'.$jk_init.'~');
			if(is_file($config_dir.'/'.$jk_chrootsh.".master")) copy($config_dir.'/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh.'~');
287
288
289
290
291
292
293
			
			copy('tpl/'.$jk_init.".master", $config_dir.'/'.$jk_init);
			copy('tpl/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh);
		}
		
    }
        
294
295
	public function configure_postfix($options = '')
    {
296
297
        global $conf;
		$cf = $conf['postfix'];
298
299
		$config_dir = $cf['config_dir'];
        
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
		if(!is_dir($config_dir)){
            $this->error("The postfix configuration directory '$config_dir' does not exist.");
        }
        
		//* mysql-virtual_domains.cf
        $this->process_postfix_config('mysql-virtual_domains.cf');

		//* mysql-virtual_forwardings.cf
        $this->process_postfix_config('mysql-virtual_forwardings.cf');

		//* mysql-virtual_mailboxes.cf
        $this->process_postfix_config('mysql-virtual_mailboxes.cf');

		//* mysql-virtual_email2email.cf
        $this->process_postfix_config('mysql-virtual_email2email.cf');

		//* mysql-virtual_transports.cf
        $this->process_postfix_config('mysql-virtual_transports.cf');

		//* mysql-virtual_recipient.cf
        $this->process_postfix_config('mysql-virtual_recipient.cf');

		//* mysql-virtual_sender.cf
        $this->process_postfix_config('mysql-virtual_sender.cf');

		//* mysql-virtual_client.cf
        $this->process_postfix_config('mysql-virtual_client.cf');
327
328
329
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
330
331

		//* Changing mode and group of the new created config files.
332
333
334
335
336
337
338
339
340
341
342
		caselog('chmod o= '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null',
                 __FILE__, __LINE__, 'chmod on mysql-virtual_*.cf*', 'chmod on mysql-virtual_*.cf* failed');
		caselog('chgrp '.$cf['group'].' '.$config_dir.'/mysql-virtual_*.cf* &> /dev/null', 
                __FILE__, __LINE__, 'chgrp on mysql-virtual_*.cf*', 'chgrp on mysql-virtual_*.cf* failed');
		
		//* Creating virtual mail user and group
		$command = 'groupadd -g '.$cf['vmail_groupid'].' '.$cf['vmail_groupname'];
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");

		$command = 'useradd -g '.$cf['vmail_groupname'].' -u '.$cf['vmail_userid'].' '.$cf['vmail_username'].' -d '.$cf['vmail_mailbox_base'].' -m';
		caselog("$command &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");		
343
344

		$postconf_commands = array (
345
346
			'myhostname = '.$conf['hostname'],
			'mydestination = '.$conf['hostname'].', localhost, localhost.localdomain',
347
348
			'mynetworks = 127.0.0.0/8',
			'virtual_alias_domains =',
pedro_morgan's avatar
pedro_morgan committed
349
350
			'virtual_alias_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_forwardings.cf, mysql:'.$config_dir.'/mysql-virtual_email2email.cf',
			'virtual_mailbox_domains = proxy:mysql:'.$config_dir.'/mysql-virtual_domains.cf',
351
352
353
354
			'virtual_mailbox_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailboxes.cf',
			'virtual_mailbox_base = '.$cf['vmail_mailbox_base'],
			'virtual_uid_maps = static:'.$cf['vmail_userid'],
			'virtual_gid_maps = static:'.$cf['vmail_groupid'],
355
356
			'smtpd_sasl_auth_enable = yes',
			'broken_sasl_auth_clients = yes',
pedro_morgan's avatar
pedro_morgan committed
357
			'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
358
			'smtpd_use_tls = yes',
redray's avatar
redray committed
359
			'smtpd_tls_security_level = may',
redray's avatar
redray committed
360
361
			'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
			'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
pedro_morgan's avatar
pedro_morgan committed
362
			'transport_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_transports.cf',
363
			'relay_domains = mysql:'.$config_dir.'/mysql-virtual_relaydomains.cf',
364
365
			'virtual_create_maildirsize = yes',
			'virtual_mailbox_extended = yes',
pedro_morgan's avatar
pedro_morgan committed
366
			'virtual_mailbox_limit_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailbox_limit_maps.cf',
367
368
369
370
			'virtual_mailbox_limit_override = yes',
			'virtual_maildir_limit_message = "The user you are trying to reach is over quota."',
			'virtual_overquota_bounce = yes',
			'proxy_read_maps = $local_recipient_maps $mydestination $virtual_alias_maps $virtual_alias_domains $virtual_mailbox_maps $virtual_mailbox_domains $relay_recipient_maps $relay_domains $canonical_maps $sender_canonical_maps $recipient_canonical_maps $relocated_maps $transport_maps $mynetworks $virtual_mailbox_limit_maps',
pedro_morgan's avatar
pedro_morgan committed
371
372
			'smtpd_sender_restrictions = check_sender_access mysql:'.$config_dir.'/mysql-virtual_sender.cf',
			'smtpd_client_restrictions = check_client_access mysql:'.$config_dir.'/mysql-virtual_client.cf',
373
374
			'maildrop_destination_concurrency_limit = 1',
			'maildrop_destination_recipient_limit   = 1',
375
			'virtual_transport = maildrop',
pedro_morgan's avatar
pedro_morgan committed
376
377
378
379
			'header_checks = regexp:'.$config_dir.'/header_checks',
			'mime_header_checks = regexp:'.$config_dir.'/mime_header_checks',
			'nested_header_checks = regexp:'.$config_dir.'/nested_header_checks',
			'body_checks = regexp:'.$config_dir.'/body_checks'
380
381
		);
		
pedro_morgan's avatar
pedro_morgan committed
382
383
384
385
386
		//* Create the header and body check files
		touch($config_dir.'/header_checks');
		touch($config_dir.'/mime_header_checks');
		touch($config_dir.'/nested_header_checks');
		touch($config_dir.'/body_checks');
387
388
		
		
pedro_morgan's avatar
pedro_morgan committed
389
390
		//* Make a backup copy of the main.cf file
		copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
391
		
pedro_morgan's avatar
pedro_morgan committed
392
		//* Executing the postconf commands
393
394
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
pedro_morgan's avatar
pedro_morgan committed
395
			caselog($command." &> /dev/null", __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
396
397
		}
		
tbrehm's avatar
tbrehm committed
398
		if(!stristr($options,'dont-create-certs')) {
pedro_morgan's avatar
pedro_morgan committed
399
			//* Create the SSL certificate
redray's avatar
redray committed
400
			$command = 'cd '.$config_dir.'; '
redray's avatar
redray committed
401
                      .'openssl req -new -outform PEM -out smtpd.cert -newkey rsa:2048 -nodes -keyout smtpd.key -keyform PEM -days 365 -x509';
tbrehm's avatar
tbrehm committed
402
			exec($command);
403
		
redray's avatar
redray committed
404
			$command = 'chmod o= '.$config_dir.'/smtpd.key';
pedro_morgan's avatar
pedro_morgan committed
405
			caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
tbrehm's avatar
tbrehm committed
406
		}
407
		
408
		//** We have to change the permissions of the courier authdaemon directory to make it accessible for maildrop.
pedro_morgan's avatar
pedro_morgan committed
409
410
		$command = 'chmod 755  /var/run/courier/authdaemon/';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
411
		
pedro_morgan's avatar
pedro_morgan committed
412
413
414
415
416
417
418
419
		//* Changing maildrop lines in posfix master.cf
		if(is_file($config_dir.'/master.cf')){
            copy($config_dir.'/master.cf', $config_dir.'/master.cf~');
        }
		if(is_file($config_dir.'/master.cf~')){
            exec('chmod 400 '.$config_dir.'/master.cf~');
        }
		$configfile = $config_dir.'/master.cf';
420
		$content = rf($configfile);
421
422
423
424
		$content = str_replace('  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}', 
                   '  flags=R user='.$cf['vmail_username'].' argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}',
                     $content);
		wf($configfile, $content);
425
		
pedro_morgan's avatar
pedro_morgan committed
426
		//* Writing the Maildrop mailfilter file
427
		$configfile = 'mailfilter';
428
429
430
431
432
433
		if(is_file($cf['vmail_mailbox_base'].'/.'.$configfile)){
            copy($cf['vmail_mailbox_base'].'/.'.$configfile, $cf['vmail_mailbox_base'].'/.'.$configfile.'~');
        }
		$content = rf("tpl/$configfile.master");
		$content = str_replace('{dist_postfix_vmail_mailbox_base}', $cf['vmail_mailbox_base'], $content);
		wf($cf['vmail_mailbox_base'].'/.'.$configfile, $content);
434
		
435
		//* Create the directory for the custom mailfilters
436
437
438
439
		if(!is_dir($cf['vmail_mailbox_base'].'/mailfilters')) {
			$command = 'mkdir '.$cf['vmail_mailbox_base'].'/mailfilters';
			caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
440
		
441
442
443
		//* Chmod and chown the .mailfilter file
		$command = 'chown -R '.$cf['vmail_username'].':'.$cf['vmail_groupname'].' '.$cf['vmail_mailbox_base'].'/.mailfilter';
		caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
444
		
445
446
		$command = 'chmod -R 600 '.$cf['vmail_mailbox_base'].'/.mailfilter';
		caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
447
448
449
		
	}
	
tbrehm's avatar
tbrehm committed
450
	public function configure_saslauthd() {
451
452
		global $conf;
		
453
	
454
		$configfile = 'sasl_smtpd.conf';
oliver's avatar
oliver committed
455
456
		if(is_file($conf["postfix"]["config_dir"].'/sasl/smtpd.conf')) copy($conf["postfix"]["config_dir"].'/sasl/smtpd.conf',$conf["postfix"]["config_dir"].'/sasl/smtpd.conf~');
		if(is_file($conf["postfix"]["config_dir"].'/sasl/smtpd.conf~')) exec('chmod 400 '.$conf["postfix"]["config_dir"].'/sasl/smtpd.conf~');
457
		$content = rf("tpl/".$configfile.".master");
458
459
460
461
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
		$content = str_replace('{mysql_server_ip}',$conf['mysql']['ip'],$content);
oliver's avatar
oliver committed
462
		wf($conf["postfix"]["config_dir"].'/sasl/smtpd.conf',$content);
463
464
465
466
		
		// TODO: Chmod and chown on the config file
		
		
467
468
		
		// Create the spool directory
469
		exec('mkdir -p /var/spool/postfix/var/run/saslauthd');
470
471
		
		// Edit the file /etc/default/saslauthd
oliver's avatar
oliver committed
472
		$configfile = $conf["saslauthd"]["config"];
473
		if(is_file($configfile)) copy($configfile,$configfile.'~');
474
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
475
476
		$content = rf($configfile);
		$content = str_replace('START=no','START=yes',$content);
477
		// Debian
478
		$content = str_replace('OPTIONS="-c"','OPTIONS="-m /var/spool/postfix/var/run/saslauthd -r"',$content);
479
480
		// Ubuntu
		$content = str_replace('OPTIONS="-c -m /var/run/saslauthd"','OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"',$content);
481
482
		wf($configfile,$content);
		
483
		// Edit the file /etc/init.d/saslauthd
oliver's avatar
oliver committed
484
		$configfile = $conf["init_scripts"].'/'.$conf["saslauthd"]["init_script"];
485
486
487
488
		$content = rf($configfile);
		$content = str_replace('PIDFILE=$RUN_DIR/saslauthd.pid','PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"',$content);
		wf($configfile,$content);
		
489
490
491
		// add the postfix user to the sasl group (at least nescessary for ubuntu 8.04 and most likely debian lenny too.
		exec('adduser postfix sasl');
		
492
		
493
494
	}
	
495
496
	public function configure_pam()
    {
497
498
		global $conf;
		$pam = $conf['pam'];
499
		//* configure pam for SMTP authentication agains the ispconfig database
500
		$configfile = 'pamd_smtp';
501
502
503
504
		if(is_file("$pam/smtp"))    copy("$pam/smtp", "$pam/smtp~");
		if(is_file("$pam/smtp~"))   exec("chmod 400 $pam/smtp~");

		$content = rf("tpl/$configfile.master");
505
506
507
508
		$content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
		$content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
		$content = str_replace('{mysql_server_ip}', $conf['mysql']['ip'], $content);
509
510
511
		wf("$pam/smtp", $content);
		exec("chmod 660 $pam/smtp");
		exec("chown daemon:daemon $pam/smtp");
512
513
514
	
	}
	
515
516
	public function configure_courier()
    {
517
518
		global $conf;
		$config_dir = $conf['courier']['config_dir'];
519
		//* authmysqlrc
520
		$configfile = 'authmysqlrc';
521
522
523
524
525
		if(is_file("$config_dir/$configfile")){
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
		exec("chmod 400 $config_dir/$configfile~");
		$content = rf("tpl/$configfile.master");
526
527
528
529
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
		$content = str_replace('{mysql_server_host}',$conf['mysql']['host'],$content);
530
		wf("$config_dir/$configfile", $content);
531
		
532
533
		exec("chmod 660 $config_dir/$configfile");
		exec("chown daemon:daemon $config_dir/$configfile");
534
		
535
		//* authdaemonrc
536
		$configfile = $conf['courier']['config_dir'].'/authdaemonrc';
537
538
539
540
541
542
		if(is_file($configfile)){
            copy($configfile, $configfile.'~');
        }
		if(is_file($configfile.'~')){
            exec('chmod 400 '.$configfile.'~');
        }
543
		$content = rf($configfile);
544
545
		$content = str_replace('authmodulelist="authpam"', 'authmodulelist="authmysql"', $content);
		wf($configfile, $content);
546
547
	}
	
tbrehm's avatar
tbrehm committed
548
	public function configure_amavis() {
549
550
551
552
		global $conf;
		
		// amavisd user config file
		$configfile = 'amavisd_user_config';
oliver's avatar
oliver committed
553
554
		if(is_file($conf["amavis"]["config_dir"].'/conf.d/50-user')) copy($conf["amavis"]["config_dir"].'/conf.d/50-user',$conf["courier"]["config_dir"].'/50-user~');
		if(is_file($conf["amavis"]["config_dir"].'/conf.d/50-user~')) exec('chmod 400 '.$conf["amavis"]["config_dir"].'/conf.d/50-user~');
555
		$content = rf("tpl/".$configfile.".master");
556
557
558
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
559
		$content = str_replace('{mysql_server_port}',$conf["mysql"]["port"],$content);
560
		$content = str_replace('{mysql_server_ip}',$conf['mysql']['ip'],$content);
oliver's avatar
oliver committed
561
		wf($conf["amavis"]["config_dir"].'/conf.d/50-user',$content);
562
563
564
565
566
567
568
569
570
571
572
		
		// TODO: chmod and chown on the config file
		
		
		// Adding the amavisd commands to the postfix configuration
		$postconf_commands = array (
			'content_filter = amavis:[127.0.0.1]:10024',
			'receive_override_options = no_address_mappings'
		);
		
		// Make a backup copy of the main.cf file
oliver's avatar
oliver committed
573
		copy($conf["postfix"]["config_dir"].'/main.cf',$conf["postfix"]["config_dir"].'/main.cf~2');
574
575
576
577
		
		// Executing the postconf commands
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
578
			caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
579
580
581
		}
		
		// Append the configuration for amavisd to the master.cf file
oliver's avatar
oliver committed
582
		if(is_file($conf["postfix"]["config_dir"].'/master.cf')) copy($conf["postfix"]["config_dir"].'/master.cf',$conf["postfix"]["config_dir"].'/master.cf~');
tbrehm's avatar
tbrehm committed
583
		$content = rf($conf["postfix"]["config_dir"].'/master.cf');
584
		// Only add the content if we had not addded it before
tbrehm's avatar
tbrehm committed
585
		if(!stristr($content,"127.0.0.1:10025")) {
tbrehm's avatar
tbrehm committed
586
587
			unset($content);
			$content = rf("tpl/master_cf_amavis.master");
oliver's avatar
oliver committed
588
			af($conf["postfix"]["config_dir"].'/master.cf',$content);
589
		}
tbrehm's avatar
tbrehm committed
590
		unset($content);
591
592
593
594
595
596
597
		
		// Add the clamav user to the amavis group
		exec('adduser clamav amavis');
		
		
	}
	
598
599
	public function configure_spamassassin()
    {
600
601
		global $conf;
		
602
		//* Enable spamasasssin on debian and ubuntu
603
		$configfile = '/etc/default/spamassassin';
604
		if(is_file($configfile)){
605
            copy($configfile, $configfile.'~');
606
        }
607
		$content = rf($configfile);
608
609
		$content = str_replace('ENABLED=0', 'ENABLED=1', $content);
		wf($configfile, $content);
610
611
	}
	
612
613
	public function configure_getmail()
    {
614
615
		global $conf;
		
616
		$config_dir = $conf['getmail']['config_dir'];
617
618
		
		if(!is_dir($config_dir)) exec("mkdir -p ".escapeshellcmd($config_dir));
619
620
621

		$command = "useradd -d $config_dir getmail";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
tbrehm's avatar
tbrehm committed
622
		
623
624
		$command = "chown -R getmail $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
625
		
626
627
		$command = "chmod -R 700 $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
628
629
	}
	
630
	
631
632
	public function configure_pureftpd()
    {
633
634
		global $conf;
		
635
		$config_dir = $conf['pureftpd']['config_dir'];
636
637

		//* configure pam for SMTP authentication agains the ispconfig database
638
		$configfile = 'db/mysql.conf';
639
640
641
642
643
644
645
		if(is_file("$config_dir/$configfile")){
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
		if(is_file("$config_dir/$configfile~")){
            exec("chmod 400 $config_dir/$configfile~");
        }
		$content = rf('tpl/pureftpd_mysql.conf.master');
646
647
648
649
650
		$content = str_replace('{mysql_server_ispconfig_user}', $conf["mysql"]["ispconfig_user"], $content);
		$content = str_replace('{mysql_server_ispconfig_password}', $conf["mysql"]["ispconfig_password"], $content);
		$content = str_replace('{mysql_server_database}', $conf["mysql"]["database"], $content);
		$content = str_replace('{mysql_server_ip}', $conf["mysql"]["ip"], $content);
		$content = str_replace('{server_id}', $conf["server_id"], $content);
651
652
653
654
		wf("$config_dir/$configfile", $content);
		exec("chmod 600 $config_dir/$configfile");
		exec("chown root:root $config_dir/$configfile");
		// **enable chrooting
655
		//exec('mkdir -p '.$config_dir.'/conf/ChrootEveryone');
656
		exec('echo "yes" > '.$config_dir.'/conf/ChrootEveryone');
tbrehm's avatar
tbrehm committed
657
658
	}
	
659
660
	public function configure_mydns()
    {
661
662
663
664
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
665
666
		if(is_file($conf["mydns"]["config_dir"].'/'.$configfile)) copy($conf["mydns"]["config_dir"].'/'.$configfile,$conf["mydns"]["config_dir"].'/'.$configfile.'~');
		if(is_file($conf["mydns"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["mydns"]["config_dir"].'/'.$configfile.'~');
667
		$content = rf("tpl/".$configfile.".master");
668
669
670
		$content = str_replace('{mysql_server_ispconfig_user}',$conf['mysql']['ispconfig_user'],$content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}',$conf['mysql']['database'],$content);
671
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
672
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
673
674
675
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
676
677
678
	
	}
	
679
680
	public function configure_apache()
    {	
681
682
		global $conf;
		
683
684
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
685
		
686
		if(is_file('/etc/suphp/suphp.conf')) {
687
			replaceLine('/etc/suphp/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
688
689
690
			replaceLine('/etc/suphp/suphp.conf','docroot=','docroot=/var/clients',0);
		}
		
691
692
	}
	
tbrehm's avatar
tbrehm committed
693
694
695
696
697
698
	public function configure_firewall()
	{
		global $conf;
		
		$dist_init_scripts = $conf['init_scripts'];
  		
699
		if(is_dir("/etc/Bastille.backup")) caselog("rm -rf /etc/Bastille.backup", __FILE__, __LINE__);
700
		if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
701
  		@mkdir("/etc/Bastille", octdec($directory_mode));
702
703
704
  		if(is_dir("/etc/Bastille.backup/firewall.d")) caselog("cp -pfr /etc/Bastille.backup/firewall.d /etc/Bastille/", __FILE__, __LINE__);
  		caselog("cp -f tpl/bastille-firewall.cfg.master /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
  		caselog("chmod 644 /etc/Bastille/bastille-firewall.cfg", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
705
706
707
708
709
710
  		$content = rf("/etc/Bastille/bastille-firewall.cfg");
  		$content = str_replace("{DNS_SERVERS}", "", $content);

  		$tcp_public_services = '';
  		$udp_public_services = '';
		
711
		$row = $this->db->queryOneRecord("SELECT * FROM firewall WHERE server_id = ".intval($conf['server_id']));
tbrehm's avatar
tbrehm committed
712
713
714
715
716
717
718
719
720
721
722
723
724
		
  		if(trim($row["tcp_port"]) != '' || trim($row["udp_port"]) != ''){
    		$tcp_public_services = trim(str_replace(',',' ',$row["tcp_port"]));
    		$udp_public_services = trim(str_replace(',',' ',$row["udp_port"]));
  		} else {
    		$tcp_public_services = '21 22 25 53 80 110 443 8080 10000';
    		$udp_public_services = '53';
  		}
  		$content = str_replace("{TCP_PUBLIC_SERVICES}", $tcp_public_services, $content);
  		$content = str_replace("{UDP_PUBLIC_SERVICES}", $udp_public_services, $content);

  		wf("/etc/Bastille/bastille-firewall.cfg", $content);

tbrehm's avatar
tbrehm committed
725
  		if(is_file($dist_init_scripts."/bastille-firewall")) caselog("mv -f $dist_init_scripts/bastille-firewall $dist_init_scripts/bastille-firewall.backup", __FILE__, __LINE__);
726
727
  		caselog("cp -f apps/bastille-firewall $dist_init_scripts", __FILE__, __LINE__);
  		caselog("chmod 700 $dist_init_scripts/bastille-firewall", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
728

729
730
731
  		if(is_file("/sbin/bastille-ipchains")) caselog("mv -f /sbin/bastille-ipchains /sbin/bastille-ipchains.backup", __FILE__, __LINE__);
  		caselog("cp -f apps/bastille-ipchains /sbin", __FILE__, __LINE__);
  		caselog("chmod 700 /sbin/bastille-ipchains", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
732

733
734
735
736
737
  		if(is_file("/sbin/bastille-netfilter")) caselog("mv -f /sbin/bastille-netfilter /sbin/bastille-netfilter.backup", __FILE__, __LINE__);
  		caselog("cp -f apps/bastille-netfilter /sbin", __FILE__, __LINE__);
  		caselog("chmod 700 /sbin/bastille-netfilter", __FILE__, __LINE__);
		
		if(!@is_dir('/var/lock/subsys')) caselog("mkdir /var/lock/subsys", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
738
739

  		exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
740
  		if(!is_file("/sbin/ipchains") && !is_link("/sbin/ipchains") && $ret_val == 0) phpcaselog(@symlink(shell_exec("which ipchains"), "/sbin/ipchains"), 'create symlink', __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
741
742
  		unset($ipchains_location);
  		exec("which iptables &> /dev/null", $iptables_location, $ret_val);
743
  		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__);
tbrehm's avatar
tbrehm committed
744
745
746
747
  		unset($iptables_location);

	}
	
tbrehm's avatar
tbrehm committed
748
	
749
750
	public function install_ispconfig()
    {
751
752
		global $conf;
		
753
		$install_dir = $conf['ispconfig_install_dir'];
754
755

		//* Create the ISPConfig installation directory
756
		if(!@is_dir("$install_dir")) {
757
758
759
			$command = "mkdir $install_dir";
			caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
760
		
761
762
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
763
		if(!is_group('vacp')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
764
		
765
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
766
		if(!is_user('vacp')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
767
		
768
769
770
		//* copy the ISPConfig interface part
		$command = "cp -rf ../interface $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
771
		
772
773
774
		//* copy the ISPConfig server part
		$command = "cp -rf ../server $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
775
		
776
		//* Create a symlink, so ISPConfig is accessible via web
777
778
779
		// Replaced by a separate vhost definition for port 8080
		// $command = "ln -s $install_dir/interface/web/ /var/www/ispconfig";
		// caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
780
		
781
		//* Create the config file for ISPConfig interface
782
		$configfile = 'config.inc.php';
783
784
785
786
		if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
787
788
789
790
		$content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
		$content = str_replace('{mysql_server_ispconfig_password}',$conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
		$content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
791
792
793
794
795
796
		
		$content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
		$content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
		$content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
		$content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
		
tbrehm's avatar
tbrehm committed
797
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
798
		wf("$install_dir/interface/lib/$configfile", $content);
799
		
800
		//* Create the config file for ISPConfig server
801
		$configfile = 'config.inc.php';
802
803
804
805
		if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
806
807
808
809
		$content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
		$content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
		$content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
810
811
812
813
814
815
		
		$content = str_replace('{mysql_master_server_ispconfig_user}', $conf['mysql']['master_ispconfig_user'], $content);
		$content = str_replace('{mysql_master_server_ispconfig_password}', $conf['mysql']['master_ispconfig_password'], $content);
		$content = str_replace('{mysql_master_server_database}', $conf['mysql']['master_database'], $content);
		$content = str_replace('{mysql_master_server_host}', $conf['mysql']['master_host'], $content);
		
816
		$content = str_replace('{server_id}', $conf['server_id'], $content);
817
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
818
		wf("$install_dir/server/lib/$configfile", $content);
819
		
820
		
821
822
823
824
825
826
827
		//* Enable the server modules and plugins.
		// TODO: Implement a selector which modules and plugins shall be enabled.
		$dir = $install_dir.'/server/mods-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if($file != '.' && $file != '..') {
828
						if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
829
830
831
						if (strpos($file, '_core_module') !== false) {
							if(!@is_link($install_dir.'/server/mods-core/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-core/'.$file);
						}
832
833
834
835
836
837
838
839
840
841
842
					}
				}
				closedir($dh);
			}
		}
		
		$dir = $install_dir.'/server/plugins-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if($file != '.' && $file != '..') {
843
						if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
844
845
846
						if (strpos($file, '_core_plugin') !== false) {
							if(!@is_link($install_dir.'/server/plugins-core/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-core/'.$file);
						}
847
848
849
850
851
					}
				}
				closedir($dh);
			}
		}
852
		
853
854
855
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
856

857
858
859
		//* chown the files to the ispconfig user and group
		$command = "chown -R ispconfig:ispconfig $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
860
		
861
		//* Make the global language file directory group writable
tbrehm's avatar
tbrehm committed
862
		exec("chmod -R 770 $install_dir/interface/lib/lang");
863
		
864
865
866
		//* Make the temp directory for language file exports writable
		exec("chmod -R 770 $install_dir/interface/web/temp");
		
867
868
869
870
871
872
		//* Make all interface language file directories group writable
		$handle = @opendir($install_dir.'/interface/web');
		while ($file = @readdir ($handle)) { 
	   		if ($file != '.' && $file != '..') {
	        	if(@is_dir($install_dir.'/interface/web'.'/'.$file.'/lib/lang')) {
					$handle2 = opendir($install_dir.'/interface/web'.'/'.$file.'/lib/lang');
tbrehm's avatar
tbrehm committed
873
					chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang',0770);
874
875
					while ($lang_file = @readdir ($handle2)) {
						if ($lang_file != '.' && $lang_file != '..') {
tbrehm's avatar
tbrehm committed
876
							chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang/'.$lang_file,0770);
877
878
879
880
881
882
						}
					}
				}
			}
		}
		
883
884
885
		//* make sure that the server config file (not the interface one) is only readable by the root user
		exec("chmod 600 $install_dir/server/lib/$configfile");
		exec("chown root:root $install_dir/server/lib/$configfile");
tbrehm's avatar
tbrehm committed
886
		if(@is_file("$install_dir/server/lib/mysql_clientdb.conf")) {
887
888
889
			exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf");
			exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf");
		}
890
		
891
892
893
		// TODO: FIXME: add the www-data user to the ispconfig group. This is just for testing
		// and must be fixed as this will allow the apache user to read the ispconfig files.
		// Later this must run as own apache server or via suexec!
894
895
		$command = 'adduser www-data ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
896
		
897
898
899
		//* Make the shell scripts executable
		$command = "chmod +x $install_dir/server/scripts/*.sh";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
900
		
901
		//* Copy the ISPConfig vhost for the controlpanel
902
        // TODO: These are missing! should they be "vhost_dist_*_dir" ?
903
904
        $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
        $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
daniel's avatar
daniel committed
905
906
907
908
909
        
        
        // Dont just copy over the virtualhost template but add some custom settings
         
        $content = rf("tpl/apache_ispconfig.vhost.master");
910
		$content = str_replace('{vhost_port}', $conf['apache']['vhost_port'], $content);
911
912
913
914
915
916
917
918
		
		// comment out the listen directive if port is 80 or 443
		if($conf['apache']['vhost_port'] == 80 or $conf['apache']['vhost_port'] == 443) {
			$content = str_replace('{vhost_port_listen}', '#', $content);
		} else {
			$content = str_replace('{vhost_port_listen}', '', $content);
		}
		
daniel's avatar
daniel committed
919
920
921
		wf("$vhost_conf_dir/ispconfig.vhost", $content);
		
		//copy('tpl/apache_ispconfig.vhost.master', "$vhost_conf_dir/ispconfig.vhost");
922
		//* and create the symlink
tbrehm's avatar
tbrehm committed
923
		if($this->install_ispconfig_interface == true) {
924
			if(@is_link("$vhost_conf_enabled_dir/ispconfig.vhost")) unlink("$vhost_conf_enabled_dir/ispconfig.vhost");
925
926
			if(!@is_link("$vhost_conf_enabled_dir/000-ispconfig.vhost")) {
				exec("ln -s $vhost_conf_dir/ispconfig.vhost $vhost_conf_enabled_dir/000-ispconfig.vhost");
tbrehm's avatar
tbrehm committed
927
			}
tbrehm's avatar
tbrehm committed
928
		}
929
930
931
932
		
		// Make the Clamav log files readable by ISPConfig
		exec('chmod +r /var/log/clamav/clamav.log');
		exec('chmod +r /var/log/clamav/freshclam.log');
933
934
935
936
937
938
		
		//* Install the SVN update script
		exec('cp ../helper_scripts/update_from_svn.sh /usr/local/bin/ispconfig_update_from_svn.sh');
		exec('chown root /usr/local/bin/ispconfig_update_from_svn.sh');
		exec('chmod 700 /usr/local/bin/ispconfig_update_from_svn.sh');
		
939
940
		//set the fast cgi starter script to executable
		exec('chmod 755 '.$install_dir.'/interface/bin/php-fcgi');
941
942
943
944
945
946
947
		
		//* Make the logs readable for the ispconfig user
		if(@is_file('/var/log/mail.log')) exec('chmod +r /var/log/mail.log');
		if(@is_file('/var/log/mail.warn')) exec('chmod +r /var/log/mail.warn');
		if(@is_file('/var/log/mail.err')) exec('chmod +r /var/log/mail.err');
		if(@is_file('/var/log/messages')) exec('chmod +r /var/log/messages');
		
948
949
		//* Create the ispconfig log directory
		if(!is_dir('/var/log/ispconfig')) mkdir('/var/log/ispconfig');
950
		if(!is_file('/var/log/ispconfig/ispconfig.log')) exec('touch /var/log/ispconfig/ispconfig.log');
951
		
952
		
953
954
	}
	
tbrehm's avatar
tbrehm committed
955
956
957
958
959
	public function configure_dbserver()
	{
		global $conf;
		
		//* If this server shall act as database server for client DB's, we configure this here