<?php
///////////////////////////////////////////////////////////////////////////////
//
// NagiosQL
//
///////////////////////////////////////////////////////////////////////////////
//
// (c) 2005-2018 by Martin Willisegger
//
// Project   : NagiosQL
// Component : Installer script - step 1
// Website   : https://sourceforge.net/projects/nagiosql/
// Version   : 3.4.0
// GIT Repo  : https://gitlab.com/wizonet/NagiosQL
//
///////////////////////////////////////////////////////////////////////////////
//
// Prevent this file from direct access
// ====================================
if (preg_match('#' . basename(__FILE__) . '#', htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES, 'utf-8'))) {
    header('Location: install.php');
    exit;
}
//
// Define common variables
// =======================
$preIncludeContent = $preBasePath.'install/templates/step1.htm.tpl';
$intError          = 0;
//
// Define check arrays
// ===================
$arrRequiredExt = array(
    'Session' => 'session',
    'Gettext' => 'gettext',
    'Filter'  => 'filter'
);
$arrOptionalExt = array(
    'FTP'     => 'ftp',
    'SSH2'    => 'ssh2'
);
$arrSupportedDBs = array(
    'MySQLi'  => 'mysqli'
);
$arrIniCheck = array(
    'file_uploads'            => 1,
    'session.auto_start'      => 0,
    'suhosin.session.encrypt' => 0,
    'date.timezone'           => '-NOTEMPTY-'
);
$arrSourceURLs = array(
    'Sockets'       => 'http://www.php.net/manual/en/book.sockets.php',
    'Session'       => 'http://www.php.net/manual/en/book.session.php',
    'PCRE'          => 'http://www.php.net/manual/en/book.pcre.php',
    'FileInfo'      => 'http://www.php.net/manual/en/book.fileinfo.php',
    'Mcrypt'        => 'http://www.php.net/manual/en/book.mcrypt.php',
    'OpenSSL'       => 'http://www.php.net/manual/en/book.openssl.php',
    'JSON'          => 'http://www.php.net/manual/en/book.json.php',
    'DOM'           => 'http://www.php.net/manual/en/book.dom.php',
    'Intl'          => 'http://www.php.net/manual/en/book.intl.php',
    'gettext'       => 'http://www.php.net/manual/en/book.gettext.php',
    'curl'          => 'http://www.php.net/manual/en/book.curl.php',
    'Filter'        => 'http://www.php.net/manual/en/book.filter.php',
    'XML'           => 'http://www.php.net/manual/en/book.xml.php',
    'SimpleXML'     => 'http://www.php.net/manual/en/book.simplexml.php',
    'FTP'           => 'http://www.php.net/manual/en/book.ftp.php',
    'MySQL'         => 'http://php.net/manual/de/book.mysqli.php',
    'PEAR'          => 'http://pear.php.net',
    'date.timezone' => 'http://www.php.net/manual/en/datetime.configuration.php#ini.date.timezone',
    'SSH2'          => 'http://pecl.php.net/package/ssh2'
);
//
// Build content
// =============
$arrTemplate['STEP1_BOX']       = $myInstClass->translate('Requirements');
$arrTemplate['STEP2_BOX']       = $myInstClass->translate('Installation');
$arrTemplate['STEP3_BOX']       = $myInstClass->translate('Finish');
$arrTemplate['STEP1_TITLE']     = 'NagiosQL ' .$myInstClass->translate('Installation'). ': ' .
    $myInstClass->translate('Checking requirements');
$arrTemplate['STEP1_SUBTITLE1'] = $myInstClass->translate('Checking Client');
$arrTemplate['STEP1_SUBTITLE2'] = $myInstClass->translate('Checking PHP version');
$arrTemplate['STEP1_SUBTITLE3'] = $myInstClass->translate('Checking PHP extensions');
$arrTemplate['STEP1_SUBTITLE4'] = $myInstClass->translate('Checking available database interfaces');
$arrTemplate['STEP1_SUBTITLE5'] = $myInstClass->translate('Checking php.ini/.htaccess settings');
$arrTemplate['STEP1_SUBTITLE6'] = $myInstClass->translate('Checking System Permission');
$arrTemplate['STEP1_TEXT3_1']   = $myInstClass->translate('The following modules/extensions are <em>required</em> '
    . 'to run NagiosQL');
$arrTemplate['STEP1_TEXT3_2']   = $myInstClass->translate('The next couple of extensions are <em>optional</em> but '
    . 'recommended');
$arrTemplate['STEP1_TEXT4_1']   = $myInstClass->translate('Check which of the supported extensions are installed. At '
    . 'least one of them is required.');
$arrTemplate['STEP1_TEXT5_1']   = $myInstClass->translate('The following settings are <em>required</em> to run '
    . 'NagiosQL');
//
// Conditional checks
// =======================
$strHTMLPart1 = '<img src="images/valid.png" alt="valid" title="valid" class="textmiddle"> ';
$strHTMLPart2 = '<img src="images/invalid.png" alt="invalid" title="invalid" class="textmiddle"> ';
$strHTMLPart3 = '<img src="images/warning.png" alt="warning" title="warning" class="textmiddle"> ';
$strHTMLPart4 = ': <span class="green">';
$strHTMLPart5 = ': <span class="red">';
$strHTMLPart6 = ': <span class="yellow">';
$strHTMLPart7 = '<img src="images/onlinehelp.png" alt="online help" title="online help" class="textmiddle" '
    . 'style="border:none;">';

// Javascript check
if ($_SESSION['install']['jscript'] == 'yes') {
    $arrTemplate['CHECK_1_PIC']   = 'valid';
    $arrTemplate['CHECK_1_CLASS'] = 'green';
    $arrTemplate['CHECK_1_VALUE'] = $myInstClass->translate('ENABLED');
    $arrTemplate['CHECK_1_INFO']  = '';
} else {
    $arrTemplate['CHECK_1_PIC']   = 'invalid';
    $arrTemplate['CHECK_1_CLASS'] = 'green';
    $arrTemplate['CHECK_1_VALUE'] = $myInstClass->translate('NOT ENABLED');
    $arrTemplate['CHECK_1_INFO']  = '(' .$myInstClass->translate('After enabling Javascript, the page must be updated '
            . 'twice so that the status changes'). ')';
}
// PHP version check
$strMinPHPVersion = '5.5.0';
$arrTemplate['CHECK_2_TEXT'] = $myInstClass->translate('Version');
if (version_compare(PHP_VERSION, $strMinPHPVersion, '>=')) {
    $arrTemplate['CHECK_2_PIC']   = 'valid';
    $arrTemplate['CHECK_2_CLASS'] = 'green';
    $arrTemplate['CHECK_2_VALUE'] = $myInstClass->translate('OK');
    $arrTemplate['CHECK_2_INFO']  = '(PHP ' . PHP_VERSION . ' ' .$myInstClass->translate('detected'). ')';
} else {
    $arrTemplate['CHECK_2_PIC']   = 'invalid';
    $arrTemplate['CHECK_2_CLASS'] = 'green';
    $arrTemplate['CHECK_2_VALUE'] = 'PHP ' . PHP_VERSION . ' ' .$myInstClass->translate('detected');
    $arrTemplate['CHECK_2_INFO']  = '(PHP ' . $strMinPHPVersion . ' ' .$myInstClass->translate('or greater is '
            . 'required'). ')';
    $intError = 1;
}
// PHP modules / extensions
$strExtPath = ini_get('extension_dir');
$strPrefix  = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : '';
$strHTML1   = '';
foreach ($arrRequiredExt as $key => $elem) {
    if (extension_loaded($elem)) {
        $strHTML1 .= $strHTMLPart1.$key.$strHTMLPart4.$myInstClass->translate('OK')."</span>\n";
    } else {
        $strPath   = $strExtPath. '/' .$strPrefix.$elem. '.' .PHP_SHLIB_SUFFIX;
        $strMsg    = is_readable($strPath) ? $myInstClass->translate('Could be loaded. Please add in php.ini')
            : '<a href="' .$arrSourceURLs[$key]. '" target="_blank">' .$strHTMLPart7. '</a>';
        $strHTML1 .= $strHTMLPart2.$key.$strHTMLPart5.$myInstClass->translate('NOT AVAILABLE'). ' (' .$strMsg. ')'
            . "</span>\n";
        $intError  = 1;
    }
    $strHTML1 .= "<br>\n";
}
$arrTemplate['CHECK_3_CONTENT_1'] = $strHTML1;
$strHTML2   = '';
foreach ($arrOptionalExt as $key => $elem) {
    if (extension_loaded($elem)) {
        $strHTML2 .= $strHTMLPart1.$key.$strHTMLPart4.$myInstClass->translate('OK')."</span>\n";
    } else {
        $strPath   = $strExtPath. '/' .$strPrefix.$elem. '.' .PHP_SHLIB_SUFFIX;
        $strMsg    = is_readable($strPath) ? $myInstClass->translate('Could be loaded. Please add in php.ini')
            : '<a href="' .$arrSourceURLs[$key]. '" target="_blank">' .$strHTMLPart7. '</a>';
        $strHTML2 .= $strHTMLPart3.$key.$strHTMLPart6.$myInstClass->translate('NOT AVAILABLE'). ' (' .$strMsg. ')'
            . "</span>\n";
        //$intError = 1;
    }
    $strHTML2 .= "<br>\n";
}
$arrTemplate['CHECK_3_CONTENT_2'] = $strHTML2;
// PHP database interfaces
$strHTML3 = '';
$intTemp  = 0;
$_SESSION['install']['dbtype_available'] = array();
foreach ($arrSupportedDBs as $key => $elem) {
    if (extension_loaded($elem)) {
        $strNewInstallOnly = '';
        if (isset($_SESSION['install']['dbtype']) && ($_SESSION['install']['mode'] == 'Update') &&
            ($_SESSION['install']['dbtype'] != $elem) &&
            (0 !== strpos($_SESSION['install']['dbtype'], substr($elem, 0, 5)))) {
            $strNewInstallOnly = ' (' .$myInstClass->translate('New installation only - updates are only supported '
                    . 'using the same database interface!'). ')';
        }
        $strHTML3 .= $strHTMLPart1.$key.$strHTMLPart4.$myInstClass->translate('OK')."</span>  $strNewInstallOnly\n";
        if ($strNewInstallOnly == '') {
            $_SESSION['install']['dbtype_available'][] = $elem;
        }
        $intTemp++;
    } else {
        $strPath   = $strExtPath. '/' .$strPrefix.$elem. '.' .PHP_SHLIB_SUFFIX;
        $strMsg    = is_readable($strPath) ? $myInstClass->translate('Could be loaded. Please add in php.ini')
            : '<a href="' .$arrSourceURLs[$key]. '" target="_blank">' .$strHTMLPart7. '</a>';
        $strHTML3 .= $strHTMLPart2.$key.$strHTMLPart5.$myInstClass->translate('NOT AVAILABLE'). ' (' .$strMsg. ')'
            . "</span>\n";
    }
    $strHTML3 .= "<br>\n";
}
$arrTemplate['CHECK_4_CONTENT_1'] = $strHTML3;
if ($intTemp == 0) {
    $intError = 1;
}
// PHP ini checks
$strHTML4 = '';
foreach ($arrIniCheck as $key => $elem) {
    $strStatus = ini_get($key);
    if ($elem === '-NOTEMPTY-') {
        if (empty($strStatus)) {
            $strHTML4 .= $strHTMLPart2.$key.$strHTMLPart5.$myInstClass->translate('NOT AVAILABLE'). ' (' .
                $myInstClass->translate('cannot be empty and needs to be set').")</span>\n";
            $intError = 1;
        } else {
            $strHTML4 .= $strHTMLPart1.$key.$strHTMLPart4.$myInstClass->translate('OK')."</span>\n";
        }
    } else {
        if ($strStatus == $elem) {
            $strHTML4 .= $strHTMLPart1.$key.$strHTMLPart4.$myInstClass->translate('OK')."</span>\n";
        } else {
            $strHTML4 .= $strHTMLPart2.$key.$strHTMLPart5.$strStatus. ' (' .$myInstClass->translate('should be'). ' ' .
                $elem.")</span>\n";
            $intError = 1;
        }
    }
    $strHTML4 .= "<br>\n";
}
$arrTemplate['CHECK_5_CONTENT_1'] = $strHTML4;
// File access checks
$strConfigFile = '../config/settings.php';
if (file_exists($strConfigFile) && is_readable($strConfigFile)) {
    $arrTemplate['CHECK_6_CONTENT_1'] = $strHTMLPart1.$myInstClass->translate('Read test on settings file '
            . '(config/settings.php)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} elseif (file_exists($strConfigFile)&& !is_readable($strConfigFile)) {
    $arrTemplate['CHECK_6_CONTENT_1'] = $strHTMLPart2.$myInstClass->translate('Read test on settings file '
            . '(config/settings.php)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
} elseif (!file_exists($strConfigFile)) {
    $arrTemplate['CHECK_6_CONTENT_1'] = $strHTMLPart3.$myInstClass->translate('Settings file does not exists '
            . '(config/settings.php)').$strHTMLPart6.$myInstClass->translate('will be created')."</span><br>\n";
}
if (file_exists($strConfigFile) && is_writable($strConfigFile)) {
    $arrTemplate['CHECK_6_CONTENT_2'] = $strHTMLPart1.$myInstClass->translate('Write test on settings file '
            . '(config/settings.php)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} elseif (is_writable('../config') && !file_exists($strConfigFile)) {
    $arrTemplate['CHECK_6_CONTENT_2'] = $strHTMLPart1.$myInstClass->translate('Write test on settings directory '
            . '(config/)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} elseif (file_exists($strConfigFile) && !is_writable($strConfigFile)) {
    $arrTemplate['CHECK_6_CONTENT_2'] = $strHTMLPart2.$myInstClass->translate('Write test on settings file '
            . '(config/settings.php)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
} else {
    $arrTemplate['CHECK_6_CONTENT_2'] = $strHTMLPart2.$myInstClass->translate('Write test on settings directory '
            . '(config/)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
}
$strClassFile = '../functions/NagVisualClass.php';
if (file_exists($strClassFile) && is_readable($strClassFile)) {
    $arrTemplate['CHECK_6_CONTENT_3'] = $strHTMLPart1.$myInstClass->translate('Read test on one class file '
            . '(functions/NagVisualClass.php)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} else {
    $arrTemplate['CHECK_6_CONTENT_3'] = $strHTMLPart2.$myInstClass->translate('Read test on one class file '
            . '(functions/NagVisualClass.php)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
}
$strFile1 = '../admin.php';
if (file_exists($strFile1) && is_readable($strFile1)) {
    $arrTemplate['CHECK_6_CONTENT_4'] = $strHTMLPart1.$myInstClass->translate('Read test on home page file '
            . '(admin.php)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} else {
    $arrTemplate['CHECK_6_CONTENT_4'] = $strHTMLPart2.$myInstClass->translate('Read test on home page file '
            . '(admin.php)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
}
$strFile2 = '../templates/index.htm.tpl';
if (file_exists($strFile2) && is_readable($strFile2)) {
    $arrTemplate['CHECK_6_CONTENT_5'] = $strHTMLPart1.$myInstClass->translate('Read test on one template file '
            . '(templates/index.tpl.htm)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} else {
    $arrTemplate['CHECK_6_CONTENT_5'] = $strHTMLPart2.$myInstClass->translate('Read test on one template file '
            . '(templates/index.tpl.htm)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
}
$strFile3 = '../templates/admin/datalist.htm.tpl';
if (file_exists($strFile3) && is_readable($strFile3)) {
    $arrTemplate['CHECK_6_CONTENT_6'] = $strHTMLPart1.$myInstClass->translate('Read test on one admin template file '
            . '(templates/admin/datalist.htm.tpl)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} else {
    $arrTemplate['CHECK_6_CONTENT_6'] = $strHTMLPart2.$myInstClass->translate('Read test on one admin template file '
            . '(templates/admin/datalist.htm.tpl)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
}
$strFile4 = '../templates/files/contacts.tpl.dat';
if (file_exists($strFile4) && is_readable($strFile4)) {
    $arrTemplate['CHECK_6_CONTENT_7'] = $strHTMLPart1.$myInstClass->translate('Read test on one file template '
            . '(templates/files/contacts.tpl.dat)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} else {
    $arrTemplate['CHECK_6_CONTENT_7'] = $strHTMLPart2.$myInstClass->translate('Read test on one file template '
            . '(templates/files/contacts.tpl.dat)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
}
$strFile5 = '../images/pixel.gif';
if (file_exists($strFile5) && is_readable($strFile5)) {
    $arrTemplate['CHECK_6_CONTENT_8'] = $strHTMLPart1.$myInstClass->translate('Read test on one image file '
            . '(images/pixel.gif)').$strHTMLPart4.$myInstClass->translate('OK')."</span><br>\n";
} else {
    $arrTemplate['CHECK_6_CONTENT_9'] = $strHTMLPart2.$myInstClass->translate('Read test on one image file '
            . '(images/pixel.gif)').$strHTMLPart5.$myInstClass->translate('failed')."</span><br>\n";
    $intError = 1;
}
if ($intError != 0) {
    $arrTemplate['MESSAGE']     = '<span class="red">' .$myInstClass->translate('There are some errors - please '
            . 'check your system settings and read the requirements of NagiosQL!')."</span><br><br>\n";
    $arrTemplate['MESSAGE']    .= $myInstClass->translate('Read the INSTALLATION file in the NagiosQL doc directory '
        . 'or the installation PDF file on our');
    $arrTemplate['MESSAGE']    .= ' <a href="https://sourceforge.net/projects/nagiosql/documentation.html" '
        . 'target="_blank">';
    $arrTemplate['MESSAGE']    .= $myInstClass->translate('online documentation'). '</a><br>' .
        $myInstClass->translate('site to find out, how to fix them.') ."<br>\n";
    $arrTemplate['MESSAGE']    .= $myInstClass->translate('After that - refresh this page to proceed') ."...<br>\n";
    $arrTemplate['DIV_ID']     = 'install-center';
    $arrTemplate['FORM_CONTENT']  = '<input type="image" src="images/reload.png" title="refresh" '
        . 'value="Submit" alt="refresh" onClick="window.location.reload()"><br>';
    $arrTemplate['FORM_CONTENT'] .= $myInstClass->translate('Refresh')."\n";
} else {
    $arrTemplate['MESSAGE']  = '<span class="green">' .$myInstClass->translate('Environment test completed '
            . 'successfully')."</span><br><br>\n";
    $arrTemplate['DIV_ID']   = 'install-next';
    $arrTemplate['FORM_CONTENT']  = "<input type=\"hidden\" name=\"hidStep\" id=\"hidStep\" value=\"2\">\n";
    $arrTemplate['FORM_CONTENT'] .= '<input type="image" src="images/next.png" value="Submit" title="next" '
        . 'alt="next"><br>' .$myInstClass->translate('Next')."\n";
}
//
// Write content
// =============
$strContent = $myInstClass->parseTemplate($arrTemplate, $preIncludeContent);
echo $strContent;