You are not logged in.

Announcement

 Téléchargez la dernière version stable de GLPI      -     Et vous, que pouvez vous faire pour le projet GLPI ? :  Contribuer
 Download last stable version of GLPI                      -     What can you do for GLPI ? :  Contribute

#1 2019-06-07 11:39:50

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Script php - Ouverture/fermeture de ticket par Centreon

Bonjour à tous.

Je souhaite migrer notre GLPI v 0.85.4 vers v 9.4, or cela nécessite que nous mettions à jour un script que nous avons sur Centreon qui ouvre/ferme des tickets automatiquement.

Centreon tourne sous PHP 5.3 et le client API GLPI requiert une version plus récente de php. Je cherche donc à updater le script via des appels CURL en PHP.

J'arrive bien à me connecter à l'API, je récupère bien un token de session, et pour vérifier, je récupère les informations d'un compte utilisateur => C'est ok.

Ma problématique se porte sur la recherche de ticket, voici la portion de code concerné :

echo "\n\nSearch tickets not closed\n";
//Titre du ticket
$criteria[] = ['field' => 2, 'searchtype' => 'contains', 'value' => $BAMTag];     //$BAMTag = Titre du ticket - Spécifique à un hôte/Service Centreon
//Status not closed
$criteria[] = ['link'=>'AND', 'field' => 4, 'searchtype' => 'equals', 'value' => 2];
$url=$wsurl."Search/Ticket?Content-Type=%20application/json&app_token=".$wsapptoken."&session_token=".$session;
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$TicketSearchCall = curl_exec($ch);
if (!curl_error($ch))
    {
    $TicketSearchCallResults = json_decode($TicketSearchCall);
        
    foreach($TicketSearchCallResults as $property => $value)
        {
        echo $property." : ".$value."\n";
        }
    }
    else
    {
    $error_msg = curl_error($ch);
    echo "Error :",$error_msg,"\n";
    }

Retour :

Search tickets not closed
0 : ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM
1 : resource not found or not an instance of CommonDBTM; view documentation in your browser at http://xxx.xxx.xxx.xxx/glpi-094/apirest.php/#ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM

Sauriez-vous me dire ce qui ne va pas dans ma requête ?

Question bonus : Existe-t-il une liste quelque part précisant le nom pour chaque field ID ?

'field' => 2 = Titre du ticket
...

Merci d'avance pour votre aide.

Cordialement.

Offline

#2 2019-06-07 14:04:39

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

reponse bonus :

$url=$apiurl ."/listesearchoptions/Ticket";
renvoie la liste des champs de recherche du ticket avec les ID.
***************
il faut mettre les critères dans l'url :



$url=$wsurl."Search/Ticket?Content-Type=%20application/json&app_token=".$wsapptoken."&session_token=".$session&criteria[0][link]=AND&criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notclosed
&criteria[1][link]=AND&criteria[1][field]=1&criteria[1][searchtype]=contains&criteria[1][value]=".$leTitreDeMonTicket


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#3 2019-06-07 16:28:36

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Merci LaDenrée.

Je viens de tester directement dans le browser avec ceci :

.../Search/Ticket?Content-Type=application/json&app_token=ckczvhxEfm4oCyciGdpVVOLly3q5hcTLdTZ4vUit&session_token=a9vkc0um0lhp9f25h1lqtf3720&&criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notclosed

Mais cela me renvoit toujours:

["ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM","resource not found or not an instance of CommonDBTM; view documentation in your browser at ]http://192.168.93.46/glpi-094/apirest.php/#ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM"]


Pour la question bonus, au top, cela va bien me servir.

Offline

#4 2019-06-07 16:30:49

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

vous avez 2 &&  après le session token
&&criteria[0][field]=


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#5 2019-06-07 16:45:04

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

pour mon appel curl je procède un peu différemment :

1)initsession-> je récupère mon session_token et je le mets dans un tableau $header (puis je le stocke en variable de session, mais vous n'êtes pas obligé)

$headers = array(
    'Content-Type: application/json',
    'App-Token: ' . $app_token,
    'Session-Token: '.$sess_token
    );

2)ensuite dans mon appel curl :

$url="/search/Ticket?criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notclosed";
$ch = curl_init();
   
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    $json = curl_exec($ch);
    curl_close ($ch);
    $obj = json_decode($json,true);

print_r($obj);


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#6 2019-06-07 16:48:16

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

astuce pour définir les critères :  aller dans l'interface graphique glpi, filtrer avec les filtres classiques, copier l'url,  nettoyer un peu, ça vous donne l'url curl.


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#7 2019-06-07 17:22:27

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

J'ai corrigé, mais toujours pareil.

$url=$wsurl."Search/Ticket?criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notclosed";
	curl_setopt($ch, CURLOPT_URL,$url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	$TicketSearchCall = curl_exec($ch);
	if (!curl_error($ch))
		{
		$TicketSearchCallResults = json_decode($TicketSearchCall);
		//var_dump($TicketSearchCallResults);
		foreach($TicketSearchCallResults as $TicketSearchCallResult)
			{
			echo "Search results:\n";
			var_dump($TicketSearchCallResult);
			}
		
		}
		else
		{
		$error_msg = curl_error($ch);
		echo "Error :",$error_msg,"\n";
		}

Résultat :

Search tickets not closed
Search results:
string(39) "ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM"
Search results:
string(173) "resource not found or not an instance of CommonDBTM; view documentation in your browser at [url=http://xxx.xxx.xxx.xxx/glpi-094/apirest.php/#ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM]http://xxx.xxx.xxx.xxx/glpi-094/apirest.php/#ERROR_RESOURCE_NOT_FOUND_NOR_COMMONDBTM"[/url]

J'ai bien des tickets non clos - dans le doute, j'ai vérifié smile

Offline

#8 2019-06-17 21:13:57

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

search avec un s MINUSCULE ....!

$url=$wsurl."search/Ticket?criteria[0][field]=12&criteria[0][searchtype]=equals&criteria[0][value]=notclosed";

Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#9 2019-06-29 13:49:28

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Merci Helper, cela fonctionne mieux smile

Offline

#10 2020-01-02 13:16:52

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Bonjour.
Je suis de retour sur mon script GLPI (9.4)/CENTREON, j'ai bien avancé.
Je butte sur l'ajout d'un suivi à un ticket avant de le clôturer :

Mon code :

$wsurl =  "http://xxx.xxx.xx.xx/glpi-094/apirest.php/";
$url=$wsurl.'search/Ticket?criteria[0][link]=AND&criteria[0][field]=4&criteria[0][searchtype]=equals&criteria[0][value]=3887&criteria[1][link]=AND&criteria[1][field]=12&criteria[1][searchtype]=equals&criteria[1][value]=notclosed&criteria[2][link]=AND&criteria[2][field]=1&criteria[2][searchtype]=contains&criteria[2][value]=BusinessActivity+'.$service;

curl_setopt($ch, CURLOPT_URL,$url);
			curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
			curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
			$TicketSearchCall = curl_exec($ch);
			if (!curl_error($ch)){
				$TicketSearchCallResults = json_decode($TicketSearchCall, true);
				//var_dump($TicketSearchCallResults);
				$TotalTicketsFound = $TicketSearchCallResults['totalcount'];
				echo "Totalcount : ".$TotalTicketsFound."\n";

				if($TotalTicketsFound == 0){
					echo "No tickets found !\n\n";
					}

				if($TotalTicketsFound > 0){
					echo "Ticket(s) found !\n\n";
					$TicketSearchCallResultsdata = ($TicketSearchCallResults['data']);
					//var_dump($TicketSearchCallResultsdata[$i]);
					echo "--------------\n\n";
					foreach($TicketSearchCallResultsdata as $i => $item){
						
						echo "\tTicket # : ".$TicketSearchCallResultsdata[$i][2]."\n";
						$ticket_id = $TicketSearchCallResultsdata[$i][2];
						echo "\tTitle : ".$TicketSearchCallResultsdata[$i][1]."\n";
						echo "\tStatus : ".$TicketSearchCallResultsdata[$i][12]."\n";
						echo "****************\n\n";
						
						//Adding a followup ...
						$url=$wsurl."Ticket/".$ticket_id."/ItilFollowup/";
						
						$input = array("tickets_id" => $ticket_id,
										"is_private" => 0,
										"requesttypes_id" => 6,
										"content" => "Service fully available",
										"_close" => 1,
										"add_close" => 1
										);
						$arrayofinputs = array("input" => $input);
						//$curl_post_data = json_encode($arrayofinputs);
						$curl_post_data = '{"input":{"tickets_id": "'.$ticket_id.'","is_private": "0","requesttypes_id":"6","content": "Service fully available","_close": "1","add_close": "1"}}';
						
						
						curl_setopt($ch, CURLOPT_URL,$url);
						curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
						curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
						curl_setopt($ch, CURLOPT_POST, true);
						curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_post_data);
						var_dump($ch);
						$AddFollowUp = curl_exec($ch);
						
						if(curl_error($ch)){
							echo "\tFollowup not added to ticket !\n";
							}else{
							echo "\tFollowup added to ticket.\n";
							var_dump($AddFollowUp);
							}
						
						//... and close tickets.
						$url=$wsurl.'Ticket/'.$ticket_id.'/?Content-Type=%20application/json&app_token='.$wsapptoken.'&session_token='.$session;
						$fields = '{"input": {"tickets_id":"'.$ticket_id.'","status": 6}}';
						
						curl_setopt($ch, CURLOPT_URL,$url);
						curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
						curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
						curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
						curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
						$UpdateTicketCall = curl_exec($ch);
						
						if (curl_error($ch)){
							echo "\tTicket not closed !\n";
							$error = curl_error($ch);
							echo "Error :\n",$error[0],"\n".$error[1],"\n";
							}else{
							echo "\tTicket closed.\n";
							$UpdateTicketCallResults = json_decode($UpdateTicketCall,true);
							var_dump($UpdateTicketCallResults);
							}
						}
					}
				}else{
				$error_msg = curl_error($ch);
				$error_msg = "Error : ".$error_msg."\n";
				//Close API connexion
				echo "Close API connexion";
				curl_close ($ch);
				die($error_msg);
				}

Output :

Search related tickets if exist
Totalcount : 1
Ticket(s) found !

--------------

        Ticket # : 202492
        Title : BusinessActivity TEST
        Status : 2
****************

resource(4) of type (curl)
        Followup added to ticket.
string(157) "["ERROR_JSON_PAYLOAD_FORBIDDEN","GET Request should not have json payload (http body); view documentation in your browser at /#ERROR_JSON_PAYLOAD_FORBIDDEN"]"
        Ticket closed.
array(1) {
  [0]=>
  array(2) {
    [202492]=>
    bool(true)
    ["message"]=>
    string(108) "Error in sending the emailSMTP connect() failed. https://github.com/PHPMailer/PHPMailer/wiki/Troubleshooting"
  }
}
Close API connexion

Est ce que vous auriez une idée ?

Offline

#11 2020-01-02 19:42:09

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

remplacez
"tickets_id": "'.$ticket_id.'" 

par

"items_id": '.$ticketid.',"itemtype": "Ticket"


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#12 2020-01-03 09:56:52

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Salut LaDenrée.

J'ai oublié de préciser que le suivi ne s'ajoute pas au ticket malgré le message "Followup added to ticket". La clôture du ticket fonctionne très bien par contre.

Est-ce que tu aurais un exemple d'ajout de ticket pour un GLPI 9.4 stp ?

Offline

#13 2020-01-03 14:50:14

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

je pense que la requête ne s'exécute pas et donc qu'il n'y a pas de message d'erreur.

çi dessous mon script qui marche en 9.4.5 ( j'ai juste mes headers et api_url qui sont en variable de session (j'ai une page de login et après je navigue sur mon portail, sans refaire d'authentificaiton, y compris pour ma page de test).

par contre j'ai l'habitude de fermer mon curl après chaque appel et de le réouvrir.
j'ai mis des print_r pour le debug.

$ticketid=2877;
$url=$_SESSION['api_url']."/Ticket/".$ticketid."/ItilFollowup/";
//print_r($url);
$curl_post_data = '{"input":{"items_id": '.$ticketid.',"itemtype": "Ticket","is_private": "0","requesttypes_id":"6","content": "Service fully available","_close": "1","add_close": "1"}}';

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL,$url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_post_data);
	$json = curl_exec($ch);
	print_r($json);
        $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	print_r($httpcode);
  	if($httpcode >= 200 && $httpcode < 300){
		echo "\tFollowup  added to ticket !\n";
	}else{
		echo "\tFollowup  not added to ticket.\n";						
	}
	curl_close ($ch);

Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#14 2020-01-03 14:54:14

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Merci, je vais tester.

Offline

#15 2020-01-03 15:03:40

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Et là magie, tout fonctionne ! smile Je pense que le - curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST'); - y est pour quelque chose.
Un grand merci, on va pouvoir migrer notre GLPI.
Je fignole mon script et je le partagerais pour ceux qui pourrait en avoir besoin.

Dernière question : où peux tu trouver les schemas json à utiliser en fonction des item types ?

Offline

#16 2020-01-03 15:09:53

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

Pour le json  je fais un get sur un élément déjà créé dans l intetface et je récupère les valeurs


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#17 2020-01-09 14:13:55

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Bonjour.
Petite question en rapport avec le script, est-ce qu'on a la possibilité de choisir l'entitée dans laquel on créé le ticket via l'API ?

Offline

#18 2020-01-09 14:52:17

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

par défaut, le ticket est créé dans l'entité du demandeur :
si le demandeur a un profil valide sur l'entitié de destination, changez d'entité après le login :
methode POST

$url=$url=$_SESSION['api_url']."/changeActiveEntities/";
$curl_post_data = '{"input":{"entities_id": 1, "is_recursive": true}}';


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

#19 2020-01-09 14:53:49

Chouille75
Member
Registered: 2008-05-30
Posts: 32

Re: Script php - Ouverture/fermeture de ticket par Centreon

Merci, je vais tester.

Offline

#20 2020-01-09 15:03:34

LaDenrée
HELPER
Registered: 2012-11-19
Posts: 6,146

Re: Script php - Ouverture/fermeture de ticket par Centreon

pour info j'ai un petit fichier api_common.php  que j'inclue dans mes pages qui me permet d'initialiser le login et mes variables de session et qui contient en plus aussi 3 petites fonctions :

function glpi_get($url){

	$ch = curl_init();
	$url=$_SESSION['api_url'] .$url;
	curl_setopt($ch, CURLOPT_URL,$url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
	$json = curl_exec($ch);
//print_r($json);
	curl_close ($ch);
	$obj = json_decode($json,true);

	return $obj;
}

function glpi_post($url,$fields){

	$ch = curl_init();
	$url=$_SESSION['api_url'] .$url;
	curl_setopt($ch, CURLOPT_URL,$url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
	curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
	$json = curl_exec($ch);
	curl_close ($ch);
	$obj = json_decode($json,true);
	return $obj;
}
function glpi_put($url,$fields){

	$ch = curl_init();
	$url=$_SESSION['api_url'] .$url;
	curl_setopt($ch, CURLOPT_URL,$url);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $_SESSION['headers']);
	curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
	curl_setopt($ch, CURLOPT_POSTFIELDS,$fields);
	$json = curl_exec($ch);
	curl_close ($ch);
	$obj = json_decode($json,true);
	return $obj;
}

comme ça j'ai juste un include à faire au début de ma page et ensuite l'appel se résume à :

$url="/changeActiveEntities/";
$curl_post_data = '{"input":{"entities_id": 1, "is_recursive": true}}';
$obj= glpi_post($url,$curl_post_data );
print_r($obj);


Trouver la panne avant de réparer...
GLPI10.0.10 (ubuntu 22.04 PHP8.1  Mariadb10.6 ) plugins : comportements 2.7.2 reports 1.16.0 formcreator 2.13.8, datainjection 2.13.4 fields 1.21.6

Offline

Board footer

Powered by FluxBB