installer_base.lib.php 40.8 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
121
		$cf = $conf['mysql']; // make $conf['mysql'] more accessible
		//** Create the database
redray's avatar
redray committed
122
		if(!$this->db->query('CREATE DATABASE IF NOT EXISTS '.$cf['database'].' DEFAULT CHARACTER SET '.$cf['charset'])) {
123
			$this->error('Unable to create MySQL database: '.$cf['database'].'.');
124
125
		}
		
126
127
		//* Set the database name in the DB library
		$this->db->dbName = $cf['database'];
128
		
129
		//* Load the database dump into the database, if database contains no tables
130
131
		$db_tables = $this->db->getTables();
		if(count($db_tables) > 0) {
132
			$this->error('Stopped: Database already contains some tables.');
133
		} else {
134
			if($cf['admin_password'] == '') {
redray's avatar
redray committed
135
				caselog("mysql --default-character-set=".$cf['charset']." -h '".$cf['host']."' -u '".$cf['admin_user']."' '".$cf['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/ispconfig3.sql' &> /dev/null", 
136
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
137
			} else {
redray's avatar
redray committed
138
				caselog("mysql --default-character-set=".$cf['charset']." -h '".$cf['host']."' -u '".$cf['admin_user']."' -p'".$cf['admin_password']."' '".$cf['database']."' < '".ISPC_INSTALL_ROOT."/install/sql/ispconfig3.sql' &> /dev/null", 
139
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
140
141
142
143
144
145
146
147
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
		}
	}
	
148
	//** Create the server record in the database
149
150
	public function add_database_server_record() {
		
151
		global $conf;
tbrehm's avatar
tbrehm committed
152
		
153
154
		$cf = $conf['mysql']; // make $conf['mysql'] more accessible
		
tbrehm's avatar
tbrehm committed
155
156
157
		if($cf['host'] == 'localhost') {
			$from_host = 'localhost';
		} else {
158
			$from_host = $conf['hostname'];
tbrehm's avatar
tbrehm committed
159
160
		}
		
161
162
163
164
165
		// Delete ISPConfig user, in case that it exists
		$this->db->query("DELETE FROM mysql.user WHERE User = '".$cf['ispconfig_user']."' AND Host = '".$from_host."';");
		$this->db->query("DELETE FROM mysql.db WHERE Db = '".$cf['database']."' AND Host = '".$from_host."';");
		$this->db->query('FLUSH PRIVILEGES;');
		
166
167
		//* Create the ISPConfig database user
        $query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$cf['database'].".* "
tbrehm's avatar
tbrehm committed
168
                ."TO '".$cf['ispconfig_user']."'@'".$from_host."' "
169
170
                ."IDENTIFIED BY '".$cf['ispconfig_password']."';";
		if(!$this->db->query($query)) {
171
			$this->error('Unable to create database user: '.$cf['ispconfig_user'].' Error: '.$this->db->errorMessage);
172
173
174
175
176
		}
		
		//* Reload database privelages
		$this->db->query('FLUSH PRIVILEGES;');
		
tbrehm's avatar
tbrehm committed
177
178
		//* Set the database name in the DB library
		$this->db->dbName = $cf['database'];
179
		
180
		$server_ini_content = rf("tpl/server.ini.master");
181
		$server_ini_content = mysql_real_escape_string($server_ini_content);
182
		
183
		$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);";
184
		$this->db->query($sql);
tbrehm's avatar
tbrehm committed
185
		$conf['server_id'] = $this->db->insertID();
186
		$conf['server_id'] = $conf['server_id'];
187
188
	}
	
189

190
    //** writes postfix configuration files
tbrehm's avatar
tbrehm committed
191
    public function process_postfix_config($configfile)
tbrehm's avatar
tbrehm committed
192
193
194
    {	
		global $conf;
		
195
        $config_dir = $conf['postfix']['config_dir'].'/';
196
197
198
199
200
201
        $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');
202
203
204
205
206
        $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);
207
208
209
        wf($full_file_name, $content);
    }

210
211
	public function configure_jailkit()
    {
tbrehm's avatar
tbrehm committed
212
213
214
        global $conf;
		
		$cf = $conf['jailkit'];
215
216
217
218
		$config_dir = $cf['config_dir'];
		$jk_init = $cf['jk_init'];
		$jk_chrootsh = $cf['jk_chrootsh'];
		
219
		if (is_dir($config_dir))
220
		{
221
222
			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.'~');
223
224
225
226
227
228
229
			
			copy('tpl/'.$jk_init.".master", $config_dir.'/'.$jk_init);
			copy('tpl/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh);
		}
		
    }
        
230
231
	public function configure_postfix($options = '')
    {
232
233
        global $conf;
		$cf = $conf['postfix'];
234
235
		$config_dir = $cf['config_dir'];
        
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
		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');
263
264
265
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
266
267

		//* Changing mode and group of the new created config files.
268
269
270
271
272
273
274
275
276
277
278
		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");		
279
280

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

		$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
559
		
560
561
		$command = "chown -R getmail $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
562
		
563
564
		$command = "chmod -R 700 $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
565
566
	}
	
567
	
568
569
	public function configure_pureftpd()
    {
570
571
		global $conf;
		
572
		$config_dir = $conf['pureftpd']['config_dir'];
573
574

		//* configure pam for SMTP authentication agains the ispconfig database
575
		$configfile = 'db/mysql.conf';
576
577
578
579
580
581
582
		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');
583
584
585
586
587
		$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);
588
589
590
591
		wf("$config_dir/$configfile", $content);
		exec("chmod 600 $config_dir/$configfile");
		exec("chown root:root $config_dir/$configfile");
		// **enable chrooting
592
		//exec('mkdir -p '.$config_dir.'/conf/ChrootEveryone');
593
		exec('echo "yes" > '.$config_dir.'/conf/ChrootEveryone');
tbrehm's avatar
tbrehm committed
594
595
	}
	
596
597
	public function configure_mydns()
    {
598
599
600
601
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
602
603
		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.'~');
604
		$content = rf("tpl/".$configfile.".master");
605
606
607
		$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);
608
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
609
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
610
611
612
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
613
614
615
	
	}
	
616
617
	public function configure_apache()
    {	
618
619
		global $conf;
		
620
621
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
622
		
623
		if(is_file('/etc/suphp/suphp.conf')) {
624
			replaceLine('/etc/suphp/suphp.conf','php=php:/usr/bin','x-httpd-suphp=php:/usr/bin/php-cgi',0);
625
626
627
			replaceLine('/etc/suphp/suphp.conf','docroot=','docroot=/var/clients',0);
		}
		
628
629
	}
	
tbrehm's avatar
tbrehm committed
630
631
632
633
634
635
	public function configure_firewall()
	{
		global $conf;
		
		$dist_init_scripts = $conf['init_scripts'];
  		
636
		if(is_dir("/etc/Bastille.backup")) caselog("rm -rf /etc/Bastille.backup", __FILE__, __LINE__);
637
		if(is_dir("/etc/Bastille")) caselog("mv -f /etc/Bastille /etc/Bastille.backup", __FILE__, __LINE__);
tbrehm's avatar
tbrehm committed
638
  		@mkdir("/etc/Bastille", octdec($directory_mode));
639
640
641
  		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
642
643
644
645
646
647
  		$content = rf("/etc/Bastille/bastille-firewall.cfg");
  		$content = str_replace("{DNS_SERVERS}", "", $content);

  		$tcp_public_services = '';
  		$udp_public_services = '';
		
648
		$row = $this->db->queryOneRecord("SELECT * FROM firewall WHERE server_id = ".intval($conf['server_id']));
tbrehm's avatar
tbrehm committed
649
650
651
652
653
654
655
656
657
658
659
660
661
		
  		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
662
  		if(is_file($dist_init_scripts."/bastille-firewall")) caselog("mv -f $dist_init_scripts/bastille-firewall $dist_init_scripts/bastille-firewall.backup", __FILE__, __LINE__);
663
664
  		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
665

666
667
668
  		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
669

670
671
672
673
674
  		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
675
676

  		exec("which ipchains &> /dev/null", $ipchains_location, $ret_val);
677
  		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
678
679
  		unset($ipchains_location);
  		exec("which iptables &> /dev/null", $iptables_location, $ret_val);
680
  		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
681
682
683
684
  		unset($iptables_location);

	}
	
tbrehm's avatar
tbrehm committed
685
	
686
687
	public function install_ispconfig()
    {
688
689
		global $conf;
		
690
		$install_dir = $conf['ispconfig_install_dir'];
691
692

		//* Create the ISPConfig installation directory
693
		if(!@is_dir("$install_dir")) {
694
695
696
			$command = "mkdir $install_dir";
			caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
		}
697
		
698
699
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
700
		if(!is_group('vacp')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
701
		
702
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
703
		if(!is_user('vacp')) caselog($command.' &> /dev/null 2> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
704
		
705
706
707
		//* 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");
708
		
709
710
711
		//* 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");
712
		
713
		//* Create a symlink, so ISPConfig is accessible via web
714
715
716
		// 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");
717
		
718
		//* Create the config file for ISPConfig interface
719
		$configfile = 'config.inc.php';
720
721
722
723
		if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
724
725
726
727
		$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);
tbrehm's avatar
tbrehm committed
728
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
729
		wf("$install_dir/interface/lib/$configfile", $content);
730
		
731
		//* Create the config file for ISPConfig server
732
		$configfile = 'config.inc.php';
733
734
735
736
		if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
737
738
739
740
741
		$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);
		$content = str_replace('{server_id}', $conf['server_id'], $content);
742
		$content = str_replace('{ispconfig_log_priority}', $conf['ispconfig_log_priority'], $content);
743
		wf("$install_dir/server/lib/$configfile", $content);
744
		
745
		
746
747
748
749
750
751
752
		//* 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 != '..') {
753
						if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
754
755
756
						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);
						}
757
758
759
760
761
762
763
764
765
766
767
					}
				}
				closedir($dh);
			}
		}
		
		$dir = $install_dir.'/server/plugins-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if($file != '.' && $file != '..') {
768
						if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
769
770
771
						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);
						}
772
773
774
775
776
					}
				}
				closedir($dh);
			}
		}
777
		
778
779
780
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
781

782
783
784
		//* 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");
785
		
786
		//* Make the global language file directory group writable
tbrehm's avatar
tbrehm committed
787
		exec("chmod -R 770 $install_dir/interface/lib/lang");
788
		
789
790
791
		//* Make the temp directory for language file exports writable
		exec("chmod -R 770 $install_dir/interface/web/temp");
		
792
793
794
795
796
797
		//* 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
798
					chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang',0770);
799
800
					while ($lang_file = @readdir ($handle2)) {
						if ($lang_file != '.' && $lang_file != '..') {
tbrehm's avatar
tbrehm committed
801
							chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang/'.$lang_file,0770);
802
803
804
805
806
807
						}
					}
				}
			}
		}
		
808
809
810
		//* 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
811
		if(@is_file("$install_dir/server/lib/mysql_clientdb.conf")) {
812
813
814
			exec("chmod 600 $install_dir/server/lib/mysql_clientdb.conf");
			exec("chown root:root $install_dir/server/lib/mysql_clientdb.conf");
		}
815
		
816
817
818
		// 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!
819
820
		$command = 'adduser www-data ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
821
		
822
823
824
		//* 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");
825
		
826
		//* Copy the ISPConfig vhost for the controlpanel
827
        // TODO: These are missing! should they be "vhost_dist_*_dir" ?
828
829
        $vhost_conf_dir = $conf['apache']['vhost_conf_dir'];
        $vhost_conf_enabled_dir = $conf['apache']['vhost_conf_enabled_dir'];
daniel's avatar
daniel committed
830
831
832
833
834
        
        
        // Dont just copy over the virtualhost template but add some custom settings
         
        $content = rf("tpl/apache_ispconfig.vhost.master");
835
		$content = str_replace('{vhost_port}', $conf['apache']['vhost_port'], $content);
836
837
838
839
840
841
842
843
		
		// 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
844
845
846
		wf("$vhost_conf_dir/ispconfig.vhost", $content);
		
		//copy('tpl/apache_ispconfig.vhost.master', "$vhost_conf_dir/ispconfig.vhost");
847
		//* and create the symlink
tbrehm's avatar
tbrehm committed
848
		if($this->install_ispconfig_interface == true) {
849
			if(@is_link("$vhost_conf_enabled_dir/ispconfig.vhost")) unlink("$vhost_conf_enabled_dir/ispconfig.vhost");
850
851
			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
852
			}
tbrehm's avatar
tbrehm committed
853
		}
854
855
856
857
		
		// Make the Clamav log files readable by ISPConfig
		exec('chmod +r /var/log/clamav/clamav.log');
		exec('chmod +r /var/log/clamav/freshclam.log');
858
859
860
861
862
863
		
		//* 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');
		
864
865
		//set the fast cgi starter script to executable
		exec('chmod 755 '.$install_dir.'/interface/bin/php-fcgi');
866
867
868
869
870
871
872
		
		//* 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');
		
873
874
		//* Create the ispconfig log directory
		if(!is_dir('/var/log/ispconfig')) mkdir('/var/log/ispconfig');
875
		if(!is_file('/var/log/ispconfig/ispconfig.log')) exec('touch /var/log/ispconfig/ispconfig.log');
876
		
877
		
878
879
	}
	
tbrehm's avatar
tbrehm committed
880
881
882
883
884
	public function configure_dbserver()
	{
		global $conf;
		
		//* If this server shall act as database server for client DB's, we configure this here
885
		$install_dir = $conf['ispconfig_install_dir'];
tbrehm's avatar
tbrehm committed
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
		
		// 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");
		
	}
	
904
	public function install_crontab()
905
    {		
906
907
		global $conf;
		
908
909
		//* Root Crontab
		exec('crontab -u root -l > crontab.txt');
tbrehm's avatar
tbrehm committed
910
911
		$existing_root_cron_jobs = file('crontab.txt');
		
912
913
914
915
916
		// 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
917
		$root_cron_jobs = array(
918
919
			'* * * * * /usr/local/ispconfig/server/server.sh > /dev/null',
			'30 00 * * * /usr/local/ispconfig/server/cron_daily.sh > /dev/null'
tbrehm's avatar
tbrehm committed
920
		);
tbrehm's avatar
tbrehm committed
921
		foreach($root_cron_jobs as $cron_job) {
922
			if(!in_array($cron_job."\n", $existing_root_cron_jobs)) {
tbrehm's avatar
tbrehm committed
923
924
925
				$existing_root_cron_jobs[] = $cron_job."\n";
			}
		}
926
927
		file_put_contents('crontab.txt', $existing_root_cron_jobs);
		exec('crontab -u root crontab.txt &> /dev/null');
tbrehm's avatar
tbrehm committed
928
929
		unlink('crontab.txt');
		
930
		//* Getmail crontab
931
932
933
934
		if(is_user('getmail')) {
        	$cf = $conf['getmail'];
			exec('crontab -u getmail -l > crontab.txt');
			$existing_cron_jobs = file('crontab.txt');
tbrehm's avatar
tbrehm committed
935
		
936
			$cron_jobs = array('*/5 * * * * '.$cf['program'].' -g '.$cf['config_dir'].' -r '.$cf['config_dir'].'/*.conf > /dev/null');
937
		
938
939
940
941
			// remove existing ispconfig cronjobs, in case the syntax has changed
			foreach($cron_jobs as $key => $val) {
				if(stristr($val,$cf['program'])) unset($cron_jobs[$key]);
			}
942