installer_base.lib.php 29 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;
37
38


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

161
    //** writes postfix configuration files
162
163
    private function process_postfix_config($configfile)
    {
oliver's avatar
oliver committed
164
        $config_dir = $this->conf['postfix']['config_dir'].'/';
165
166
167
168
169
170
171
172
173
174
175
176
177
178
        $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);
    }

179

180
181
	public function configure_postfix($options = '')
    {
oliver's avatar
oliver committed
182
        $cf = $this->conf['postfix'];
183
184
		$config_dir = $cf['config_dir'];
        
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
		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.
214
215
216
217
218
219
220
221
222
223
224
		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");		
225
226

		$postconf_commands = array (
227
228
			'myhostname = '.$this->conf['hostname'],
			'mydestination = '.$this->conf['hostname'].', localhost, localhost.localdomain',
229
230
			'mynetworks = 127.0.0.0/8',
			'virtual_alias_domains =',
pedro_morgan's avatar
pedro_morgan committed
231
232
			'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',
233
234
235
236
			'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'],
237
238
			'smtpd_sasl_auth_enable = yes',
			'broken_sasl_auth_clients = yes',
pedro_morgan's avatar
pedro_morgan committed
239
			'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
240
			'smtpd_use_tls = yes',
pedro_morgan's avatar
pedro_morgan committed
241
242
243
			'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',
244
245
			'virtual_create_maildirsize = yes',
			'virtual_mailbox_extended = yes',
pedro_morgan's avatar
pedro_morgan committed
246
			'virtual_mailbox_limit_maps = proxy:mysql:'.$config_dir.'/mysql-virtual_mailbox_limit_maps.cf',
247
248
249
250
			'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
251
252
			'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',
253
254
			'maildrop_destination_concurrency_limit = 1',
			'maildrop_destination_recipient_limit   = 1',
255
			'virtual_transport = maildrop',
pedro_morgan's avatar
pedro_morgan committed
256
257
258
259
			'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'
260
261
		);
		
pedro_morgan's avatar
pedro_morgan committed
262
263
264
265
266
		//* 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');
267
268
		
		
pedro_morgan's avatar
pedro_morgan committed
269
270
		//* Make a backup copy of the main.cf file
		copy($config_dir.'/main.cf', $config_dir.'/main.cf~');
271
		
pedro_morgan's avatar
pedro_morgan committed
272
		//* Executing the postconf commands
273
274
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
pedro_morgan's avatar
pedro_morgan committed
275
			caselog($command." &> /dev/null", __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
276
277
278
279
280
		}
		
		// TODO: Change the master.cf file
		/*
		Add:
281
282
        maildrop  unix  -       n       n       -       -       pipe
        flags=R user=vmail argv=/usr/bin/maildrop -d ${recipient} ${extension} ${recipient} ${user} ${nexthop} ${sender}
283
		*/
tbrehm's avatar
tbrehm committed
284
		if(!stristr($options,'dont-create-certs')) {
pedro_morgan's avatar
pedro_morgan committed
285
286
287
288
			//* 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
289
			exec($command);
290
		
pedro_morgan's avatar
pedro_morgan committed
291
292
			$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
293
		}
294
		
295
		//** We have to change the permissions of the courier authdaemon directory to make it accessible for maildrop.
pedro_morgan's avatar
pedro_morgan committed
296
297
		$command = 'chmod 755  /var/run/courier/authdaemon/';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, 'EXECUTED: '.$command, 'Failed to execute the command '.$command);
298
		
pedro_morgan's avatar
pedro_morgan committed
299
300
301
302
303
304
305
306
		//* 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';
307
		$content = rf($configfile);
308
309
310
311
		$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);
312
		
pedro_morgan's avatar
pedro_morgan committed
313
		//* Writing the Maildrop mailfilter file
314
		$configfile = 'mailfilter';
315
316
317
318
319
320
		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);
321
		
322
323
324
		//* Create the directory for the custom mailfilters
		$command = 'mkdir '.$cf['vmail_mailbox_base'].'/mailfilters';
		caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
325
		
326
327
328
		//* 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");
329
		
330
331
		$command = 'chmod -R 600 '.$cf['vmail_mailbox_base'].'/.mailfilter';
		caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
332
333
334
335
336
337
		
	}
	
	function configure_saslauthd() {
		global $conf;
		
338
	
339
		$configfile = 'sasl_smtpd.conf';
oliver's avatar
oliver committed
340
341
		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~');
342
		$content = rf("tpl/".$configfile.".master");
343
344
345
346
		$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);
oliver's avatar
oliver committed
347
		wf($conf["postfix"]["config_dir"].'/sasl/smtpd.conf',$content);
348
349
350
351
		
		// TODO: Chmod and chown on the config file
		
		
352
353
		
		// Create the spool directory
354
		exec('mkdir -p /var/spool/postfix/var/run/saslauthd');
355
356
		
		// Edit the file /etc/default/saslauthd
oliver's avatar
oliver committed
357
		$configfile = $conf["saslauthd"]["config"];
358
		if(is_file($configfile)) copy($configfile,$configfile.'~');
359
		if(is_file($configfile.'~')) exec('chmod 400 '.$configfile.'~');
360
361
362
363
364
		$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);
		
365
		// Edit the file /etc/init.d/saslauthd
oliver's avatar
oliver committed
366
		$configfile = $conf["init_scripts"].'/'.$conf["saslauthd"]["init_script"];
367
368
369
370
371
		$content = rf($configfile);
		$content = str_replace('PIDFILE=$RUN_DIR/saslauthd.pid','PIDFILE="/var/spool/postfix/var/run/${NAME}/saslauthd.pid"',$content);
		wf($configfile,$content);
		
		
372
373
	}
	
374
375
	public function configure_pam()
    {
oliver's avatar
oliver committed
376
		$pam = $this->conf['pam'];
377
		//* configure pam for SMTP authentication agains the ispconfig database
378
		$configfile = 'pamd_smtp';
379
380
381
382
383
384
385
386
387
388
389
		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");
		$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);
		wf("$pam/smtp", $content);
		exec("chmod 660 $pam/smtp");
		exec("chown daemon:daemon $pam/smtp");
390
391
392
	
	}
	
393
394
	public function configure_courier()
    {
oliver's avatar
oliver committed
395
		$config_dir = $this->conf['courier']['config_dir'];
396
		//* authmysqlrc
397
		$configfile = 'authmysqlrc';
398
399
400
401
402
403
404
405
406
407
		if(is_file("$config_dir/$configfile")){
            copy("$config_dir/$configfile", "$config_dir/$configfile~");
        }
		exec("chmod 400 $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_host}',$this->conf['mysql']['host'],$content);
		wf("$config_dir/$configfile", $content);
408
		
409
410
		exec("chmod 660 $config_dir/$configfile");
		exec("chown daemon:daemon $config_dir/$configfile");
411
		
412
		//* authdaemonrc
oliver's avatar
oliver committed
413
		$configfile = $this->conf['courier']['config_dir'].'/authdaemonrc';
414
415
416
417
418
419
		if(is_file($configfile)){
            copy($configfile, $configfile.'~');
        }
		if(is_file($configfile.'~')){
            exec('chmod 400 '.$configfile.'~');
        }
420
		$content = rf($configfile);
421
422
		$content = str_replace('authmodulelist="authpam"', 'authmodulelist="authmysql"', $content);
		wf($configfile, $content);
423
424
425
426
427
428
429
	}
	
	function configure_amavis() {
		global $conf;
		
		// amavisd user config file
		$configfile = 'amavisd_user_config';
oliver's avatar
oliver committed
430
431
		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~');
432
		$content = rf("tpl/".$configfile.".master");
433
434
435
		$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);
436
		$content = str_replace('{mysql_server_port}',$conf["mysql"]["port"],$content);
437
		$content = str_replace('{mysql_server_ip}',$this->conf['mysql']['ip'],$content);
oliver's avatar
oliver committed
438
		wf($conf["amavis"]["config_dir"].'/conf.d/50-user',$content);
439
440
441
442
443
444
445
446
447
448
449
		
		// 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
450
		copy($conf["postfix"]["config_dir"].'/main.cf',$conf["postfix"]["config_dir"].'/main.cf~2');
451
452
453
454
		
		// Executing the postconf commands
		foreach($postconf_commands as $cmd) {
			$command = "postconf -e '$cmd'";
455
			caselog($command." &> /dev/null", __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
456
457
458
		}
		
		// Append the configuration for amavisd to the master.cf file
oliver's avatar
oliver committed
459
		if(is_file($conf["postfix"]["config_dir"].'/master.cf')) copy($conf["postfix"]["config_dir"].'/master.cf',$conf["postfix"]["config_dir"].'/master.cf~');
460
461
462
		$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)) {
oliver's avatar
oliver committed
463
			af($conf["postfix"]["config_dir"].'/master.cf',$content);
464
465
466
467
468
469
470
471
		}
		
		// Add the clamav user to the amavis group
		exec('adduser clamav amavis');
		
		
	}
	
472
473
	public function configure_spamassassin()
    {
474
		//* Enable spamasasssin on debian and ubuntu
475
		$configfile = '/etc/default/spamassassin';
476
		if(is_file($configfile)){
477
            copy($configfile, $configfile.'~');
478
        }
479
		$content = rf($configfile);
480
481
		$content = str_replace('ENABLED=0', 'ENABLED=1', $content);
		wf($configfile, $content);
482
483
	}
	
484
485
	public function configure_getmail()
    {
oliver's avatar
oliver committed
486
		$config_dir = $this->conf['getmail']['config_dir'];
487
488
489

		$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
490
		
491
492
		$command = "chown -R getmail $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
493
		
494
495
		$command = "chmod -R 700 $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
496
497
	}
	
498
	
499
500
	public function configure_pureftpd()
    {
oliver's avatar
oliver committed
501
		$config_dir = $this->conf['pureftpd']['config_dir'];
502
503

		//* configure pam for SMTP authentication agains the ispconfig database
504
		$configfile = 'db/mysql.conf';
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
		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');
		$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("$config_dir/$configfile", $content);
		exec("chmod 600 $config_dir/$configfile");
		exec("chown root:root $config_dir/$configfile");
		// **enable chrooting
		exec('mkdir -p '.$config_dir.'/conf/ChrootEveryone');
		exec('echo "yes" > '.$config_dir.'/conf/ChrootEveryone');
tbrehm's avatar
tbrehm committed
523
524
	}
	
525
526
	public function configure_mydns()
    {
527
528
529
530
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
531
532
		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.'~');
533
		$content = rf("tpl/".$configfile.".master");
534
535
536
		$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);
537
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
538
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
539
540
541
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
542
543
544
	
	}
	
545
546
547
548
	public function configure_apache()
    {	
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
549
550
551
		
	}
	
tbrehm's avatar
tbrehm committed
552
	
553
554
555
556
557
558
559
	public function install_ispconfig()
    {
		$install_dir = $this->conf['ispconfig_install_dir'];

		//* Create the ISPConfig installation directory
		$command = "mkdir $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
560
		
561
562
563
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
564
		
565
566
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
567
		
568
569
570
		//* 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");
571
		
572
573
574
		//* 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");
575
		
576
577
578
		//* Create a symlink, so ISPConfig is accessible via web
		$command = "ln -s $install_dir/interface/web/ /var/www/ispconfig";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
579
		
580
		//* Create the config file for ISPConfig interface
581
		$configfile = 'config.inc.php';
582
583
584
585
586
587
588
589
590
		if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$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_host}', $this->conf['mysql']['host'], $content);
		wf("$install_dir/interface/lib/$configfile", $content);
591
		
592
		//* Create the config file for ISPConfig server
593
		$configfile = 'config.inc.php';
594
595
596
597
598
599
600
601
602
603
		if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$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_host}', $this->conf['mysql']['host'], $content);
		$content = str_replace('{server_id}', $this->conf['server_id'], $content);
		wf("$install_dir/server/lib/$configfile", $content);
604
605
		
		
606
607
608
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
609

610
611
612
		//* 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");
613
		
614
615
616
		//* 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");
617
		
618
619
620
		// 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!
621
622
		$command = 'adduser www-data ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
623
		
624
625
626
		//* 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");
627
		
628
629
		//* Copy the ISPConfig vhost for the controlpanel
        //TODO These are missing! should they be "vhost_dist_*_dir" ?
oliver's avatar
oliver committed
630
631
        $vhost_conf_dir = $this->conf['apache']['vhost_conf_dir'];
        $vhost_conf_enabled_dir = $this->conf['apache']['vhost_conf_enabled_dir'];
632
633
634
635
		copy('tpl/apache_ispconfig.vhost.master', "$vhost_conf_dir/ispconfig.vhost");
		//* and create the symlink
		if(!is_link("$vhost_conf_enabled_dir/ispconfig.vhost")) {
			exec("ln -s $vhost_conf_dir/ispconfig.vhost $vhost_conf_enabled_dir/ispconfig.vhost");
tbrehm's avatar
tbrehm committed
636
		}
637
638
	}
	
639
	public function install_crontab()
640
641
642
    {		
		//* Root Crontab
		exec('crontab -u root -l > crontab.txt');
tbrehm's avatar
tbrehm committed
643
644
645
646
		$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) {
647
			if(!in_array($cron_job."\n", $existing_root_cron_jobs)) {
tbrehm's avatar
tbrehm committed
648
649
650
				$existing_root_cron_jobs[] = $cron_job."\n";
			}
		}
651
652
		file_put_contents('crontab.txt', $existing_root_cron_jobs);
		exec('crontab -u root crontab.txt &> /dev/null');
tbrehm's avatar
tbrehm committed
653
654
		unlink('crontab.txt');
		
655
		//* Getmail crontab
oliver's avatar
oliver committed
656
        $cf = $this->conf['getmail'];
657
		exec('crontab -u getmail -l > crontab.txt');
tbrehm's avatar
tbrehm committed
658
659
		$existing_cron_jobs = file('crontab.txt');
		
660
		$cron_jobs = array('*/5 * * * * '.$cf['program'].' -g '.$cf['config_dir'].' -r '.$cf['config_dir'].'/*.conf &> /dev/null');
tbrehm's avatar
tbrehm committed
661
		foreach($cron_jobs as $cron_job) {
662
			if(!in_array($cron_job."\n", $existing_cron_jobs)) {
tbrehm's avatar
tbrehm committed
663
664
665
				$existing_cron_jobs[] = $cron_job."\n";
			}
		}
666
667
		file_put_contents('crontab.txt', $existing_cron_jobs);
		exec('crontab -u getmail crontab.txt &> /dev/null');
tbrehm's avatar
tbrehm committed
668
669
670
		unlink('crontab.txt');
	}
	
671
672
}

673
?>