<?php
//Tester les modules php, extensions, mémoire
//Tester la communication FTP vers l'exterieur, connexion base carthame
//Tester si le fichier de configuration de l'agent est bien créé et le montrer

function test_config($requirements) {
    header('Content-type: text/html; charset=UTF-8');
    $out = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                <html xmlns="http://www.w3.org/1999/xhtml">
                <head>
                <title>Vérification du système</title><meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                <link rel="stylesheet" type="text/css" href="css/styles.css" />
                <link rel="shortcut icon" type="image/x-icon" href="css/images/favicon.ico" />
                </head>
                <body>
                <h1 class="bigTitle">Vérification de l\'environnement système APACHE/PHP et Agent SIGB</h1>';
 
    //Vérification de la configuration de PHP
    $out .= '<fieldset>';
    $out .= '<legend id="legend_php" class="collapsible"><a href="#" onclick="javascript:if (document.getElementById(\'legend_php\').className==\'collapsible\') { document.getElementById(\'php_content\').style.display=\'none\';document.getElementById(\'legend_php\').className=\'collapsed\';} else { document.getElementById(\'php_content\').style.display=\'block\';document.getElementById(\'legend_php\').className=\'collapsible\'; }return false;">Configuration PHP</a></legend><div id="php_content">';
    $out .= '<ul>';
    $out .= '<li><a href="?info">Voir le Php Info</a></li></ul>';
    $phpversion = phpversion();
    list($php_majeur, $php_mineur) = explode(".", $phpversion);
    if ($php_majeur >= 5 && $php_mineur >= 2) {
        $class = 'ok';
        $error_msg = '';
    }
    else {
        $class = 'nok';
        $error_msg = '<strong>PHP doit être en version 5.2.X</strong>';
    }
    $out .= '<ul><li>Version PHP courante : <b>' . $phpversion.'</b><span class="'.$class.'">&nbsp;'.$error_msg.'</span></li>';
    $out .= '<li>Mode PHP : '.php_sapi_name().'</li>';

    $mem = str_replace('M','',ini_get('memory_limit'));
    if ($mem < 100) {
        $out .= nok('La taille de la mémoire alouée à PHP est < à 100 M</b>'.ini_get('memory_limit'));
    }
    else {
        $out .= ok('La taille de la mémoire alouée à PHP est > à 100 M : '.ini_get('memory_limit'));
    }
    $out .= '</ul><br />';
    $out .= '<strong>Test des extensions PHP :</strong><ul>';
 
    $ext_array = get_loaded_extensions();
    $ext = $requirements['php'];
    $extBlocking = false;
    foreach($ext as $val) {
        if (in_array($val, $ext_array)) {
            $out .= ok('L\'extension <em>'.$val.'</em> est bien chargée');
        }
        else{
            if ($php_majeur <= 5 && $php_mineur <= 2) @dl($val); //Non compatible avec PHP 5.3.X
            if (extension_loaded($val)) {
                $out .= warning('Extension <em>'.$val.'</em> chargée dynamiquement, penser à l\'activer dans le php.ini');
            }
            else{
                $out .= nok('L\'extension <em>'.$val.'</em> n\'est pas chargée');
                if ($val == 'interbase') {
                    //bloquant pour le test ktm
                    $extBlocking = true;
                }
            }
        }
    }

    $out .= '</ul>';
    $out .= '</div></fieldset>';

    //Vérification de la configuration d'Apache
    $out .= '<fieldset>';
    $out .= '<legend id="legend_apache" class="collapsible"><a href="#" onclick="javascript:if (document.getElementById(\'legend_apache\').className==\'collapsible\') { document.getElementById(\'apache_content\').style.display=\'none\';document.getElementById(\'legend_apache\').className=\'collapsed\';} else { document.getElementById(\'apache_content\').style.display=\'block\';document.getElementById(\'legend_apache\').className=\'collapsible\'; }return false;">Configurations Apache</a></legend><div id="apache_content">';

    if (function_exists('apache_get_version')) {
        $apacheversion = apache_get_version();
        $apacheversiontemp1 = explode(" ", $apacheversion);
        $apacheversiontemp2 = explode("/", $apacheversiontemp1[0], 2);
        list($apache_majeur, $apache_mineur) = explode(".", $apacheversiontemp2[1]);
        if ($apache_majeur >= 2 && $apache_mineur >= 2) {
            $class = 'ok';
            $error_msg = '';
        }
        else {
            $class = 'nok';
            $error_msg = '<strong>Apache doit être en version 2.2.X</strong>';
        }
        $out .= '<ul><li>Version Apache courante : <b>' . $apacheversiontemp2[1].'</b><span class="'.$class.'">&nbsp;'.$error_msg.'</span></li></ul>';
        $out .= '<strong>Test des modules Apache :</strong><ul>';
        $ext_apache_array = array_flip(apache_get_modules());
        $ext = $requirements['apache'];
        foreach ($ext as $val) {
            if (in_array($val, $ext_apache_array)){
                $out .= ok('Le module '.$val .' est bien chargé');
            }
            else {
                $out .= warning('Le module '.$val .' n\'est pas chargé');
            }
        }
    }
    else {
        $out .= info('Récupération des modules Apache impossible, il se peut que PHP soit en mode CGI');
        $out .= '<li>Mode PHP : '.php_sapi_name().'</li>';
        $out .= '<li>Pour information, voici les extensions Apaches nécessaires</li>';
        $out .= '<br><br>';
        $ext = $requirements['apache'];
        foreach ($ext as $val) {
            $out .= info(''.$val.'');
        }
    }
    $out .= '</ul>';
    $out .= '</div></fieldset>';

    //Communication externe
    $out .= '<fieldset>';
    $out .= '<legend id="legend_comm" class="collapsible"><a href="#" onclick="javascript:if (document.getElementById(\'legend_comm\').className==\'collapsible\') { document.getElementById(\'comm_content\').style.display=\'none\';document.getElementById(\'legend_comm\').className=\'collapsed\';} else { document.getElementById(\'comm_content\').style.display=\'block\';document.getElementById(\'legend_comm\').className=\'collapsible\'; }return false;">Communication avec l\'extérieur</a></legend><div id="comm_content">';
    $out .= '<strong>Test de connexion FTP :</strong>';
    $out .= '<ul>';
    $test_ftp = ftp_connect('upload.bibenligne.fr');
    if ($test_ftp) $out .= ok('Connexion au FTP <em>upload.bibenligne.fr</em> OK');
    else $out .= '<li>Connexion au FTP <em>upload.bibenligne.fr</em> impossible</li>';
    $out .= '</ul>';
    $out .= '</div></fieldset>';

    //Vérification de la configuration de l'agent
    $out .= '<fieldset>';
    $out .= '<legend id="legend_agent" class="collapsible"><a href="#" onclick="javascript:if (document.getElementById(\'legend_agent\').className==\'collapsible\') { document.getElementById(\'agent_content\').style.display=\'none\';document.getElementById(\'legend_agent\').className=\'collapsed\';} else { document.getElementById(\'agent_content\').style.display=\'block\';document.getElementById(\'legend_agent\').className=\'collapsible\'; }return false;">Configuration de l\'agent SIGB</a></legend><div id="agent_content">';
    $out .= '<strong>Client '.$_REQUEST['idclient'].'</strong>';
    $out .= '<ul>';
    $config_present = false;
    $ini_path = '';
    $default_ini = true;
    if (file_exists('../client/config/'.$_REQUEST['idclient'].'/config.ini')) {
        $ini_path = '../client/config/'.$_REQUEST['idclient'].'/config.ini';
        $default_ini = false;
    }
    elseif (file_exists('../client/config/config.ini')) $ini_path = '../client/config/config.ini';
    if (!empty($ini_path)) {
        $config_present = true;
        $out .= (!$default_ini ? ok('Fichier de configuration client présent') : warning('Fichier de configuration client introuvable mais fichier par défaut trouvé'));
        $ini_array = parse_ini_file($ini_path, TRUE);
        $out .= '<li>Détails :<br /><br /><div class="config">';
        foreach ($ini_array as $part => $tabConfig) {
            $out .= '<strong>['.$part.']</strong><br />';
            foreach ($tabConfig as $key => $val) {
                $out .= $key.'='.$val.'<br />';
            }
            $out .= '<br />';
        }
        $out .= '</div></li>';
    }
    else {
        $out .= nok('Fichier de configuration introuvable');
    }

    $out .= '</div></fieldset>';

    //Test de connexion au SIGB
    if ($config_present) {
        $out .= '<fieldset>';
        $out .= '<legend id="legend_sigb" class="collapsible"><a href="#" onclick="javascript:if (document.getElementById(\'legend_sigb\').className==\'collapsible\') { document.getElementById(\'sigb_content\').style.display=\'none\';document.getElementById(\'legend_sigb\').className=\'collapsed\';} else { document.getElementById(\'sigb_content\').style.display=\'block\';document.getElementById(\'legend_sigb\').className=\'collapsible\'; }return false;">Communication avec le SIGB</a></legend><div id="sigb_content">';
        if (isset($ini_array['ktm'])) {
            if (!$extBlocking) {
            $out .= '<strong>Connexion avec Carthame :</strong>';
            $out .= '<ul>';
            if (@ibase_connect($ini_array['ktm']['hostData'], $ini_array['ktm']['userData'], $ini_array['ktm']['passData'], 'NONE', 0, 1)) {
                $out .= ok('Connexion à la base Carthame OK');
				$rid2 = @ibase_query("SELECT VA FROM PARAM WHERE CLE = 'VERSIONKTM'");
				if ($row = @ibase_fetch_assoc($rid2)){
					$version_ktm = $row['VA'];
				}
				
				
				if (ereg("1.2.12",$version_ktm))
				$tabParams = array('ABLOGIN_TYPE' => 'Type de login abonné indivuel et groupe (VA=0 : N° de carte validé par le nom ; VA=1 : N° de carte validé par le mot de passe initialisé au nom ; VA=2 : N° de carte validé par le mot de passe initialisé à la date de naissance ; VA=3 : N° de carte validé par le mot de passe initialisé à la date de 1ère inscription, Exemple : 22, le premier chiffre correspond abonné indivuel et le deuxième au abonné groupe)', 'ABLOGIN_UPDATEPWD' => 'Forcer la modification du mot de passe des abonnés s\'il est invalide (longueur insuffisante, ...) (VA=T : Oui ; VA=F: Non)', 'PUBPROLONGRD' => 'Activation de la prolongation par recherche doc (VA=T : prolongation possible ; VN=pourcentage (entre 0 et 100) du temps de prêt à partir duquel le prêt est prolongeable');
				else
                $tabParams = array('ABLOGIN_TYPE' => 'Type de login abonné (VA=N : N° de carte validé par le nom ; VA=P : N° de carte validé par le mot de passe', 'ABLOGIN_UPDATEPWD' => 'Forcer la modification du mot de passe des abonnés s\'il est invalide (longueur insuffisante, ...) (VA=T : Oui ; VA=F: Non)', 'PUBPROLONGRD' => 'Activation de la prolongation par recherche doc (VA=T : prolongation possible ; VN=pourcentage (entre 0 et 100) du temps de prêt à partir duquel le prêt est prolongeable');
							
				
				$out .= "<table border=0 width=90% align=center>";
                foreach ($tabParams as $param => $desc) {
                    $rid = @ibase_query("SELECT VA FROM PARAM WHERE CLE = '".$param."'");
                    if ($row = @ibase_fetch_assoc($rid)) {
					
					
                        if (($param == 'ABLOGIN_TYPE' && ($row['VA'] == 'P' || ((substr($row['VA'],0,1)=='1' || substr($row['VA'],0,1)=='2' || substr($row['VA'],0,1)=='3') &&
								(substr($row['VA'],1,1)=='1' || substr($row['VA'],1,1)=='2' || substr($row['VA'],1,1)=='3'))) ) || $row['VA'] == 'T'){ 

						if ($param!="PUBPROLONGRD")	
						$out .= '<tr><td width=40%>'.ok('Paramètre <b>obligatoire</b> <acronym title="'.$desc.'">'.$param.'</acronym> : '.$row['VA']).'</td><td>'.modifParamDisplay($param, $ini_array['ktm'],0).'</td></tr>';
						else 
						$out .= '<tr><td width=40%>'.ok('Paramètre <b>optionnel</b> <acronym title="'.$desc.'">'.$param.'</acronym> : '.$row['VA']).'</td><td>'.modifParamDisplay($param, $ini_array['ktm'],1).'</td></tr>';
						
						}						
                        else {
						
							if ($param!="PUBPROLONGRD")	
						$out .= '<tr><td width=40%>'.warning('Paramètre <b>obligatoire</b> <acronym title="'.$desc.'">'.$param.'</acronym> : '.$row['VA']).'</td><td>'.modifParamDisplay($param, $ini_array['ktm'],0).'</td></tr>';
						else 
						$out .= '<tr><td width=40%>'.warning('Paramètre <b>optionnel</b> <acronym title="'.$desc.'">'.$param.'</acronym> : '.$row['VA']).'</td><td>'.modifParamDisplay($param, $ini_array['ktm'],1).'</td></tr>';
						
						}
                    }
                }
                $out .= '</ul>';
				$out .= "</table></ul>";
				
                if ($_POST['passabo'] == substr(md5('OPAC3DSUPERADMIN'.date('YW')), 0, 10)) {
                    $rid = @ibase_query("SELECT FIRST 10 NA, MOTPASSE FROM AB WHERE TYPEAB = 'I' AND DATDERPRET IS NOT null");
                    while ($row = @ibase_fetch_assoc($rid)) {
                        $abos .= '<tr><td>'.$row['NA'].'</td><td>'.$row['MOTPASSE'].'</td></tr>';
                    }
                    $abos = '<table id="pass" border="1"><th>Carte</th><th>Mot de passe</th>'.$abos.'</table>';
                }
                else $abos = '<form name="formshowabo" action="test_config.php?idclient='.$_REQUEST['idclient'].'#legend_sigb" method="post">Caché : mot de passe pour afficher <input type="password" name="passabo" size="10" autocomplete="off" /> <input name="showpass" type="submit" value="OK" /></form>';
                $out .= '<ul><li>Exemples d\'abonnés pour tester :<br />'.$abos.'</li></ul>';
                $out .= '</ul>';
                ibase_close();
            }
            else $out .= nok('Impossible de se connecter à la base Carthame');
            }
            else {
                $out .= '<strong>Connexion avec Carthame :</strong>';
                $out .= '<ul>';
                $out .= nok('Extension interbase manquante');
                $out .= '</ul>';
            }
        }
        if (isset($ini_array['karvi'])) {
            $out .= '<strong>Connexion avec Karvi :</strong>';
            $out .= '<ul>';
            if (@file_get_contents($ini_array['karvi']['hostData']."portail/opacportail.php") !== FALSE) $out .= ok('Connexion à Karvi OK');
            else $out .= nok('Impossible de se connecter à Karvi');
            $out .= '</ul>';
        }
        if (isset($ini_array['gabi'])) {
            $out .= '<strong>Connexion avec e-Paprika :</strong>';
            $out .= '<ul>';
            $arrContextOptions=array(
                "ssl"=>array(
                    "verify_peer"=>false,
                    "verify_peer_name"=>false,
                ),
            );
            if (@file_get_contents('http://'.$ini_array['gabi']['hostData'], false, stream_context_create($arrContextOptions)) !== FALSE) $out .= ok('Connexion e-Paprika OK');
            else $out .= nok('Impossible de se connecter à e-Paprika');
            $out .= '</ul>';
        }
        if (isset($ini_array['agate'])) {
            $out .= '<strong>Connexion avec Agate :</strong>';
            $out .= '<ul>';
            if (fsockopen($ini_array['agate']['hostData'], $ini_array['agate']['portData'], $errno, $errstr, 5) !== FALSE) $out .= ok('Connexion Agate OK');
            else $out .= nok('Impossible de se connecter à Agate ('.$errstr.')');
            $out .= '</ul>';
        }
        if (isset($ini_array['aloes'])) {
            class BaseSession {
                private $NomBase;

                function __construct($NomBase) {
                    $this->NomBase = $NomBase;
                }
            }
            class ServeurSession {
                private $BasesServeurs;
                private $NomServeur;

                function __construct($BasesServeurs, $NomServeur) {
                    $this->BasesServeurs = $BasesServeurs;
                    $this->NomServeur = $NomServeur;
                }
            }
            class EntOuvrirSession {
                private $NomMachine;
                private $ListeServeurs;

                function __construct($NomMachine, $ListeServeurs) {
                    $this->NomMachine = $NomMachine;
                    $this->ListeServeurs = $ListeServeurs;
                }
            }
            $out .= '<strong>Connexion avec Aloes :</strong>';
            $out .= '<ul>';
            try {
                list($server, $posteClient) = explode('\\', $ini_array['aloes']['hostData'], 2);
                $soapAloes = new SoapClient($ini_array['aloes']['hostData'].'/ServiceRecherche.asmx?WSDL');
                $BaseSession = new BaseSession($ini_array['aloes']['databaseID']);
                $ArrayOfBaseSession = array($BaseSession);
                $ServeurSession = new ServeurSession($ArrayOfBaseSession, $server);
                $ArrayOfServeurSession = array($ServeurSession);
                $EntOuvrirSession = new EntOuvrirSession($posteClient, $ArrayOfServeurSession);
                $params = array('Param' => $EntOuvrirSession);
                $result = $soapAloes->OuvrirSession($params);
                if ($result->OuvrirSessionResult->GUIDSession == '') {
                    throw new Exception('Aucun GUID Session');
                }
                $out .= ok('Connexion à Aloes OK');
            }
            catch (Exception $e) {
                $out .= nok('Impossible de se connecter à Aloes ('.$e->getMessage().')');
            }
            $out .= '</ul>';
        }
        if (isset($ini_array['koha'])) {
            $out .= '<strong>Connexion avec Koha :</strong>';
            $out .= '<ul>';
            if (@file_get_contents($ini_array['koha']['hostData']."/cgi-bin/koha/webservice/rest.pl/biblio/1") !== FALSE) $out .= ok('Connexion à Koha OK');
            else $out .= nok('Impossible de se connecter à Koha');
            $out .= '</ul>';
        }
    }

    $out .= '</body></html>';
    return $out;
} 
 
function warning($string) {
  $out = '<li>';
  $out.= $string;
  $out.= ' <span class="warning">&nbsp;</span></li>'."\r\n";
  return($out);
}
 
function ok($string) {
  $out = '<li>';
  $out.= $string;
  $out.= ' <span class="ok">&nbsp;</span></li>'."\r\n";
  return($out);
}
 
function nok($string) {
  $out = '<li>';
  $out.= '<b>'.$string.'</b>';
  $out.= ' <span class="nok">&nbsp;</span></li>'."\r\n";
  return($out);
} 
 
function info($string) {
  $out = '<li>';
  $out.= $string;
  $out.= ' <span class="info">&nbsp;</span></li>'."\r\n";
  return($out);
}

function modifParamDisplay($nameParam, $database, $vn) {

	if ($vn==0) 
    return '<form name="modif_'.$nameParam.'" method=post action="test_config.php?idclient='.$_REQUEST['idclient'].'&modifparam=true&param='.$nameParam.'#legend_sigb">Changer la valeur : VA <input name="va_'.$nameParam.'" type="text" size="1" /> <input type="button" value="OK" onclick="javascript:document.forms[\'modif_'.$nameParam.'\'].submit();" /><input name="host_'.$nameParam.'" type="hidden" value="'.$database['hostData'].'" /><input name="user_'.$nameParam.'" type="hidden" value="'.$database['userData'].'" /><input name="pass_'.$nameParam.'" type="hidden" value="'.$database['passData'].'" /></form>';
	else 
	return '<form name="modif_'.$nameParam.'" method=post action="test_config.php?idclient='.$_REQUEST['idclient'].'&modifparam=true&param='.$nameParam.'#legend_sigb">Changer les valeurs : VA <input name="va_'.$nameParam.'" type="text" size="1" /> VN <input name="vn_'.$nameParam.'" type="text" size="1" /> <input type="button" value="OK" onclick="javascript:document.forms[\'modif_'.$nameParam.'\'].submit();" /><input name="host_'.$nameParam.'" type="hidden" value="'.$database['hostData'].'" /><input name="user_'.$nameParam.'" type="hidden" value="'.$database['userData'].'" /><input name="pass_'.$nameParam.'" type="hidden" value="'.$database['passData'].'" /></form>';
}

if (isset($_REQUEST['info'])) phpinfo();
if (isset($_GET['modifparam']) && $_GET['modifparam'] == 'true' && !empty($_POST['va_'.$_GET['param']])) {
    if (isset($_GET['param']) && in_array($_GET['param'], array('ABLOGIN_TYPE', 'PUBPROLONGRD', 'ABLOGIN_UPDATEPWD'))) {
        $ressource = ibase_connect($_POST['host_'.$_GET['param']], $_POST['user_'.$_GET['param']], $_POST['pass_'.$_GET['param']], 'NONE', 0, 1);
        if (!ibase_query($ressource, "UPDATE PARAM SET VA = '".$_POST['va_'.$_GET['param']]."'".(!empty($_POST['vn_'.$_GET['param']]) ? ", VN = '".$_POST['vn_'.$_GET['param']]."'" : "")." WHERE CLE = '".$_GET['param']."'")) echo nok('Erreur de mise à jour de la base');
        ibase_close();
    }
}
if (isset($_POST['ok_idclient']) || (isset($_GET['idclient']) && !empty($_GET['idclient']))) {
    //Configuration nécessaire
    $requirements = array('php' => array('curl', 'interbase', 'mbstring', 'mcrypt', 'sockets', 'ssh2', 'zip'),
                          'apache' => array('mod_alias', 'mod_proxy', 'mod_proxy_http', 'mod_php5', 'mod_ssl'));
    echo test_config($requirements);
}
else echo 'Aucun ID client renseigné.<br /><a href="index.php"><< Retour</a>';