installer_base.lib.php 33.2 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
	
45
    //: TODO  Implement the translation function and language files for the installer.
pedro_morgan's avatar
pedro_morgan committed
46
47
	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;
	}
	
103
	/*
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
		
		swriteln(lng('Enter your language'));
		swriteln(lng('de, en'));
		
	}
111
	*/
112
	
113
114
115
	/** Create the database for ISPConfig */ 
	public function configure_database()
    {
116
		global $conf;
117
118
119
120
		$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'].'.');
121
122
		}
		
123
124
		//* Set the database name in the DB library
		$this->db->dbName = $cf['database'];
125
		
126
		//* Load the database dump into the database, if database contains no tables
127
128
		$db_tables = $this->db->getTables();
		if(count($db_tables) > 0) {
129
			$this->error('Stopped: Database already contains some tables.');
130
		} else {
131
132
			if($cf['admin_password'] == '') {
				caselog("mysql -h '".$cf['host']."' -u '".$cf['admin_user']."' '".$cf['database']."' < 'sql/ispconfig3.sql' &> /dev/null", 
133
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
134
			} else {
135
				caselog("mysql -h '".$cf['host']."' -u '".$cf['admin_user']."' -p'".$cf['admin_password']."' '".$cf['database']."' < 'sql/ispconfig3.sql' &> /dev/null", 
136
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
137
138
139
140
141
142
143
144
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
		}
	}
	
145
	//** Create the server record in the database
146
147
	public function add_database_server_record() {
		
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
		global $conf;
		$cf = $conf['mysql']; // make $conf['mysql'] more accessible
		
		//* 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']);
		}
		
		//* Reload database privelages
		$this->db->query('FLUSH PRIVILEGES;');
		
		
163
164
		$server_ini_content = rf("tpl/server.ini.master");
		$server_ini_content = addslashes($server_ini_content);
165
		
tbrehm's avatar
tbrehm committed
166
		$sql = "INSERT INTO `server` (`sys_userid`, `sys_groupid`, `sys_perm_user`, `sys_perm_group`, `sys_perm_other`, `server_name`, `mail_server`, `web_server`, `dns_server`, `file_server`, `db_server`, `vserver_server`, `config`, `updated`, `active`) VALUES (1, 1, 'riud', 'riud', 'r', 'Server', 1, 1, 1, 1, 1, 1, '$server_ini_content', 0, 1);";
167
168
169
170
		$this->db->query($sql);
		$this->conf['server_id'] = $this->db->insertID();
	}
	
171

172
    //** writes postfix configuration files
173
174
    private function process_postfix_config($configfile)
    {
oliver's avatar
oliver committed
175
        $config_dir = $this->conf['postfix']['config_dir'].'/';
176
177
178
179
180
181
182
183
184
185
186
187
188
189
        $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);
    }

190
191
192
193
194
195
196
	public function configure_jailkit()
    {
        $cf = $this->conf['jailkit'];
		$config_dir = $cf['config_dir'];
		$jk_init = $cf['jk_init'];
		$jk_chrootsh = $cf['jk_chrootsh'];
		
197
		if (is_dir($config_dir))
198
		{
199
200
			if(is_file($config_dir.'/'.$jk_init)) copy($config_dir.'/'.$jk_init, $config_dir.'/'.$jk_init.'~');
			if(is_file($config_dir.'/'.$jk_chrootsh.".master")) copy($config_dir.'/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh.'~');
201
202
203
204
205
206
207
			
			copy('tpl/'.$jk_init.".master", $config_dir.'/'.$jk_init);
			copy('tpl/'.$jk_chrootsh.".master", $config_dir.'/'.$jk_chrootsh);
		}
		
    }
        
208
209
	public function configure_postfix($options = '')
    {
oliver's avatar
oliver committed
210
        $cf = $this->conf['postfix'];
211
212
		$config_dir = $cf['config_dir'];
        
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
		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');
240
241
242
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
243
244

		//* Changing mode and group of the new created config files.
245
246
247
248
249
250
251
252
253
254
255
		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");		
256
257

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

		$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
524
		
525
526
		$command = "chown -R getmail $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
527
		
528
529
		$command = "chmod -R 700 $config_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
530
531
	}
	
532
	
533
534
	public function configure_pureftpd()
    {
535
536
		global $conf;
		
oliver's avatar
oliver committed
537
		$config_dir = $this->conf['pureftpd']['config_dir'];
538
539

		//* configure pam for SMTP authentication agains the ispconfig database
540
		$configfile = 'db/mysql.conf';
541
542
543
544
545
546
547
		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');
548
549
550
551
552
		$content = str_replace('{mysql_server_ispconfig_user}', $conf["mysql"]["ispconfig_user"], $content);
		$content = str_replace('{mysql_server_ispconfig_password}', $conf["mysql"]["ispconfig_password"], $content);
		$content = str_replace('{mysql_server_database}', $conf["mysql"]["database"], $content);
		$content = str_replace('{mysql_server_ip}', $conf["mysql"]["ip"], $content);
		$content = str_replace('{server_id}', $conf["server_id"], $content);
553
554
555
556
		wf("$config_dir/$configfile", $content);
		exec("chmod 600 $config_dir/$configfile");
		exec("chown root:root $config_dir/$configfile");
		// **enable chrooting
557
		//exec('mkdir -p '.$config_dir.'/conf/ChrootEveryone');
558
		exec('echo "yes" > '.$config_dir.'/conf/ChrootEveryone');
tbrehm's avatar
tbrehm committed
559
560
	}
	
561
562
	public function configure_mydns()
    {
563
564
565
566
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
567
568
		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.'~');
569
		$content = rf("tpl/".$configfile.".master");
570
571
572
		$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);
573
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
574
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
575
576
577
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
578
579
580
	
	}
	
581
582
583
584
	public function configure_apache()
    {	
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
585
586
587
		
	}
	
tbrehm's avatar
tbrehm committed
588
	
589
590
	public function install_ispconfig()
    {
591
592
		global $conf;
		
593
594
595
596
597
		$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");
598
		
599
600
601
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
602
		
603
604
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
605
		
606
607
608
		//* 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");
609
		
610
611
612
		//* 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");
613
		
614
		//* Create a symlink, so ISPConfig is accessible via web
615
616
617
		// Replaced by a separate vhost definition for port 8080
		// $command = "ln -s $install_dir/interface/web/ /var/www/ispconfig";
		// caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
618
		
619
		//* Create the config file for ISPConfig interface
620
		$configfile = 'config.inc.php';
621
622
623
624
		if(is_file($install_dir.'/interface/lib/'.$configfile)){
            copy("$install_dir/interface/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
625
626
627
628
		$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);
629
		wf("$install_dir/interface/lib/$configfile", $content);
630
		
631
		//* Create the config file for ISPConfig server
632
		$configfile = 'config.inc.php';
633
634
635
636
		if(is_file($install_dir.'/server/lib/'.$configfile)){
            copy("$install_dir/server/lib/$configfile", "$install_dir/interface/lib/$configfile~");
        }
		$content = rf("tpl/$configfile.master");
637
638
639
640
641
		$content = str_replace('{mysql_server_ispconfig_user}', $conf['mysql']['ispconfig_user'], $content);
		$content = str_replace('{mysql_server_ispconfig_password}', $conf['mysql']['ispconfig_password'], $content);
		$content = str_replace('{mysql_server_database}', $conf['mysql']['database'], $content);
		$content = str_replace('{mysql_server_host}', $conf['mysql']['host'], $content);
		$content = str_replace('{server_id}', $conf['server_id'], $content);
642
		wf("$install_dir/server/lib/$configfile", $content);
643
		
644
		
645
646
647
648
649
650
651
		//* Enable the server modules and plugins.
		// TODO: Implement a selector which modules and plugins shall be enabled.
		$dir = $install_dir.'/server/mods-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if($file != '.' && $file != '..') {
652
						if(!@is_link($install_dir.'/server/mods-enabled/'.$file)) @symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
653
654
655
656
657
658
659
660
661
662
663
					}
				}
				closedir($dh);
			}
		}
		
		$dir = $install_dir.'/server/plugins-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if($file != '.' && $file != '..') {
664
						if(!@is_link($install_dir.'/server/plugins-enabled/'.$file)) @symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
665
666
667
668
669
					}
				}
				closedir($dh);
			}
		}
670
		
671
672
673
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
674

675
676
677
		//* 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");
678
		
679
		//* Make the global language file directory group writable
tbrehm's avatar
tbrehm committed
680
		exec("chmod -R 770 $install_dir/interface/lib/lang");
681
		
682
683
684
		//* Make the temp directory for language file exports writable
		exec("chmod -R 770 $install_dir/interface/web/temp");
		
685
686
687
688
689
690
		//* Make all interface language file directories group writable
		$handle = @opendir($install_dir.'/interface/web');
		while ($file = @readdir ($handle)) { 
	   		if ($file != '.' && $file != '..') {
	        	if(@is_dir($install_dir.'/interface/web'.'/'.$file.'/lib/lang')) {
					$handle2 = opendir($install_dir.'/interface/web'.'/'.$file.'/lib/lang');
tbrehm's avatar
tbrehm committed
691
					chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang',0770);
692
693
					while ($lang_file = @readdir ($handle2)) {
						if ($lang_file != '.' && $lang_file != '..') {
tbrehm's avatar
tbrehm committed
694
							chmod($install_dir.'/interface/web'.'/'.$file.'/lib/lang/'.$lang_file,0770);
695
696
697
698
699
700
						}
					}
				}
			}
		}
		
701
702
703
		//* 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");
704
		
705
706
707
		// 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!
708
709
		$command = 'adduser www-data ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
710
		
711
712
713
		//* 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");
714
		
715
		//* Copy the ISPConfig vhost for the controlpanel
716
        // TODO: These are missing! should they be "vhost_dist_*_dir" ?
oliver's avatar
oliver committed
717
718
        $vhost_conf_dir = $this->conf['apache']['vhost_conf_dir'];
        $vhost_conf_enabled_dir = $this->conf['apache']['vhost_conf_enabled_dir'];
daniel's avatar
daniel committed
719
720
721
722
723
        
        
        // Dont just copy over the virtualhost template but add some custom settings
         
        $content = rf("tpl/apache_ispconfig.vhost.master");
724
		$content = str_replace('{vhost_port}', $conf['apache']['vhost_port'], $content);
daniel's avatar
daniel committed
725
726
727
		wf("$vhost_conf_dir/ispconfig.vhost", $content);
		
		//copy('tpl/apache_ispconfig.vhost.master', "$vhost_conf_dir/ispconfig.vhost");
728
729
730
		//* 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
731
		}
732
733
734
735
		
		// Make the Clamav log files readable by ISPConfig
		exec('chmod +r /var/log/clamav/clamav.log');
		exec('chmod +r /var/log/clamav/freshclam.log');
736
737
738
739
740
741
		
		//* Install the SVN update script
		exec('cp ../helper_scripts/update_from_svn.sh /usr/local/bin/ispconfig_update_from_svn.sh');
		exec('chown root /usr/local/bin/ispconfig_update_from_svn.sh');
		exec('chmod 700 /usr/local/bin/ispconfig_update_from_svn.sh');
		
742
743
		//set the fast cgi starter script to executable
		exec('chmod 755 '.$install_dir.'/interface/bin/php-fcgi');
744
745
	}
	
746
	public function install_crontab()
747
748
749
    {		
		//* Root Crontab
		exec('crontab -u root -l > crontab.txt');
tbrehm's avatar
tbrehm committed
750
751
		$existing_root_cron_jobs = file('crontab.txt');
		
tbrehm's avatar
tbrehm committed
752
753
754
755
		$root_cron_jobs = array(
			'* * * * * /usr/local/ispconfig/server/server.sh &> /dev/null',
			'30 00 * * * /usr/local/ispconfig/server/cron_daily.sh &> /dev/null'
		);
tbrehm's avatar
tbrehm committed
756
		foreach($root_cron_jobs as $cron_job) {
757
			if(!in_array($cron_job."\n", $existing_root_cron_jobs)) {
tbrehm's avatar
tbrehm committed
758
759
760
				$existing_root_cron_jobs[] = $cron_job."\n";
			}
		}
761
762
		file_put_contents('crontab.txt', $existing_root_cron_jobs);
		exec('crontab -u root crontab.txt &> /dev/null');
tbrehm's avatar
tbrehm committed
763
764
		unlink('crontab.txt');
		
765
		//* Getmail crontab
oliver's avatar
oliver committed
766
        $cf = $this->conf['getmail'];
767
		exec('crontab -u getmail -l > crontab.txt');
tbrehm's avatar
tbrehm committed
768
769
		$existing_cron_jobs = file('crontab.txt');
		
770
		$cron_jobs = array('*/5 * * * * '.$cf['program'].' -g '.$cf['config_dir'].' -r '.$cf['config_dir'].'/*.conf &> /dev/null');
tbrehm's avatar
tbrehm committed
771
		foreach($cron_jobs as $cron_job) {
772
			if(!in_array($cron_job."\n", $existing_cron_jobs)) {
tbrehm's avatar
tbrehm committed
773
774
775
				$existing_cron_jobs[] = $cron_job."\n";
			}
		}
776
777
		file_put_contents('crontab.txt', $existing_cron_jobs);
		exec('crontab -u getmail crontab.txt &> /dev/null');
tbrehm's avatar
tbrehm committed
778
779
780
		unlink('crontab.txt');
	}
	
781
782
}

783
?>