<?php // Pandora FMS - http://pandorafms.com // ================================================== // Copyright (c) 2005-2012 Artica Soluciones Tecnologicas // Please see http://pandorafms.org for full contribution list // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU Lesser General Public License // as published by the Free Software Foundation; version 2 // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. ?> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>Pandora FMS - Installation Wizard</title> <meta http-equiv="expires" content="0"> <meta http-equiv="content-type" content="text/html; charset=utf-8"> <meta name="resource-type" content="document"> <meta name="distribution" content="global"> <meta name="author" content="Pandora FMS Development Team"> <meta name="copyright" content="This is GPL software. Created by Sancho Lerena and many others"> <meta name="keywords" content="pandora, fms, monitoring, network, system, GPL, software"> <meta name="robots" content="index, follow"> <link rel="icon" href="images/pandora.ico" type="image/ico"> <link rel="stylesheet" href="include/styles/install.css" type="text/css"> </head> <script type="text/javascript"> options_text = new Array('An existing Database','A new Database'); options_values = new Array('db_exist','db_new'); function ChangeDBDrop(causer) { if (causer.value != 'db_exist') { window.document.step2_form.drop.checked = 0; window.document.step2_form.drop.disabled = 1; } else { window.document.step2_form.drop.disabled = 0; } } function ChangeDBAction(causer) { var i = 0; if (causer.value == 'oracle') { window.document.step2_form.db_action.length = 1; } else { window.document.step2_form.db_action.length = 2; } while (i < window.document.step2_form.db_action.length) { window.document.step2_form.db_action.options[i].value = options_values[i]; window.document.step2_form.db_action.options[i].text = options_text[i]; i++; } window.document.step2_form.db_action.options[window.document.step2_form.db_action.length-1].selected=1; ChangeDBDrop(window.document.step2_form.db_action); } </script> <body> <div style='height: 10px'> <?php $version = '5.0dev'; $build = '130423'; $banner = "v$version Build $build"; error_reporting(0); // --------------- // Main page code // --------------- if (! isset($_GET["step"])) { install_step1(); } else { $step = $_GET["step"]; switch ($step) { case 11: install_step1_licence(); break; case 2: install_step2(); break; case 3: install_step3(); break; case 4: install_step4(); break; case 5: install_step5(); break; } } ?> </div> </body> </html> <?php function check_extension ( $ext, $label ) { echo "<tr><td>"; echo "<span class='arr'> $label </span>"; echo "</td><td>"; if (!extension_loaded($ext)) { echo "<img src='images/dot_red.png'>"; return 1; } else { echo "<img src='images/dot_green.png'>"; return 0; } echo "</td></tr>"; } function check_include ( $ext, $label ) { echo "<tr><td>"; echo "<span class='arr'> $label </span>"; echo "</td><td>"; if (!include($ext)) { echo "<img src='images/dot_red.png'>"; return 1; } else { echo "<img src='images/dot_green.png'>"; return 0; } echo "</td></tr>"; } function check_exists ( $file, $label ) { echo "<tr><td>"; echo "<span class='arr'> $label </span>"; echo "</td><td>"; if (!file_exists ($file)) { echo " <img src='images/dot_red.png'>"; return 1; } else { echo " <img src='images/dot_green.png'>"; return 0; } echo "</td></tr>"; } function check_generic ( $ok, $label ) { echo "<tr><td>"; echo "<span class='arr'> $label </span>"; echo "</td><td>"; if ($ok == 0 ) { echo " <img src='images/dot_red.png'>"; return 1; } else { echo " <img src='images/dot_green.png'>"; return 0; } echo "</td></tr>"; } function check_writable ( $fullpath, $label ) { echo "<tr><td>"; echo "<span class='arr'> $label </span>"; echo "</td><td>"; if (file_exists($fullpath)) if (is_writable($fullpath)) { echo " <img src='images/dot_green.png'>"; echo "</td></tr>"; return 0; } else { echo " <img src='images/dot_red.png'>"; echo "</td></tr>"; return 1; } else { echo " <img src='images/dot_red.png'>"; echo "</td></tr>"; return 1; } } function check_variable ( $var, $value, $label, $mode ) { echo "<tr><td>"; echo "<span class='arr'> $label </span>"; echo "</td><td>"; if ($mode == 1) { if ($var >= $value) { echo " <img src='images/dot_green.png'>"; return 0; } else { echo " <img src='images/dot_red.png'>"; return 1; } } elseif ($var == $value) { echo " <img src='images/dot_green.png'>"; return 0; } else { echo " <img src='images/dot_red.png'>"; return 1; } echo "</td></tr>"; } function parse_mysql_dump($url) { if (file_exists($url)) { $file_content = file($url); $query = ""; foreach($file_content as $sql_line) { if (trim($sql_line) != "" && strpos($sql_line, "--") === false) { $query .= $sql_line; if(preg_match("/;[\040]*\$/", $sql_line)) { if (!$result = mysql_query($query)) { echo mysql_error(); //Uncomment for debug echo "<i><br>$query<br></i>"; return 0; } $query = ""; } } } return 1; } else return 0; } function parse_postgresql_dump($connection, $url, $debug = false) { if (file_exists($url)) { $file_content = file($url); $query = ""; foreach ($file_content as $sql_line) { $clean_line = trim($sql_line); $comment = preg_match("/^(\s|\t)*--.*$/", $clean_line); if ($comment) { continue; } if (empty($clean_line)) { continue; } $query .= $clean_line; //Check if the end of query with the the semicolon and any returns in the end of line if(preg_match("/;[\040]*\$/", $clean_line)) { //And execute and clean buffer pg_send_query($connection, $query); $result = pg_get_result($connection); if ($debug) { var_dump($query); var_dump(pg_result_error($result)); } if (pg_result_status($result) == PGSQL_FATAL_ERROR) { echo pg_result_error($result); echo "<i><br>$query<br></i>"; return 0; } $query = ""; } } return 1; } else { return 0; } } function parse_oracle_dump($connection, $url, $debug = false) { if (file_exists($url)) { $file_content = file($url); $query = ""; $plsql_block = false; foreach ($file_content as $sql_line) { $clean_line = trim($sql_line); $comment = preg_match("/^(\s|\t)*--.*$/", $clean_line); if ($comment) { continue; } if (empty($clean_line)) { continue; } //Support for PL/SQL blocks if (preg_match("/^BEGIN$/", $clean_line)) { $query .= $clean_line . ' '; $plsql_block = true; } else{ $query .= $clean_line; } //Check query's end with a back slash and any returns in the end of line or if it's a PL/SQL block 'END;;' string if ((preg_match("/;[\040]*\$/", $clean_line) && !$plsql_block) || (preg_match("/^END;;[\040]*\$/", $clean_line) && $plsql_block)) { $plsql_block = false; //Execute and clean buffer //Delete the last semicolon from current query $query = substr($query, 0, strlen($query) - 1); $sql = oci_parse($connection, $query); $result = oci_execute($sql); if ($debug) { var_dump($query); } if (!$result) { $e = oci_error($sql); echo "<tr><td><div class='warn'>Errors creating schema:</div><div style=\"overflow:auto; height:50px;\" >"; echo htmlentities($e['message'], ENT_QUOTES); echo "<i><br>$query<br></i>"; echo "</div></td></tr>"; return 0; } $query = ""; oci_free_statement($sql); } } return 1; } else { return 0; } } function oracle_drop_all_objects ($connection) { //Drop all objects of the current installation $stmt = oci_parse($connection, "BEGIN " . "FOR cur_rec IN (SELECT object_name, object_type " . "FROM user_objects " . "WHERE object_type IN ('TABLE', 'VIEW', 'PACKAGE', 'PROCEDURE', 'FUNCTION', 'SEQUENCE', 'SNAPSHOT', 'MATERIALIZED VIEW')) LOOP " . "BEGIN " . "IF cur_rec.object_type = 'TABLE' THEN " . "EXECUTE IMMEDIATE 'DROP ' || cur_rec.object_type || ' \"' || cur_rec.object_name || '\" CASCADE CONSTRAINTS'; " . "ELSE " . "EXECUTE IMMEDIATE 'DROP ' || cur_rec.object_type || ' \"' || cur_rec.object_name || '\"'; " . "END IF; " . "EXCEPTION " . "WHEN OTHERS THEN " . "DBMS_OUTPUT.put_line('FAILED: DROP ' || cur_rec.object_type || ' \"' || cur_rec.object_name || '\"'); " . "END; " . "END LOOP; " . "END; "); $result = oci_execute($stmt); oci_free_statement($stmt); return 0; } function random_name ($size) { $temp = ""; for ($a=0;$a< $size;$a++) $temp = $temp. chr(rand(122,97)); return $temp; } function print_logo_status ($step, $step_total) { global $banner; echo " <div id='logo_img'> <img src='images/pandora_logo.png' border='0'><br> <span style='font-size: 9px;'>$banner</span> <br><br> <b>Install step $step of $step_total</b> </div>"; } function install_step1() { global $banner; echo " <div id='install_container'> <div id='wizard' style='height: 480px;'> <div id='install_box'> <h2>Welcome to Pandora FMS installation Wizard</h2> <p>This wizard helps you to quick install Pandora FMS console and main database in your system.</p> <p>In four steps, this installer will check all dependencies and will create your configuration, ready to use.</p> <p>For more information, please refer to documentation.<br> <i>Pandora FMS Development Team</i></p> "; if (file_exists("include/config.php")) { echo "<div class='warn'><b>Warning:</b> You already have a config.php file. Configuration and database would be overwritten if you continued.</div>"; } echo "<br>"; echo "<table width=85%>"; $writable = check_writable ( "include", "Checking if ./include is writable"); if (file_exists("include/config.php")) $writable += check_writable ( "include/config.php", "Checking if include/config.php is writable"); echo "</table>"; echo "<div class='warn'><b>Warning:</b> This installer will <b>overwrite and destroy</b> your existing Pandora FMS configuration and <b>Database</b>. Before continue, please <b>be sure that you have no valuable Pandora FMS data in your Database</b>.<br> </div>"; echo "<div class='info'><b>Upgrade</b>: If you want to upgrade from Pandora FMS 4.x to 5.0 version, please use the migration tool inside /extras directory in this setup.</div>"; echo "</div>"; print_logo_status (1,6); echo "<div id='install_img'>"; if ($writable == 0) { echo " <br><br> <a href='install.php?step=11'><img align='right' src='images/arrow_next.png' border='0'></a>"; } else echo "<div class='warn'><b>ERROR:</b>You need to setup permissions to be able to write in ./include directory</div>"; echo " </div> </div> <div id='foot_install'> <i>Pandora FMS is an OpenSource Software project registered at <a target='_new' href='http://pandora.sourceforge.net'>SourceForge</a></i> </div> </div>"; } function install_step1_licence() { echo " <div id='install_container'> <div id='wizard' style='height: 500px;'> <div id='install_box'> <h2>GPL2 Licence terms agreement</h2> <p>Pandora FMS is an OpenSource software project licensed under the GPL2 licence. Pandora FMS includes, as well, another software also licensed under LGPL and BSD licenses. Before continue, <i>you must accept the licence terms.</i>. <p>For more information, please refer to our website at http://pandorafms.org and contact us if you have any kind of question about the usage of Pandora FMS</p> <p>If you dont accept the licence terms, please, close your browser and delete Pandora FMS files.</p> "; if (!file_exists("COPYING")) { echo "<div class='warn'><b>Licence file 'COPYING' is not present in your distribution. This means you have some 'partial' Pandora FMS distribution. We cannot continue without accepting the licence file.</b>"; echo "</div>"; } else { echo "<form method=post action='install.php?step=2'>"; echo "<textarea name='gpl2' cols=52 rows=15>"; echo file_get_contents ("COPYING"); echo "</textarea>"; echo "<p>"; echo "<input type=submit value='Yes, I accept licence terms'>"; } echo "</div>"; print_logo_status (2,6); echo "</div> <div style='clear: both;height: 1px;'><!-- --></div> <div id='foot_install'> <i>Pandora FMS is an OpenSource Software project registered at <a target='_new' href='http://pandora.sourceforge.net'>SourceForge</a></i> </div> </div>"; } function install_step2() { echo " <div id='install_container'> <div id='wizard' style='min-height: 390px;'> <div id='install_box'>"; echo "<h2>Checking software dependencies</h2>"; echo "<table border=0 width=230>"; $res = 0; $res += check_variable(phpversion(),"5.2","PHP version >= 5.2",1); $res += check_extension("gd","PHP GD extension"); $res += check_extension("ldap","PHP LDAP extension"); $res += check_extension("snmp","PHP SNMP extension"); $res += check_extension("session","PHP session extension"); $res += check_extension("gettext","PHP gettext extension"); $res += check_extension("mbstring","PHP Multibyte String"); $res += check_extension("zip","PHP Zip"); $res += check_extension("zlib","PHP Zlib extension"); $res += check_extension("curl","CURL (Client URL Library)"); if (PHP_OS == "FreeBSD") { $res += check_exists ("/usr/local/bin/twopi","Graphviz Binary"); } else if (PHP_OS == "NetBSD") { $res += check_exists ("/usr/pkg/bin/twopi","Graphviz Binary"); } else { $res += check_exists ("/usr/bin/twopi","Graphviz Binary"); } echo "<tr><td>"; echo "<span style='display: block; font-family: verdana,arial,sans; font-size: 8.5pt;margin-top: 2px; font-weight: bolder;'>DB Engines</span>"; echo "</td><td>"; echo "</td></tr>"; check_extension("mysql", "PHP MySQL extension"); check_extension("pgsql", "PHP PostgreSQL extension"); check_extension("oci8", "PHP Oracle extension"); echo "</table>"; echo "</div>"; print_logo_status (3,6); echo "<div id='install_img'>"; if ($res > 0) { echo " <div class='warn'>You have some incomplete dependencies. Please correct them or this installer will not be able to finish your installation. </div> Ignore it. <a href='install.php?step=3' style='font-weight: bolder;'>Force install Step #3</a>"; } else { echo "<a href='install.php?step=3'><br> <img align='right' src='images/arrow_next.png' border='0' alt=''></a>"; } echo " </div> <div style='clear: both;'><!-- --></div> </div> <div id='foot_install'> <i>Pandora FMS is an OpenSource Software project registered at <a target='_new' href='http://pandora.sourceforge.net'>SourceForge</a></i> </div> </div>"; } function install_step3() { $options = ''; if (extension_loaded("mysql")) { $options .= "<option value='mysql'>MySQL</option>"; } if (extension_loaded("pgsql")) { $options .= "<option value='pgsql'>PostgreSQL</option>"; } if (extension_loaded("oci8")) { $options .= "<option value='oracle'>Oracle</option>"; } $error = false; if (empty($options)) { $error = true; } echo " <div id='install_container'> <div id='wizard' style='height: 665px;'> <div id='install_box'> <h2>Environment and database setup</h2> <p> This wizard will create your Pandora FMS database, and populate it with all the data needed to run for the first time. </p> <p> You need a privileged user to create database schema, this is usually <b>root</b> user. Information about <b>root</b> user will not be used or stored anymore. </p> <p> You can also deploy the scheme into an existing Database. In this case you need a privileged Database user and password of that instance. </p> <p> Now, please, complete all details to configure your database and environment setup. </p> <div class='warn'> <b>Warning:</b> This installer will <b>overwrite and destroy</b> your existing Pandora FMS configuration and <b>Database</b>. Before continue, please <b>be sure that you have no valuable Pandora FMS data in your Database.</b> <br><br> </div>"; if (extension_loaded("oci8")) { echo " <div class='warn'>For Oracle installation an existing Database with a privileged user is needed.</div>"; } if (!$error) { echo "<form method='post' name='step2_form' action='install.php?step=4'>"; } echo "<table cellpadding=6 celwidth=100% border=0>"; echo "<tr><td>"; echo "DB Engine<br>"; if ($error) { echo " <div class='warn'> <b>Warning:</b> You haven't a any DB engine with PHP. Please check the previous step to DB engine dependencies. </div>"; } else { echo "<select name='engine' onChange=\"ChangeDBAction(this)\">"; echo $options; echo "</select>"; echo "<td>"; echo " Installation in <br>"; echo "<select name='db_action' onChange=\"ChangeDBDrop(this)\">"; echo "<option value='db_new'>A new Database</option>"; echo "<option value='db_exist'>An existing Database</option>"; echo "</select>"; } echo " <tr><td>DB User with privileges<br> <input class='login' type='text' name='user' value='root' size=8> <td>DB Password for this user<br> <input class='login' type='password' name='pass' value='' size=8> <tr><td>DB Hostname<br> <input class='login' type='text' name='host' value='localhost' size=12> <td>DB Name (pandora by default)<br> <input class='login' type='text' name='dbname' value='pandora' size=8> <tr><td valign=top> Drop Database if exists<br> <input class='login' type='checkbox' name='drop' value=1 disabled> <td>Full path to HTTP publication directory<br> <span style='font-size: 9px'>For example /var/www/pandora_console/</span> <br> <input class='login' type='text' name='path' style='width: 240px;' value='".dirname (__FILE__)."'> <tr><td colspan=2>URL path to Pandora FMS Console<br> <span style='font-size: 9px'>For example '/pandora_console'</span> </br> <input class='login' type='text' name='url' style='width: 250px;' value='".dirname ($_SERVER["SCRIPT_NAME"])."'> </table> "; if (!$error) { echo "<div align='right'><br> <input type='image' src='images/arrow_next.png' value='Step #4' id='step4'> </div>"; } echo "</form> </div>"; print_logo_status (4,6); echo "</div> <div id='foot_install'> <i>Pandora FMS is an OpenSource Software project registered at <a target='_new' href='http://pandora.sourceforge.net'>SourceForge</a></i> </div> </div>"; } function install_step4() { $pandora_config = "include/config.php"; if ( (! isset($_POST["user"])) || (! isset($_POST["dbname"])) || (! isset($_POST["host"])) || (! isset($_POST["pass"])) || (!isset($_POST['engine'])) || (! isset($_POST["db_action"])) ) { $dbpassword = ""; $dbuser = ""; $dbhost = ""; $dbname = ""; $engine = ""; $dbaction = ""; } else { $engine = $_POST['engine']; $dbpassword = $_POST["pass"]; $dbuser = $_POST["user"]; $dbhost = $_POST["host"]; $dbaction = $_POST["db_action"]; if (isset($_POST["drop"])) $dbdrop = $_POST["drop"]; else $dbdrop = 0; $dbname = $_POST["dbname"]; if (isset($_POST["url"])) $url = $_POST["url"]; else $url = "http://localhost"; if (isset($_POST["path"])) $path = $_POST["path"]; else $path = "/var/www"; } $everything_ok = 0; $step1=0; $step2=0; $step3=0; $step4=0; $step5=0; $step6=0; $step7=0; echo " <div id='install_container'> <div id='wizard' style='height: 480px;'> <div id='install_box'> <h2>Creating database and default configuration file</h2> <table>"; switch ($engine) { case 'mysql': if (! mysql_connect ($dbhost, $dbuser, $dbpassword)) { check_generic ( 0, "Connection with Database"); } else { check_generic ( 1, "Connection with Database"); // Drop database if needed and don't want to install over an existing DB if ($dbdrop == 1) { mysql_query ("DROP DATABASE IF EXISTS `$dbname`"); } // Create schema if ($dbaction == 'db_new' || $dbdrop == 1) { $step1 = mysql_query ("CREATE DATABASE `$dbname`"); check_generic ($step1, "Creating database '$dbname'"); } else { $step = 1; } if ($step1 == 1) { $step2 = mysql_select_db($dbname); check_generic ($step2, "Opening database '$dbname'"); $step3 = parse_mysql_dump("pandoradb.sql"); check_generic ($step3, "Creating schema"); $step4 = parse_mysql_dump("pandoradb_data.sql"); check_generic ($step4, "Populating database"); $random_password = random_name (8); $host = 'localhost'; if ($dbhost != 'localhost') $host = $_SERVER['SERVER_ADDR']; $step5 = mysql_query ("GRANT ALL PRIVILEGES ON `$dbname`.* to pandora@$host IDENTIFIED BY '".$random_password."'"); mysql_query ("FLUSH PRIVILEGES"); check_generic ($step5, "Established privileges for user pandora. A new random password has been generated: <b>$random_password</b><div class='warn'>Please write it down, you will need to setup your Pandora FMS server, editing the </i>/etc/pandora/pandora_server.conf</i> file</div>"); $step6 = is_writable("include"); check_generic ($step6, "Write permissions to save config file in './include'"); $cfgin = fopen ("include/config.inc.php","r"); $cfgout = fopen ($pandora_config,"w"); $config_contents = fread ($cfgin, filesize("include/config.inc.php")); $dbtype = 'mysql'; $config_new = '<?php // Begin of automatic config file $config["dbtype"] = "' . $dbtype . '"; //DB type (mysql, postgresql...in future others) $config["dbname"]="'.$dbname.'"; // MySQL DataBase name $config["dbuser"]="pandora"; // DB User $config["dbpass"]="'.$random_password.'"; // DB Password $config["dbhost"]="'.$dbhost.'"; // DB Host $config["homedir"]="'.$path.'"; // Config homedir /* ----------Attention-------------------- Please note that in certain installations: - reverse proxy. - web server in other ports. - https This variable might be dynamically altered. But it is save as backup in the $config["homeurl_static"] for expecial needs. ----------Attention-------------------- */ $config["homeurl"]="'.$url.'"; // Base URL $config["homeurl_static"]="'.$url.'"; // Don\'t delete // End of automatic config file ?>'; $step7 = fputs ($cfgout, $config_new); $step7 = $step7 + fputs ($cfgout, $config_contents); if ($step7 > 0) $step7 = 1; fclose ($cfgin); fclose ($cfgout); chmod ($pandora_config, 0600); check_generic ($step7, "Created new config file at '".$pandora_config."'"); } } if (($step7 + $step6 + $step5 + $step4 + $step3 + $step2 + $step1) == 7) { $everything_ok = 1; } break; case 'oracle': $connection = oci_connect($dbuser, $dbpassword, '//' . $dbhost . '/' . $dbname); if (!$connection) { check_generic(0, "Connection with Database"); } else { check_generic(1, "Connection with Database"); // Drop all objects if needed if ($dbdrop == 1) { oracle_drop_all_objects($connection); } $step1 = parse_oracle_dump($connection, "pandoradb.oracle.sql"); check_generic($step1, "Creating schema"); if ($step1) { $step2 = parse_oracle_dump($connection, "pandoradb.data.oracle.sql"); } check_generic ($step2, "Populating database"); echo "<tr><td><div class='warn'>Please, you will need to setup your Pandora FMS server, editing the </i>/etc/pandora/pandora_server.conf</i> file and set database password.</div></tr></td>"; if ($step2) { $step3 = is_writable("include"); } check_generic ($step3, "Write permissions to save config file in './include'"); if ($step3) { $cfgin = fopen ("include/config.inc.php","r"); $cfgout = fopen ($pandora_config,"w"); $config_contents = fread ($cfgin, filesize("include/config.inc.php")); $dbtype = 'oracle'; $config_new = '<?php // Begin of automatic config file $config["dbtype"] = "' . $dbtype . '"; //DB type (mysql, postgresql, oracle) $config["dbname"]="' . $dbname . '"; // Oracle DataBase name $config["dbuser"]="' . $dbuser . '"; // DB User $config["dbpass"]="' . $dbpassword . '"; // DB Password $config["dbhost"]="' . $dbhost . '"; // DB Host $config["homedir"]="' . $path . '"; // Config homedir /* ----------Attention-------------------- Please note that in certain installations: - reverse proxy. - web server in other ports. - https This variable might be dynamically altered. But it is save as backup in the $config["homeurl_static"] for expecial cases. ----------Attention-------------------- */ $config["homeurl"]="' . $url . '"; // Base URL $config["homeurl_static"]="'.$url.'"; // Don\'t delete // End of automatic config file ?>'; $step4 = fputs ($cfgout, $config_new); $step4 = $step4 + fputs ($cfgout, $config_contents); if ($step4 > 0) $step4 = 1; fclose ($cfgin); fclose ($cfgout); chmod ($pandora_config, 0600); } check_generic ($step4, "Created new config file at '" . $pandora_config . "'"); if (($step4 + $step3 + $step2 + $step1) == 4) { $everything_ok = 1; } } break; case 'pgsql': $step1 = $step2 = $step3 = $step4 = $step5 = $step6 = $step7 = 0; $connection = pg_connect("host='" . $dbhost . "' user='" . $dbuser . "' password='" . $dbpassword . "'"); if ($connection === false) { check_generic(0, "Connection with Database"); } else { check_generic(1, "Connection with Database"); // Drop database if needed if ($dbdrop == 1 && $dbaction == 'db_exist') { $result = pg_query($connection, "DROP DATABASE \"" . $dbname . "\";"); } if ($dbaction != 'db_exist' || $dbdrop == 1) { pg_send_query($connection, "CREATE DATABASE \"" . $dbname . "\" WITH ENCODING 'utf8';"); $result = pg_get_result($connection); if (pg_result_status($result) != PGSQL_FATAL_ERROR) { $step1 = 1; } check_generic ($step1, "Creating database '$dbname'"); } else { $step1 = 1; } check_generic ($step1, "Creating database '$dbname'"); if ($step1 == 1) { //Reopen DB because I don't know how to use DB in PostgreSQL pg_close($connection); $connection = pg_connect("host='" . $dbhost . "' dbname='" . $dbname . "' user='" . $dbuser . "' password='" . $dbpassword . "'"); if ($connection !== false) { $step2 = 1; } } check_generic ($step2, "Opening database '$dbname'"); if ($step2) { $step3 = parse_postgresql_dump($connection, "pandoradb.postgreSQL.sql"); } check_generic($step3, "Creating schema"); if ($step3) { $step4 = parse_postgresql_dump($connection, "pandoradb.data.postgreSQL.sql"); } check_generic ($step4, "Populating database"); if ($step4) { $random_password = random_name (8); pg_query($connection, "DROP USER pandora"); pg_send_query($connection, "CREATE USER pandora WITH PASSWORD '" . $random_password . "'"); $result = pg_get_result($connection); if (pg_result_status($result) != PGSQL_FATAL_ERROR) { //Set the privileges for DB pg_send_query($connection, "GRANT ALL PRIVILEGES ON DATABASE pandora TO pandora;"); $result = pg_get_result($connection); $setDBPrivileges = 0; if (pg_result_status($result) != PGSQL_FATAL_ERROR) { $setDBPrivileges = 1; } if ($setDBPrivileges) { //Set the privileges for each tables. pg_send_query($connection, "SELECT table_name FROM information_schema.tables WHERE table_schema = 'public';"); $result = pg_get_result($connection); $tables = array(); while ($row = pg_fetch_assoc($result)) { $tables[] = $row['table_name']; } $correct = 1; foreach ($tables as $table) { pg_send_query($connection, "GRANT ALL PRIVILEGES ON TABLE " . $table . " TO pandora;"); $result = pg_get_result($connection); if (pg_result_status($result) == PGSQL_FATAL_ERROR) { $correct = 0; break; } //For each table make owner pandora pg_send_query($connection, "ALTER TABLE " . $table . " OWNER TO pandora;"); $result = pg_get_result($connection); if (pg_result_status($result) == PGSQL_FATAL_ERROR) { $correct = 0; break; } //INI ----- Grant for secuences pg_send_query($connection, "SELECT column_name FROM information_schema.columns WHERE table_name = '" . $table . "';"); $result2 = pg_get_result($connection); $columns = array(); while ($row = pg_fetch_assoc($result2)) { $columns[] = $row['column_name']; } //Check for each column if it have a sequence to grant foreach ($columns as $column) { pg_send_query($connection, "SELECT pg_get_serial_sequence('" . $table . "', '" . $column . "');"); $result3 = pg_get_result($connection); $sequence = pg_fetch_assoc($result3); if (!empty($sequence['pg_get_serial_sequence'])) { pg_send_query($connection, "GRANT ALL PRIVILEGES ON SEQUENCE " . $sequence['pg_get_serial_sequence'] . " to pandora;"); $result4 = pg_get_result($connection); if (pg_result_status($result4) == PGSQL_FATAL_ERROR) { $correct = 0; break; } } } //END ----- Grant for secuences } if ($correct) { $step5 = 1; } } } } check_generic ($step5, "Established privileges for user pandora. A new random password has been generated: <b>$random_password</b><div class='warn'>Please write it down, you will need to setup your Pandora FMS server, editing the </i>/etc/pandora/pandora_server.conf</i> file</div>"); if ($step5) { $step6 = is_writable("include"); } check_generic ($step6, "Write permissions to save config file in './include'"); if ($step6) { $cfgin = fopen ("include/config.inc.php","r"); $cfgout = fopen ($pandora_config,"w"); $config_contents = fread ($cfgin, filesize("include/config.inc.php")); $dbtype = 'postgresql'; $config_new = '<?php // Begin of automatic config file $config["dbtype"] = "' . $dbtype . '"; //DB type (mysql, postgresql...in future others) $config["dbname"]="'.$dbname.'"; // MySQL DataBase name $config["dbuser"]="pandora"; // DB User $config["dbpass"]="'.$random_password.'"; // DB Password $config["dbhost"]="'.$dbhost.'"; // DB Host $config["homedir"]="'.$path.'"; // Config homedir /* ----------Attention-------------------- Please note that in certain installations: - reverse proxy. - web server in other ports. - https This variable might be dynamically altered. But it is save as backup in the $config["homeurl_static"] for expecial cases. ----------Attention-------------------- */ $config["homeurl"]="'.$url.'"; // Base URL $config["homeurl_static"]="'.$url.'"; // Don\'t delete // End of automatic config file ?>'; $step7 = fputs ($cfgout, $config_new); $step7 = $step7 + fputs ($cfgout, $config_contents); if ($step7 > 0) $step7 = 1; fclose ($cfgin); fclose ($cfgout); chmod ($pandora_config, 0600); } check_generic ($step7, "Created new config file at '".$pandora_config."'"); if (($step7 + $step6 + $step5 + $step4 + $step3 + $step2 + $step1) == 7) { $everything_ok = 1; } } break; } echo "</table></div>"; print_logo_status(5,6); echo "<div id='install_img'>"; if ($everything_ok == 1) { echo "<br><br><a href='install.php?step=5'> <img align='right' src='images/arrow_next.png' border='0' alt=''></a>"; } else { $info = "<div class='warn'><b>There were some problems. Installation was not completed.</b> <p>Please correct failures before trying again. All database "; if ($engine == 'oracle') $info .= "objects "; else $info .= "schemes "; $info .= "created in this step have been dropped. </p> </div>"; echo $info; switch ($engine) { case 'mysql': if (mysql_error() != "") { echo "<div class='warn'> <b>ERROR:</b> ". mysql_error().".</div>"; } if ($step1 == 1) { mysql_query ("DROP DATABASE $dbname"); } break; case 'pgsql': break; case 'oracle': oracle_drop_all_objects($connection); break; } } echo " </div> </div> <div id='foot_install'> <i>Pandora FMS is an Open Source Software project registered at <a target='_new' href='http://pandora.sourceforge.net'>SourceForge</a></i> </div> </div>"; } function install_step5() { echo " <div id='install_container'> <div id='wizard' style='height: 300px;'> <div id='install_box'> <h2>Installation complete</h2> <p>For security, you now must manually delete this installer ('<i>install.php</i>') file before trying to access to your Pandora FMS console. <p>You should also install Pandora FMS Servers before trying to monitor anything; please read documentation on how to install it.</p> <p>Default user is <b>'admin'</b> with password <b>'pandora'</b>, please change it both as soon as possible.</p> <p>Don't forget to check <a href='http://pandorafms.com'>http://pandorafms.com</a> for updates. <p><br><b><a href='index.php'>Click here to access to your Pandora FMS console</a>.</b> </p> </div>"; print_logo_status (6,6); echo "</div> <div id='foot_install'> <i>Pandora FMS is an OpenSource Software project registered at <a target='_new' href='http://pandora.sourceforge.net'>SourceForge</a></i> </div> </div>"; } ?>