installer_base.lib.php 30 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;
pedro_morgan's avatar
pedro_morgan committed
36
	private $conf;
37
38
39
	/*
	
	*/
pedro_morgan's avatar
pedro_morgan committed
40
    public function __construct()
41
    {
pedro_morgan's avatar
pedro_morgan committed
42
43
        global $conf; //TODO: maybe $conf  should be passed to constructor
        $this->conf = $conf;
44
    }
45
	
pedro_morgan's avatar
pedro_morgan committed
46
47
48
    //TODO  uh ?
	public function lng($text)
    {
tbrehm's avatar
tbrehm committed
49
		return $text;
50
51
	}
	
pedro_morgan's avatar
pedro_morgan committed
52
53
	public function error($msg)
    {
54
55
56
		die("ERROR: ".$msg."\n");
	}
	
pedro_morgan's avatar
pedro_morgan committed
57
58
	public function simple_query($query, $answers, $default)
    {		
tbrehm's avatar
tbrehm committed
59
60
		$finished = false;
		do {
pedro_morgan's avatar
pedro_morgan committed
61
			$answers_str = implode(',', $answers);
tbrehm's avatar
tbrehm committed
62
			swrite($this->lng($query).' ('.$answers_str.') ['.$default.']: ');
tbrehm's avatar
tbrehm committed
63
64
			$input = sread();
			
pedro_morgan's avatar
pedro_morgan committed
65
			//* Stop the installation
tbrehm's avatar
tbrehm committed
66
			if($input == 'quit') {
pedro_morgan's avatar
pedro_morgan committed
67
				swriteln($this->lng("Installation terminated by user.\n"));
tbrehm's avatar
tbrehm committed
68
				die();
tbrehm's avatar
tbrehm committed
69
70
			}
			
pedro_morgan's avatar
pedro_morgan committed
71
			//* Select the default
tbrehm's avatar
tbrehm committed
72
73
74
75
76
			if($input == '') {
				$answer = $default;
				$finished = true;
			}
			
pedro_morgan's avatar
pedro_morgan committed
77
78
            //* Set answer id valid
			if(in_array($input, $answers)) {
tbrehm's avatar
tbrehm committed
79
80
81
82
83
				$answer = $input;
				$finished = true;
			}
			
		} while ($finished == false);
tbrehm's avatar
tbrehm committed
84
		swriteln();
tbrehm's avatar
tbrehm committed
85
86
87
		return $answer;
	}
	
pedro_morgan's avatar
pedro_morgan committed
88
89
	public function free_query($query,$default)
    {		
tbrehm's avatar
tbrehm committed
90
		swrite($this->lng($query).' ['.$default.']: ');
tbrehm's avatar
tbrehm committed
91
92
		$input = sread();
			
pedro_morgan's avatar
pedro_morgan committed
93
		//* Stop the installation
tbrehm's avatar
tbrehm committed
94
		if($input == 'quit') {
pedro_morgan's avatar
pedro_morgan committed
95
96
            swriteln($this->lng("Installation terminated by user.\n"));
            die();
tbrehm's avatar
tbrehm committed
97
98
		}
			
pedro_morgan's avatar
pedro_morgan committed
99
        $answer =  ($input == '') ? $default : $input;
tbrehm's avatar
tbrehm committed
100
		swriteln();
tbrehm's avatar
tbrehm committed
101
102
103
		return $answer;
	}
	
pedro_morgan's avatar
pedro_morgan committed
104
105
	// TODO: this function is not used atmo I think - pedro
	function request_language(){
106
107
108
109
110
111
112
113
114
115
116
117
118
		
		swriteln(lng('Enter your language'));
		swriteln(lng('de, en'));
		
		/*
		do {
			$lang = sread(2);
		} while (!$this->check_break($lang) or $this-> 
		*/
		
		
	}
	
119
120
121
	/** Create the database for ISPConfig */ 
	public function configure_database()
    {
122
		global $conf;
123
124
125
126
		$cf = $conf['mysql']; // make $conf['mysql'] more accessible
		//** Create the database
		if(!$this->db->query('CREATE DATABASE IF NOT EXISTS '.$cf['database'])) {
			$this->error('Unable to create MySQL database: '.$cf['database'].'.');
127
128
		}
		
129
130
131
132
133
134
		//* Create the ISPConfig database user
        $query = 'GRANT SELECT, INSERT, UPDATE, DELETE ON '.$cf['database'].".* "
                ."TO '".$cf['ispconfig_user']."'@'".$cf['host']."' "
                ."IDENTIFIED BY '".$cf['ispconfig_password']."';";
		if(!$this->db->query($query)) {
			$this->error('Unable to create database user: '.$cf['ispconfig_user']);
135
136
		}
		
137
		//* Reload database privelages
138
139
		$this->db->query('FLUSH PRIVILEGES;');
		
140
141
		//* Set the database name in the DB library
		$this->db->dbName = $cf['database'];
142
		
143
		//* Load the database dump into the database, if database contains no tables
144
145
		$db_tables = $this->db->getTables();
		if(count($db_tables) > 0) {
146
			$this->error('Stopped: Database already contains some tables.');
147
		} else {
148
149
			if($cf['admin_password'] == '') {
				caselog("mysql -h '".$cf['host']."' -u '".$cf['admin_user']."' '".$cf['database']."' < 'sql/ispconfig3.sql' &> /dev/null", 
150
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
151
			} else {
152
				caselog("mysql -h '".$cf['host']."' -u '".$cf['admin_user']."' -p'".$cf['admin_password']."' '".$cf['database']."' < 'sql/ispconfig3.sql' &> /dev/null", 
153
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
154
155
156
157
158
159
160
161
162
163
164
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
		}
	}
	
	/*
		Create postfix configuration files
	*/
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182

    private function process_postfix_config($configfile)
    {
        $config_dir = $this->conf['dist']['postfix']['config_dir'].'/';
        $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');
        $content = str_replace('{mysql_server_ispconfig_user}', $this->conf['mysql']['ispconfig_user'], $content);
        $content = str_replace('{mysql_server_ispconfig_password}', $this->conf['mysql']['ispconfig_password'], $content);
        $content = str_replace('{mysql_server_database}', $this->conf['mysql']['database'], $content);
        $content = str_replace('{mysql_server_ip}', $this->conf['mysql']['ip'], $content);
        $content = str_replace('{server_id}', $this->conf['server_id'], $content);
        wf($full_file_name, $content);
    }

183
	
184
185
	public function configure_postfix($options = '')
    {
186
		global $conf;
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
		$config_dir = $this->conf['dist']['postfix']['config_dir'];
		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');

		//* Changing mode and group of the new created config files.
pedro_morgan's avatar
pedro_morgan committed
217
218
		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 ".$conf["dist"]["postfix"]["group"]." ".$config_dir."/mysql-virtual_*.cf* &> /dev/null", __FILE__, __LINE__,"chgrp on mysql-virtual_*.cf*","chgrp on mysql-virtual_*.cf* failed");
219
220
		
		// Creating virtual mail user and group
221
		$command = "groupadd -g ".$conf["dist"]["postfix"]["vmail_groupid"]." ".$conf["dist"]["postfix"]["vmail_groupname"];
222
223
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
224
		$command = "useradd -g ".$conf["dist"]["postfix"]["vmail_groupname"]." -u ".$conf["dist"]["postfix"]["vmail_userid"]." ".$conf["dist"]["postfix"]["vmail_username"]." -d ".$conf["dist"]["postfix"]["vmail_mailbox_base"]." -m";
225
226
227
228
229
230
231
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);		

		$postconf_commands = array (
			'myhostname = '.$conf["hostname"],
			'mydestination = '.$conf["hostname"].', localhost, localhost.localdomain',
			'mynetworks = 127.0.0.0/8',
			'virtual_alias_domains =',
pedro_morgan's avatar
pedro_morgan committed
232
233
			'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',
234
235
236
237
			'virtual_mailbox_maps = proxy:mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_mailboxes.cf',
			'virtual_mailbox_base = '.$conf["dist"]["postfix"]["vmail_mailbox_base"],
			'virtual_uid_maps = static:'.$conf["dist"]["postfix"]["vmail_userid"],
			'virtual_gid_maps = static:'.$conf["dist"]["postfix"]["vmail_groupid"],
238
239
			'smtpd_sasl_auth_enable = yes',
			'broken_sasl_auth_clients = yes',
pedro_morgan's avatar
pedro_morgan committed
240
			'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
241
			'smtpd_use_tls = yes',
pedro_morgan's avatar
pedro_morgan committed
242
243
244
			'smtpd_tls_cert_file = '.$config_dir.'/smtpd.cert',
			'smtpd_tls_key_file = '.$config_dir.'/smtpd.key',
			'transport_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_transports.cf',
245
246
			'virtual_create_maildirsize = yes',
			'virtual_mailbox_extended = yes',
pedro_morgan's avatar
pedro_morgan committed
247
			'virtual_mailbox_limit_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailbox_limit_maps.cf',
248
249
250
251
			'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
252
253
			'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',
254
255
			'maildrop_destination_concurrency_limit = 1',
			'maildrop_destination_recipient_limit   = 1',
256
			'virtual_transport = maildrop',
pedro_morgan's avatar
pedro_morgan committed
257
258
259
260
			'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'
261
262
		);
		
pedro_morgan's avatar
pedro_morgan committed
263
264
265
266
267
		//* 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');
268
269
		
		
pedro_morgan's avatar
pedro_morgan committed
270
271
		//* Make a backup copy of the main.cf file
		copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
272
		
pedro_morgan's avatar
pedro_morgan committed
273
		//* Executing the postconf commands
274
275
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
pedro_morgan's avatar
pedro_morgan committed
276
			caselog($command." &> /dev/null", __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
277
278
279
280
281
282
283
284
285
		}
		
		// TODO: Change the master.cf file
		/*
		Add:
maildrop  unix  -       n       n       -       -       pipe
  flags=R user=vmail argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}
		
		*/
tbrehm's avatar
tbrehm committed
286
		if(!stristr($options,'dont-create-certs')) {
pedro_morgan's avatar
pedro_morgan committed
287
288
289
290
			//* Create the SSL certificate
			$command = 'cd '.$config_dir.'; '
                      .'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
291
			exec($command);
292
		
pedro_morgan's avatar
pedro_morgan committed
293
294
			$command = 'chmod o= '.$config_dir.'/smtpd.key';
			caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
tbrehm's avatar
tbrehm committed
295
		}
296
297
298
299
300
301
		
		/*
		We have to change the permissions of the courier authdaemon directory
		to make it accessible for maildrop.
		*/
		
pedro_morgan's avatar
pedro_morgan committed
302
303
		$command = 'chmod 755  /var/run/courier/authdaemon/';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
304
		
pedro_morgan's avatar
pedro_morgan committed
305
306
307
308
309
310
311
312
		//* 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';
313
		$content = rf($configfile);
pedro_morgan's avatar
pedro_morgan committed
314
		$content = str_replace('  flags=DRhu user=vmail argv=/usr/bin/maildrop -d ${recipient}', '  flags=R user='.$conf["dist"]["postfix"]["vmail_username"].' argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}', $content);
315
316
		wf($configfile,$content);
		
pedro_morgan's avatar
pedro_morgan committed
317
		//* Writing the Maildrop mailfilter file
318
		$configfile = 'mailfilter';
319
		if(is_file($conf["dist"]["postfix"]["vmail_mailbox_base"].'/.'.$configfile)) copy($conf["dist"]["postfix"]["vmail_mailbox_base"].'/.'.$configfile,$conf["dist"]["postfix"]["vmail_mailbox_base"].'/.'.$configfile.'~');
320
		$content = rf("tpl/".$configfile.".master");
321
322
		$content = str_replace('{dist_postfix_vmail_mailbox_base}',$conf["dist"]["postfix"]["vmail_mailbox_base"],$content);
		wf($conf["dist"]["postfix"]["vmail_mailbox_base"].'/.'.$configfile,$content);
323
324
		
		// Create the directory for the custom mailfilters
325
		$command = "mkdir ".$conf["dist"]["postfix"]["vmail_mailbox_base"]."/mailfilters";
326
327
328
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		// Chmod and chown the .mailfilter file
329
		$command = "chown -R ".$conf["dist"]["postfix"]["vmail_username"].":".$conf["dist"]["postfix"]["vmail_groupname"]." ".$conf["dist"]["postfix"]["vmail_mailbox_base"]."/.mailfilter";
330
331
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
332
		$command = "chmod -R 600 ".$conf["dist"]["postfix"]["vmail_mailbox_base"]."/.mailfilter";
333
334
335
336
337
338
339
340
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		
	}
	
	function configure_saslauthd() {
		global $conf;
		
341
	
342
		$configfile = 'sasl_smtpd.conf';
343
344
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/sasl/smtpd.conf')) copy($conf["dist"]["postfix"]["config_dir"].'/sasl/smtpd.conf',$conf["dist"]["postfix"]["config_dir"].'/sasl/smtpd.conf~');
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/sasl/smtpd.conf~')) exec('chmod 400 '.$conf["dist"]["postfix"]["config_dir"].'/sasl/smtpd.conf~');
345
		$content = rf("tpl/".$configfile.".master");
346
347
348
349
350
		$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);
		wf($conf["dist"]["postfix"]["config_dir"].'/sasl/smtpd.conf',$content);
351
352
353
354
		
		// TODO: Chmod and chown on the config file
		
		
355
356
		
		// Create the spool directory
357
		exec('mkdir -p /var/spool/postfix/var/run/saslauthd');
358
359
		
		// Edit the file /etc/default/saslauthd
360
		$configfile = $conf['dist']["saslauthd"]["config"];
361
		if(is_file($configfile)) copy($configfile,$configfile.'~');
362
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
363
364
365
366
367
		$content = rf($configfile);
		$content = str_replace('START=no','START=yes',$content);
		$content = str_replace('OPTIONS="-c"','OPTIONS="-m /var/spool/postfix/var/run/saslauthd -r"',$content);
		wf($configfile,$content);
		
368
369
		// Edit the file /etc/init.d/saslauthd
		$configfile = $conf["dist"]["init_scripts"].'/'.$conf["dist"]["saslauthd"]["init_script"];
370
371
372
373
374
		$content = rf($configfile);
		$content = str_replace('PIDFILE=$RUN_DIR/saslauthd.pid','PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"',$content);
		wf($configfile,$content);
		
		
375
376
377
378
379
380
381
	}
	
	function configure_pam() {
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'pamd_smtp';
382
383
		if(is_file($conf['dist']['pam'].'/smtp')) copy($conf['dist']['pam'].'/smtp',$conf['dist']['pam'].'/smtp~');
		if(is_file($conf['dist']['pam'].'/smtp~')) exec('chmod 400 '.$conf['dist']['pam'].'/smtp~');
384
		$content = rf("tpl/".$configfile.".master");
385
386
387
388
389
390
391
		$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);
		wf($conf['dist']['pam'].'/smtp',$content);
		exec('chmod 660 '.$conf['dist']['pam'].'/smtp');
		exec('chown daemon:daemon '.$conf['dist']['pam'].'/smtp');
392
393
394
395
396
397
398
399
	
	}
	
	function configure_courier() {
		global $conf;
		
		// authmysqlrc
		$configfile = 'authmysqlrc';
400
401
		if(is_file($conf["dist"]["courier"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["courier"]["config_dir"].'/'.$configfile,$conf["dist"]["courier"]["config_dir"].'/'.$configfile.'~');
		exec('chmod 400 '.$conf["dist"]["courier"]["config_dir"].'/'.$configfile.'~');
402
		$content = rf("tpl/".$configfile.".master");
403
404
405
406
407
		$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);
		wf($conf["dist"]["courier"]["config_dir"].'/'.$configfile,$content);
408
		
409
410
		exec('chmod 660 '.$conf["dist"]["courier"]["config_dir"].'/'.$configfile);
		exec('chown daemon:daemon '.$conf["dist"]["courier"]["config_dir"].'/'.$configfile);
411
412
		
		//authdaemonrc
413
		$configfile = $conf["dist"]["courier"]["config_dir"].'/authdaemonrc';
414
		if(is_file($configfile)) copy($configfile,$configfile.'~');
415
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
416
417
418
419
420
		$content = rf($configfile);
		$content = str_replace('authmodulelist="authpam"','authmodulelist="authmysql"',$content);
		wf($configfile,$content);
		
		
421
422
423
424
425
426
427
	}
	
	function configure_amavis() {
		global $conf;
		
		// amavisd user config file
		$configfile = 'amavisd_user_config';
428
429
		if(is_file($conf["dist"]["amavis"]["config_dir"].'/conf.d/50-user')) copy($conf["dist"]["amavis"]["config_dir"].'/conf.d/50-user',$conf["dist"]["courier"]["config_dir"].'/50-user~');
		if(is_file($conf["dist"]["amavis"]["config_dir"].'/conf.d/50-user~')) exec('chmod 400 '.$conf["dist"]["amavis"]["config_dir"].'/conf.d/50-user~');
430
		$content = rf("tpl/".$configfile.".master");
431
432
433
434
435
436
		$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_port}',$conf["mysql"]["port"],$content);
		$content = str_replace('{mysql_server_ip}',$conf["mysql"]["ip"],$content);
		wf($conf["dist"]["amavis"]["config_dir"].'/conf.d/50-user',$content);
437
438
439
440
441
442
443
444
445
446
447
		
		// 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
448
		copy($conf["dist"]["postfix"]["config_dir"].'/main.cf',$conf["dist"]["postfix"]["config_dir"].'/main.cf~2');
449
450
451
452
453
454
455
456
		
		// Executing the postconf commands
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
			caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		}
		
		// Append the configuration for amavisd to the master.cf file
457
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/master.cf')) copy($conf["dist"]["postfix"]["config_dir"].'/master.cf',$conf["dist"]["postfix"]["config_dir"].'/master.cf~');
458
459
460
		$content = rf("tpl/master_cf_amavis.master");
		// Only add the content if we had not addded it before
		if(!stristr("127.0.0.1:10025 inet n - - - - smtpd",$content)) {
461
			af($conf["dist"]["postfix"]["config_dir"].'/master.cf',$content);
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
		}
		
		// Add the clamav user to the amavis group
		exec('adduser clamav amavis');
		
		
	}
	
	function configure_spamassassin() {
		global $conf;
		
		// Enable spamasasssin in debian and ubunti
		$configfile = '/etc/default/spamassassin';
		if(is_file($configfile)) copy($configfile,$configfile.'~');
		$content = rf($configfile);
		$content = str_replace('ENABLED=0','ENABLED=1',$content);
		wf($configfile,$content);
	}
	
481
482
483
	function configure_getmail() {
		global $conf;
		
484
		$command = 'useradd -d '.$conf["dist"]["getmail"]["config_dir"].' getmail';
tbrehm's avatar
tbrehm committed
485
486
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
487
		$command = 'chown -R getmail '.$conf["dist"]["getmail"]["config_dir"];
488
489
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
490
		$command = 'chmod -R 700 '.$conf["dist"]["getmail"]["config_dir"];
491
492
493
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
	}
	
494
	
tbrehm's avatar
tbrehm committed
495
496
497
498
	function configure_pureftpd() {
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
499
500
501
502
503
504
505
506
		$configfile = 'db/mysql.conf';
		if(is_file($conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile,$conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile.'~');
		if(is_file($conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile.'~');
		$content = rf("tpl/pureftpd_mysql.conf.master");
		$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);
tbrehm's avatar
tbrehm committed
507
		$content = str_replace('{server_id}',$conf["server_id"],$content);
508
509
510
		wf($conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["dist"]["pureftpd"]["config_dir"].'/'.$configfile);
tbrehm's avatar
tbrehm committed
511
		// enable chrooting
512
513
		exec('mkdir -p '.$conf["dist"]["pureftpd"]["config_dir"].'/conf/ChrootEveryone');
		exec('echo "yes" > '.$conf["dist"]["pureftpd"]["config_dir"].'/conf/ChrootEveryone');
tbrehm's avatar
tbrehm committed
514
515
516
	
	}
	
517
518
519
520
521
	function configure_mydns() {
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
522
523
		if(is_file($conf["dist"]["mydns"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["mydns"]["config_dir"].'/'.$configfile,$conf["dist"]["mydns"]["config_dir"].'/'.$configfile.'~');
		if(is_file($conf["dist"]["mydns"]["config_dir"].'/'.$configfile.'~')) exec('chmod 400 '.$conf["dist"]["mydns"]["config_dir"].'/'.$configfile.'~');
524
		$content = rf("tpl/".$configfile.".master");
525
526
527
528
		$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);
529
		$content = str_replace('{server_id}',$conf["server_id"],$content);
530
531
532
		wf($conf["dist"]["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["dist"]["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["dist"]["mydns"]["config_dir"].'/'.$configfile);
533
534
535
	
	}
	
536
537
538
539
540
541
542
543
	function configure_apache() {
		global $conf;
		
		// Create the logging directory for the vhost logfiles
		exec("mkdir -p /var/log/ispconfig/httpd");
		
	}
	
tbrehm's avatar
tbrehm committed
544
	
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
	function install_ispconfig() {
		global $conf;
		
		// Create the ISPConfig installation directory
		$command = "mkdir ".$conf["ispconfig_install_dir"];
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		// Create a ISPConfig user and group
		$command = "groupadd ispconfig";
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		$command = "useradd -g ispconfig -d ".$conf["ispconfig_install_dir"]." ispconfig";
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		// copy the ISPConfig interface part
		$command = "cp -rf ../interface ".$conf["ispconfig_install_dir"];
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		// copy the ISPConfig server part
		$command = "cp -rf ../server ".$conf["ispconfig_install_dir"];
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		// Create a symlink, so ISPConfig is accessible via web
		$command = "ln -s ".$conf["ispconfig_install_dir"]."/interface/web/ /var/www/ispconfig";
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
571
		// Create the config file for ISPConfig interface
572
573
574
		$configfile = 'config.inc.php';
		if(is_file($conf["ispconfig_install_dir"].'/interface/lib/'.$configfile)) copy($conf["ispconfig_install_dir"].'/interface/lib/'.$configfile,$conf["ispconfig_install_dir"].'/interface/lib/'.$configfile.'~');
		$content = rf("tpl/".$configfile.".master");
575
576
577
578
		$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);
579
580
		wf($conf["ispconfig_install_dir"].'/interface/lib/'.$configfile,$content);
		
581
582
583
584
		// Create the config file for ISPConfig server
		$configfile = 'config.inc.php';
		if(is_file($conf["ispconfig_install_dir"].'/server/lib/'.$configfile)) copy($conf["ispconfig_install_dir"].'/server/lib/'.$configfile,$conf["ispconfig_install_dir"].'/interface/lib/'.$configfile.'~');
		$content = rf("tpl/".$configfile.".master");
585
586
587
588
		$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
589
		$content = str_replace('{server_id}',$conf["server_id"],$content);
590
591
592
		wf($conf["ispconfig_install_dir"].'/server/lib/'.$configfile,$content);
		
		
593
594
595
596
597
598
599
600
		// Chmod the files
		$command = "chmod -R 750 ".$conf["ispconfig_install_dir"];
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);

		// chown the files to the ispconfig user and group
		$command = "chown -R ispconfig:ispconfig ".$conf["ispconfig_install_dir"];
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
601
602
603
604
		// make sure that the server config file (not the interface one) is only readable by the root user
		exec('chmod 600 '.$conf["ispconfig_install_dir"].'/server/lib/'.$configfile);
		exec('chown root:root '.$conf["ispconfig_install_dir"].'/server/lib/'.$configfile);
		
605
606
607
608
609
610
611
		// 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!
		
		$command = "adduser www-data ispconfig";
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
612
613
614
		// Make the shell scripts executable
		$command = "chmod +x ".$conf["ispconfig_install_dir"]."/server/scripts/*.sh";
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
615
		
tbrehm's avatar
tbrehm committed
616
		// Copy the ISPConfig vhost for the controlpanel
617
		copy('tpl/apache_ispconfig.vhost.master',$conf["dist"]["apache"]["vhost_conf_dir"].'/ispconfig.vhost');
tbrehm's avatar
tbrehm committed
618
		// and create the symlink
619
620
		if(!is_link($conf["dist"]["apache"]["vhost_conf_enabled_dir"].'/ispconfig.vhost')) {
			exec('ln -s '.$conf["dist"]["apache"]["vhost_conf_dir"].'/ispconfig.vhost '.$conf["dist"]["apache"]["vhost_conf_enabled_dir"].'/ispconfig.vhost');
tbrehm's avatar
tbrehm committed
621
		}
tbrehm's avatar
tbrehm committed
622
		
623
624
	}
	
tbrehm's avatar
tbrehm committed
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
	function install_crontab() {
		global $conf;
		
		// Root Crontab
		exec("crontab -u root -l > crontab.txt");
		$existing_root_cron_jobs = file('crontab.txt');
		
		$root_cron_jobs = array('* * * * * /usr/bin/php -q /usr/local/ispconfig/server/server.php &> /dev/null');
		foreach($root_cron_jobs as $cron_job) {
			if(!in_array($cron_job."\n",$existing_root_cron_jobs)) {
				$existing_root_cron_jobs[] = $cron_job."\n";
			}
		}
		file_put_contents('crontab.txt',$existing_root_cron_jobs);
		exec("crontab -u root crontab.txt &> /dev/null");
		unlink('crontab.txt');
		
		// Getmail crontab
643
		exec("crontab -u getmail -l > crontab.txt");
tbrehm's avatar
tbrehm committed
644
645
		$existing_cron_jobs = file('crontab.txt');
		
646
		$cron_jobs = array('*/5 * * * * '.$conf["dist"]["getmail"]["program"].' -g '.$conf["dist"]["getmail"]["config_dir"].' -r '.$conf["dist"]["getmail"]["config_dir"].'/*.conf &> /dev/null');
tbrehm's avatar
tbrehm committed
647
648
649
650
651
652
		foreach($cron_jobs as $cron_job) {
			if(!in_array($cron_job."\n",$existing_cron_jobs)) {
				$existing_cron_jobs[] = $cron_job."\n";
			}
		}
		file_put_contents('crontab.txt',$existing_cron_jobs);
653
		exec("crontab -u getmail crontab.txt &> /dev/null");
tbrehm's avatar
tbrehm committed
654
655
656
657
		unlink('crontab.txt');
		
	}
	
658
659
660
661
	
	
}

662
?>