﻿<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tag Authorization - Constellation</title>
	<atom:link href="https://developer.myconstellation.io/tag/authorization/feed/" rel="self" type="application/rss+xml" />
	<link>https://developer.myconstellation.io/tag/authorization/</link>
	<description>Votre plateforme d&#039;interconnexion</description>
	<lastBuildDate>Thu, 19 Apr 2018 08:14:48 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.11</generator>

<image>
	<url>https://developer.myconstellation.io/wp-content/uploads/2016/02/256x256-e1457476015859.png</url>
	<title>Tag Authorization - Constellation</title>
	<link>https://developer.myconstellation.io/tag/authorization/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Le fichier de configuration</title>
		<link>https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/</link>
					<comments>https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:52:30 +0000</pubDate>
				<category><![CDATA[Constellation Server]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[AccessKey]]></category>
		<category><![CDATA[SettingsGroups]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[Settings]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2149</guid>

					<description><![CDATA[<p>Une Constellation est décrite en un seul fichier : le fichier de configuration Constellation. Ce fichier se nomme “Constellation.Server.exe.config” et se trouve dans le répertoire d’installation du serveur (par défaut dans “Program Files\Constellation Plateform\Server« ). Vous pouvez le modifier de différente</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/">Le fichier de configuration</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Une Constellation est décrite en un seul fichier : le <strong>fichier de configuration Constellation</strong>.</p>
<p>Ce fichier se nomme “<em>Constellation.Server.exe.config</em>” et se trouve dans le répertoire d’installation du serveur (par défaut dans “<em>Program Files\Constellation Plateform\Server</em>« ).</p>
<p>Vous pouvez le modifier de différente manière :</p>
<ul>
<li>En éditant ce fichier directement sur le serveur (avec un éditeur de texte type Notepad)</li>
<li>Via la Console Constellation (sur la page Configuration Editor)</li>
<li>Via Visual Studio</li>
<li>Via l’API de Management Constellation</li>
</ul>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/03/image75-4.png"><img class="colorbox-2149"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Edition de la configuration" src="https://developer.myconstellation.io/wp-content/uploads/2016/03/image75_thumb.png" alt="Edition de la configuration" width="363" height="200" border="0" /></a></p>
<p>Le fichier contient une balise globale “configuration” dans laquelle vous trouverez 4 sections :</p>
<ul>
<li><u>configSections</u> : réservé au moteur .NET</li>
<li><u>constellation</u> : la section de configuration Constellation (anciennement nommée &lsquo;constellationSection&rsquo;)</li>
<li><u>startup</u> : réservé au moteur .NET</li>
<li><u>runtime</u> : réservé au moteur .NET</li>
</ul>
<p>Vous ne devez en aucun cas modifier les sections réservées au moteur .NET sans savoir exactement ce que vous faites.</p>
<p>La section de “<strong>constellation</strong>” se décompose de la façon suivante :</p>
<ul>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_listenUris">listenUris</a></u> : définit la configuration des URI d’écoute du serveur Constellation</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_fileServer">fileServer</a></u> : définit la configuration du serveur Web statique utilisé pour l’hébergement de la Console Constellation</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">recoveryOptions</a></u> : définit les options de récupération des packages</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_sentinels">sentinels</a></u> : définit la configuration des sentinelles (et des packages) de votre Constellation</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_settingsGroups">settingsGroups</a></u> : définit la configuration des groupes de “settings”</li>
<li><u><a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">credentials</a></u> : définit la configuration des credentials pour l’accès à votre Constellation</li>
</ul>
<p>A chaque modification vous devez recharger la configuration soit via le hub de contrôle ou la Console Constellation (bouton “Reload Configuration”) ou soit en redémarrant le service Constellation Server.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-10.png"><img class="colorbox-2149"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-width: 0px;" title="Schéma de configuration" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-10.png" alt="Schéma de configuration" width="350" height="261" border="0" /></a></p>
<h3>Section “listenUris”</h3>
<p>Cette section permet de définir les URI sur lesquels le serveur Constellation doit écouter.</p>
<p></p><pre class="crayon-plain-tag">&lt;listenUris&gt;
  &lt;uri listenUri="http://+:8088/" /&gt;
&lt;/listenUris&gt;</pre><p></p>
<p>Ici le serveur répondra sur le port HTTP 8088 quelque soit le host (nom DNS ou adresse IP) car nous utilisons le wildcard “+” (pour plus d’information, <a href="https://msdn.microsoft.com/en-us/library/system.net.httplistener(v=vs.100).aspx#Anchor_6">lisez ceci</a>).</p>
<p>Vous pouvez configurer autant de “listenUri” que vous souhaitez. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;listenUris&gt;
  &lt;uri listenUri="http://+:8088/" /&gt;
  &lt;uri listenUri="http://constellation.mydomain.net:8888/" /&gt;
  &lt;uri listenUri="http://+:8080/constellation/" /&gt;
  &lt;uri listenUri="https://+:8089/" /&gt;
&lt;/listenUris&gt;</pre><p></p>
<p>Ici, le serveur Constellation répondra :</p>
<ul>
<li>Aux requêtes sur le port HTTP 8088</li>
<li>Aux requêtes sur le port HTTP 8888 où le host est “constellation.mydomain.net” (en clair une requête <a href="http://&lt;ip&gt;:8888">http://&lt;ip&gt;:8888</a>  ne fonctionnera pas)</li>
<li>Aux requêtes sur le port HTTP 8080 quelque soit le host mais dont le path doit forcement démarrer par “/constellation/”</li>
<li>Aux requêtes sur le port HTTPS 8089 en utilisant un cryptage SSL (<a href="/constellation-platform/constellation-server/configuration-ssl/">plus d’information</a>)</li>
</ul>
<p>Pour prendre en compte les modifications de cette section vous devez redémarrer le service Constellation.</p>
<h3>Section “fileServer”</h3>
<p>Cette section permet d’activer et configurer le “fileServer” de Constellation pour héberger des fichiers statiques (pages HTML, fichiers CSS, JS, images, etc..).</p>
<p>Cela sert principalement pour “auto-héberger”  la Console Constellation par le serveur Constellation lui-même.</p>
<p>En effet, la Console Constellation n’est ni plus ni moins qu’une application Web client-side, c’est à dire une série de pages HTML avec scripts JS et fichiers CSS/Image. Libre à vous de l’héberger sur vos serveurs Web mais afin de limiter les prérequis, le serveur Constellation peut lui-même héberger la console grâce au “fileServer” intégré.</p>
<p>La section “fileServer” ne contient que quatre attributs :</p>
<p></p><pre class="crayon-plain-tag">&lt;fileServer enable="true" path="/WebConsole" localhostOnly="true" physicalPath="D:\App\Constellation\Console" /&gt;</pre><p></p>
<ul>
<li>“<u>enable</u>” : indique si le serveur de fichier statique sur le serveur Constellation doit être activé (<em>true</em> ou <em>false</em>).</li>
<li>“<u>path</u>” : le répertoire d’écoute (préfixé par la listenUri).</li>
<li>“<u>localhostOnly</u>” : indique si le fileServer répond seulement aux requêtes “locales” ou à toutes les requêtes (<em>true</em> ou <em>false</em>).</li>
<li>“<u>physicalPath</u>” : le répertoire physique</li>
</ul>
<p>Dans l’exemple ci-dessus, le serveur de fichier est activé mais ne répondra qu’aux requêtes locales. Le serveur délivra les fichiers dans “D:\App\Constellation\Console” sur l’URL “&lt;listen_URI_du_serveur_Constellation&gt;/WebConsole” par exemple <a href="http://localhost:8088/WebConsole">http://localhost:8088/WebConsole</a> ou <a href="http://127.0.0.1:8088/WebConsole">http://127.0.0.1:8088/WebConsole</a> en partant du principe qu’il existe une listenUri “http://+:8088”.</p>
<p>Comme pour la section précédente (listenUris), il faut obligatoirement redémarrer le service Constellation Server pour prendre en compte ces modifications.</p>
<h3>Section “recoveryOptions”</h3>
<p>Les options de récupération (recoveryOptions) permettent de définir le comportement de la sentinelle en cas d’arrêt brutale de l’exécution d’un package (crash du package).</p>
<p>Chaque package peut avoir ses propres options de récupération mais cette section permet de définir les options “globales”, c’est à dire appliqué par défaut pour chaque package de la Constellation.</p>
<p>Les options de récupérations se résume en quatre propriétés :</p>
<ul>
<li>“<u>restartAfterFailure</u>” (<em>true</em> par défaut) : définit si la sentinelle doit redémarrer un package en cas de crash de ce dernier</li>
<li>“<u>numberOfRetry</u>” (<em>3 </em>par défaut) : définit le nombre maximal de tentative de redémarrage d’un package</li>
<li>“<u>restCounterAfterMinutes</u>” (<em>15 </em>par défaut) : définit la période (en minute) au delà de laquelle le compteur d’erreur est réinitialisé</li>
<li>“<u>restartPackageAfterSeconds</u>” (<em>30 </em>par défaut) : définit le délai d’attente avant de redémarrer un package suite à un crash</li>
</ul>
<p>Dans la configuration par défaut, si un package “crash” il est automatiquement redémarré 30 secondes après son crash dans la limite de 3 tentatives sachant qu’au bout de 15 minutes, le compteur de tentative est réinitialisé à 0.</p>
<h3>Section “sentinels”</h3>
<p>Dans cette section vous allez déclarer vos sentinelles (virtuelles ou non) dans lesquelles vous déclarerez les packages (virtuels ou non) qui eux même déclarons leurs settings et leurs groupes.</p>
<p>En clair, c’est cette section qui décrit votre “Constellation”.</p>
<p>Prenez l’exemple de la Constellation suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinels&gt;
  &lt;sentinel name="SENTINEL-NAME-DEMO" credential="Standard"&gt;
    &lt;packages&gt;    
      &lt;package name="HWMonitor" enable="true"&gt;&lt;/package&gt;          
      &lt;package name="DemoPackage" credential="ControlHubAccess" enable="true"&gt;
        &lt;settings&gt;
        &lt;import&gt;
          &lt;settingGroup groupName="GroupSettingsDemo" /&gt;
        &lt;/import&gt;
        &lt;setting key="IntSetting" value="42" /&gt;
        &lt;setting key="StringSetting" value="sample config value 2" /&gt;
        &lt;setting key="SettingXml"&gt;
          &lt;content&gt;
            &lt;demo type="test"&gt;
              &lt;list count="42"&gt;
              &lt;a&gt;123&lt;/a&gt;
              &lt;b&gt;test&lt;/b&gt;
              &lt;/list&gt;
            &lt;/demo&gt;
          &lt;/content&gt;
        &lt;/setting&gt;
        &lt;setting key="SettingJson"&gt;
          &lt;content&gt;
          &lt;![CDATA[
          {
            ListenPorts: [ 80, 443 ],
            EnableCaching : true,
            ServerProgramName: "Hypothetical WebServer 1.0",
            Websites: [
              {
                Path: "/srv/www/example/",
                Domain: "example.com",
                Contact: "admin@example.com"    
              },
              {
                Path: "/srv/www/somedomain/",
                Domain: "somedomain.com",
                Contact: "admin@somedomain.com"
              }
            ]
          }
          ]]&gt;
          &lt;/content&gt;
        &lt;/setting&gt;
        &lt;/settings&gt;
      &lt;/package&gt;
    &lt;/packages&gt;
  &lt;/sentinel&gt;
  &lt;sentinel name="ANOTHER-SENTINEL" credential="Standard"&gt;
    &lt;!-- ..... --&gt;
  &lt;/sentinel&gt;
&lt;/sentinels&gt;</pre><p></p>
<p>Voici ce qu’elle décrit :</p>
<ul>
<li>Nous avons deux sentinelles “SENTINEL-NAME-DEMO” et “ANOTHER-SENTINEL »</li>
<li>Les deux sentinelles utilisent le même <a href="/concepts/securite-accesskey-credential-authorization/">credential</a> “Standard” (déclaré dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">section credentials</a>).</li>
<li>Sur la première sentinelle est déployée deux packages :
<ul>
<li>“HWMonitor” : le package utilise le même credential que sa sentinelle (car non défini explicitement donc hérite du credential de sa sentinelle)</li>
<li>“DemoPackage” : ce package utilise le credential nommé “ControlHubAccess” et déclare les settings suivants :
<ul>
<li>IntSetting et StringSetting associés à des valeurs (numérique et string)</li>
<li>SettingXml et SettingJson associés à des contenus (XML et JSON)</li>
<li>Importe le groupes de settings nommé “GroupSettingsDemo” défini dans <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_settingsGroups">la section “settingsGroups”</a></li>
</ul>
</li>
</ul>
</li>
</ul>
<h4>Les sentinelles</h4>
<p>Pour entrer dans le détail, vous allez déclarer dans la section “sentinels”, les sentinelles de votre Constellation que ce soit des sentinelles réelles ou virtuelles.</p>
<p>Pour cela, vous utiliser la balise “&lt;sentinel&gt;” qui comporte les attributs suivants :</p>
<ul>
<li>“<u>name</u>” : le nom de la sentinelle (obligatoire et unique)</li>
<li>“<u>credential</u>” : le nom du credential (déclaré dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">section credentials</a>) à utiliser pour l’authentification (obligatoire)</li>
</ul>
<p>La section “&lt;sentinel&gt;” contient une collection de “&lt;package&gt;” rangée dans la balise “&lt;packages&gt;”. Chaque package peut-être réel ou virtuel.</p>
<h4>Les packages</h4>
<p>L’élément “&lt;package&gt;” contient les attributs suivants :</p>
<ul>
<li>“<u>name</u>”: le nom de l’instance du package (obligatoire et unique)</li>
<li>“<u>filename</u>” (facultatif) : le nom du fichier du package à utiliser dans le repository (<a href="/concepts/instance-package/">plus d’info</a>)</li>
<li>“<u>enable</u>” (facultatif, par defaut <em>true</em>) : indique si le package est activé ou désactivé</li>
<li>“<u>credential</u>” (facultatif, utilise par défaut du credential de sa sentinelle) : spécifie le <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">credential</a> que le package va utiliser pour s’authentifier sur le serveur Constellation</li>
<li>“<u>autostart</u>” (facultatif, par defaut <em>true</em>) : indique si le package doit automatiquement démarrer sur sa sentinelle ou juste être déployé (et donc démarré manuellement)</li>
</ul>
<p>Un package peut contenir ensuite trois sous sections :</p>
<ul>
<li>“<u>recoveryOptions</u>” : définit les options de récupération du package (par défaut, la sentinelle utilise les <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">options globales</a>)</li>
<li>“<u>settings</u>” : définit les paramètres/variables de configuration d’un package</li>
<li>“<u>groups</u>” : définit les groupes dans lesquels le package sera abonné</li>
</ul>
<h5>Les options de récupérations</h5>
<p>La balise est la même que la <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">section globale</a>.</p>
<p>Par exemple si on ne souhaite pas que le package redémarre en cas de crash, on peut écrire :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPackage" enable="true"&gt;
  &lt;recoveryOptions restartAfterFailure="false" /&gt;
&lt;/package&gt;</pre><p></p>
<h5>Les paramètres de configuration</h5>
<p>Chaque package peut définir des paramètres de configuration au niveau du serveur Constellation. Cela vous permet de changer ces paramètres directement depuis la Constellation qui se chargera de redescendre ces paramètres sur vos packages.</p>
<p>Il y a deux types de settings :</p>
<ul>
<li>Les “Setting Value” : il s’agit d’un couple clé/value</li>
<li>Les “Setting Content”  : il s’agit d’un setting dont la valeur peut être un XML ou JSON</li>
</ul>
<p>Dans l’exemple plus haut, le package “DemoPackage” contient à la fois des settings de type “value” et de type “content”.</p>
<p>Vous pouvez également regrouper des settings dans les groupes afin de les partager entre plusieurs package grâce aux <a href="/constellation-server/fichier-de-configuration/#Section_settingsGroups">settingsGroups</a>. Toujours dans l&rsquo;exemple précédent, le package “DemoPackage” inclut le groupe “GroupSettingsDemo”, un groupe de settings décrit dans la section ”<a href="/constellation-server/fichier-de-configuration/#Section_settingsGroups">settingsGroups</a>”.</p>
<p>Pour plus d’information sur les settings, consultez l’article sur l’exploitation des <a href="/client-api/net-package-api/settings/">settings avec l’API .NET</a>.</p>
<h5>Les groupes</h5>
<p>Comme <a href="/concepts/messaging-message-scope-messagecallback-saga/#Message_Scope">vous le savez</a>, un message peut être envoyé à un groupe dans lequel des packages réels ou virtuels peuvent s’abonner.</p>
<p>Il y a deux manières d’abonner un package à un groupe :</p>
<ul>
<li>Soit par le package lui même en invoquant la méthode “SubscribeToMessage” via les différentes API Constellation misent à disposition</li>
<li>Soit dans la configuration du package au niveau du serveur Constellation</li>
</ul>
<p>Cela vous permet d’avoir la main sur l’appartenance des packages aux groupes que vous pouvez administrer sans devoir modifier vos packages (virtuels ou non).</p>
<p>La section “groups” sur un package permet de définir ces liens. Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="MonPackage" enable="true"&gt;
  &lt;groups&gt;
    &lt;group name="MonGroupeA" /&gt;
    &lt;group name="MonGroupeB" /&gt;
  &lt;/groups&gt;
&lt;/package&gt;</pre><p></p>
<p>Ici le package “MonPackage” est abonné aux groupes “MonGroupeA” et “MonGroupeB”. En cas de modification des affectations aux groupes, il faudra redémarrer le package soit via vos applications en utilisant les API du hub de contrôle soit depuis la Console Constellation.</p>
<h3>Section “settingsGroups”</h3>
<p>Vous pouvez grouper des settings (Content ou Value) dans des groupes au niveau du serveur et importer ces groupes dans les settings de vos packages ou dans d’autres groupes.</p>
<p>Par exemple, créons un groupe pour “HWMonitorSettings” qui contient le setting “Interval” :</p>
<p></p><pre class="crayon-plain-tag">&lt;settingsGroups&gt;
  &lt;group name="HWMonitorSettings"&gt;
    &lt;settings&gt;
      &lt;setting key="Interval" value="500" /&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
&lt;/settingsGroups&gt;</pre><p></p>
<p>Ainsi pour chaque instance du package “HWMonitor”, vous pouvez importer le groupe “HWMonitorSettings” afin de centraliser la configuration de ce package :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="HWMonitor"&gt;
  &lt;settings&gt;
    &lt;import&gt;
      &lt;settingGroup groupName="HWMonitorSettings" /&gt;
    &lt;/import&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<p>Vous pouvez importer des groupes dans des groupes sans limite.</p>
<p>C’est toujours la valeur du setting la plus proche du package qui gagne (surcharge).</p>
<p>Bien entendu, vous pouvez créer autant de groupe que vous voulez et chaque groupe peut contenir des SettingValue ou des SettingContent :</p>
<p></p><pre class="crayon-plain-tag">&lt;settingsGroups&gt;
  &lt;group name="test"&gt;
    &lt;settings&gt;
      &lt;setting key="Demo1" value="Seb" /&gt;
      &lt;setting key="Demo2" value="123" /&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
  &lt;group name="test2"&gt;
    &lt;settings&gt;
      &lt;import&gt;
        &lt;settingGroup groupName="common" /&gt;
      &lt;/import&gt;
      &lt;setting key="Demo1" value="Sebastien" /&gt;
      &lt;setting key="Demo2" value="2015" /&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
  &lt;group name="common"&gt;
    &lt;settings&gt;
      &lt;setting key="MyStringSetting" value="This is a string" /&gt;
      &lt;setting key="MyBoolSetting" value="true" /&gt;
      &lt;setting key="MyXmlDocument"&gt;
        &lt;content&gt;
          &lt;note date="09-02-2016"&gt;
            &lt;to&gt;Tove&lt;/to&gt;
            &lt;from&gt;Jani&lt;/from&gt;
            &lt;heading&gt;Reminder&lt;/heading&gt;
            &lt;body&gt;Don't forget me this weekend!&lt;/body&gt;
          &lt;/note&gt;
        &lt;/content&gt;
      &lt;/setting&gt;
      &lt;setting key="MyJsonObject"&gt;
        &lt;content&gt;
          &lt;![CDATA[
        {
          "Number": 123,
          "String" : "This is a test (local)",
          "Boolean": true
        }
        ]]&gt;
        &lt;/content&gt;
      &lt;/setting&gt;
    &lt;/settings&gt;
  &lt;/group&gt;
&lt;/settingsGroups&gt;</pre><p></p>
<p>Pour bien comprendre, imaginez le package suivant :</p>
<p></p><pre class="crayon-plain-tag">&lt;package name="DemoPackage"&gt;
  &lt;settings&gt;
    &lt;import&gt;
      &lt;settingGroup groupName="test" /&gt;
      &lt;settingGroup groupName="test2" /&gt;
    &lt;/import&gt;
    &lt;setting key="numberTest" value="42" /&gt;
    &lt;setting key="Demo1" value="It’me" /&gt;
  &lt;/settings&gt;
&lt;/package&gt;</pre><p></p>
<p>Ici cette instance du package “DemoPackage” définie au niveau du serveur (= sans prendre en compte les settings déclarés dans le fichier local et le manifeste) 7 settings :</p>
<ul>
<li>numberTest = 42 (définit dans les settings du package)</li>
<li>Demo1 = “It’s me” (définit dans les settings du package, cette valeur écrase celle des groupes importés)</li>
<li>Demo2 = 2015 (définit par le groupe “test2”. Cette valeur écrase la valeur du groupe “test”, car le groupe “test2” est importé APRES le groupe “test”)</li>
<li>MyStringSetting, MyBoolSetting, MyXmlDocument et MyJsonObject définies par le groupe “common” (groupe importé dans le groupe “test2” lui même importé sur le package “DemoPackage”).</li>
</ul>
<h3>Section “credentials”</h3>
<p>Comme évoqué dans <a href="/concepts/securite-accesskey-credential-authorization/">l’article lié à la sécurité</a>, tous les appels (http) au serveur Constellation doivent être authentifiés en utilisant une clé d’accès que l’on nomme “AccessKey”.</p>
<p>Ces clé d’accès sont liés à des credentials.</p>
<p>Dans la section “credentials” nous allons donc définir les différents credentials ainsi que les différentes autorisations et droits sur ces credentials.</p>
<p>Chaque credential comporte obligatoirement deux propriétés :</p>
<ul>
<li>Le nom (unique) du credential</li>
<li>L’AccessKey</li>
</ul>
<p>Ainsi que les propriétés suivantes :</p>
<ul>
<li>“<u>enable</u>” (<em>true</em> par défaut) : indique si le credential est activé ou désactivé</li>
<li>“<u>enableControlHub</u>” (<em>false</em> par défaut) : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)</li>
<li>“<u>enableManagementAPI</u>” (<em>false</em> par défaut) : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)</li>
<li>“<u>enableDeveloperAccess</u>” (<em>false </em>par défaut) : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)</li>
</ul>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credentials&gt;
  &lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749" /&gt;
  &lt;credential name="Administrator" accessKey="b363d6ccb86ef1418a72f9fea4b96975d8a1f2c7" enableControlHub="true" enableDeveloperAccess="true" enableManagementAPI="true" /&gt;
&lt;/credentials&gt;</pre><p></p>
<p>Vous pouvez ensuite définir des <a href="/concepts/securite-accesskey-credential-authorization/#Les_Authorizations">autorisations</a> particulières sur un credential pour l’envoi de message, l’abonnement aux groupes de message ou encore l’interrogation de StateObject.</p>
<p>Pour cela il existe trois sous-sections :</p>
<ul>
<li>“<u>stateObjects</u>” : autorisations spécifiques pour l’interrogation (Request ou Subscribe) des StateObjects</li>
<li>“<u>messages</u>” : autorisations spécifiques pour l’envoi de messages</li>
<li>“<u>groups</u>” : autorisations spécifiques pour l’abonnement aux groupes</li>
</ul>
<h4>Les autorisations sur l’interrogation des StateObjects</h4>
<p>Par défaut un credential actif (<em>enable=true</em>) peut interroger (Request ou Subscribe) tous les StateObjects de votre Constellation sans restriction.</p>
<p>Pour modifier ce comportement vous pouvez utiliser les autorisation sur les StateObjects.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749"&gt;
  &lt;authorizations&gt;
    &lt;stateObjects defaultAuthorization="Deny"&gt;
      &lt;authorization id="Paradox" authorization="Allow" packageName="Paradox" /&gt;
      &lt;authorization id="MonPC" authorization="Allow" sentinelName="PC-SEB" /&gt;
      &lt;authorization id="LesCPU" authorization="Allow" packageName="HWMonitor" name="/intelcpu/load/0" /&gt;
      &lt;authorization id="ServerRAM" authorization="Allow" sentinelName="SERVER" packageName="HWMonitor" name="/ram/load" /&gt;
    &lt;/stateObjects&gt;
  &lt;/authorizations&gt;
&lt;/credential&gt;</pre><p></p>
<p>Ici le credential “Standard” ne pourra pas interroger les StateObjects de la Constellation (defaultAuthorization = Deny) sauf pour les exceptions suivantes :</p>
<ul>
<li>Les StateObjects produits par le(s) instance(s) du package “Paradox”</li>
<li>Les StateObjects produits par les packages (quel qu’il soit) de la sentinelle “PC-SEB”</li>
<li>Les StateObjects nommés “/intelcpu/load/0” et produits par le package “HWMonitor” peu importe la sentinelle</li>
<li>Le StateObject nommé “/ram/load” produit par le package “HWMonitor” sur la sentinelle “SERVER”</li>
</ul>
<p>Vous devez donc définir l’autorisation par défaut (defaultAuthorization) et optionnellement ajouter une ou plusieurs exceptions avec l’élément &lt;authorization&gt; dont les attributs sont les suivants :</p>
<ul>
<li>“<u>id</u>” (obligatoire) : identifiant unique de l’autorisation</li>
<li>“<u>authorization</u>” (facultatif &#8211; <em>Allow</em> par défaut) : type de l’exception (<em>Allow</em> ou <em>Deny</em>)</li>
<li>“<u>sentinelName</u>” (facultatif – <em>*</em> par défaut) : sentinelle producteur du StateObject</li>
<li>“<u>packageName</u>” (facultatif – <em>*</em> par défaut) : package producteur du StateObject</li>
<li>“<u>name</u>” (facultatif – <em>*</em> par défaut) :  nom du StateObject</li>
</ul>
<h4>Les autorisations sur l’envoi de messages</h4>
<p>Par défaut un credential actif (<em>enable=true</em>) peut envoyer un message à n’importe quel scope dans votre Constellation sans restriction.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749"&gt;
  &lt;authorizations&gt;
    &lt;messages defaultAuthorization="Deny"&gt;
      &lt;authorization id="GroupA" authorization="Allow" scope="Group" args="A" /&gt;
      &lt;authorization id="DemoSeb" authorization="Allow" scope="Package" args="DemoPackage" /&gt;
      &lt;authorization id="TemperatureNest" authorization="Allow" scope="Package" args="Nest" messageKey="SetTargetTemperature"  /&gt;
    &lt;/messages&gt;
  &lt;/authorizations&gt;
&lt;/credential&gt;</pre><p></p>
<p>Ici le credential “Standard” ne pourra pas envoyer de message dans la Constellation (defaultAuthorization = Deny) sauf pour les exceptions suivantes :</p>
<ul>
<li>Messages envoyés au groupe “A”</li>
<li>Messages envoyés au package “DemoPackage”</li>
<li>Message “SetTargetTemperature” envoyé au package “Nest”</li>
</ul>
<p>Vous devez donc définir l’autorisation par défaut (defaultAuthorization) et optionnellement ajouter une ou plusieurs exceptions avec l’élément &lt;authorization&gt; dont les attributs sont les suivants :</p>
<ul>
<li>“<u>id</u>” (obligatoire) : identifiant unique de l’autorisation</li>
<li>“<u>scope</u>” (obligatoire) : type de <a href="/concepts/messaging-message-scope-messagecallback-saga/#Message_Scope">scope</a> pour le message (<em>All</em>, <em>Group</em>, <em>Package</em> ou <em>Sentinel</em>)</li>
<li>“<u>authorization</u>” (facultatif &#8211; <em>Allow</em> par défaut) : type de l’exception (<em>Allow</em> ou <em>Deny</em>)</li>
<li>“<u>args</u>” (facultatif) : les arguments du scope</li>
<li>“<u>messageKey</u>” (facultatif) :  la clé du message</li>
</ul>
<h4>Les autorisation sur l’abonnement aux groupes</h4>
<p>Par défaut un credential actif (<em>enable=true</em>) peut s’abonner à n’importe quel groupe sans restriction.</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;credential name="Standard" accessKey="fb1af70a46057dbf4f2ff3f43b6ec0c544b22749"&gt;
  &lt;authorizations&gt;
    &lt;groups defaultAuthorization="Deny"&gt;
      &lt;authorization groupName="A" /&gt;
    &lt;/groups&gt;
  &lt;/authorizations&gt;
&lt;/credential&gt;</pre><p></p>
<p>Ici le credential “Standard” ne pourra pas s’abonner à des groupes (defaultAuthorization = Deny) à l’exception du groupe “A”. Les attributs sont les suivants :</p>
<ul>
<li>“<u>groupName</u>” (obligatoire) : le nom du groupe</li>
<li>“<u>authorization</u>” (facultatif &#8211; <em>Allow</em> par défaut) : type de l’exception (<em>Allow</em> ou <em>Deny</em>)</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/">Le fichier de configuration</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Gérer les credentials avec la Console Constellation</title>
		<link>https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/</link>
					<comments>https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 19 Aug 2016 14:56:33 +0000</pubDate>
				<category><![CDATA[Constellation Console]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[Console]]></category>
		<category><![CDATA[AccessKey]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2368</guid>

					<description><![CDATA[<p>Dans le menu principal de gauche, sous la section “Server Management”, rendez-vous sur la page “Manage Credentials” : Vous obtiendrez sur la page la liste des credentials déclarés sur votre Constellation avec leurs clés d’accès associées, utilisées pour authentifier toutes</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">Gérer les credentials avec la Console Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Dans le menu principal de gauche, sous la section “Server Management”, rendez-vous sur la page “Manage Credentials” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-38.png"><img class="colorbox-2368"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-27.png" alt="image" width="350" height="120" border="0" /></a></p>
<p align="left">Vous obtiendrez sur la page la liste des credentials déclarés sur votre Constellation avec leurs clés d’accès associées, utilisées pour authentifier toutes requêtes vers votre Constellation.</p>
<p align="left">N’hésitez pas à lire ou relire la <a href="/concepts/securite-accesskey-credential-authorization/">page dédiée aux concepts de Credential / AccessKey et Authorization</a> avant de poursuivre !</p>
<p align="left">Pour chaque credential vous avez la possibilité d’activer ou désactiver la clé d’accès en cliquant sur le bouton “Disable” ou “Enable” :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-39.png"><img class="colorbox-2368"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-28.png" alt="image" width="124" height="50" border="0" /></a><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-40.png"><img class="colorbox-2368"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-29.png" alt="image" width="124" height="48" border="0" /></a></p>
<p align="left">Attention ces actions sont immédiates. Si vous désactivez une clé d’accès actuellement utilisée par un ou plusieurs packages, leurs accès seront immédiatement révoqués.</p>
<p align="left">Vous pouvez également accéder au menu contextuel pour éditer le crédential, ses autorisation ou le supprimer.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-41.png"><img class="colorbox-2368"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-30.png" alt="image" width="190" height="174" border="0" /></a></p>
<h3>Ajouter ou éditer un credential</h3>
<p>Si vous cliquez sur le bouton “Add credential” ou “Edit” du menu contextuel d’une sentinelle, vous obtiendrez la fenêtre suivante :</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-42.png"><img class="colorbox-2368"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-31.png" alt="image" width="350" height="273" border="0" /></a></p>
<p align="left"><u>Note</u> : dans le cas d’une édition vous ne pourrez pas éditer le nom du credential.</p>
<p align="left">Vous pouvez cependant éditer en toute circonstance la clé d’accès et même utiliser un générateur login/password comme <a href="/concepts/securite-accesskey-credential-authorization/#Login_et_AccessKey">expliqué ici</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-43.png"><img class="colorbox-2368"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-32.png" alt="image" width="350" height="353" border="0" /></a></p>
<p align="left">Pour rappel, chaque credential porte les propriétés suivantes :</p>
<ul>
<li><u>Enable</u> : indique si le credential est activé ou désactivé</li>
<li><u>EnableControlHub</u> : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)</li>
<li><u>EnableManagementAPI</u> : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)</li>
<li><u>EnableDeveloperAccess</u> : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)</li>
</ul>
<h3>Gérer les autorisations</h3>
<p>En cliquant sur “Edit Authorizations” vous pourrez gérer les autorisations d’un credential pour limiter l’envoi de message, les StateObjects autorisés à consommer et les groupes.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-44.png"><img class="colorbox-2368"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-33.png" alt="image" width="350" height="238" border="0" /></a></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">Gérer les credentials avec la Console Constellation</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>La sécurité : AccessKey, Credential et Authorization</title>
		<link>https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/</link>
					<comments>https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 12:30:20 +0000</pubDate>
				<category><![CDATA[Concepts]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[AccessKey]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[Securité]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2143</guid>

					<description><![CDATA[<p>Tous les appels (HTTP) au serveur Constellation doivent être authentifiés. Pour cela, nous utilisons une clé d’accès que l’on nomme “AccessKey”. L’AccessKey Chaque requête au serveur Constellation comporte soit dans les paramètres de l’URL (querystring) soit dans les entêtes (headers)</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/">La sécurité : AccessKey, Credential et Authorization</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Tous les appels (HTTP) au serveur Constellation doivent être authentifiés. Pour cela, nous utilisons une clé d’accès que l’on nomme “AccessKey”.</p>
<h3>L’AccessKey</h3>
<p>Chaque requête au serveur Constellation comporte soit dans les paramètres de l’URL (querystring) soit dans les entêtes (headers) HTTP trois informations :</p>
<ul>
<li><u>SentinelName</u> : le nom de la sentinelle</li>
<li><u>PackageName</u> : le nom du package</li>
<li><u>AccessKey</u> : la clé d’accès</li>
</ul>
<p>Les paramètres “SentinelName” et “PackageName” permettent d’identifier le package qui réalise la requête car un package (virtuel ou non) est toujours associé à une sentinelle (virtuelle ou non).</p>
<p>En fait le couple “SentinelName/PackageName” forme l’identifiant unique du package (nommé <a href="/concepts/instance-package-versioning-et-resolution/">instance de package</a>) dans la Constellation et l’AccessKey peut être comparé au “mot de passe”.</p>
<p>Une sentinelle (virtuelle ou non) déclarée dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/">configuration de votre Constellation</a> doit obligatoirement être associée à une clé d’accès et les packages (virtuels ou non) déclarés sur une sentinelle utilisent implicitement la même clé d’accès ou bien peuvent redéfinir une clé spécifique.</p>
<p>Il y a quelques cas particuliers :</p>
<ul>
<li>Lorsqu&rsquo;une sentinelle produit des logs, son “PackageName” est “Sentinel”</li>
<li>Pour les consommateurs ou contrôleurs, le “SentinelName” est soit “Consumer” ou soit “Controller” et le “PackageName” sert de “FriendlyName” pour les logs</li>
<li>Dans le cas de l’utilisation de la fonction de “Debug on Constellation” depuis le SDK VisualStudio, le “SentinelName” est “Developer”</li>
</ul>
<h3>Les Credentials</h3>
<p>Dans le <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">fichier de configuration de votre Constellation</a>, on ne déclare pas l’AccessKey directement sur une sentinelle ou un package.</p>
<p>En effet une sentinelle est associée à un credential et un package utilise implicitement le même credential que sa sentinelle ou bien redéfini son propre credential.</p>
<p>Un credential comporte obligatoirement deux propriétés :</p>
<ul>
<li>Le nom (unique) du credential</li>
<li>L’AccessKey</li>
</ul>
<p>Pour authentifier une requête, le serveur Constellation regardera alors si l’AccessKey de la requête correspond bien à celle déclarée pour le credential utilisé par le couple Sentinel/Package.</p>
<p>Un credential peut définir les propriétés suivantes :</p>
<ul>
<li><u>Enable</u> : indique si le credential est activé ou désactivé</li>
<li><u>EnableControlHub</u> : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)</li>
<li><u>EnableManagementAPI</u> : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)</li>
<li><u>EnableDeveloperAccess</u> : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)</li>
</ul>
<p>Vous pouvez gérer les credentials depuis <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">la Console Constellation</a> ou depuis <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">le fichier de configuration</a>.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/08/image-11.png"><img class="colorbox-2143"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="Manage Credential" src="https://developer.myconstellation.io/wp-content/uploads/2016/08/image_thumb-11.png" alt="Manage Credential" width="354" height="141" border="0" /></a></p>
<h3>Login et AccessKey</h3>
<p>L’AccessKey doit être une chaîne de caractère assez longue et sera utilisée un peu comme un mot de passe pour l’authentification.</p>
<p>Cependant il est assez compliqué de retenir un AccessKey surtout comparé à un couple “login / password” que nous utilisons au quotidien.</p>
<p>C’est pourquoi la Console Constellation, les installeurs Constellation ou encore le SDK Constellation propose d’utiliser un login/password pour générer un AccessKey.</p>
<p>La formule est très simple : <strong>AccessKey = sha1(login + password)</strong>. En clair une clé d’accès peut être obtenue par le hash SHA1 de la concaténation du login avec un mot de passe.</p>
<p>Par exemple, si mon login est “<u>admin</u>” et que mon mot de passe est “<u>P@</u><u>ssw0rd</u>” alors ma clé d’accès (AccessKey) sera <u>a5761adf00e4060f05fab7017b32905cc9e5d540</u> (= le hash SHA1 de “adminP@ssw0rd”).</p>
<h3>Les Authorizations</h3>
<p>Par défaut un credential actif (<em>enable=true</em>) à le droit d’interroger (<em>Request</em> ou <em>Subscribe</em>) tous les StateObjects de votre Constellation sans restriction ou d&rsquo;envoyer des messages à n’importe quel scope ou encore de s’abonner n’importe quel groupe.</p>
<p>Imaginez maintenant que vous réalisez une page Web en <a href="/client-api/javascript-api/">Javascript</a> connectée à votre Constellation pour afficher les valeurs de quelques StateObjects en temps réel ou encore pour envoyer des messages pour contrôler certains dispositifs.</p>
<p>Dans le cas présent, si il s’agit d’une page JavaScript, le code est “client-side”, donc n’importe quelle personne ayant accès à cette page pourra visualiser le code source et récupérer l’AccessKey utilisée.</p>
<p>En clair si vous développez un petit morceau de Javscript pour afficher en temps réel la consommation de votre CPU (StateObject produit par le package HWMonitor par exemple) sur votre site Web, n’importe qui pourrait récupérer votre clé d’accès et suivre en temps réel le statut de votre alarme, votre courbe de poids, la température de votre chambre, le volume de votre ampli, etc… Ou pire encore, envoyer différents messages dans votre Constellation pour éteindre des machines, allumer des lumières, ouvrir la porte de garage, augmenter le chauffage, etc…</p>
<p>Un concept « d&rsquo;autorisation” a été introduite dans la version 1.8 de Constellation pour restreindre les droits sur une clé d’accès (AccessKey) sur les éléments suivants :</p>
<ul>
<li>L’interrogation des StateObjects</li>
<li>L’envoi de message (invocation des MessageCallback)</li>
<li>L’abonnement à des groupes de message</li>
</ul>
<p>De ce fait, si vous souhaitez afficher par exemple la consommation de votre CPU de telle machine, vous allez créer un credential qui n’aura que le droit (autorisation) de visualiser ce StateObject ni plus ni moins.</p>
<p>Plus d’information, consultez l&rsquo;article dédié à <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">la configuration des autorisations</a>.</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/">La sécurité : AccessKey, Credential et Authorization</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/concepts/securite-accesskey-credential-authorization/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>L&#8217;interface REST « Constellation »</title>
		<link>https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/</link>
					<comments>https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/#comments</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Tue, 16 Aug 2016 08:51:20 +0000</pubDate>
				<category><![CDATA[REST API]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[PurgeStateObject]]></category>
		<category><![CDATA[MessageCallback]]></category>
		<category><![CDATA[PackageDescriptor]]></category>
		<category><![CDATA[Saga]]></category>
		<category><![CDATA[AccessKey]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Virtuel]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[Request]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Subscribe]]></category>
		<category><![CDATA[SendMessage]]></category>
		<category><![CDATA[PushStateObject]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[WriteLog]]></category>
		<category><![CDATA[Setting]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2296</guid>

					<description><![CDATA[<p>L’interface REST “Constellation” est une API HTTP permettant d’exposer les fonctionnalités de base pour les packages “virtuels”. Avec cette interface vous pourrez via des requêtes HTTP : Publier, consommer ou purger des StateObjects Envoyer et recevoir des messages Récupérer les</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/">L&rsquo;interface REST « Constellation »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>L’interface REST “Constellation” est une API HTTP permettant d’exposer les fonctionnalités de base pour les <a href="/concepts/sentinels-packages-virtuels/">packages “virtuels”</a>.</p>
<p>Avec cette interface vous pourrez via des requêtes HTTP :</p>
<ul>
<li>Publier, consommer ou purger des StateObjects</li>
<li>Envoyer et recevoir des messages</li>
<li>Récupérer les settings du package « virtuel »</li>
<li>Produire des logs</li>
<li>Déclarer le “Package Descriptor” (MessageCallbacks exposés ou les types utilisés par les MC ou SO)</li>
</ul>
<p>De ce fait un script Bash ou Powershell, une page PHP, un Arduino, ESP ou NetDuino, bref n’importe quel système, objet ou langage pouvant effectuer des appels HTTP peut être considéré comme un package (dit virtuel) de votre Constellation et produire ou consommer des StateObjects, envoyer ou recevoir des messages, écrire des logs, etc…</p>
<h3>Généralités</h3>
<h4>Construction de l’URL</h4>
<p>L’URL est :  &lt;Root URI&gt;/rest/constellation/&lt;action&gt;?&lt;paramètres&gt;</p>
<p>Partons du principe que votre Constellation est exposée en HTTP sur le port 8088 (sans path). On retrouvera dans le <a href="/constellation-server/fichier-de-configuration/">fichier de configuration</a> la section suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;listenUris&gt;
  &lt;uri listenUri="http://+:8088/" /&gt;
&lt;/listenUris&gt;</pre><p></p>
<p>La “Root URI “ est donc “<strong>http://&lt;ip ou dns&gt;:8088/</strong>”.</p>
<p>Par exemple si nous sommes en local, nous pourrions écrire :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/xxxxx</pre><p></p>
<h4>Authentification</h4>
<p>Comme pour toutes les requêtes vers Constellation vous devez impérativement spécifier dans <u>les headers HTTP</u> <strong>ou</strong> dans <u>les paramètres de l’URL</u> (querystring), les paramètres “SentinelName”, “PackageName” et “AccessKey” pour l’authentification.</p>
<p>Ici votre “<a href="/concepts/sentinels-packages-virtuels/">package virtuel</a>” doit être déclaré dans la <a href="/constellation-platform/constellation-server/fichier-de-configuration/">configuration</a> de votre Constellation comme un véritable package, c’est à dire avec une sentinelle (dite virtuelle) et un package qui peut contenir des settings, etc…</p>
<p>Par exemple :</p>
<p></p><pre class="crayon-plain-tag">&lt;sentinels&gt;
  &lt;sentinel name="MyVirtualSentinel" credential="Standard"&gt;
    &lt;packages&gt;        
      &lt;package name="MyVirtualPackage" enable="true"&gt;
        &lt;settings&gt;
          &lt;setting key="IntSetting" value="42" /&gt;
          &lt;setting key="StringSetting" value="sample config value" /&gt;
        &lt;/settings&gt;
      &lt;/package&gt;
    &lt;/packages&gt;
  &lt;/sentinel&gt;
&lt;/sentinels&gt;</pre><p></p>
<p>On a ici déclaré une sentinelle virtuelle “MyVirtualSentinel” qui contient le package virtuelle “MonPackageVirtuel”. Ce package <a href="/concepts/securite-accesskey-credential-authorization/">utilise implicitement l’AccessKey</a> du credential “Standard” déclaré au niveau de la sentinelle.</p>
<p>De ce fait, pour chaque appel on passera les paramètres suivants (dans l’URL ou dans les headers) :</p>
<ul>
<li>SentinelName = MyVirtualSentinel</li>
<li>PackageName = MyVirtualPackage</li>
<li>AccessKey = MyAccessKey (en partant du principe que l’AccessKey déclaré pour le credential “Standard” est “MyAccessKey”)</li>
</ul>
<p>Pour la suite de cet article nous passerons tous les paramètres dans l’URL, ainsi chaque appel sera sous la forme :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/&lt;action&gt;?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;&lt;paramètres&gt;</pre><p></p>
<h4>Check Access</h4>
<p>Toutes les API REST de Constellation exposent une méthode en GET “CheckAccess” qui retourne un code HTTP 200 (OK). Cela permet de tester la connexion et l’authentification au serveur Constellation.</p>
<ul>
<li>Action : “CheckAccess” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/CheckAccess?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey</pre><p></p>
<h3>Publier des StateObjects</h3>
<ul>
<li>Action : “PushStateObject” (GET ou POST)</li>
<li>En GET, voici les paramètres de l’URL :
<ul>
<li><u>name</u> : le nom du StateObject</li>
<li><u>value</u> : la valeur du StateObject</li>
<li><u>type</u> (optionnel) : le type du StateObject</li>
<li><u>lifetime</u> (optionnel – par défaut 0) : la durée de vie (en seconde) du StateObject avant d’être marqué “expiré”. (0 = durée de vie infinie)<!--EndFragment--></li>
</ul>
</li>
</ul>
<p>Pour publier un StateObject vous devez obligatoirement spécifier son nom (name) et sa valeur (value). La valeur peut être un type simple (un Int, String, bool, etc..) ou un objet complexe formaté en JSON. Optionnellement vous pouvez spécifier le type et la durée de vie de votre SO (en seconde).</p>
<p>Par exemple publions un StateObject nommé “Temperature” dont la valeur est le nombre “21” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PushStateObject?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;name=Temperature&amp;value=21</pre><p></p>
<p>Autre exemple avec un objet complexe contenant deux propriété (Temperature et Humidity) dont la durée de vie est de 60 secondes et le type nommé “TemperatureHumidity” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PushStateObject?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;name=Temperature&amp;value={ Temperature: 21, Humidity: 72 }&amp;type=TemperatureHumidity&amp;lifetime=60</pre><p></p>
<p>Si la valeur du StateObject est trop grande pour être passée dans l’URL ou si vous souhaitez ajouter des métadonnées (metadatas) à votre StateObject vous pouvez “poster” le StateObject dans le corps de la requête HTTP en utilisant le verbe “POST” (sans oublier de définir le Content-Type à “application/json”).</p>
<p>Pour publier par un POST le même StateObject en lui ajoutant deux métadonnées :</p>
<p></p><pre class="crayon-plain-tag">POST http://localhost:8088/rest/constellation/PushStateObject?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey
Host: localhost:8088
Content-Length: 189
Content-Type: application/json

{
  "Name" : "Temperature",
  "Value" : { Temperature: 21, Humidity: 72 },
  "Type" : "TemperatureHumidity",
  "Lifetime" : 60,
  "Metadatas": { "ChipId":"ABC123", "Room":"Garden" }
}</pre><p></p>
<h3>Purger ses StateObjects</h3>
<p>Un package peut supprimer ses StateObjects qu’il produit avec la méthode “PurgeStateObjects”.</p>
<ul>
<li>Action : “PurgeStateObjects” (GET)</li>
<li>Paramètres:
<ul>
<li><u>name</u> (optionnel – par défaut “*”) : le nom du StateObject</li>
<li><u>type</u> (optionnel – par défaut “*”) : le type du StateObject</li>
</ul>
</li>
</ul>
<p>Vous pouvez spécifier le nom du StateObject à supprimer et/ou son type. Par défaut ces deux paramètres sont définis à “*”. C’est à dire que si vous ne précisez rien, tous les StateObjects du package seront purgés.</p>
<ul><!--EndFragment--></ul>
<p>Par exemple pour purger tous les StateObjects de notre package virtuel (instance MyVirtualSentinel/MyVirtualPackage):</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PurgeStateObjects?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey</pre><p></p>
<p>Pour purger tous les StateObjects de type “Temperature” de cette même instance :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PurgeStateObjects?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;type=Temperature</pre><p></p>
<p>Ou pour supprimer le StateObject nommé “Demo” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/PurgeStateObjects?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;name=Demo</pre><p></p>
<h3>Ecrire des logs</h3>
<p>Les packages peuvent écrire des logs qui seront remontés dans le hub Constellation.</p>
<ul>
<li>Action : “WriteLog” (GET)</li>
<li>Paramètres:
<ul>
<li><u>message</u> : texte du log</li>
<li><u>level</u> (optionnel – par défaut “Info”) : le niveau du log (Info, Warn ou Error)</li>
</ul>
<p><!--EndFragment--></li>
</ul>
<p>Exemple d’un message “Info” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/WriteLog?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;message=Hello World</pre><p></p>
<p>Exemple pour produire un message d’erreur (Error) :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/WriteLog?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey&amp;message=Il y  a une erreur ici&amp;level=Error</pre><p></p>
<h3>Récupérer ses settings</h3>
<p>Les settings sont récupérés en invoquant la méthode “GetSettings”.</p>
<ul>
<li>Action : “GetSettings” (GET)</li>
<li>Paramètres:  aucun</li>
</ul>
<p>Par exemple pour récupérer les settings (dictionnaire de clé / valeur) définis pour notre package virtuel :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetSettings?SentinelName=MyVirtualSentinel&amp;PackageName=MyVirtualPackage&amp;AccessKey=MyAccessKey</pre><p></p>
<h3>Envoyer des messages</h3>
<ul>
<li>Action : “SendMessage” (GET ou POST)</li>
<li>En GET, voici les paramètres de l’URL :
<ul>
<li><u>scope</u> : le type de scope (All, Other, Group, Sentinel ou Package)</li>
<li><u>args</u> : les arguments du scope (par exemple le nom du groupe, de la sentinelle, du package ou de l’instance du package – plusieurs valeurs possibles séparées par des virgules)</li>
<li><u>key</u> : la clé du message (= la méthode à invoquer)</li>
<li><u>data</u> : le contenu du message (= les arguments de la méthode)</li>
<li><u>sagaId</u> (optionnel) : l’identification de la saga si le message est envoyé dans une saga</li>
</ul>
</li>
</ul>
<p>Vous pouvez également invoquer cette action en POST. Le corps de votre requête contiendra l’objet JSON suivant :</p>
<p></p><pre class="crayon-plain-tag">{
  "Scope" : { "Type" : "&lt;type&gt;", Args: [ "&lt;arg1&gt;", "&lt;args2&gt;", .... ], "SagaId":"Identifiant de la Saga" },
  "Key" : "&lt;Key&gt;",
  "Data" : "&lt;Data&gt;"
}</pre><p></p>
<p>La propriété “SagaId” dans le JSON ci-dessus est optionnelle.</p>
<p>Par exemple pour envoyer un message au package Nest en invoquant la méthode (key) “SetTargetTemperature” avec en paramètre le nombre “21” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SendMessage?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;scope=Package&amp;args=Nest&amp;key=SetTargetTemperature&amp;data=21</pre><p></p>
<p>Ce même MessageCallback “SetTargetTemperature” du package Nest peut être invoqué dans une saga afin de recevoir un accusé de réception :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SendMessage?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;scope=Package&amp;args=Nest&amp;key=SetTargetTemperature&amp;data=21&amp;sagaId=123456789</pre><p></p>
<p>Il faudra ensuite “récupérer” les messages reçus (voir dessous) pour lire la réponse à votre saga que nous avons ici identifié par la clé “123456789”.</p>
<h3>Recevoir des messages</h3>
<h4>Créer un abonnement de réception</h4>
<p>Tout d’abord pour recevoir des messages il faut s’abonner aux messages.</p>
<ul>
<li>Action : “SubscribeToMessage” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> (optionnel) : identifiant de l’abonnement si déjà connu</li>
</ul>
</li>
</ul>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToMessage?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Vous obtiendrez en réponse l’ID de votre abonnement, le “Subscription Id”.</p>
<h4>Relever les messages</h4>
<ul>
<li>Action : “GetMessages” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> : identifiant de l’abonnement</li>
<li><u>timeout</u> (optionnel – par défaut 60000) : temps maximal en milliseconde de la mise en attente de la requête (entre 1000ms et 120000ms)</li>
<li><u>limit</u> (optionnel – par défaut 0) : nombre maximum de message à retourner pour l’appel</li>
</ul>
</li>
</ul>
<p>Il s’agit d’une requête en “long-polling” c’est à dire que la requête sera “bloquée” sur le serveur tant qu’il n’y a pas de message reçu évitant ainsi de “flooder” en continue le serveur pour savoir si de nouveaux messages sont disponibles ou non. Par défaut la requête est bloquée 60 secondes maximum mais vous pouvez personnaliser cette valeur avec le paramètre “timeout”. Si il y a des messages disponibles, le serveur vous renvoi un tableau JSON avec les messages reçus. Si il n’y a pas de réponse dans le délai spécifié par le paramètre “timeout” (60 secondes par défaut), le tableau retourné sera vide.</p>
<p>A chaque réponse vous devez donc relancer une requête “GetMessages” pour “écouter” les prochains messages qui vont sont destinés.</p>
<p>Il est également possible de limiter le nombre de message dans la réponse avec le paramètre “limit” ce qui peut être utile sur de petits “devices” ne disposant pas de beaucoup de mémoire RAM pour désérialiser de gros tableaux JSON.</p>
<p>Exemple simple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetMessages?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=xxxxx</pre><p></p>
<p>Autre exemple en limitant le nombre de message à 2 par appel et en bloquant la requête pendant 10 secondes au maximum :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetMessages?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=xxxxx&amp;timeout=10000&amp;limit=2</pre><p></p>
<h4>S’abonner à un groupe</h4>
<p>Vous pouvez vous abonner à des groupes pour recevoir les messages envoyés dans ces groupes par l’action “SubscribeToMessageGroup” en précisant le nom du groupe et votre ID d’abonnement.</p>
<ul>
<li>Action : “SubscribeToMessageGroup” (GET)</li>
<li>Paramètres :
<ul>
<li><u>group</u> : le nom du groupe à joindre</li>
<li><u>subscriptionId</u> (optionnel) : identifiant de l’abonnement si déjà connu</li>
</ul>
</li>
</ul>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToMessageGroup?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=xxxxx&amp;group=A</pre><p></p>
<p>Comme l’action “SubscribeToMessage”, cette action vous retourne l’ID d’abonnement à utiliser pour l’action “GetMessages”.</p>
<h3>Consommation de StateObjects</h3>
<h4>Request</h4>
<p>Cette méthode permet de récupérer la valeur actuelle d’un ou de plusieurs StateObjects.</p>
<ul>
<li>Action : “RequestStateObjects” (GET)</li>
<li>Paramètres :
<ul>
<li><u>sentinel</u> (optionnel – par défaut “*”): nom de la sentinelle</li>
<li><u>package</u> (optionnel – par défaut “*”) : nom du package</li>
<li><u>name</u> (optionnel – par défaut “*”) : nom du StateObject</li>
<li><u>type</u> (optionnel – par défaut “*”) : type du StateObject</li>
</ul>
</li>
</ul>
<p>Par exemple pour récupérer tous les StateObject de votre Constellation :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/RequestStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Ou seulement ceux produits par le package “HWMonitor” (quelque soit la sentinelle) :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/RequestStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;package=HWMonitor</pre><p></p>
<p>Ou encore tous les StateObjects nommés “/intelcpu/load/0” et produits le package “HWMonitor” (quelque soit la sentinelle) :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/RequestStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;package=HWMonitor&amp;name=/intelcpu/load/0</pre><p></p>
<h4>Subscribe</h4>
<p>Vous pouvez également vous abonner aux mises à jour des StateObjects.</p>
<p>Le principe est le même qu’avec les messages : il faut récupérer un ID d’abonnement et invoquer une méthode en long-polling pour recevoir les mises à jour.</p>
<h5>S’abonner à des StateObjects</h5>
<ul>
<li>Action : “SubscribeToStateObjects” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> (optionnel) : identifiant de l’abonnement si déjà connu</li>
<li><u>sentinel</u> (optionnel – par défaut “*”): nom de la sentinelle</li>
<li><u>package</u> (optionnel – par défaut “*”) : nom du package</li>
<li><u>name</u> (optionnel – par défaut “*”) : nom du StateObject</li>
<li><u>type</u> (optionnel – par défaut “*”) : type du StateObject</li>
</ul>
</li>
</ul>
<p>En retour vous obtiendrez l’ID d’abonnement (un GUID).</p>
<p>Par exemple pour s’abonner au SO “/intelcpu/load/0”, produit le package “HWMonitor” sur la sentinelle “MON-PC” :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;sentinel=MON-PC&amp;package=HWMonitor&amp;name=/intelcpu/load/0</pre><p></p>
<p><strong>ATTENTION</strong> : si vous souhaitez “ajouter” des SO à votre abonnement vous devez <u>impérativement</u> préciser votre ID d’abonnement récupéré lors du 1er appel autrement vous allez créer un nouvel abonnement.</p>
<p>Par exemple pour “ajouter” le SO correspondant à la consommation RAM :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/SubscribeToStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;sentinel=MON-PC&amp;package=HWMonitor&amp;name=/ram/load&amp;subscriptionId=&lt;subId&gt;</pre><p></p>
<h5>Relever les StateObjects mis à jour</h5>
<p>Pour récupérer les SO de votre abonnement qui ont changés entre deux appels vous devez invoquer l’action “GetStateObjects” en spécifiant l’ID de votre abonnement :</p>
<ul>
<li>Action : “GetStateObjects” (GET)</li>
<li>Paramètres :
<ul>
<li><u>subscriptionId</u> : identifiant de l’abonnement</li>
<li><u>timeout</u> (optionnel – par défaut 60000) : temps maximal en milliseconde de la mise en attente de la requête (entre 1000ms et 120000ms)</li>
<li><u>limit</u> (optionnel – par défaut 0) : nombre maximum de message à retourner pour l’appel</li>
</ul>
</li>
</ul>
<p>Comme pour les messages, vous pouvez limiter le nombre de SO (limit) et le timeout de la requête (timeout).</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/constellation/GetStateObjects?SentinelName=Consumer&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123&amp;subscriptionId=&lt;subId&gt;</pre><p></p>
<p>Notez que si un StateObject pour lequel vous êtes abonné change plusieurs fois entre deux appels “GetStateObjects”, vous obtiendrez la dernière valeur et non l’historique de tous les changements.</p>
<h3>Déclarer le “Package Descriptor”</h3>
<p>Action : “DeclarePackageDescriptor” (POST)</p>
<p>Le “<a href="/concepts/messaging-message-scope-messagecallback-saga/#Auto-description_des_MessageCallbacks">Package Descriptor</a>” permet décrire les MessagesCallbacks d’un package ainsi que les types utilisés par ses MC ou StateObjects.</p>
<p>Ainsi en publiant le PackageDescriptor, la Constellation aura connaissance des MessageCallbacks qu’expose un package ainsi que le type des StateObject qu’il publie. C’est grâce au Package Descriiptor que fonctionne le “MessageCallback Explorer” de la Console Constellation.</p>
<p>Le Package Descriptor est un objet JSON contenant :</p>
<ul>
<li>Le nom du package</li>
<li>La liste des MessageCallbacks du package</li>
<li>La liste des types utilisés par les MessageCallbacks du package</li>
<li>La liste des types utilisés par les StateObjects publiés par le package</li>
</ul>
<p>La structure de base est donc :</p>
<p></p><pre class="crayon-plain-tag">{
  "PackageName": "MyVirtualPackage",
  "MessageCallbacks": [],
  "MessageCallbackTypes": [],
  "StateObjectTypes": [],
}</pre><p></p>
<p>Chaque “MessageCallback” est un objet contenant :</p>
<ul>
<li><u>MessageKey</u> : la clé du message (le nom/clé du MessageCallback)</li>
<li><u>Description</u> (optionnel) : description du MessageCallback</li>
<li><u>ResponseType</u> (optionnel) : le type du message de retour dans le cas où le MC répond au Saga</li>
<li><u>Parameters</u> (optionnel) : la liste des paramètres du MC</li>
</ul>
<p>Un paramètre est décrit par un objet contenant :</p>
<ul>
<li><u>Name</u> : le nom du paramètre</li>
<li><u>TypeName</u> : le type du paramètre</li>
<li><u>Description</u> (optionnel) : la description du paramètre</li>
<li><u>Type</u> : le type de paramètre (doit être obligatoirement défini à 2 pour un paramètre d’un MC)</li>
<li><u>IsOptional</u> (optionnel) : booléen (true ou false) qui indique si le paramètre est optionnel ou non</li>
<li><u>DefaultValue</u> (optionnel) : la valeur par défaut du paramètre si optionnel</li>
</ul>
<p>Le type d’un paramètre peut être un type simple décrit par les types .NET (System.Int16, System.Int32, System.Int64, System.Double, System.Decimal, System.Float, System.Boolean, System.String) ou un type personnalisé.</p>
<p>Les types personnalisés utilisés dans les paramètres des MC seront décrits dans la propriété “MessageCallbackTypes” du Package Descriptor et les types personnalisés utilisés pour les StateObjects seront décrits dans la propriété “StateObjectTypes” du Package Descriptor.</p>
<p>Dans les deux cas il s’agit de la même structure de donnée.</p>
<p>La description d’un type est un objet contenant :</p>
<ul>
<li><u>TypeName</u> : le nom du type (l’identifiant)</li>
<li><u>TypeFullname</u> : le nom complet du type (utilisé pour identifier le nom complet d’un type .NET par exemple)</li>
<li><u>Description</u> (optionnel) : la description du type</li>
<li><u>IsGeneric</u> (optionnel) : booléen (true ou false) qui indique si le type est un type générique</li>
<li><u>IsArray</u> (optionnel) : booléen (true ou false) qui indique si le type est un tableau</li>
<li><u>GenericParameters</u> (optionnel) : la liste des types génériques si il s’agit d’un type générique ou d’un tableau</li>
<li><u>IsEnum</u> (optionnel) : booléen (true ou false) qui indique si le type est une énumération</li>
<li><u>EnumValues</u> (optionnel) : la liste des valeurs de l’énumérations si le type est une énumération</li>
<li><u>Properties</u> (optionnel) : la liste des propriétés du type</li>
</ul>
<p>Les propriétés d’un type tout comme les valeurs d’une énumération sont décrits de la même manière qu’un paramètre d’un MessageCallback déjà détaillé ci-dessus.</p>
<p>Seule la propriété “Type” change :</p>
<ul>
<li>Type = 0 : pour décrire une propriété</li>
<li>Type = 1 : pour décrire une valeur d’une énumération</li>
<li>Type = 2 : pour décrire une paramètre d’un MessageCallback comme expliqué précédemment</li>
</ul>
<h4>Exemple 1 – Package “NetworkTools”</h4>
<p>Voici le Package Descriptor du package “NetworkTools” :</p>
<p></p><pre class="crayon-plain-tag">{
   "PackageName":"NetworkTools",
   "MessageCallbacks":[  
      {  
         "MessageKey":"Ping",
         "Description":"Pings the specified host and return the response time.",
         "ResponseType":"System.Int64",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"timeout",
               "TypeName":"System.Int32",
               "Description":"The timeout (5000ms by defaut).",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"CheckPort",
         "Description":"Check a port's status by entering an address and port number above and return the response time.",
         "ResponseType":"System.Int64",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"port",
               "TypeName":"System.Int32",
               "Description":"The port.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"timeout",
               "TypeName":"System.Int32",
               "Description":"The timeout (5000ms by defaut).",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"CheckHttp",
         "Description":"Checks the HTTP address and return the response time.",
         "ResponseType":"System.Int64",
         "Parameters":[  
            {  
               "Name":"address",
               "TypeName":"System.String",
               "Description":"The address.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"ScanPort",
         "Description":"Scans TCP port range to discover which TCP ports are open on your target host.",
         "ResponseType":"System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"startPort",
               "TypeName":"System.Int32",
               "Description":"The start port.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"endPort",
               "TypeName":"System.Int32",
               "Description":"The end port.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"timeout",
               "TypeName":"System.Int32",
               "Description":"The timeout (5000ms by defaut).",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"WakeUp",
         "Description":"Wakes up the specified host.",
         "ResponseType":"System.Boolean",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"macAddress",
               "TypeName":"System.String",
               "Description":"The mac address.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"DnsLookup",
         "Description":"Resolves a host name or IP address.",
         "ResponseType":"System.String[]",
         "Parameters":[  
            {  
               "Name":"host",
               "TypeName":"System.String",
               "Description":"The host.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      }
   ],
   "MessageCallbackTypes":[  
      {  
         "Description":null,
         "IsGeneric":true,
         "IsArray":false,
         "GenericParameters":[  
            "System.Int32",
            "System.Boolean"
         ],
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"Dictionary`2",
         "TypeFullname":"System.Collections.Generic.Dictionary`2[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":true,
         "GenericParameters":[  
            "System.String"
         ],
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"String[]",
         "TypeFullname":"System.String[]",
         "Properties":null
      }
   ],
   "StateObjectTypes":[  
      {  
         "Description":"Monitoring type",
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"MonitoringResult",
         "TypeFullname":"NetworkTools.MonitoringResult",
         "Properties":[  
            {  
               "Name":"ResponseTime",
               "TypeName":"System.Int64",
               "Description":"Gets or sets the response time in millisecond.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"State",
               "TypeName":"System.Boolean",
               "Description":"Gets or sets the state.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      }
   ]
}</pre><p></p>
<h4>Exemple 2 – Package “Paradox”</h4>
<p>Autre exemple plus complet, le Package Descriptor du package “Paradox” :</p>
<p></p><pre class="crayon-plain-tag">{  
   "PackageName":"Paradox",
   "MessageCallbacks":[  
      {  
         "MessageKey":"AreaArm",
         "Description":"Arm the area.",
         "ResponseType":"System.Boolean",
         "Parameters":[  
            {  
               "Name":"request",
               "TypeName":"ParadoxOnConstellation.ArmingRequestData",
               "Description":"The request.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"AreaDisarm",
         "Description":"Disarm the area.",
         "ResponseType":"System.Boolean",
         "Parameters":[  
            {  
               "Name":"request",
               "TypeName":"ParadoxOnConstellation.ArmingRequestData",
               "Description":"The request.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"RefreshArea",
         "Description":"Refreshes the area.",
         "ResponseType":null,
         "Parameters":[  
            {  
               "Name":"area",
               "TypeName":"Paradox.Core.Area",
               "Description":"The area.",
               "Type":2,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "MessageKey":"RefreshAll",
         "Description":"Refreshes all.",
         "ResponseType":null,
         "Parameters":[  

         ]
      }
   ],
   "MessageCallbackTypes":[  
      {  
         "Description":"Arming or disarming request",
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"ArmingRequestData",
         "TypeFullname":"ParadoxOnConstellation.ArmingRequestData",
         "Properties":[  
            {  
               "Name":"Area",
               "TypeName":"Paradox.Core.Area",
               "Description":"The number of area.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Mode",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":"The mode number.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"PinCode",
               "TypeName":"System.String",
               "Description":"The pin code.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"All",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area1",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area2",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area3",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area4",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area5",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area6",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area7",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Area8",
               "TypeName":"Paradox.Core.Area",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"Area",
         "TypeFullname":"Paradox.Core.Area",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"RegularArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"ForceArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"StayArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InstantArm",
               "TypeName":"Paradox.Core.ArmingMode",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"ArmingMode",
         "TypeFullname":"Paradox.Core.ArmingMode",
         "Properties":null
      }
   ],
   "StateObjectTypes":[  
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"UserInfo",
         "TypeFullname":"ParadoxOnConstellation.UserInfo",
         "Properties":[  
            {  
               "Name":"Id",
               "TypeName":"System.Int32",
               "Description":"The identifier.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Type",
               "TypeName":"System.String",
               "Description":"The object type.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Name",
               "TypeName":"System.String",
               "Description":"The name.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LastActivity",
               "TypeName":"System.DateTime",
               "Description":"The last activity.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"DateTime",
         "TypeFullname":"System.DateTime",
         "Properties":[  
            {  
               "Name":"Date",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Day",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"DayOfWeek",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"DayOfYear",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Hour",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Kind",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Millisecond",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Minute",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Month",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Now",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"UtcNow",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Second",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Ticks",
               "TypeName":"System.Int64",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TimeOfDay",
               "TypeName":"System.TimeSpan",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Today",
               "TypeName":"System.DateTime",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Year",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"Sunday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Monday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Tuesday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Wednesday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Thursday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Friday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Saturday",
               "TypeName":"System.DayOfWeek",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"DayOfWeek",
         "TypeFullname":"System.DayOfWeek",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":true,
         "EnumValues":[  
            {  
               "Name":"Unspecified",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Utc",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Local",
               "TypeName":"System.DateTimeKind",
               "Description":null,
               "Type":0,
               "IsOptional":false,
               "DefaultValue":null
            }
         ],
         "TypeName":"DateTimeKind",
         "TypeFullname":"System.DateTimeKind",
         "Properties":null
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"TimeSpan",
         "TypeFullname":"System.TimeSpan",
         "Properties":[  
            {  
               "Name":"Ticks",
               "TypeName":"System.Int64",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Days",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Hours",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Milliseconds",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Minutes",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Seconds",
               "TypeName":"System.Int32",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalDays",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalHours",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalMilliseconds",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalMinutes",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"TotalSeconds",
               "TypeName":"System.Double",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":"Represent Zone information",
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"ZoneInfo",
         "TypeFullname":"ParadoxOnConstellation.ZoneInfo",
         "Properties":[  
            {  
               "Name":"IsOpen",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is open.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsTamper",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is tamper.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InAlarm",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is in alarm.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InFireAlarm",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone is in fire alarm].",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"SupervisionLost",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone has supervision lost.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LowBattery",
               "TypeName":"System.Boolean",
               "Description":"A value indicating whether this zone has low battery.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Id",
               "TypeName":"System.Int32",
               "Description":"The identifier.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Type",
               "TypeName":"System.String",
               "Description":"The object type.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Name",
               "TypeName":"System.String",
               "Description":"The name.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LastActivity",
               "TypeName":"System.DateTime",
               "Description":"The last activity.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      },
      {  
         "Description":null,
         "IsGeneric":false,
         "IsArray":false,
         "GenericParameters":null,
         "IsEnum":false,
         "EnumValues":null,
         "TypeName":"AreaInfo",
         "TypeFullname":"ParadoxOnConstellation.AreaInfo",
         "Properties":[  
            {  
               "Name":"IsFullArmed",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsStayArmed",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"ZoneInMemory",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"HasTrouble",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsReady",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"IsInProgramming",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"InAlarm",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Strobe",
               "TypeName":"System.Boolean",
               "Description":null,
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Id",
               "TypeName":"System.Int32",
               "Description":"The identifier.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Type",
               "TypeName":"System.String",
               "Description":"The object type.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"Name",
               "TypeName":"System.String",
               "Description":"The name.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            },
            {  
               "Name":"LastActivity",
               "TypeName":"System.DateTime",
               "Description":"The last activity.",
               "Type":1,
               "IsOptional":false,
               "DefaultValue":null
            }
         ]
      }
   ]
}</pre><p></p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/">L&rsquo;interface REST « Constellation »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/rest-api/interface-rest-constellation/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>L&#8217;interface REST « Management »</title>
		<link>https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/</link>
					<comments>https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/#respond</comments>
		
		<dc:creator><![CDATA[Sebastien Warin]]></dc:creator>
		<pubDate>Fri, 23 Sep 2016 21:19:38 +0000</pubDate>
				<category><![CDATA[REST API]]></category>
		<category><![CDATA[Authorization]]></category>
		<category><![CDATA[Licence]]></category>
		<category><![CDATA[Repository]]></category>
		<category><![CDATA[Package]]></category>
		<category><![CDATA[RecoveryOptions]]></category>
		<category><![CDATA[Settings]]></category>
		<category><![CDATA[Management]]></category>
		<category><![CDATA[Sentinel]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Credential]]></category>
		<category><![CDATA[group]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[REST]]></category>
		<guid isPermaLink="false">https://developer.myconstellation.io/?p=2939</guid>

					<description><![CDATA[<p>L’interface REST “Management” (ou Management API) fournit des opérations permettant de configurer la Constellation : Gestion des sentinelles Gestion des packages Gestion des groupes Gestion des settings Gestion des RecoveryOptions Gestion des credentials et autorisations Gestion du Package Repository et</p>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/">L&rsquo;interface REST « Management »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>L’interface REST “Management” (ou Management API) fournit des opérations permettant de configurer la Constellation :</p>
<ul>
<li>Gestion des sentinelles</li>
<li>Gestion des packages</li>
<li>Gestion des groupes</li>
<li>Gestion des settings</li>
<li>Gestion des RecoveryOptions</li>
<li>Gestion des credentials et autorisations</li>
<li>Gestion du Package Repository et upload de package</li>
<li>Gestion de la licence</li>
<li>Lire / Ecriture du fichier de configuration</li>
<li>Récupération du numéro de version du serveur</li>
<li>Rechargement et déploiement de la configuration</li>
</ul>
<h3>Généralités</h3>
<h4>Construction de l’URL</h4>
<p>L’URL est :  &lt;Root URI&gt;/rest/management/&lt;action&gt;?&lt;paramètres&gt;</p>
<p>Partons du principe que votre Constellation est exposée en HTTP sur le port 8088 (sans path). On retrouvera dans le <a href="https://developer.myconstellation.io/constellation-server/fichier-de-configuration/">fichier de configuration</a> la section suivante :</p>
<p></p><pre class="crayon-plain-tag">&lt;listenUris&gt;
  &lt;uri listenUri="http://+:8088/" /&gt;
&lt;/listenUris&gt;</pre><p></p>
<p>La “Root URI “ est donc “<strong>http://&lt;ip ou dns&gt;:8088/</strong>”.</p>
<p>Par exemple si nous sommes en local, nous pourrions écrire :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/xxxxx</pre><p></p>
<h4>Authentification</h4>
<p>Comme pour toutes les requêtes vers Constellation vous devez impérativement spécifier dans <u>les headers HTTP</u> <strong>ou</strong> dans <u>les paramètres de l’URL</u> (querystring), les paramètres “SentinelName”, “PackageName” et “AccessKey” pour l’authentification.</p>
<p>Dans le cas de l’API “Management”, la “SentinelName” est “Management” et le “PackageName” est le nom de votre choix que l’on considère comme un “FriendlyName”. Typiquement le “FriendlyName” est par exemple le nom de l’application/page qui se connecte.</p>
<p>L’AccessKey doit bien sûr être déclaré et activé sur le serveur. De plus elle doit avoir le droit  d’utiliser l’API de Management, soit depuis la <a href="/constellation-platform/constellation-console/gerer-credentials-avec-la-console-constellation/">Console Constellation</a> ou soit directement dans le <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">fichier de configuration</a> en ajoutant l’attribut “<a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">enableManagementAPI</a>”.</p>
<p align="center"><a href="https://developer.myconstellation.io/wp-content/uploads/2016/09/image-121.png"><img class="colorbox-2939"  loading="lazy" style="background-image: none; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border: 0px;" title="image" src="https://developer.myconstellation.io/wp-content/uploads/2016/09/image_thumb-116.png" alt="image" width="240" height="192" border="0" /></a></p>
<p>Ainsi chaque appel aura le format suivant :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/&lt;action&gt;?SentinelName=Management&amp;PackageName=&lt;Friendly name&gt;&amp;AccessKey=&lt;access key&gt;&amp;&lt;paramètres&gt;</pre><p></p>
<h4>Check Access</h4>
<p>Toutes les API REST de Constellation exposent une méthode en GET “CheckAccess” qui retourne un code HTTP 200 (OK). Cela permet de tester la connexion et l’authentification au serveur Constellation.</p>
<ul>
<li>Action : “CheckAccess” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/CheckAccess?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer la version du serveur</h4>
<p>Pour connaitre la version du serveur Constellation, vous pouvez invoquer l’action “/server/version”.</p>
<ul>
<li>Action : “/server/version” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/server/version?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h3>Edition du fichier de configuration</h3>
<h4>Lire le fichier de configuration</h4>
<p>Vous pouvez récupérer le contenu entier du fichier de configuration de votre Constellation en invoquant l’action ”/configuration”</p>
<ul>
<li>Action : “/configuration” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/configuration?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ecrire le fichier de configuration</h4>
<p>Vous pouvez également réécrire le fichier de configuration en postant le nouveau contenu sur la même URL.</p>
<ul>
<li>Action : “/configuration” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête : le fichier de configuration XML<!--EndFragment--></li>
</ul>
<p>Le serveur vérifiera le bon format du fichier XML avant d’écraser le fichier de configuration existant par votre nouvelle version. Vous devrez ensuite recharger la configuration pour appliquer les modifications.</p>
<h3>Recharger et déployer la configuration</h3>
<p>Pour recharger le fichier de configuration vous devez invoquer l’action “/configuration/reload” :</p>
<ul>
<li>Action : “/configuration/reload ” (GET)</li>
<li>Paramètres :
<ul>
<li>deployConfiguration (optionnel – par défaut “false”) : indique si l’ordre de mise à jour doit être envoyé aux sentinelles et packages de la Constellation</li>
</ul>
</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/configuration/reload?deployConfiguration=true&amp;SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h3>La License Constellation</h3>
<p>Vous pouvez récupérer les caractéristiques de la licence affectée à votre serveur en invoquant l’action  “/license”.</p>
<ul>
<li>Action : “/license” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/license?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Vous pouvez également charger une nouvelle licence en utilisant le verbe “POST” sur cette action et en plaçant le contenu de la nouvelle licence dans le corps de la requête.</p>
<h3>Gestion du Package Repository</h3>
<h4>Lister le Package Repository</h4>
<p>Pour récupérer la liste des packages de le Package Repository :</p>
<ul>
<li>Action : “/packages” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer un package</h4>
<p>Pour récupérer un package en particulier de votre Package Repository :</p>
<ul>
<li>Action : “/packages/{packageName}” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages/{packageName}?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Renommer un package</h4>
<p>Pour renommer un package de votre Package Repository vous devez poster un objet JSON contenant son nouveau nom :</p>
<ul>
<li>Action : “/packages/{packageName}” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : { « newName »: newName }</li>
</ul>
<h4>Supprimer un package</h4>
<p>Pour supprimer package de votre Package Repository :</p>
<ul>
<li>Action : “/packages/{packageName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h4>Récupérer l’icone d’un package</h4>
<p>Pour récupérer l’icone d’un package de votre Package Repository :</p>
<ul>
<li>Action : “/packages/{packageName}/icon” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Vous obtiendrez l’icone au format “PNG”.</p>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages/{packageName}/icon?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer le schéma XSD d’un paramètre de configuration d’un package</h4>
<p>Chaque package peut avoir des settings. Ces settings peuvent être de plusieurs types (types simples, objet JSON ou XML). Chaque package doit (ou devrait) <a href="/concepts/package-manifest/#Informations_sur_les_Settings_du_package">déclarer la liste des settings</a> qu’il utilise dans son “<a href="/concepts/package-manifest/">Package Manifest</a>”.</p>
<p>Si le setting est de type XML (“<em>ConfigurationSection</em>” ou “<em>XmlDocument</em>”) il peut être lié à un schéma XSD pour décrire le format XML du setting en question.</p>
<p>L’action ci-dessous permet de récupérer ce schema XSD pour un setting d’un package de votre Package Repository.</p>
<ul>
<li>Action : ”/packages/{package}/settings/{settingName}/xsd ” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/packages/{packageName}}/settings/{settingName}/xsd?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Télécharger un package vers votre Package Repository</h4>
<p>Vous pouvez ordonner à votre serveur Constellation de télécharger un fichier vers le Package Repository.</p>
<p>Pour cela vous utiliserez l’action “/download-package” en spécifiant l’URL du fichier à télécharger.</p>
<ul>
<li style="list-style-type: none;">
<ul>
<li>Action : ”/download-package” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : { « url »: url}</li>
</ul>
</li>
</ul>
<p><!--EndFragment--></p>
<h4>Téléverser un package vers votre Package Repository</h4>
<p>Vous pouvez également envoyer un fichier vers votre Package Repository en utilisant l’action “/upload-package”.</p>
<ul>
<li>Action : ”/upload-package” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (multipart/form-data) : les fichiers à enregistrer dans votre Package Repository.</li>
</ul>
<h3>Les RecoveryOptions</h3>
<p>Les <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Section_recoveryOptions">Recovery Options</a> spécifient les options de récupération en cas de crash d’un package sur vos sentinelles.</p>
<p>Chaque package peut avoir ses propres options mais par défaut il hérite des options “globales”.</p>
<p>Pour récupérer ces options “globales” :</p>
<ul>
<li>Action : ”/configuration/recoveryoptions” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/configuration/recoveryoptions?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Vous pouvez également redéfinir ces options en postant sur cette même URI votre nouvel objet JSON :</p>
<ul>
<li>Action : ”/configuration/recoveryoptions” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : l’objet “RecoveryOptions” avec les nouvelles valeurs</li>
</ul>
<h3>Gestion des sentinelles</h3>
<h4>Lister les sentinelles</h4>
<p>Pour récupérer la liste des sentinelles de votre Constellation :</p>
<ul>
<li>Action : “/sentinels” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ajouter ou modifier une sentinelle</h4>
<p>Pour ajouter ou modifier une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : un objet JSON contenant deux propriétés :
<ul>
<li>“Name”  : le nom de la sentinelle</li>
<li>“Credential” : le nom du credential associé à cette sentinelle</li>
</ul>
</li>
</ul>
<h4>Supprimer une sentinelle</h4>
<p>Pour supprimer une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h3>Gestion des packages et des settings</h3>
<h4>Lister les packages d’une sentinelles</h4>
<p>Pour récupérer la liste des packages (virtuels ou non) d’une sentinelle (virtuelle ou non) de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Récupérer une instance d’un package</h4>
<p>Pour récupérer le détail d’une instance de package sur une sentinelle donnée :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ajouter ou modifier une instance d’un package</h4>
<p>Pour ajouter ou modifier un package sur une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinel}/packages” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : un objet JSON contenant cinq propriétés :
<ul>
<li>“Name”: le nom de l’instance du package (obligatoire et unique)</li>
<li>“PackageFile” (facultatif) : le nom du fichier du package à utiliser dans le repository (<a href="https://developer.myconstellation.io/concepts/instance-package/">plus d’info</a>)</li>
<li>“Enable” (facultatif, par defaut <em>true</em>) : indique si le package est activé ou désactivé</li>
<li>“Credential” (facultatif, utilise par défaut du credential de sa sentinelle) : spécifie le <a href="https://developer.myconstellation.io/constellation-platform/constellation-server/fichier-de-configuration/#Section_credentials">credential</a> que le package va utiliser pour s’authentifier sur le serveur Constellation</li>
<li>“AutoStart” (facultatif, par defaut <em>true</em>) : indique si le package doit automatiquement démarrer lorsque sa sentinelle démarre</li>
</ul>
</li>
</ul>
<h4>Supprimer une instance d’un package</h4>
<p>Pour supprimer un package sur une sentinelle de votre Constellation :</p>
<ul>
<li>Action : “/sentinels/{sentinel}/packages/{packageName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h4>Options de récupération d’une instance d’un package</h4>
<p>Pour récupérer les options de récupération d’une instance d&rsquo;un package :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/recoveryoptions” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}/recoveryoptions?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Pour les redéfinir vous devez poster la nouvelle valeur de votre objet “RecoveryOptions” sur cette même URI.</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/recoveryoptions” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : l’objet “RecoveryOptions” avec les nouvelles valeurs</li>
</ul>
<h4>Groupes d’une instance d’un package</h4>
<p>Pour récupérer les <a href="/constellation-platform/constellation-server/fichier-de-configuration/#Les_groupes">groupes d’une instance d’un package</a> :</p>
<ul><!--EndFragment--></ul>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/groups” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}/groups?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Utilisez cette même URI pour poster la nouvelle liste des groupes de votre instance :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/groups” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : la liste des groupes de votre instance<!--EndFragment--></li>
</ul>
<h4>Settings d’une instance d’un package</h4>
<p>Pour récupérer les settings d’une instance d’un package :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/settings” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/sentinels/{sentinelName}/packages/{packageName}/settings?SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<p>Utilisez cette même URI pour poster le nouveau dictionnaire (clé/valeur) des settings :</p>
<ul>
<li>Action : “/sentinels/{sentinelName}/packages/{packageName}/settings” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : le dictionnaire (clé/valeur) des settings de votre instance</li>
</ul>
<h3>Gestion des credentials et autorisations</h3>
<h4>Lister les credentials</h4>
<p>Pour récupérer la liste des credentials de votre Constellation :</p>
<ul>
<li>Action : “/credentials” (GET)</li>
<li>Paramètres :
<ul>
<li>includeAccessKeys (optionnel – par défaut “false”) : indique si vous souhaitez inclure les AccessKeys de chaque credentials</li>
</ul>
</li>
</ul>
<p>Exemple :</p>
<p></p><pre class="crayon-plain-tag">http://localhost:8088/rest/management/credentials?includeAccessKeys=true&amp;SentinelName=Management&amp;PackageName=Demo&amp;AccessKey=MaCleDeTest123</pre><p></p>
<h4>Ajouter ou modifier un credential</h4>
<p>Pour ajouter ou modifier un credential de votre Constellation :</p>
<ul>
<li>Action : “/credentials” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : un objet JSON contenant six propriétés :
<ul>
<li>“Name” : le nom du credential</li>
<li>“AccessKey” : la clé d’accès du credential</li>
<li>“Enable” (<em>true</em> par défaut) : indique si le credential est activé ou désactivé</li>
<li>“EnableControlHub” (<em>false</em> par défaut) : indique si le credential peut se connecter sur le hub de contrôle (pour l’administration de la Constellation)</li>
<li>“EnableManagementAPI” (<em>false</em> par défaut) : indique si le credential peut se connecter à l’API de Management (pour l’édition de la configuration)</li>
<li>“EnableDeveloperAccess” (<em>false </em>par défaut) : indique si le credential peut utiliser la sentinelle virtuelle “Developer” pour debugger des packages (utilisé par le SDK Visual Studio)</li>
</ul>
</li>
</ul>
<h4>Supprimer un credential</h4>
<p>Pour supprimer un credential de votre Constellation :</p>
<ul>
<li>Action : “/credentials/{credentialName}” (DELETE)</li>
<li>Paramètres : aucun</li>
</ul>
<h4>Récupérer les autorisations d’un credential</h4>
<ul>
<li>Action : “/credentials/{credentialName}/authorizations” (GET)</li>
<li>Paramètres : aucun</li>
</ul>
<p>Vous récupérerez un objet de type “<em>CredentialAuthorizations</em>“ sérialisé en JSON</p>
<h4>Définir les autorisations d’un credential</h4>
<ul>
<li>Action : “/credentials/{credentialName}/authorizations” (POST)</li>
<li>Paramètres : aucun</li>
<li>Corps de la requête (application/json) : l’objet <em>CredentialAuthorizations</em> sérialisé en JSON</li>
</ul>
<p>The post <a rel="nofollow" href="https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/">L&rsquo;interface REST « Management »</a> appeared first on <a rel="nofollow" href="https://developer.myconstellation.io">Constellation</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://developer.myconstellation.io/client-api/rest-api/interface-rest-management/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Mise en cache de page à l’aide de Disk: Enhanced 

Served from: developer.myconstellation.io @ 2026-01-22 02:14:50 by W3 Total Cache
-->