installer_base.lib.php 35.4 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
165
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
		}
	}
	
	/*
		Create postfix configuration files
	*/
	
166
	function configure_postfix($options = '') {
167
168
		global $conf;
		
169
		if(!is_dir($conf["dist"]["postfix"]["config_dir"])) $this->error("The postfix configuration directory ".$conf["dist"]["postfix"]["config_dir"]." does not exist.");
170
171
172
		
		// mysql-virtual_domains.cf
		$configfile = 'mysql-virtual_domains.cf';
173
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
174
		$content = rf("tpl/".$configfile.".master");
175
176
177
178
		$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
179
		$content = str_replace('{server_id}',$conf["server_id"],$content);
180
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
181
182
183
		
		// mysql-virtual_forwardings.cf
		$configfile = 'mysql-virtual_forwardings.cf';
184
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
185
		$content = rf("tpl/".$configfile.".master");
186
187
188
189
		$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
190
		$content = str_replace('{server_id}',$conf["server_id"],$content);
191
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
192
193
194
		
		// mysql-virtual_mailboxes.cf
		$configfile = 'mysql-virtual_mailboxes.cf';
195
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
196
		$content = rf("tpl/".$configfile.".master");
197
198
199
200
		$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
201
		$content = str_replace('{server_id}',$conf["server_id"],$content);
202
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
203
204
205
		
		// mysql-virtual_email2email.cf
		$configfile = 'mysql-virtual_email2email.cf';
206
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
207
		$content = rf("tpl/".$configfile.".master");
208
209
210
211
		$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
212
		$content = str_replace('{server_id}',$conf["server_id"],$content);
213
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
214
215
216
		
		// mysql-virtual_transports.cf
		$configfile = 'mysql-virtual_transports.cf';
217
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
218
		$content = rf("tpl/".$configfile.".master");
219
220
221
222
		$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
223
		$content = str_replace('{server_id}',$conf["server_id"],$content);
224
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
225
226
227
		
		// mysql-virtual_recipient.cf
		$configfile = 'mysql-virtual_recipient.cf';
228
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
229
		$content = rf("tpl/".$configfile.".master");
230
231
232
233
		$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
234
		$content = str_replace('{server_id}',$conf["server_id"],$content);
235
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
236
237
238
		
		// mysql-virtual_sender.cf
		$configfile = 'mysql-virtual_sender.cf';
239
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
240
		$content = rf("tpl/".$configfile.".master");
241
242
243
244
		$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
245
		$content = str_replace('{server_id}',$conf["server_id"],$content);
246
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
247
248
249
		
		// mysql-virtual_client.cf
		$configfile = 'mysql-virtual_client.cf';
250
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/'.$configfile)) copy($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$conf["dist"]["postfix"]["config_dir"].'/'.$configfile.'~');
251
		$content = rf("tpl/".$configfile.".master");
252
253
254
255
		$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
256
		$content = str_replace('{server_id}',$conf["server_id"],$content);
257
		wf($conf["dist"]["postfix"]["config_dir"].'/'.$configfile,$content);
258
259
		
		// Changing mode and group of the new created config files.
260
261
		caselog("chmod o= ".$conf["dist"]["postfix"]["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"]["groupname"]." ".$conf["dist"]["postfix"]["config_dir"]."/mysql-virtual_*.cf* &> /dev/null", __FILE__, __LINE__,"chgrp on mysql-virtual_*.cf*","chgrp on mysql-virtual_*.cf* failed");
262
263
		
		// Creating virtual mail user and group
264
		$command = "groupadd -g ".$conf["dist"]["postfix"]["vmail_groupid"]." ".$conf["dist"]["postfix"]["vmail_groupname"];
265
266
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
267
		$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";
268
269
270
271
272
273
274
		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 =',
275
276
277
278
279
280
			'virtual_alias_maps = proxy:mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_forwardings.cf, mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_email2email.cf',
			'virtual_mailbox_domains = proxy:mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_domains.cf',
			'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"],
281
282
			'smtpd_sasl_auth_enable = yes',
			'broken_sasl_auth_clients = yes',
283
			'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_recipient.cf, reject_unauth_destination',
284
			'smtpd_use_tls = yes',
285
286
287
			'smtpd_tls_cert_file = '.$conf["dist"]["postfix"]["config_dir"].'/smtpd.cert',
			'smtpd_tls_key_file = '.$conf["dist"]["postfix"]["config_dir"].'/smtpd.key',
			'transport_maps = proxy:mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_transports.cf',
288
289
			'virtual_create_maildirsize = yes',
			'virtual_mailbox_extended = yes',
290
			'virtual_mailbox_limit_maps = proxy:mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_mailbox_limit_maps.cf',
291
292
293
294
			'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',
295
296
			'smtpd_sender_restrictions = check_sender_access mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_sender.cf',
			'smtpd_client_restrictions = check_client_access mysql:'.$conf["dist"]["postfix"]["config_dir"].'/mysql-virtual_client.cf',
297
298
			'maildrop_destination_concurrency_limit = 1',
			'maildrop_destination_recipient_limit   = 1',
299
			'virtual_transport = maildrop',
300
301
302
303
			'header_checks = regexp:'.$conf["dist"]["postfix"]["config_dir"].'/header_checks',
			'mime_header_checks = regexp:'.$conf["dist"]["postfix"]["config_dir"].'/mime_header_checks',
			'nested_header_checks = regexp:'.$conf["dist"]["postfix"]["config_dir"].'/nested_header_checks',
			'body_checks = regexp:'.$conf["dist"]["postfix"]["config_dir"].'/body_checks'
304
305
		);
		
306
		// Create the header ynd body check files
307
308
309
310
		touch($conf["dist"]["postfix"]["config_dir"].'/header_checks');
		touch($conf["dist"]["postfix"]["config_dir"].'/mime_header_checks');
		touch($conf["dist"]["postfix"]["config_dir"].'/nested_header_checks');
		touch($conf["dist"]["postfix"]["config_dir"].'/body_checks');
311
312
		
		
313
		// Make a backup copy of the main.cf file
314
		copy($conf["dist"]["postfix"]["config_dir"].'/main.cf',$conf["dist"]["postfix"]["config_dir"].'/main.cf~');
315
316
317
318
319
320
321
322
323
324
325
326
327
328
		
		// 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);
		}
		
		// 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
329
		if(!stristr($options,'dont-create-certs')) {
tbrehm's avatar
tbrehm committed
330
			// Create the SSL certificate
331
			$command = "cd ".$conf["dist"]["postfix"]["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
332
			exec($command);
333
		
334
			$command = "chmod o= ".$conf["dist"]["postfix"]["config_dir"]."/smtpd.key";
tbrehm's avatar
tbrehm committed
335
336
			caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		}
337
338
339
340
341
342
343
344
345
		
		/*
		We have to change the permissions of the courier authdaemon directory
		to make it accessible for maildrop.
		*/
		
		$command = "chmod 755  /var/run/courier/authdaemon/";
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
346
		// Changing maildrop lines in posfix master.cf
347
348
349
		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~');
		if(is_file($conf["dist"]["postfix"]["config_dir"].'/master.cf~')) exec('chmod 400 '.$conf["dist"]["postfix"]["config_dir"].'/master.cf~');
		$configfile = $conf["dist"]["postfix"]["config_dir"].'/master.cf';
350
		$content = rf($configfile);
351
		$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);
352
353
		wf($configfile,$content);
		
354
355
		// Writing the Maildrop mailfilter file
		$configfile = 'mailfilter';
356
		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.'~');
357
		$content = rf("tpl/".$configfile.".master");
358
359
		$content = str_replace('{dist_postfix_vmail_mailbox_base}',$conf["dist"]["postfix"]["vmail_mailbox_base"],$content);
		wf($conf["dist"]["postfix"]["vmail_mailbox_base"].'/.'.$configfile,$content);
360
361
		
		// Create the directory for the custom mailfilters
362
		$command = "mkdir ".$conf["dist"]["postfix"]["vmail_mailbox_base"]."/mailfilters";
363
364
365
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		// Chmod and chown the .mailfilter file
366
		$command = "chown -R ".$conf["dist"]["postfix"]["vmail_username"].":".$conf["dist"]["postfix"]["vmail_groupname"]." ".$conf["dist"]["postfix"]["vmail_mailbox_base"]."/.mailfilter";
367
368
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
369
		$command = "chmod -R 600 ".$conf["dist"]["postfix"]["vmail_mailbox_base"]."/.mailfilter";
370
371
372
373
374
375
376
377
378
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
		
		
	}
	
	function configure_saslauthd() {
		global $conf;
		
379
	
380
		$configfile = 'sasl_smtpd.conf';
381
382
		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~');
383
		$content = rf("tpl/".$configfile.".master");
384
385
386
387
388
		$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);
389
390
391
392
		
		// TODO: Chmod and chown on the config file
		
		
393
394
		
		// Create the spool directory
395
		exec('mkdir -p /var/spool/postfix/var/run/saslauthd');
396
397
		
		// Edit the file /etc/default/saslauthd
398
		$configfile = $conf['dist']["saslauthd"]["config"];
399
		if(is_file($configfile)) copy($configfile,$configfile.'~');
400
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
401
402
403
404
405
		$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);
		
406
407
		// Edit the file /etc/init.d/saslauthd
		$configfile = $conf["dist"]["init_scripts"].'/'.$conf["dist"]["saslauthd"]["init_script"];
408
409
410
411
412
		$content = rf($configfile);
		$content = str_replace('PIDFILE=$RUN_DIR/saslauthd.pid','PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"',$content);
		wf($configfile,$content);
		
		
413
414
415
416
417
418
419
	}
	
	function configure_pam() {
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'pamd_smtp';
420
421
		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~');
422
		$content = rf("tpl/".$configfile.".master");
423
424
425
426
427
428
429
		$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');
430
431
432
433
434
435
436
437
	
	}
	
	function configure_courier() {
		global $conf;
		
		// authmysqlrc
		$configfile = 'authmysqlrc';
438
439
		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.'~');
440
		$content = rf("tpl/".$configfile.".master");
441
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_host}',$conf["mysql"]["host"],$content);
		wf($conf["dist"]["courier"]["config_dir"].'/'.$configfile,$content);
446
		
447
448
		exec('chmod 660 '.$conf["dist"]["courier"]["config_dir"].'/'.$configfile);
		exec('chown daemon:daemon '.$conf["dist"]["courier"]["config_dir"].'/'.$configfile);
449
450
		
		//authdaemonrc
451
		$configfile = $conf["dist"]["courier"]["config_dir"].'/authdaemonrc';
452
		if(is_file($configfile)) copy($configfile,$configfile.'~');
453
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
454
455
456
457
458
		$content = rf($configfile);
		$content = str_replace('authmodulelist="authpam"','authmodulelist="authmysql"',$content);
		wf($configfile,$content);
		
		
459
460
461
462
463
464
465
	}
	
	function configure_amavis() {
		global $conf;
		
		// amavisd user config file
		$configfile = 'amavisd_user_config';
466
467
		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~');
468
		$content = rf("tpl/".$configfile.".master");
469
470
471
472
473
474
		$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);
475
476
477
478
479
480
481
482
483
484
485
		
		// 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
486
		copy($conf["dist"]["postfix"]["config_dir"].'/main.cf',$conf["dist"]["postfix"]["config_dir"].'/main.cf~2');
487
488
489
490
491
492
493
494
		
		// 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
495
		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~');
496
497
498
		$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)) {
499
			af($conf["dist"]["postfix"]["config_dir"].'/master.cf',$content);
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
		}
		
		// 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);
	}
	
519
520
521
	function configure_getmail() {
		global $conf;
		
522
		$command = 'useradd -d '.$conf["dist"]["getmail"]["config_dir"].' getmail';
tbrehm's avatar
tbrehm committed
523
524
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
525
		$command = 'chown -R getmail '.$conf["dist"]["getmail"]["config_dir"];
526
527
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
		
528
		$command = 'chmod -R 700 '.$conf["dist"]["getmail"]["config_dir"];
529
530
531
		caselog($command." &> /dev/null", __FILE__, __LINE__,"EXECUTED: ".$command,"Failed to execute the command ".$command);
	}
	
532
	
tbrehm's avatar
tbrehm committed
533
534
535
536
	function configure_pureftpd() {
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
537
538
539
540
541
542
543
544
		$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
545
		$content = str_replace('{server_id}',$conf["server_id"],$content);
546
547
548
		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
549
		// enable chrooting
550
551
		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
552
553
554
	
	}
	
555
556
557
558
559
	function configure_mydns() {
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
560
561
		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.'~');
562
		$content = rf("tpl/".$configfile.".master");
563
564
565
566
		$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);
567
		$content = str_replace('{server_id}',$conf["server_id"],$content);
568
569
570
		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);
571
572
573
	
	}
	
574
575
576
577
578
579
580
581
	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
582
	
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
	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);
		
609
		// Create the config file for ISPConfig interface
610
611
612
		$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");
613
614
615
616
		$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);
617
618
		wf($conf["ispconfig_install_dir"].'/interface/lib/'.$configfile,$content);
		
619
620
621
622
		// 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");
623
624
625
626
		$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
627
		$content = str_replace('{server_id}',$conf["server_id"],$content);
628
629
630
		wf($conf["ispconfig_install_dir"].'/server/lib/'.$configfile,$content);
		
		
631
632
633
634
635
636
637
638
		// 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);
		
639
640
641
642
		// 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);
		
643
644
645
646
647
648
649
		// 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);
		
650
651
652
		// 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);
653
		
tbrehm's avatar
tbrehm committed
654
		// Copy the ISPConfig vhost for the controlpanel
655
		copy('tpl/apache_ispconfig.vhost.master',$conf["dist"]["apache"]["vhost_conf_dir"].'/ispconfig.vhost');
tbrehm's avatar
tbrehm committed
656
		// and create the symlink
657
658
		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
659
		}
tbrehm's avatar
tbrehm committed
660
		
661
662
	}
	
tbrehm's avatar
tbrehm committed
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
	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
681
		exec("crontab -u getmail -l > crontab.txt");
tbrehm's avatar
tbrehm committed
682
683
		$existing_cron_jobs = file('crontab.txt');
		
684
		$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
685
686
687
688
689
690
		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);
691
		exec("crontab -u getmail crontab.txt &> /dev/null");
tbrehm's avatar
tbrehm committed
692
693
694
695
		unlink('crontab.txt');
		
	}
	
696
697
698
699
	
	
}

700
?>