installer_base.lib.php 29.1 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
		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');
212
213
214
		
		//* mysql-virtual_relaydomains.cf
        $this->process_postfix_config('mysql-virtual_relaydomains.cf');
215
216

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

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

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

		//* configure pam for SMTP authentication agains the ispconfig database
508
		$configfile = 'db/mysql.conf';
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
		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
527
528
	}
	
529
530
	public function configure_mydns()
    {
531
532
533
534
		global $conf;
		
		// configure pam for SMTP authentication agains the ispconfig database
		$configfile = 'mydns.conf';
oliver's avatar
oliver committed
535
536
		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.'~');
537
		$content = rf("tpl/".$configfile.".master");
538
539
540
		$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);
541
		$content = str_replace('{mysql_server_host}',$conf["mysql"]["host"],$content);
542
		$content = str_replace('{server_id}',$conf["server_id"],$content);
oliver's avatar
oliver committed
543
544
545
		wf($conf["mydns"]["config_dir"].'/'.$configfile,$content);
		exec('chmod 600 '.$conf["mydns"]["config_dir"].'/'.$configfile);
		exec('chown root:root '.$conf["mydns"]["config_dir"].'/'.$configfile);
546
547
548
	
	}
	
549
550
551
552
	public function configure_apache()
    {	
		//* Create the logging directory for the vhost logfiles
		exec('mkdir -p /var/log/ispconfig/httpd');
553
554
555
		
	}
	
tbrehm's avatar
tbrehm committed
556
	
557
558
559
560
561
562
563
	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");
564
		
565
566
567
		//* Create a ISPConfig user and group
		$command = 'groupadd ispconfig';
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
568
		
569
570
		$command = "useradd -g ispconfig -d $install_dir ispconfig";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
571
		
572
573
574
		//* 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");
575
		
576
577
578
		//* 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");
579
		
580
581
582
		//* 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");
583
		
584
		//* Create the config file for ISPConfig interface
585
		$configfile = 'config.inc.php';
586
587
588
589
590
591
592
593
594
		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);
595
		
596
		//* Create the config file for ISPConfig server
597
		$configfile = 'config.inc.php';
598
599
600
601
602
603
604
605
606
607
		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);
608
609
		
		
610
611
612
		//* Chmod the files
		$command = "chmod -R 750 $install_dir";
		caselog($command.' &> /dev/null', __FILE__, __LINE__, "EXECUTED: $command", "Failed to execute the command $command");
613

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

677
?>