tbrehm
2012-06-11 897af06af9522ded99b1e0f46730299e89856ffe
commit | author | age
8896ab 1 <?php
N 2
3 /*
4 Copyright (c) 2007-2010, Till Brehm, projektfarm Gmbh
5 All rights reserved.
6
7 Redistribution and use in source and binary forms, with or without modification,
8 are permitted provided that the following conditions are met:
9
10     * Redistributions of source code must retain the above copyright notice,
11       this list of conditions and the following disclaimer.
12     * Redistributions in binary form must reproduce the above copyright notice,
13       this list of conditions and the following disclaimer in the documentation
14       and/or other materials provided with the distribution.
15     * Neither the name of ISPConfig nor the names of its contributors
16       may be used to endorse or promote products derived from this software without
17       specific prior written permission.
18
19 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
20 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22 IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
23 INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
24 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
26 OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
27 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28 EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 /*
32     ISPConfig 3 updater.
33 */
34
35 error_reporting(E_ALL|E_STRICT);
36
37 //** The banner on the command line
38 echo "\n\n".str_repeat('-',80)."\n";
39 echo " _____ ___________   _____              __ _         ____
40 |_   _/  ___| ___ \ /  __ \            / _(_)       /__  \
41   | | \ `--.| |_/ / | /  \/ ___  _ __ | |_ _  __ _    _/ /
42   | |  `--. \  __/  | |    / _ \| '_ \|  _| |/ _` |  |_ |
43  _| |_/\__/ / |     | \__/\ (_) | | | | | | | (_| | ___\ \
44  \___/\____/\_|      \____/\___/|_| |_|_| |_|\__, | \____/
45                                               __/ |
46                                              |___/ ";
47 echo "\n".str_repeat('-',80)."\n";
48 echo "\n\n>> Update  \n\n";
49
50 //** Include the library with the basic installer functions
51 require_once('lib/install.lib.php');
52
53 //** Include the library with the basic updater functions
54 require_once('lib/update.lib.php');
55
56 //** Include the base class of the installer class
57 require_once('lib/installer_base.lib.php');
58
59 //** Ensure that current working directory is install directory
60 $cur_dir = getcwd();
61 if(realpath(dirname(__FILE__)) != $cur_dir) die("Please run installation/update from _inside_ the install directory!\n");
62
63 //** Install logfile
64 define('ISPC_LOG_FILE', '/var/log/ispconfig_install.log');
65 define('ISPC_INSTALL_ROOT', realpath(dirname(__FILE__).'/../'));
66
67 //** Check for ISPConfig 2.x versions
68 if(is_dir('/root/ispconfig') || is_dir('/home/admispconfig')) {
69     die('This software cannot be installed on a server wich runs ISPConfig 2.x.');
70 }
71
72 //** Get distribution identifier
73 $dist = get_distname();
74
75 include_once("/usr/local/ispconfig/server/lib/config.inc.php");
76 $conf_old = $conf;
77 unset($conf);
78
79 if($dist['id'] == '') die('Linux distribution or version not recognized.');
80
81 //** Include the distribution-specific installer class library and configuration
82 if(is_file('dist/lib/'.$dist['baseid'].'.lib.php')) include_once('dist/lib/'.$dist['baseid'].'.lib.php');
83 include_once('dist/lib/'.$dist['id'].'.lib.php');
84 include_once('dist/conf/'.$dist['id'].'.conf.php');
85
86 //** Get hostname
87 exec('hostname -f', $tmp_out);
88 $conf['hostname'] = $tmp_out[0];
89 unset($tmp_out);
90
91 //** Set the mysql login information
92 $conf["mysql"]["host"] = $conf_old["db_host"];
93 $conf["mysql"]["database"] = $conf_old["db_database"];
94 $conf['mysql']['charset'] = 'utf8';
95 $conf["mysql"]["ispconfig_user"] = $conf_old["db_user"];
96 $conf["mysql"]["ispconfig_password"] = $conf_old["db_password"];
97 $conf['language'] = $conf_old['language'];
98 if($conf['language'] == '{language}') $conf['language'] = 'en';
91e1ba 99 $conf['timezone'] = (isset($conf_old['timezone']))?$conf_old['timezone']:'UTC';
2dd674 100 if($conf['timezone'] == '{timezone}' or trim($conf['timezone']) == '') $conf['timezone'] = 'UTC';
8896ab 101
N 102 if(isset($conf_old["dbmaster_host"])) $conf["mysql"]["master_host"] = $conf_old["dbmaster_host"];
103 if(isset($conf_old["dbmaster_database"])) $conf["mysql"]["master_database"] = $conf_old["dbmaster_database"];
104 if(isset($conf_old["dbmaster_user"])) $conf["mysql"]["master_ispconfig_user"] = $conf_old["dbmaster_user"];
105 if(isset($conf_old["dbmaster_password"])) $conf["mysql"]["master_ispconfig_password"] = $conf_old["dbmaster_password"];
106
107 //* Check if this is a master / slave setup
108 if($conf["mysql"]["master_host"] != '' && $conf["mysql"]["host"] != $conf["mysql"]["master_host"]) {
109     $conf['mysql']['master_slave_setup'] = 'y';
110 }
111
112 // Resolve the IP address of the mysql hostname.
113 if(!$conf['mysql']['ip'] = gethostbyname($conf['mysql']['host'])) die('Unable to resolve hostname'.$conf['mysql']['host']);
114
115 $conf['server_id'] = intval($conf_old["server_id"]);
116 $conf['ispconfig_log_priority'] = $conf_old["log_priority"];
117
118 $inst = new installer();
119 $inst->is_update = true;
120
121 //** Detect the installed applications
122 $inst->find_installed_apps();
123
335660 124 echo "This application will update ISPConfig 3 on your server.\n\n";
8896ab 125
1c6b26 126 //* Make a backup before we start the update
T 127 $do_backup = $inst->simple_query('Shall the script create a ISPConfig backup in /var/backup/ now?', array('yes','no'),'yes');
128 if($do_backup == 'yes') {
129     
130     //* Create the backup directory
050c0f 131     $backup_path = '/var/backup/ispconfig_'.date('Y-m-d_H-i');
1c6b26 132     $conf['backup_path'] = $backup_path;
T 133     exec("mkdir -p $backup_path");
134     exec("chown root:root $backup_path");
135     exec("chmod 700 $backup_path");
136     
137     //* Do the backup
5fba95 138     swriteln('Creating backup of "/usr/local/ispconfig" directory...');
T 139     exec("tar pcfz $backup_path/ispconfig_software.tar.gz /usr/local/ispconfig 2> /dev/null",$out,$returnvar);
140     if($returnvar != 0) die("Backup failed. We stop here...\n");
141     
142     swriteln('Creating backup of "/etc" directory...');
143     exec("tar pcfz $backup_path/etc.tar.gz /etc 2> /dev/null",$out,$returnvar);
144     if($returnvar != 0) die("Backup failed. We stop here...\n");
145     
1c6b26 146     exec("chown root:root $backup_path/*.tar.gz");
T 147     exec("chmod 700 $backup_path/*.tar.gz");
148 }
149
150
8896ab 151 //** Initialize the MySQL server connection
N 152 include_once('lib/mysql.lib.php');
153
154 //** Database update is a bit brute force and should be rebuild later ;)
155
156 /*
157  * Try to read the DB-admin settings
158  */
159 $clientdb_host            = '';
160 $clientdb_user            = '';
161 $clientdb_password        = '';
162 include_once("/usr/local/ispconfig/server/lib/mysql_clientdb.conf");
163 $conf["mysql"]["admin_user"] = $clientdb_user;
164 $conf["mysql"]["admin_password"] = $clientdb_password;
165 $clientdb_host            = '';
166 $clientdb_user            = '';
167 $clientdb_password        = '';
168
88273a 169 //** Test mysql root connection
T 170 $finished = false;
171 do {
172     if(@mysql_connect($conf["mysql"]["host"],$conf["mysql"]["admin_user"],$conf["mysql"]["admin_password"])) {
173         $finished = true;
174     } else {
175         swriteln($inst->lng('Unable to connect to mysql server').' '.mysql_error());
176         $conf["mysql"]["admin_password"] = $inst->free_query('MySQL root password', $conf['mysql']['admin_password']);
177     }
178 } while ($finished == false);
179 unset($finished);
8896ab 180
N 181 /*
182  *  Prepare the dump of the database 
183  */
184 prepareDBDump();
185
186 //* initialize the database
187 $inst->db = new db();
188
189 //* initialize the master DB, if we have a multiserver setup
190 if($conf['mysql']['master_slave_setup'] == 'y') {
191         //** Get MySQL root credentials
192         $finished = false;
193         do {
194             $tmp_mysql_server_host = $inst->free_query('MySQL master server hostname', $conf['mysql']['master_host']);
195             $tmp_mysql_server_admin_user = $inst->free_query('MySQL master server root username', $conf['mysql']['master_admin_user']);
196             $tmp_mysql_server_admin_password = $inst->free_query('MySQL master server root password', $conf['mysql']['master_admin_password']);
197             $tmp_mysql_server_database = $inst->free_query('MySQL master server database name', $conf['mysql']['master_database']);
198     
199             //* Initialize the MySQL server connection
200             if(@mysql_connect($tmp_mysql_server_host, $tmp_mysql_server_admin_user, $tmp_mysql_server_admin_password)) {
201                 $conf['mysql']['master_host'] = $tmp_mysql_server_host;
202                 $conf['mysql']['master_admin_user'] = $tmp_mysql_server_admin_user;
203                 $conf['mysql']['master_admin_password'] = $tmp_mysql_server_admin_password;
204                 $conf['mysql']['master_database'] = $tmp_mysql_server_database;
205                 $finished = true;
206             } else {
207                 swriteln($inst->lng('Unable to connect to mysql server').' '.mysql_error());
208             }
209         } while ($finished == false);
210         unset($finished);
211         
212         // initialize the connection to the master database
213         $inst->dbmaster = new db();
214         if($inst->dbmaster->linkId) $inst->dbmaster->closeConn();
215         $inst->dbmaster->dbHost = $conf['mysql']["master_host"];
216         $inst->dbmaster->dbName = $conf['mysql']["master_database"];
217         $inst->dbmaster->dbUser = $conf['mysql']["master_admin_user"];
218         $inst->dbmaster->dbPass = $conf['mysql']["master_admin_password"];
219 } else {
220     $inst->dbmaster = $inst->db;
221 }
222
223 /*
224  *  Check all tables
225 */
226 checkDbHealth();
227
228 /*
229  *  dump the new Database and reconfigure the server.ini
230  */
231 updateDbAndIni();
232
233 /*
234  * Reconfigure the permisson if needed
235  * (if this is done at client side, only this client is updated.
236  * If this is done at server side, all clients are updated.
237  */
238 //if($conf_old['dbmaster_user'] != '' or $conf_old['dbmaster_host'] != '') {
239     //** Update master database rights
240     $reconfigure_master_database_rights_answer = $inst->simple_query('Reconfigure Permissions in master database?', array('yes','no'),'no');
241
242     if($reconfigure_master_database_rights_answer == 'yes') {
243         $inst->grant_master_database_rights();
244     }
245 //}
246
247 //** Shall the services be reconfigured during update
248 $reconfigure_services_answer = $inst->simple_query('Reconfigure Services?', array('yes','no'),'yes');
249
250 if($reconfigure_services_answer == 'yes') {
251     
252     if($conf['services']['mail']) {
253         //** Configure postfix
254         swriteln('Configuring Postfix');
255         $inst->configure_postfix('dont-create-certs');
256         
257         //** Configure mailman
258         swriteln('Configuring Mailman');
259         $inst->configure_mailman('update');
260     
261         //* Configure Jailkit
262         swriteln('Configuring Jailkit');
263         $inst->configure_jailkit();
264
265         if($conf['dovecot']['installed'] == true) {
266             //* Configure dovecot
267             swriteln('Configuring Dovecot');
268             $inst->configure_dovecot();
269         } else {
270             //** Configure saslauthd
271             swriteln('Configuring SASL');
272             $inst->configure_saslauthd();
273     
274             //** Configure PAM
275             swriteln('Configuring PAM');
276             $inst->configure_pam();
277         
278             //* Configure courier
279             swriteln('Configuring Courier');
280             $inst->configure_courier();
281         }
282
283         //** Configure Spamasassin
284         swriteln('Configuring Spamassassin');
285         $inst->configure_spamassassin();
286
287         //** Configure Amavis
288         swriteln('Configuring Amavisd');
289         $inst->configure_amavis();
290
291         //** Configure Getmail
292         swriteln('Configuring Getmail');
293         $inst->configure_getmail();
294     }
295     
296     if($conf['services']['web'] && $conf['pureftpd']['installed'] == true) {
297         //** Configure Pureftpd
298         swriteln('Configuring Pureftpd');
299         $inst->configure_pureftpd();
300     }
301     
302     if($conf['services']['dns']) {
303         //* Configure DNS
304         if($conf['powerdns']['installed'] == true) {
305             swriteln('Configuring PowerDNS');
306             $inst->configure_powerdns();
307         } elseif($conf['bind']['installed'] == true) {
308             swriteln('Configuring BIND');
309             $inst->configure_bind();
310         } else {
311             swriteln('Configuring MyDNS');
312             $inst->configure_mydns();
313         }
314     }
315     
316     if($conf['services']['web']) {
4ffb51 317         if($conf['webserver']['server_type'] == 'apache'){
F 318             //** Configure Apache
319             swriteln('Configuring Apache');
320             $inst->configure_apache();
8896ab 321         
4ffb51 322             //** Configure vlogger
F 323             swriteln('Configuring vlogger');
324             $inst->configure_vlogger();
325         } else {
326             //** Configure nginx
327             swriteln('Configuring nginx');
328             $inst->configure_nginx();
329         }
8896ab 330         
N 331         //** Configure apps vhost
332         swriteln('Configuring Apps vhost');
333         $inst->configure_apps_vhost();
334     }
335
336
337     //* Configure DBServer
338     swriteln('Configuring Database');
339     $inst->configure_dbserver();
340
341     
342     if($conf['services']['firewall']) {
343         if($conf['bastille']['installed'] == true) {
344             //* Configure Bastille Firewall
345             swriteln('Configuring Bastille Firewall');
346             $inst->configure_firewall();
347         }
348     }
349     
4ffb51 350     /*
8896ab 351     if($conf['squid']['installed'] == true) {
N 352         swriteln('Configuring Squid');
353         $inst->configure_squid();
354     } else if($conf['nginx']['installed'] == true) {
355         swriteln('Configuring Nginx');
356         $inst->configure_nginx();
357     }
4ffb51 358     */
8896ab 359 }
N 360
361 //** Configure ISPConfig
362 swriteln('Updating ISPConfig');
363
364
62ce8d 365 if ($conf['services']['web'] && $inst->install_ispconfig_interface) {
8896ab 366     //** Customise the port ISPConfig runs on
N 367     $ispconfig_port_number = get_ispconfig_port_number();
4ffb51 368     if($conf['webserver']['server_type'] == 'nginx'){
F 369         $conf['nginx']['vhost_port'] = $inst->free_query('ISPConfig Port', $ispconfig_port_number);
370     } else {
371         $conf['apache']['vhost_port'] = $inst->free_query('ISPConfig Port', $ispconfig_port_number);
372     }
373     
8896ab 374     
N 375     // $ispconfig_ssl_default = (is_ispconfig_ssl_enabled() == true)?'y':'n';
376     if(strtolower($inst->simple_query('Create new ISPConfig SSL certificate',array('yes','no'),'no')) == 'yes') {
377         $inst->make_ispconfig_ssl_cert();
378     }
379 }
380
381 $inst->install_ispconfig();
382
383 //** Configure Crontab
384 $update_crontab_answer = $inst->simple_query('Reconfigure Crontab?', array('yes','no'),'yes');
385 if($update_crontab_answer == 'yes') {
386     swriteln('Updating Crontab');
387     $inst->install_crontab();
388 }
389
390 //** Restart services:
391 if($reconfigure_services_answer == 'yes') {
392     swriteln('Restarting services ...');
393     if($conf['mysql']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['mysql']['init_script']))                    system($conf['init_scripts'].'/'.$conf['mysql']['init_script'].' restart');
394     if($conf['services']['mail']) {
395         if($conf['postfix']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['postfix']['init_script']))                system($conf['init_scripts'].'/'.$conf['postfix']['init_script'].' restart');
396         if($conf['saslauthd']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['saslauthd']['init_script']))            system($conf['init_scripts'].'/'.$conf['saslauthd']['init_script'].' restart');
397         if($conf['amavis']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['amavis']['init_script']))                    system($conf['init_scripts'].'/'.$conf['amavis']['init_script'].' restart');
398         if($conf['clamav']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['clamav']['init_script']))                    system($conf['init_scripts'].'/'.$conf['clamav']['init_script'].' restart');
399         if($conf['courier']['courier-authdaemon'] != '' && is_executable($conf['init_scripts'].'/'.$conf['courier']['courier-authdaemon'])) system($conf['init_scripts'].'/'.$conf['courier']['courier-authdaemon'].' restart');
400         if($conf['courier']['courier-imap'] != '' && is_executable($conf['init_scripts'].'/'.$conf['courier']['courier-imap']))             system($conf['init_scripts'].'/'.$conf['courier']['courier-imap'].' restart');
401         if($conf['courier']['courier-imap-ssl'] != '' && is_executable($conf['init_scripts'].'/'.$conf['courier']['courier-imap-ssl']))     system($conf['init_scripts'].'/'.$conf['courier']['courier-imap-ssl'].' restart');
402         if($conf['courier']['courier-pop'] != '' && is_executable($conf['init_scripts'].'/'.$conf['courier']['courier-pop']))                 system($conf['init_scripts'].'/'.$conf['courier']['courier-pop'].' restart');
403         if($conf['courier']['courier-pop-ssl'] != '' && is_executable($conf['init_scripts'].'/'.$conf['courier']['courier-pop-ssl']))         system($conf['init_scripts'].'/'.$conf['courier']['courier-pop-ssl'].' restart');
404         if($conf['dovecot']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['dovecot']['init_script']))         system($conf['init_scripts'].'/'.$conf['dovecot']['init_script'].' restart');
612330 405         if($conf['mailman']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['mailman']['init_script']))         system('nohup '.$conf['init_scripts'].'/'.$conf['mailman']['init_script'].' restart >/dev/null 2>&1 &');
8896ab 406     }
N 407     if($conf['services']['web']) {
4ffb51 408         if($conf['webserver']['server_type'] == 'apache' && $conf['apache']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['apache']['init_script']))                 system($conf['init_scripts'].'/'.$conf['apache']['init_script'].' restart');
F 409         //* Reload is enough for nginx
410         if($conf['webserver']['server_type'] == 'nginx'){
411             if($conf['nginx']['php_fpm_init_script'] != '' && @is_file($conf['init_scripts'].'/'.$conf['nginx']['php_fpm_init_script'])) system($conf['init_scripts'].'/'.$conf['nginx']['php_fpm_init_script'].' reload');
412             if($conf['nginx']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['nginx']['init_script']))                 system($conf['init_scripts'].'/'.$conf['nginx']['init_script'].' reload');
413         }
8896ab 414         if($conf['pureftpd']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['pureftpd']['init_script']))                system($conf['init_scripts'].'/'.$conf['pureftpd']['init_script'].' restart');
N 415     }
416     if($conf['services']['dns']) {
417         if($conf['mydns']['installed'] == true && $conf['mydns']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['mydns']['init_script']))                    system($conf['init_scripts'].'/'.$conf['mydns']['init_script'].' restart &> /dev/null');
418         if($conf['powerdns']['installed'] == true && $conf['powerdns']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['powerdns']['init_script']))                    system($conf['init_scripts'].'/'.$conf['powerdns']['init_script'].' restart &> /dev/null');
419         if($conf['bind']['installed'] == true && $conf['bind']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['bind']['init_script']))                    system($conf['init_scripts'].'/'.$conf['bind']['init_script'].' restart &> /dev/null');
420     }
421     
422     if($conf['services']['proxy']) {
c91bdc 423         // if($conf['squid']['installed'] == true && $conf['squid']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['squid']['init_script']))                    system($conf['init_scripts'].'/'.$conf['squid']['init_script'].' restart &> /dev/null');
8896ab 424         if($conf['nginx']['installed'] == true && $conf['nginx']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['nginx']['init_script']))                    system($conf['init_scripts'].'/'.$conf['nginx']['init_script'].' restart &> /dev/null');
N 425     }
426     
427     if($conf['services']['firewall']) {
c91bdc 428         //if($conf['ufw']['installed'] == true && $conf['ufw']['init_script'] != '' && is_executable($conf['init_scripts'].'/'.$conf['ufw']['init_script']))                    system($conf['init_scripts'].'/'.$conf['ufw']['init_script'].' restart &> /dev/null');
8896ab 429     }
N 430 }
431
432 echo "Update finished.\n";
433
434 ?>