installer_base.lib.php 30.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 langauge 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
125
126
127
128
		//* 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']);
129
130
		}
		
131
		//* Reload database privelages
132
133
		$this->db->query('FLUSH PRIVILEGES;');
		
134
135
		//* Set the database name in the DB library
		$this->db->dbName = $cf['database'];
136
		
137
		//* Load the database dump into the database, if database contains no tables
138
139
		$db_tables = $this->db->getTables();
		if(count($db_tables) > 0) {
140
			$this->error('Stopped: Database already contains some tables.');
141
		} else {
142
143
			if($cf['admin_password'] == '') {
				caselog("mysql -h '".$cf['host']."' -u '".$cf['admin_user']."' '".$cf['database']."' < 'sql/ispconfig3.sql' &> /dev/null", 
144
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
145
			} else {
146
				caselog("mysql -h '".$cf['host']."' -u '".$cf['admin_user']."' -p'".$cf['admin_password']."' '".$cf['database']."' < 'sql/ispconfig3.sql' &> /dev/null", 
147
                        __FILE__, __LINE__, 'read in ispconfig3.sql', 'could not read in ispconfig3.sql');
148
149
150
151
152
153
154
155
			}
			$db_tables = $this->db->getTables();
			if(count($db_tables) == 0) {
				$this->error('Unable to load SQL-Dump into database table.');
			}
		}
	}
	
156

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

175

176
177
	public function configure_postfix($options = '')
    {
oliver's avatar
oliver committed
178
        $cf = $this->conf['postfix'];
179
180
		$config_dir = $cf['config_dir'];
        
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
		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');
208
209
210
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
211
212

		//* Changing mode and group of the new created config files.
213
214
215
216
217
218
219
220
221
222
223
		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");		
224
225

		$postconf_commands = array (
226
227
			'myhostname = '.$this->conf['hostname'],
			'mydestination = '.$this->conf['hostname'].', localhost, localhost.localdomain',
228
229
			'mynetworks = 127.0.0.0/8',
			'virtual_alias_domains =',
pedro_morgan's avatar
pedro_morgan committed
230
231
			'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',
232
233
234
235
			'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'],
236
237
			'smtpd_sasl_auth_enable = yes',
			'broken_sasl_auth_clients = yes',
pedro_morgan's avatar
pedro_morgan committed
238
			'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, check_recipient_access mysql:'.$config_dir.'/mysql-virtual_recipient.cf, reject_unauth_destination',
239
			'smtpd_use_tls = yes',
pedro_morgan's avatar
pedro_morgan committed
240
241
242
			'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',
243
			'relay_domains = mysql:'.$config_dir.'/mysql-virtual_relaydomains.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
		
		if(!is_dir($config_dir)) exec("mkdir -p ".escapeshellcmd($config_dir));
489
490
491

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

		//* configure pam for SMTP authentication agains the ispconfig database
506
		$configfile = 'db/mysql.conf';
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
523
		//exec('mkdir -p '.$config_dir.'/conf/ChrootEveryone');
524
		exec('echo "yes" > '.$config_dir.'/conf/ChrootEveryone');
tbrehm's avatar
tbrehm committed
525
526
	}
	
527
528
	public function configure_mydns()
    {
529
530
531
532
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
533
534
		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.'~');
535
		$content = rf("tpl/".$configfile.".master");
536
537
538
		$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);
539
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
540
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
541
542
543
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
544
545
546
	
	}
	
547
548
549
550
	public function configure_apache()
    {	
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
551
552
553
		
	}
	
tbrehm's avatar
tbrehm committed
554
	
555
556
557
558
559
560
561
	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");
562
		
563
564
565
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
566
		
567
568
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
569
		
570
571
572
		//* 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");
573
		
574
575
576
		//* 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");
577
		
578
579
580
		//* 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");
581
		
582
		//* Create the config file for ISPConfig interface
583
		$configfile = 'config.inc.php';
584
585
586
587
588
589
590
591
592
		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);
593
		
594
		//* Create the config file for ISPConfig server
595
		$configfile = 'config.inc.php';
596
597
598
599
600
601
602
603
604
605
		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);
606
		
607
608
609
610
611
612
613
		//* 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 != '..') {
614
						if(!is_link($install_dir.'/server/mods-enabled/'.$file)) symlink($install_dir.'/server/mods-available/'.$file, $install_dir.'/server/mods-enabled/'.$file);
615
616
617
618
619
620
621
622
623
624
625
					}
				}
				closedir($dh);
			}
		}
		
		$dir = $install_dir.'/server/plugins-available/';
		if (is_dir($dir)) {
			if ($dh = opendir($dir)) {
				while (($file = readdir($dh)) !== false) {
					if($file != '.' && $file != '..') {
tbrehm's avatar
tbrehm committed
626
						if(!is_link($install_dir.'/server/plugins-enabled/'.$file)) symlink($install_dir.'/server/plugins-available/'.$file, $install_dir.'/server/plugins-enabled/'.$file);
627
628
629
630
631
					}
				}
				closedir($dh);
			}
		}
632
		
633
634
635
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
636

637
638
639
		//* 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");
640
		
641
642
643
		//* 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");
644
		
645
646
647
		// 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!
648
649
		$command = 'adduser www-data ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
650
		
651
652
653
		//* 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");
654
		
655
		//* Copy the ISPConfig vhost for the controlpanel
656
        // TODO: These are missing! should they be "vhost_dist_*_dir" ?
oliver's avatar
oliver committed
657
658
        $vhost_conf_dir = $this->conf['apache']['vhost_conf_dir'];
        $vhost_conf_enabled_dir = $this->conf['apache']['vhost_conf_enabled_dir'];
659
660
661
662
		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
663
		}
664
665
	}
	
666
	public function install_crontab()
667
668
669
    {		
		//* Root Crontab
		exec('crontab -u root -l > crontab.txt');
tbrehm's avatar
tbrehm committed
670
671
		$existing_root_cron_jobs = file('crontab.txt');
		
tbrehm's avatar
tbrehm committed
672
673
674
675
		$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
676
		foreach($root_cron_jobs as $cron_job) {
677
			if(!in_array($cron_job."\n", $existing_root_cron_jobs)) {
tbrehm's avatar
tbrehm committed
678
679
680
				$existing_root_cron_jobs[] = $cron_job."\n";
			}
		}
681
682
		file_put_contents('crontab.txt', $existing_root_cron_jobs);
		exec('crontab -u root crontab.txt &> /dev/null');
tbrehm's avatar
tbrehm committed
683
684
		unlink('crontab.txt');
		
685
		//* Getmail crontab
oliver's avatar
oliver committed
686
        $cf = $this->conf['getmail'];
687
		exec('crontab -u getmail -l > crontab.txt');
tbrehm's avatar
tbrehm committed
688
689
		$existing_cron_jobs = file('crontab.txt');
		
690
		$cron_jobs = array('*/5 * * * * '.$cf['program'].' -g '.$cf['config_dir'].' -r '.$cf['config_dir'].'/*.conf &> /dev/null');
tbrehm's avatar
tbrehm committed
691
		foreach($cron_jobs as $cron_job) {
692
			if(!in_array($cron_job."\n", $existing_cron_jobs)) {
tbrehm's avatar
tbrehm committed
693
694
695
				$existing_cron_jobs[] = $cron_job."\n";
			}
		}
696
697
		file_put_contents('crontab.txt', $existing_cron_jobs);
		exec('crontab -u getmail crontab.txt &> /dev/null');
tbrehm's avatar
tbrehm committed
698
699
700
		unlink('crontab.txt');
	}
	
701
702
}

703
?>