Recherche item dans tableau

Résolu
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 19 nov. 2017 à 16:54
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 - 19 nov. 2017 à 19:40
Bonjour le Forum,

Je dispose d'un fichier (services.cfg) ayant cette structure
define service{
	host_name				server01
	service_description		/
	...
	use				TPL_OS_UNIX_DISK_NRPE
    ...
}

define service{
	host_name				server03
	service_description		/
	use				TPL_OS_UNIX_DISK_NRPE
    ...
}

define service{
	host_name				server01
	service_description		/boot
    ...		
	use				TPL_OS_UNIX_DISK_NRPE
    ...
}

define service{
	host_name				server03
	service_description		/boot
    ...		
	use				TPL_OS_UNIX_DISK_NRPE
    ...
}

Un host_name peut posséder plusieurs services (service_description).

A partir d'une liste déroulante (ListeHost), je souhaite alimenter une liste déroulante (ListeService) dans laquelle il n'y aura que les services du host sélectionné.

Je bloque pour créer mon tableau de services par host.
Mes derniers essais :
	$lines_service = file($roothost . $fileservices);	
	
	// Tableaux des services
	foreach ($lines_service as $value) {
		if (strpos($value, 'host_name') !== false) {
			$servicehost = return_value($value);
		}
		if (strpos($value, 'service_description') !== false) {
			$servicename = return_value($value);
		}
		if (strpos($value, '	use') !== false) {
			$serviceuse = return_value($value);
			
			// Ajout au tableau multi-dimensionnel
			//$hostservice[]= array('host' =>array($servicehost,'service' =>$servicename,'use' => $serviceuse));
			//$hostservice[]= array('host' => $servicehost, 'service' =>$servicename,'use' => $serviceuse);
		
			$hostservice[][$servicehost] =  array('service' =>$servicename,'use' => $serviceuse);
		}
	}

Le print_r($hostservice) me renvoie :
Array
(
    [0] => Array
        (
            [server01] => Array
                (
                    [service] => /
                    [use] => TPL_OS_UNIX_DISK_NRPE
                )
        )

    [1] => Array
        (
            [server03] => Array
                (
                    [service] => /
                    [use] => TPL_OS_UNIX_DISK_NRPE
                )
        )

    [2] => Array
        (
            [server01] => Array
                (
                    [service] => /boot
                    [use] => TPL_OS_UNIX_DISK_NRPE
                )
        )

    [3] => Array
        (
            [server03] => Array
                (
                    [service] => /boot
                    [use] => TPL_OS_UNIX_DISK_NRPE
                )
        )

A partir de ce tableau, est-il possible de récupérer tous les services d'un host ???

Merci pour vos conseils et suggestions.

jean-marc

1 réponse

jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344
19 nov. 2017 à 17:33
Bonjour

<?php
//affichage des erreurs php
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);


//ton tableau à traiter :
$arr = Array
(
    '0' => Array
        (
            'server01' => Array
                (
                    'service' => '/'
                    ,'use' => 'TPL_OS_UNIX_DISK_NRPE'
                )
        )

    ,'1' => Array
        (
            'server03' => Array
                (
                    'service' => '/'
                    ,'use' => 'TPL_OS_UNIX_DISK_NRPE'
                )
        )

    ,'2' => Array
        (
            'server01' => Array
                (
                    'service' => '/boot'
                    ,'use' => 'TPL_OS_UNIX_DISK_NRPE'
                )
        )

    ,'3' => Array
        (
            'server03' => Array
                (
                    'service' => '/boot'
                    ,'use' => 'TPL_OS_UNIX_DISK_NRPE'
                )
        )
);

//-----------------------------------------------------------------//
// on créé un nouveau tableau ayant comme clé les "hosts"
//-----------------------------------------------------------------//
$newArr = array();
foreach($arr as $index=>$HostServ){
    foreach($HostServ as $host=>$datas){
        $newArr[$host][$datas['service']] = $datas['use'];
    } 
}

//-----------------------------------------------------------------//
// Affichage
//-----------------------------------------------------------------//
echo "Tableau remis en forme : <br>";
echo "<pre>";
print_r($newArr);
echo "</pre>";



Donne

Tableau remis en forme :

Array
(
[server01] => Array
(
[/] => TPL_OS_UNIX_DISK_NRPE
[/boot] => TPL_OS_UNIX_DISK_NRPE
)

[server03] => Array
(
[/] => TPL_OS_UNIX_DISK_NRPE
[/boot] => TPL_OS_UNIX_DISK_NRPE
)

)


0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27
19 nov. 2017 à 18:19
Bonjour Jordane,

Un grand merci, je viens de tester ta proposition. La récupération des services par host s'effectue correctement.
Depuis ce matin je testais en vain avec les deux boucles.
$newArr[$host][$datas['service']] = $datas['service']
était la solution !!!

Bonne soirée,

jean-marc
0
jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024 344 > cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018
19 nov. 2017 à 18:54
Si tu ne veux que les services sans les "use" ... tu peux simplement faire comme ça;:
$newArr = array();
foreach($arr as $index=>$HostServ){
    foreach($HostServ as $host=>$datas){
        $newArr[$host][] = $datas['service'];
    } 
}

Ce qui donnera :
Array
(
    [server01] => Array
        (
            [0] => /
            [1] => /boot
        )

    [server03] => Array
        (
            [0] => /
            [1] => /boot
        )

)
0
cs_JMO Messages postés 1854 Date d'inscription jeudi 23 mai 2002 Statut Membre Dernière intervention 24 juin 2018 27 > jordane45 Messages postés 38139 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 20 avril 2024
19 nov. 2017 à 19:40
Merci Jordane,
Testé -> ok
Pour remplir la liste déroulante "ListeService" d'un host, je n'ai besoin que du service. Mais le but est de créer une commande du genre "/usr/lib/nagios/plugins/wrap.pl 'host_name' '/var' '0' '0' /usr/lib/nagios/plugins/check_nrpe -u -t 30 -n -H 'IP site distant' -p 3180 -c disk -a 85 90 /var" où les variables se trouvent dans x fichiers .cfg (host, service, templates, command ...) !!! Donc, je devrais "mémoriser" toutes les variables des différents fichiers de config.
En bref, un shaker sera mon cadeau !!!

jean-marc
0
Rejoignez-nous