Commander JobScheduler par url

De SOS Paris
Aller à : navigation, rechercher

Toutes les commandes de JobScheduler sont accessibles en url à travers les commandes xml on peut de cette manière démarrer un ordre ou un job en appelant. Cette fonctionnalité est bien pratique lorsqu'elle est combinée avec la possibilité d'ajouter une url dans un titre de job ou d'ordre, car il est alors possible d'ajouter des liens sur le JOC pour déclencher des actions pré-définies.

Depuis les versions 1.7, l'appel de ces urls respectent les bonnes pratiques des appels REST, à savoir:

  • la méthode GET ne permet que de consulter
  • la méthode POST est obligatoire pour les autres actions

Cette limitation réduit le risque de Cross-site scripting mais enlève le confort de l'appel direct à travers une simple url.

Appel en ligne de commande

L'appel par POST étant toujours actif, il est possible d'appeler la commande XML à travers le client perl fourni avec le produit ou à travers un simple curl. L'exemple suivant permet de démarrer un ordre 'devops' sur la chaîne '/Arii/JOC/Sync_State' du jobscheduler 'monjobscheduler' avec le port par défaut 4444. La commande xml sera la suivante:

<add_order job_chain="/Arii/JOC/Sync_State" id="devops"/>

Un appel sur sera le suivant:

curl -X POST -d "<add_order job_chain='/Arii/JOC/Sync_State' id='devops'/>" http://monjobscheduler:4444
<?xml version="1.0" encoding="ISO-8859-1"?>
<spooler>
   <answer time="2018-02-06T15:43:24.633Z">
      <ok>
         <order created="2018-02-06T15:43:24.634Z"
                id="devops"
                initial_state="CHECK_OS"
                job="/Arii/JOC/checkOS"
                job_chain="/Arii/JOC/Sync_State"
                order="devops"
                path="/"
                priority="0"
                state="CHECK_OS">
            <file_based state="not_initialized">
               <requisites/>
            </file_based>
         </order>
      </ok>
   </answer>
</spooler>

A noter que cette commande fonctionne sur Windows et Unix.

Appel par une url

Pour l'appel par url, il sera nécessaire d'utiliser les paramètres passées en GET pour construire une requête POST. Ceci peut être réalisé avec un langage de script (PHP, Python, Perl...) à travers un serveurs web (apache, nginx, lighttpd), ce choix dépend principalement de vos habitudes, le résultat sera le même.

Ce premier exemple est en PHP, il est extrait du code de Arii et reprend la couche Curl. Il est appelé par l'url suivante:

http://localhost/proxy.php?spooler=monjobscheduler:4444&xml=<add_order "job_chain="/Arii/JOC/Sync_State" id="devops"/>

Le code PHP est le suivant (proxy.php):

<?php
$url = "http://".$_GET['spooler'];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS,$_GET['xml']);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$content = curl_exec($ch);
if ($content === FALSE) {
    printf("cUrl error (#%d): %s
".$_GET['spooler']."
".str_replace(['<','>'],['<','>'],$_GET['xml'])."\n", curl_errno($ch), htmlspecialchars(curl_error($ch))); } curl_close($ch); print '<pre>'.str_replace(['<','>'],['<','>'],$content).'</pre>';

Si vous n'avez pas de Curl, une solution alternative serait la suivante:

<?php
$url = "http://".$_GET['spooler']; 

$opts = [
        'http' => [
            'method' => "POST",
            'header'=>"Content-Type: text/xml\r\n",
            'content' => $_GET['xml']
        ]
];
$context = stream_context_create($opts);
$content = "";
$fp = fopen($url,'r', false, $context);
if ($fp)
    while (!feof($fp))
        $content .= fgets($fp); 

print '<pre>'.str_replace(['<','>'],['<','>'],$content).'</pre>';

Dans les 2 cas, la réponse sera identique à un appel en ligne de commande:

<?xml version="1.0" encoding="ISO-8859-1"?>
<spooler>
   <answer time="2018-02-06T16:00:53.212Z">
      <ok>
         <order created="2018-02-06T16:00:53.213Z"
                id="devops"
                initial_state="CHECK_OS"
                job="/Arii/JOC/checkOS"
                job_chain="/Arii/JOC/Sync_State"
                order="devops"
                path="/"
                priority="0"
                state="CHECK_OS">
            <file_based state="not_initialized">
               <requisites/>
            </file_based>
         </order>
      </ok>
   </answer>
</spooler>

Mise en place

  • Installer un serveur web avec PHP
  • copier/coller l'un des 2 scripts dans un fichier proxy.php
  • déposer le fichier dans le répertoire web du serveur