installer_base.lib.php 44.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
	
115
116
117
	/** Create the database for ISPConfig */ 
	public function configure_database()
    {
118
		global $conf;
tbrehm's avatar
tbrehm committed
119
		
120
		//** Create the database
121
122
		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'].'.');
123
124
		}
		
125
		//* Set the database name in the DB library
126
		$this->db->dbName = $conf['mysql']['database'];
127
		
128
		//* Load the database dump into the database, if database contains no tables
129
130
		$db_tables = $this->db->getTables();
		if(count($db_tables) > 0) {
131
			$this->error('Stopped: Database already contains some tables.');
132
		} else {
133
134
			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", 
135
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
136
			} else {
137
				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", 
138
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
139
140
141
142
143
144
145
146
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
		}
	}
	
147
	//** Create the server record in the database
148
149
	public function add_database_server_record() {
		
150
		global $conf;
tbrehm's avatar
tbrehm committed
151
		
152
		if($conf['mysql']['host'] == 'localhost') {
tbrehm's avatar
tbrehm committed
153
154
			$from_host = 'localhost';
		} else {
155
			$from_host = $conf['hostname'];
tbrehm's avatar
tbrehm committed
156
157
		}
		
158
159
160
		// 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."';");
161
162
		$this->db->query('FLUSH PRIVILEGES;');
		
163
164
165
166
		//* 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']."';";
167
		if(!$this->db->query($query)) {
168
			$this->error('Unable to create database user: '.$conf['mysql']['ispconfig_user'].' Error: '.$this->db->errorMessage);
169
170
171
172
173
		}
		
		//* Reload database privelages
		$this->db->query('FLUSH PRIVILEGES;');
		
tbrehm's avatar
tbrehm committed
174
		//* Set the database name in the DB library
175
		$this->db->dbName = $conf['mysql']['database'];
176
		
177
		$server_ini_content = rf("tpl/server.ini.master");
178
		$server_ini_content = mysql_real_escape_string($server_ini_content);
179
		
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
		if($conf['mysql']['master_slave_setup'] == 'y') {
			
			//* Insert the server record in master DB
			$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']."', 1, 1, 1, 1, 1, 1, '$server_ini_content', 0, 1);";
			$this->dbmaster->query($sql);
			$conf['server_id'] = $this->dbmaster->insertID();
			$conf['server_id'] = $conf['server_id'];
			
			//* Insert the same record in the local DB
			$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']."', 1, 1, 1, 1, 1, 1, '$server_ini_content', 0, 1);";
			$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
			$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']."', 1, 1, 1, 1, 1, 1, '$server_ini_content', 0, 1);";
			$this->db->query($sql);
			$conf['server_id'] = $this->db->insertID();
			$conf['server_id'] = $conf['server_id'];
		}
		
		
220
221
	}
	
222

223
    //** writes postfix configuration files
tbrehm's avatar
tbrehm committed
224
    public function process_postfix_config($configfile)
tbrehm's avatar
tbrehm committed
225
226
227
    {	
		global $conf;
		
228
        $config_dir = $conf['postfix']['config_dir'].'/';
229
230
231
232
233
234
        $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');
235
236
237
238
239
        $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);
240
241
242
        wf($full_file_name, $content);
    }

243
244
	public function configure_jailkit()
    {
tbrehm's avatar
tbrehm committed
245
246
247
        global $conf;
		
		$cf = $conf['jailkit'];
248
249
250
251
		$config_dir = $cf['config_dir'];
		$jk_init = $cf['jk_init'];
		$jk_chrootsh = $cf['jk_chrootsh'];
		
252
		if (is_dir($config_dir))
253
		{
254
255
			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.'~');
256
257
258
259
260
261
262
			
			copy('tpl/'.$jk_init.".master", $config_dir.'/'.$jk_init);
			copy('tpl/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh);
		}
		
    }
        
263
264
	public function configure_postfix($options = '')
    {
265
266
        global $conf;
		$cf = $conf['postfix'];
267
268
		$config_dir = $cf['config_dir'];
        
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
		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');
296
297
298
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
299
300

		//* Changing mode and group of the new created config files.
301
302
303
304
305
306
307
308
309
310
311
		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");		
312
313

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

		$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
591
		
592
593
		$command = "chown -R getmail $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
594
		
595
596
		$command = "chmod -R 700 $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
597
598
	}
	
599
	
600
601
	public function configure_pureftpd()
    {
602
603
		global $conf;
		
604
		$config_dir = $conf['pureftpd']['config_dir'];
605
606

		//* configure pam for SMTP authentication agains the ispconfig database
607
		$configfile = 'db/mysql.conf';
608
609
610
611
612
613
614
		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');
615
616
617
618
619
		$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);
620
621
622
623
		wf("$config_dir/$configfile", $content);
		exec("chmod 600 $config_dir/$configfile");
		exec("chown root:root $config_dir/$configfile");
		// **enable chrooting
624
		//exec('mkdir -p '.$config_dir.'/conf/ChrootEveryone');
625
		exec('echo "yes" > '.$config_dir.'/conf/ChrootEveryone');
tbrehm's avatar
tbrehm committed
626
627
	}
	
628
629
	public function configure_mydns()
    {
630
631
632
633
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
634
635
		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.'~');
636
		$content = rf("tpl/".$configfile.".master");
637
638
639
		$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);
640
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
641
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
642
643
644
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
645
646
647
	
	}
	
648
649
	public function configure_apache()
    {	
650
651
		global $conf;
		
652
653
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
654
		
655
		if(is_file('/etc/suphp/suphp.conf')) {
656
			replaceLine('/etc/suphp/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
657
658
659
			replaceLine('/etc/suphp/suphp.conf','docroot=','docroot=/var/clients',0);
		}
		
660
661
	}
	
tbrehm's avatar
tbrehm committed
662
663
664
665
666
667
	public function configure_firewall()
	{
		global $conf;
		
		$dist_init_scripts = $conf['init_scripts'];
  		
668
		if(is_dir("/etc/Bastille.backup")) caselog("rm -rf /etc/Bastille.backup", __FILE__, __LINE__);
669
		if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
670
  		@mkdir("/etc/Bastille", octdec($directory_mode));
671
672
673
  		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
674
675
676
677
678
679
  		$content = rf("/etc/Bastille/bastille-firewall.cfg");
  		$content = str_replace("{DNS_SERVERS}", "", $content);

  		$tcp_public_services = '';
  		$udp_public_services = '';
		
680
		$row = $this->db->queryOneRecord("SELECT * FROM firewall WHERE server_id = ".intval($conf['server_id']));
tbrehm's avatar
tbrehm committed
681
682
683
684
685
686
687
688
689
690
691
692
693
		
  		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
694
  		if(is_file($dist_init_scripts."/bastille-firewall")) caselog("mv -f $dist_init_scripts/bastille-firewall $dist_init_scripts/bastille-firewall.backup", __FILE__, __LINE__);
695
696
  		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
697

698
699
700
  		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
701

702
703
704
705
706
  		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
707
708

  		exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
709
  		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
710
711
  		unset($ipchains_location);
  		exec("which iptables &> /dev/null", $iptables_location, $ret_val);
712
  		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
713
714
715
716
  		unset($iptables_location);

	}
	
tbrehm's avatar
tbrehm committed
717
	
718
719
	public function install_ispconfig()
    {
720
721
		global $conf;
		
722
		$install_dir = $conf['ispconfig_install_dir'];
723
724

		//* Create the ISPConfig installation directory
725
		if(!@is_dir("$install_dir")) {
726
727
728
			$command = "mkdir $install_dir";
			caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
729
		
730
731
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
732
		if(!is_group('vacp')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
733
		
734
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
735
		if(!is_user('vacp')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
736
		
737
738
739
		//* 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");
740
		
741
742
743
		//* 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");
744
		
745
		//* Create a symlink, so ISPConfig is accessible via web
746
747
748
		// 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");
749
		
750
		//* Create the config file for ISPConfig interface
751
		$configfile = 'config.inc.php';
752
753
754
755
		if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
756
757
758
759
		$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);
760
761
762
763
764
765
		
		$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
766
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
767
		wf("$install_dir/interface/lib/$configfile", $content);
768
		
769
		//* Create the config file for ISPConfig server
770
		$configfile = 'config.inc.php';
771
772
773
774
		if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
775
776
777
778
		$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);
779
780
781
782
783
784
		
		$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);
		
785
		$content = str_replace('{server_id}', $conf['server_id'], $content);
786
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
787
		wf("$install_dir/server/lib/$configfile", $content);
788
		
789
		
790
791
792
793
794
795
796
		//* 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 != '..') {
797
						if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
798
799
800
						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);
						}
801
802
803
804
805
806
807
808
809
810
811
					}
				}
				closedir($dh);
			}
		}
		
		$dir = $install_dir.'/server/plugins-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if($file != '.' && $file != '..') {
812
						if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
813
814
815
						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);
						}
816
817
818
819
820
					}
				}
				closedir($dh);
			}
		}
821
		
822
823
824
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
825

826
827
828
		//* 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");
829
		
830
		//* Make the global language file directory group writable
tbrehm's avatar
tbrehm committed
831
		exec("chmod -R 770 $install_dir/interface/lib/lang");
832
		
833
834
835
		//* Make the temp directory for language file exports writable
		exec("chmod -R 770 $install_dir/interface/web/temp");
		
836
837
838
839
840
841
		//* 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
842
					chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang',0770);
843
844
					while ($lang_file = @readdir ($handle2)) {
						if ($lang_file != '.' && $lang_file != '..') {
tbrehm's avatar
tbrehm committed
845
							chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang/'.$lang_file,0770);
846
847
848
849
850
851
						}
					}
				}
			}
		}
		
852
853
854
		//* 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
855
		if(@is_file("$install_dir/server/lib/mysql_clientdb.conf")) {
856
857
858
			exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf");
			exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf");
		}
859
		
860
861
862
		// 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!
863
864
		$command = 'adduser www-data ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
865
		
866
867
868
		//* 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");
869
		
870
		//* Copy the ISPConfig vhost for the controlpanel
871
        // TODO: These are missing! should they be "vhost_dist_*_dir" ?
872
873
        $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
        $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
daniel's avatar
daniel committed
874
875
876
877
878
        
        
        // Dont just copy over the virtualhost template but add some custom settings
         
        $content = rf("tpl/apache_ispconfig.vhost.master");
879
		$content = str_replace('{vhost_port}', $conf['apache']['vhost_port'], $content);
880
881
882
883
884
885
886
887
		
		// 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
888
889
890
		wf("$vhost_conf_dir/ispconfig.vhost", $content);
		
		//copy('tpl/apache_ispconfig.vhost.master', "$vhost_conf_dir/ispconfig.vhost");
891
		//* and create the symlink
tbrehm's avatar
tbrehm committed
892
		if($this->install_ispconfig_interface == true) {
893
			if(@is_link("$vhost_conf_enabled_dir/ispconfig.vhost")) unlink("$vhost_conf_enabled_dir/ispconfig.vhost");
894
895
			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
896
			}
tbrehm's avatar
tbrehm committed
897
		}
898
899
900
901
		
		// Make the Clamav log files readable by ISPConfig
		exec('chmod +r /var/log/clamav/clamav.log');
		exec('chmod +r /var/log/clamav/freshclam.log');
902
903
904
905
906
907
		
		//* 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');
		
908
909
		//set the fast cgi starter script to executable
		exec('chmod 755 '.$install_dir.'/interface/bin/php-fcgi');
910
911
912
913
914
915
916
		
		//* 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');
		
917
918
		//* Create the ispconfig log directory
		if(!is_dir('/var/log/ispconfig')) mkdir('/var/log/ispconfig');
919
		if(!is_file('/var/log/ispconfig/ispconfig.log')) exec('touch /var/log/ispconfig/ispconfig.log');
920
		
921
		
922
923
	}
	
tbrehm's avatar
tbrehm committed
924
925
926
927
928
	public function configure_dbserver()
	{
		global $conf;
		
		//* If this server shall act as database server for client DB's, we configure this here
929
		$install_dir = $conf['ispconfig_install_dir'];
tbrehm's avatar
tbrehm committed
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
		
		// Create a file with the database login details which 
		// are used to create the client databases.
		
		if(!is_dir("$install_dir/server/lib")) {
			$command = "mkdir $install_dir/server/lib";
			caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
		
		$content = rf("tpl/mysql_clientdb.conf.master");
		$content = str_replace('{username}',$conf['mysql']['admin_user'],$content);
		$content = str_replace('{password}',$conf['mysql']['admin_password'], $content);
		wf("$install_dir/server/lib/mysql_clientdb.conf",$content);
		exec('chmod 600 '."$install_dir/server/lib/mysql_clientdb.conf");
		exec('chown root:root '."$install_dir/server/lib/mysql_clientdb.conf");
		
	}
	
948
	public function install_crontab()
949
    {		
950
951
		global $conf;
		
952
953
		//* Root Crontab
		exec('crontab -u root -l > crontab.txt');
tbrehm's avatar
tbrehm committed
954
955
		$existing_root_cron_jobs = file('crontab.txt');
		
956
957
958
959
960
		// remove existing ispconfig cronjobs, in case the syntax has changed
		foreach($existing_root_cron_jobs as $key => $val) {
			if(stristr($val,'/usr/local/ispconfig')) unset($existing_root_cron_jobs[$key]);
		}
		
tbrehm's avatar
tbrehm committed
961
		$root_cron_jobs = array(
962
963
			'* * * * * /usr/local/ispconfig/server/server.sh > /dev/null',
			'30 00 * * * /usr/local/ispconfig/server/cron_daily.sh > /dev/null'
tbrehm's avatar
tbrehm committed
964
		);
tbrehm's avatar
tbrehm committed <