installer_base.lib.php 48.6 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;
tbrehm's avatar
tbrehm committed
38
	public $is_update = false; // true if it is an update, falsi if it is a new install
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
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
162
163
164
165
166
			
			//* Load system.ini into the sys_ini table
			$system_ini = $this->db->quote(rf('tpl/system.ini.master'));
			$this->db->query("UPDATE sys_ini SET config = '$system_ini' WHERE sysini_id = 1");
			
167
168
169
		}
	}
	
170
	//** Create the server record in the database
171
172
	public function add_database_server_record() {
		
173
		global $conf;
tbrehm's avatar
tbrehm committed
174
		
175
		if($conf['mysql']['host'] == 'localhost') {
tbrehm's avatar
tbrehm committed
176
177
			$from_host = 'localhost';
		} else {
178
			$from_host = $conf['hostname'];
tbrehm's avatar
tbrehm committed
179
180
		}
		
181
182
183
		// 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."';");
184
185
		$this->db->query('FLUSH PRIVILEGES;');
		
186
187
188
189
		//* 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']."';";
190
		if(!$this->db->query($query)) {
191
			$this->error('Unable to create database user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage);
192
193
194
195
196
		}
		
		//* Reload database privelages
		$this->db->query('FLUSH PRIVILEGES;');
		
tbrehm's avatar
tbrehm committed
197
		//* Set the database name in the DB library
198
		$this->db->dbName = $conf['mysql']['database'];
199
		
tbrehm's avatar
tbrehm committed
200
201
202
203
204
205
206
		$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);
207
		$server_ini_content = mysql_real_escape_string($server_ini_content);
208
		
tbrehm's avatar
tbrehm committed
209
210
211
212
213
214
215
		$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;
		
216
217
218
		if($conf['mysql']['master_slave_setup'] == 'y') {
			
			//* Insert the server record in master DB
tbrehm's avatar
tbrehm committed
219
			$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);";
220
221
222
223
224
			$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
225
			$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);";
226
227
228
229
			$this->db->query($sql);
			
			//* insert the ispconfig user in the remote server
			$from_host = $conf['hostname'];
tbrehm's avatar
tbrehm committed
230
			$from_ip = gethostbyname($conf['hostname']);
231
232
233
234
			
			//* username for the ispconfig user
			$conf['mysql']['master_ispconfig_user'] = 'ispconfigserver'.$conf['server_id'];
		
tbrehm's avatar
tbrehm committed
235
			//* Delete ISPConfig user in the master database, in case that it exists
236
237
			$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."';");
tbrehm's avatar
tbrehm committed
238
239
			$this->dbmaster->query("DELETE FROM mysql.user WHERE User = '".$conf['mysql']['master_ispconfig_user']."' AND Host = '".$from_ip."';");
			$this->dbmaster->query("DELETE FROM mysql.db WHERE Db = '".$conf['mysql']['master_database']."' AND Host = '".$from_ip."';");
240
241
242
243
244
245
			$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']."';";
tbrehm's avatar
tbrehm committed
246
247
248
			$query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$conf['mysql']['master_database'].".* "
                	."TO '".$conf['mysql']['master_ispconfig_user']."'@'".$from_ip."' "
                	."IDENTIFIED BY '".$conf['mysql']['master_ispconfig_password']."';";
249
250
251
252
253
254
			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
255
			$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);";
256
257
258
259
260
261
			$this->db->query($sql);
			$conf['server_id'] = $this->db->insertID();
			$conf['server_id'] = $conf['server_id'];
		}
		
		
262
263
	}
	
264

265
    //** writes postfix configuration files
tbrehm's avatar
tbrehm committed
266
    public function process_postfix_config($configfile)
tbrehm's avatar
tbrehm committed
267
268
269
    {	
		global $conf;
		
270
        $config_dir = $conf['postfix']['config_dir'].'/';
271
272
273
274
275
276
        $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');
277
278
279
280
281
        $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);
282
283
284
        wf($full_file_name, $content);
    }

285
286
	public function configure_jailkit()
    {
tbrehm's avatar
tbrehm committed
287
288
289
        global $conf;
		
		$cf = $conf['jailkit'];
290
291
292
293
		$config_dir = $cf['config_dir'];
		$jk_init = $cf['jk_init'];
		$jk_chrootsh = $cf['jk_chrootsh'];
		
294
		if (is_dir($config_dir))
295
		{
296
297
			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.'~');
298
299
300
301
302
303
304
			
			copy('tpl/'.$jk_init.".master", $config_dir.'/'.$jk_init);
			copy('tpl/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh);
		}
		
    }
        
305
306
	public function configure_postfix($options = '')
    {
307
308
        global $conf;
		$cf = $conf['postfix'];
309
310
		$config_dir = $cf['config_dir'];
        
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
		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');
338
339
340
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
341
342

		//* Changing mode and group of the new created config files.
343
344
345
346
347
348
349
		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'];
350
		if(!is_group($cf['vmail_groupname'])) caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
351
352

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

		$postconf_commands = array (
356
357
			'myhostname = '.$conf['hostname'],
			'mydestination = '.$conf['hostname'].', localhost, localhost.localdomain',
358
359
			'mynetworks = 127.0.0.0/8',
			'virtual_alias_domains =',
pedro_morgan's avatar
pedro_morgan committed
360
361
			'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',
362
363
364
365
			'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'],
366
367
			'smtpd_sasl_auth_enable = yes',
			'broken_sasl_auth_clients = yes',
pedro_morgan's avatar
pedro_morgan committed
368
			'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
369
			'smtpd_use_tls = yes',
redray's avatar
redray committed
370
			'smtpd_tls_security_level = may',
redray's avatar
redray committed
371
372
			'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
			'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
pedro_morgan's avatar
pedro_morgan committed
373
			'transport_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_transports.cf',
374
			'relay_domains = mysql:'.$config_dir.'/mysql-virtual_relaydomains.cf',
375
376
			'virtual_create_maildirsize = yes',
			'virtual_mailbox_extended = yes',
pedro_morgan's avatar
pedro_morgan committed
377
			'virtual_mailbox_limit_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailbox_limit_maps.cf',
378
379
380
381
			'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
382
383
			'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',
384
385
			'maildrop_destination_concurrency_limit = 1',
			'maildrop_destination_recipient_limit   = 1',
386
			'virtual_transport = maildrop',
pedro_morgan's avatar
pedro_morgan committed
387
388
389
390
			'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'
391
392
		);
		
pedro_morgan's avatar
pedro_morgan committed
393
394
395
396
397
		//* 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');
398
399
		
		
pedro_morgan's avatar
pedro_morgan committed
400
401
		//* Make a backup copy of the main.cf file
		copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
402
		
pedro_morgan's avatar
pedro_morgan committed
403
		//* Executing the postconf commands
404
405
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
pedro_morgan's avatar
pedro_morgan committed
406
			caselog($command." &> /dev/null", __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
407
408
		}
		
tbrehm's avatar
tbrehm committed
409
		if(!stristr($options,'dont-create-certs')) {
pedro_morgan's avatar
pedro_morgan committed
410
			//* Create the SSL certificate
redray's avatar
redray committed
411
			$command = 'cd '.$config_dir.'; '
redray's avatar
redray committed
412
                      .'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
413
			exec($command);
414
		
redray's avatar
redray committed
415
			$command = 'chmod o= '.$config_dir.'/smtpd.key';
pedro_morgan's avatar
pedro_morgan committed
416
			caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
tbrehm's avatar
tbrehm committed
417
		}
418
		
419
		//** We have to change the permissions of the courier authdaemon directory to make it accessible for maildrop.
pedro_morgan's avatar
pedro_morgan committed
420
421
		$command = 'chmod 755  /var/run/courier/authdaemon/';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
422
		
pedro_morgan's avatar
pedro_morgan committed
423
424
425
426
427
428
429
430
		//* 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';
431
		$content = rf($configfile);
432
433
434
435
		$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);
436
		
pedro_morgan's avatar
pedro_morgan committed
437
		//* Writing the Maildrop mailfilter file
438
		$configfile = 'mailfilter';
439
440
441
442
443
444
		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);
445
		
446
		//* Create the directory for the custom mailfilters
447
448
449
450
		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");
		}
451
		
452
453
454
		//* 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");
455
		
456
457
		$command = 'chmod -R 600 '.$cf['vmail_mailbox_base'].'/.mailfilter';
		caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
458
459
460
		
	}
	
tbrehm's avatar
tbrehm committed
461
	public function configure_saslauthd() {
462
463
		global $conf;
		
464
	
465
		$configfile = 'sasl_smtpd.conf';
oliver's avatar
oliver committed
466
467
		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~');
468
		$content = rf("tpl/".$configfile.".master");
469
470
471
472
		$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
473
		wf($conf["postfix"]["config_dir"].'/sasl/smtpd.conf',$content);
474
475
476
477
		
		// TODO: Chmod and chown on the config file
		
		
478
479
		
		// Create the spool directory
480
		exec('mkdir -p /var/spool/postfix/var/run/saslauthd');
481
482
		
		// Edit the file /etc/default/saslauthd
oliver's avatar
oliver committed
483
		$configfile = $conf["saslauthd"]["config"];
484
		if(is_file($configfile)) copy($configfile,$configfile.'~');
485
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
486
487
		$content = rf($configfile);
		$content = str_replace('START=no','START=yes',$content);
488
		// Debian
489
		$content = str_replace('OPTIONS="-c"','OPTIONS="-m /var/spool/postfix/var/run/saslauthd -r"',$content);
490
491
		// Ubuntu
		$content = str_replace('OPTIONS="-c -m /var/run/saslauthd"','OPTIONS="-c -m /var/spool/postfix/var/run/saslauthd -r"',$content);
492
493
		wf($configfile,$content);
		
494
		// Edit the file /etc/init.d/saslauthd
oliver's avatar
oliver committed
495
		$configfile = $conf["init_scripts"].'/'.$conf["saslauthd"]["init_script"];
496
497
498
499
		$content = rf($configfile);
		$content = str_replace('PIDFILE=$RUN_DIR/saslauthd.pid','PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"',$content);
		wf($configfile,$content);
		
500
501
502
		// 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');
		
503
		
504
505
	}
	
506
507
	public function configure_pam()
    {
508
509
		global $conf;
		$pam = $conf['pam'];
510
		//* configure pam for SMTP authentication agains the ispconfig database
511
		$configfile = 'pamd_smtp';
512
513
514
515
		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");
516
517
518
519
		$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);
520
521
522
		wf("$pam/smtp", $content);
		exec("chmod 660 $pam/smtp");
		exec("chown daemon:daemon $pam/smtp");
523
524
525
	
	}
	
526
527
	public function configure_courier()
    {
528
529
		global $conf;
		$config_dir = $conf['courier']['config_dir'];
530
		//* authmysqlrc
531
		$configfile = 'authmysqlrc';
532
533
534
535
536
		if(is_file("$config_dir/$configfile")){
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
		exec("chmod 400 $config_dir/$configfile~");
		$content = rf("tpl/$configfile.master");
537
538
539
540
		$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);
541
		wf("$config_dir/$configfile", $content);
542
		
543
544
		exec("chmod 660 $config_dir/$configfile");
		exec("chown daemon:daemon $config_dir/$configfile");
545
		
546
		//* authdaemonrc
547
		$configfile = $conf['courier']['config_dir'].'/authdaemonrc';
548
549
550
551
552
553
		if(is_file($configfile)){
            copy($configfile, $configfile.'~');
        }
		if(is_file($configfile.'~')){
            exec('chmod 400 '.$configfile.'~');
        }
554
		$content = rf($configfile);
555
556
		$content = str_replace('authmodulelist="authpam"', 'authmodulelist="authmysql"', $content);
		wf($configfile, $content);
557
558
	}
	
tbrehm's avatar
tbrehm committed
559
	public function configure_amavis() {
560
561
562
563
		global $conf;
		
		// amavisd user config file
		$configfile = 'amavisd_user_config';
oliver's avatar
oliver committed
564
565
		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~');
566
		$content = rf("tpl/".$configfile.".master");
567
568
569
		$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);
570
		$content = str_replace('{mysql_server_port}',$conf["mysql"]["port"],$content);
571
		$content = str_replace('{mysql_server_ip}',$conf['mysql']['ip'],$content);
oliver's avatar
oliver committed
572
		wf($conf["amavis"]["config_dir"].'/conf.d/50-user',$content);
573
574
575
576
577
578
579
580
581
582
583
		
		// 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
584
		copy($conf["postfix"]["config_dir"].'/main.cf',$conf["postfix"]["config_dir"].'/main.cf~2');
585
586
587
588
		
		// Executing the postconf commands
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
589
			caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
590
591
592
		}
		
		// Append the configuration for amavisd to the master.cf file
oliver's avatar
oliver committed
593
		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
594
		$content = rf($conf["postfix"]["config_dir"].'/master.cf');
595
		// Only add the content if we had not addded it before
tbrehm's avatar
tbrehm committed
596
		if(!stristr($content,"127.0.0.1:10025")) {
tbrehm's avatar
tbrehm committed
597
598
			unset($content);
			$content = rf("tpl/master_cf_amavis.master");
oliver's avatar
oliver committed
599
			af($conf["postfix"]["config_dir"].'/master.cf',$content);
600
		}
tbrehm's avatar
tbrehm committed
601
		unset($content);
602
603
604
605
606
607
608
		
		// Add the clamav user to the amavis group
		exec('adduser clamav amavis');
		
		
	}
	
609
610
	public function configure_spamassassin()
    {
611
612
		global $conf;
		
613
		//* Enable spamasasssin on debian and ubuntu
614
		$configfile = '/etc/default/spamassassin';
615
		if(is_file($configfile)){
616
            copy($configfile, $configfile.'~');
617
        }
618
		$content = rf($configfile);
619
620
		$content = str_replace('ENABLED=0', 'ENABLED=1', $content);
		wf($configfile, $content);
621
622
	}
	
623
624
	public function configure_getmail()
    {
625
626
		global $conf;
		
627
		$config_dir = $conf['getmail']['config_dir'];
628
629
		
		if(!is_dir($config_dir)) exec("mkdir -p ".escapeshellcmd($config_dir));
630
631

		$command = "useradd -d $config_dir getmail";
632
		if(!is_user('getmail')) caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
tbrehm's avatar
tbrehm committed
633
		
634
635
		$command = "chown -R getmail $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
636
		
637
638
		$command = "chmod -R 700 $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
639
640
	}
	
641
	
642
643
	public function configure_pureftpd()
    {
644
645
		global $conf;
		
646
		$config_dir = $conf['pureftpd']['config_dir'];
647
648

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

  		$tcp_public_services = '';
  		$udp_public_services = '';
		
722
		$row = $this->db->queryOneRecord("SELECT * FROM firewall WHERE server_id = ".intval($conf['server_id']));
tbrehm's avatar
tbrehm committed
723
724
725
726
727
		
  		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 {
728
    		$tcp_public_services = '21 22 25 53 80 110 443 3306 8080 10000';
tbrehm's avatar
tbrehm committed
729
730
    		$udp_public_services = '53';
  		}
tbrehm's avatar
tbrehm committed
731
732
		
		if(!stristr($tcp_public_services, $conf['apache']['vhost_port'])) {
fantu's avatar
fantu committed
733
			$tcp_public_services .= ' '.intval($conf['apache']['vhost_port']);
fantu's avatar
fantu committed
734
			if($row["tcp_port"] != '') $this->db->query("UPDATE firewall SET tcp_port = tcp_port + ',".intval($conf['apache']['vhost_port'])."' WHERE server_id = ".intval($conf['server_id']));
735
736
		}
		
tbrehm's avatar
tbrehm committed
737
738
739
740
741
  		$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
742
  		if(is_file($dist_init_scripts."/bastille-firewall")) caselog("mv -f $dist_init_scripts/bastille-firewall $dist_init_scripts/bastille-firewall.backup", __FILE__, __LINE__);
743
744
  		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
745

746
747
748
  		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
749

750
751
752
753
754
  		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
755
756

  		exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
757
  		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
758
759
  		unset($ipchains_location);
  		exec("which iptables &> /dev/null", $iptables_location, $ret_val);
760
  		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
761
762
763
764
  		unset($iptables_location);

	}
	
tbrehm's avatar
tbrehm committed
765
	
766
767
	public function install_ispconfig()
    {
768
769
		global $conf;
		
770
		$install_dir = $conf['ispconfig_install_dir'];
771
772

		//* Create the ISPConfig installation directory
773
		if(!@is_dir("$install_dir")) {
774
775
776
			$command = "mkdir $install_dir";
			caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
777
		
778
779
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
780
		if(!is_group('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
781
		
782
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
783
		if(!is_user('ispconfig')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
784
		
785
786
787
		//* 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");
788
		
789
790
791
		//* 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");
792
		
793
		//* Create a symlink, so ISPConfig is accessible via web
794
795
796
		// 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");
797
		
798
		//* Create the config file for ISPConfig interface
799
		$configfile = 'config.inc.php';
800
801
802
803
		if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
804
805
806
807
		$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);
808
809
810
811
812
813
		
		$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
814
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
815
		wf("$install_dir/interface/lib/$configfile", $content);
816
		
817
		//* Create the config file for ISPConfig server
818
		$configfile = 'config.inc.php';
819
820
821
822
		if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
823
824
825
826
		$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);
827
828
829
830
831
832
		
		$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);
		
833
		$content = str_replace('{server_id}', $conf['server_id'], $content);
834
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
835
		wf("$install_dir/server/lib/$configfile", $content);
836
		
837
		
838
839
840
841
842
843
		//* 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) {
844
845
846
847
848
849
850
851
852
					if($file != '.' && $file != '..' && substr($file,-8,8) == '.inc.php') {
						include_once($install_dir.'/server/mods-available/'.$file);
						$module_name = substr($file,0,-8);
						$tmp = new $module_name;
						if($tmp->onInstall()) {
							if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
							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);
							}
853
						}
854
						unset($tmp);
855
856
857
858
859
860
861
862
863
864
					}
				}
				closedir($dh);
			}
		}
		
		$dir = $install_dir.'/server/plugins-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
865
866
867
868
869
870
871
872
873
					if($file != '.' && $file != '..' && substr($file,-8,8) == '.inc.php') {
						include_once($install_dir.'/server/plugins-available/'.$file);
						$plugin_name = substr($file,0,-8);
						$tmp = new $plugin_name;
						if($tmp->onInstall()) {
							if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
							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);
							}
874
						}
875
						unset($tmp);
876
877
878
879
880
					}
				}
				closedir($dh);
			}
		}
881
		
882
883
884
885
886
887
888
889
890
891
892
		// Update the server config
		$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;
		$sql = "UPDATE `server` SET mail_server = '$mail_server_enabled', web_server = '$web_server_enabled', dns_server = '$dns_server_enabled', file_server = '$file_server_enabled', db_server = '$db_server_enabled', vserver_server = '$vserver_server_enabled' WHERE server_id = ".intval($conf['server_id']);
		
		if($conf['mysql']['master_slave_setup'] == 'y') {
			$this->dbmaster->query($sql);
893
			$this->db->query($sql);
894
895
896
897
898
		} else {
			$this->db->query($sql);
		}
		
		
899
900
901
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
902

903
904
905
		//* 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");
906
		
907
		//* Make the global language file directory group writable
tbrehm's avatar
tbrehm committed
908
		exec("chmod -R 770 $install_dir/interface/lib/lang");
909
		
910
911
912
		//* Make the temp directory for language file exports writable
		exec("chmod -R 770 $install_dir/interface/web/temp");
		
913
914
915
916
917
918
		//* 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
919
					chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang',0770);
920
921
					while ($lang_file = @readdir ($handle2)) {
						if ($lang_file != '.' && $lang_file != '..') {
tbrehm's avatar
tbrehm committed
922
							chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang/'.$lang_file,0770);
923
924
925
926
927
928
						}
					}
				}
			}
		}
		
929
930
931
		//* 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
932
		if(@is_file("$install_dir/server/lib/mysql_clientdb.conf")) {
933
934
935
			exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf");
			exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf");
		}
936
		
937
938
939
		// 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!
940
941