{"id":7543,"date":"2026-09-22T06:00:22","date_gmt":"2026-09-22T05:00:22","guid":{"rendered":"https:\/\/www.blaess.fr\/christophe\/?p=7543"},"modified":"2026-09-22T07:35:41","modified_gmt":"2026-09-22T06:35:41","slug":"les-api-deris-linux","status":"publish","type":"post","link":"https:\/\/www.blaess.fr\/christophe\/2026\/09\/22\/les-api-deris-linux\/","title":{"rendered":"Les API d&rsquo;Eris Linux"},"content":{"rendered":"<div class=\"wp-block-image\">\n<figure class=\"alignright size-full is-resized\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/thumbnail-5-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"356\" height=\"431\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/thumbnail-5-1.png\" alt=\"\" class=\"wp-image-7855\" style=\"aspect-ratio:0.825989031576475;width:247px;height:auto\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/thumbnail-5-1.png 356w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/thumbnail-5-1-248x300.png 248w\" sizes=\"auto, (max-width: 356px) 100vw, 356px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p class=\"wp-block-paragraph\">Nous avons vu dans les articles pr\u00e9c\u00e9dents de cette s\u00e9rie&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/08\/25\/eris-linux\/\" data-type=\"post\" data-id=\"7123\">en quoi consiste la distribution embarqu\u00e9e industrielle Eris Linux<\/a><\/strong>,<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/09\/01\/installer-eris-linux-sur-un-raspberry-pi-5\/\" data-type=\"post\" data-id=\"7066\">comment installer Eris sur une carte embarqu\u00e9e<\/a><\/strong>, en l&rsquo;occurrence un Raspberry Pi 5,<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/09\/08\/deployer-des-containers-sur-eris-linux\/\" data-type=\"post\" data-id=\"7232\">comment d\u00e9ployer des containers<\/a><\/strong> avec du code de d\u00e9monstration,<\/li>\n\n\n\n<li><strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/09\/15\/developper-du-code-personnalise-pour-eris-linux\/\" data-type=\"post\" data-id=\"7318\">comment \u00e9crire et embarquer des applications<\/a><\/strong> dans des containers.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Les applications que l&rsquo;on embarque sous forme de code \u00ab\u00a0m\u00e9tier\u00a0\u00bb ne sont que tr\u00e8s rarement auto-suffisantes. Elles ont souvent besoin de communiquer avec le syst\u00e8me sous-jacent pour consulter ou configurer des \u00e9l\u00e9ments du syst\u00e8me (par exemple le param\u00e9trage r\u00e9seau, la configuration du <em>watchdog<\/em>, celle des LEDs etc.)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour cela Eris Linux offre une interface de programmation qui permet, depuis l&rsquo;int\u00e9rieur d&rsquo;un container, de communiquer avec le syst\u00e8me h\u00f4te. En r\u00e9alit\u00e9 cette <strong>API (<em>Application Programming Interface<\/em>)<\/strong> est d\u00e9clin\u00e9e en deux impl\u00e9mentations. Une <strong>biblioth\u00e8que<\/strong> (<code>liberis<\/code>) qui peut \u00eatre employ\u00e9e par les applications compil\u00e9es (en C ou C++ par exemple) et un <strong>service REST<\/strong> accessible pour les langages interpr\u00e9t\u00e9s (javascript, Python, etc.). Nous avons d\u00e9j\u00e0 aper\u00e7u des usages de <code>liberis<\/code> et du service REST pour l&rsquo;API d&rsquo;Eris Linux dans l&rsquo;article pr\u00e9c\u00e9dent.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"wp-block-paragraph\">Nous allons ici examiner les fonctionnalit\u00e9s propos\u00e9es par ces API. Cet article (tr\u00e8s long) n&rsquo;est <strong>pas pr\u00e9vu pour \u00eatre lu d&rsquo;un bout \u00e0 l&rsquo;autre<\/strong>. J&rsquo;imagine plut\u00f4t le lecteur survolant la table des mati\u00e8res pour voir les diff\u00e9rents domaines d&rsquo;utilisation de l&rsquo;API, puis examinant plus en d\u00e9tail certaines fonctions et requ\u00eates propos\u00e9es ainsi que les exemples d&rsquo;invocation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il faut savoir qu&rsquo;Eris Linux est un <strong>projet en \u00e9volution<\/strong> et des <strong>fonctionnalit\u00e9s sont r\u00e9guli\u00e8rement ajout\u00e9es<\/strong>. Pensez donc \u00e0 vous r\u00e9f\u00e9rer \u00e0 la documentation officielle en cas de doute. Cet article sera probablement mis \u00e0 jour lors des prochains ajouts dans l&rsquo;API d&rsquo;Eris.<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">Table des mati\u00e8res<\/h1>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#T1\">1 &#8211; Appels des requ\u00eates<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T1.1\">1.1 &#8211; Utilisation de la biblioth\u00e8que <code>liberis <\/code><\/a><\/li>\n\n\n\n<li><a href=\"#T1.2\">1.2 &#8211; Appel de l&rsquo;API Rest.<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T2\">2 &#8211; Informations syst\u00e8me<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T2.1\">2.1 \u2013 Version d\u2019Eris Linux en cours d\u2019utilisation<\/a><\/li>\n\n\n\n<li><a href=\"#T2.2\">2.2 \u2013 Mod\u00e8le de carte mat\u00e9rielle<\/a><\/li>\n\n\n\n<li><a href=\"#T2.3\">2.3 \u2013 Type d\u2019image Eris Linux<\/a><\/li>\n\n\n\n<li><a href=\"#T2.4\">2.4 \u2013 Version du noyau Linux<\/a><\/li>\n\n\n\n<li><a href=\"#T2.5\">2.5 \u2013 Identification de l\u2019\u00e9quipement<\/a><\/li>\n\n\n\n<li><a href=\"#T2.6\">2.6 \u2013 \u00c9tat du syst\u00e8me<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T3\">3 &#8211; Contact entre l&rsquo;\u00e9quipement et le <em>Device Manager<\/em><\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T3.1\">3.1 &#8211; Lecture de la p\u00e9riode de contact<\/a><\/li>\n\n\n\n<li><a href=\"#T3.2\">3.2 &#8211; \u00c9criture de la p\u00e9riode de contact<\/a><\/li>\n\n\n\n<li><a href=\"#T3.3\">3.3 &#8211; Contact du <em>Device Manager<\/em> d\u00e8s que possible<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T4\">4 &#8211; Les containers<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T4.1\">4.1 &#8211; Nombre de <em>slots<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T4.2\">4.2 &#8211; Occupation d&rsquo;un <em>slot<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T4.3\">4.3 &#8211; Nom du container install\u00e9 dans un <em>slot<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T4.4\">4.4 &#8211; Version du container install\u00e9 dans un <em>slot<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T4.5\">4.5 &#8211; \u00c9tat du container install\u00e9 dans un <em>slot<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T4.6\">4.6 &#8211; Lecture de la politique de mise \u00e0 jour des containers<\/a><\/li>\n\n\n\n<li><a href=\"#T4.7\">4.7 &#8211; \u00c9criture de la politique de mise \u00e0 jour des containers<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T5\">5 &#8211; Nomenclature logicielle (SBOM)<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T5.1\">5.1 &#8211; Liste des <em>packages<\/em> install\u00e9s<\/a><\/li>\n\n\n\n<li><a href=\"#T5.2\">5.2 &#8211; Version d&rsquo;un <em>package<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T5.3\">5.3 &#8211; Nom de recette d&rsquo;un <em>package<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T5.4\">5.4 &#8211; Licences d&rsquo;un <em>package<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T5.5\">5.5 &#8211; Liste des licences pr\u00e9sentes<\/a><\/li>\n\n\n\n<li><a href=\"#T5.6\">5.6 &#8211; Texte d&rsquo;une licence<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T6\">6 &#8211; Red\u00e9marrage du syst\u00e8me<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T6.1\">6.1 &#8211; Red\u00e9marrage imm\u00e9diat<\/a><\/li>\n\n\n\n<li><a href=\"#T6.2\">6.2 &#8211; \u00c9tat d&rsquo;attente de red\u00e9marrage<\/a><\/li>\n\n\n\n<li><a href=\"#T6.3\">6.3 &#8211; Demande de red\u00e9marrage<\/a><\/li>\n\n\n\n<li><a href=\"#T6.4\">6.4 &#8211; Lecture du red\u00e9marrage automatique apr\u00e8s mise \u00e0 jour<\/a><\/li>\n\n\n\n<li><a href=\"#T6.5\">6.5 &#8211; \u00c9criture du red\u00e9marrage automatique apr\u00e8s mise \u00e0 jour<\/a><\/li>\n\n\n\n<li><a href=\"#T6.6\">6.6 &#8211; Demande de <em>rollback<\/em><\/a><\/li>\n\n\n\n<li><a href=\"#T6.7\">6.7 &#8211; Demande de r\u00e9initialisation du syst\u00e8me<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T7\">7 &#8211; Watchdog<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T7.1\">7.1 \u2013 Alimentation du watchdog<\/a><\/li>\n\n\n\n<li><a href=\"#T7.2\">7.2 \u2013 Arr\u00eat du watchdog<\/a><\/li>\n\n\n\n<li><a href=\"#T7.3\">7.3 \u2013 Lecture du d\u00e9lai de red\u00e9marrage<\/a><\/li>\n\n\n\n<li><a href=\"#T7.4\">7.4 \u2013 \u00c9criture du d\u00e9lai de red\u00e9marrage<\/a><\/li>\n\n\n\n<li><a href=\"#T7.5\">7.5 \u2013 D\u00e9marrage d\u2019un thread d\u2019alimentation<\/a><\/li>\n\n\n\n<li><a href=\"#T7.6\">7.6 \u2013 Arr\u00eat du thread d\u2019alimentation<\/a><\/li>\n\n\n\n<li><a href=\"#T7.7\">7.7 \u2013 \u00c9tat du thread d\u2019alimentation<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T8\">8 &#8211; Horloge<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T8.1\">8.1 \u2013 Lecture de l\u2019utilisation de NTP<\/a><\/li>\n\n\n\n<li><a href=\"#T8.2\">8.2 \u2013 \u00c9criture de l\u2019utilisation de NTP<\/a><\/li>\n\n\n\n<li><a href=\"#T8.3\">8.3 \u2013 Lecture du serveur NTP<\/a><\/li>\n\n\n\n<li><a href=\"#T8.4\">8.4 \u2013 \u00c9criture du serveur NTP<\/a><\/li>\n\n\n\n<li><a href=\"#T8.5\">8.5 \u2013 Liste des fuseaux horaires<\/a><\/li>\n\n\n\n<li><a href=\"#T8.6\">8.6 \u2013 Lecture du fuseau horaire du syst\u00e8me<\/a><\/li>\n\n\n\n<li><a href=\"#T8.7\">8.7 \u2013 \u00c9criture du fuseau horaire du syst\u00e8me<\/a><\/li>\n\n\n\n<li><a href=\"#T8.8\">8.8 \u2013 Lecture de l\u2019heure locale<\/a><\/li>\n\n\n\n<li><a href=\"#T8.9\">8.9 \u2013 Lecture de l\u2019heure syst\u00e8me<\/a><\/li>\n\n\n\n<li><a href=\"#T8.10\">8.10 \u2013 \u00c9criture de l\u2019heure syst\u00e8me<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T9\">9 &#8211; R\u00e9seau<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T9.1\">9.1 \u2013 Liste des interfaces disponibles<\/a><\/li>\n\n\n\n<li><a href=\"#T9.2\">9.2 \u2013 Lecture de l\u2019\u00e9tat d\u2019une interface<\/a><\/li>\n\n\n\n<li><a href=\"#T9.3\">9.3 \u2013 \u00c9criture de l\u2019\u00e9tat d\u2019une interface<\/a><\/li>\n\n\n\n<li><a href=\"#T9.4\">9.4 \u2013 Lecture de la configuration d\u2019une interface<\/a><\/li>\n\n\n\n<li><a href=\"#T9.5\">9.5 \u2013 \u00c9criture de la configuration d\u2019une interface<\/a><\/li>\n\n\n\n<li><a href=\"#T9.6\">9.6 \u2013 Lecture de la connectivit\u00e9 d\u2019une interface<\/a><\/li>\n\n\n\n<li><a href=\"#T9.7\">9.7 \u2013 Lecture de l\u2019adresse du DNS<\/a><\/li>\n\n\n\n<li><a href=\"#T9.8\">9.8 \u2013 \u00c9criture de l\u2019adresse du DNS<\/a><\/li>\n\n\n\n<li><a href=\"#T9.9\">9.9 \u2013 Scan des r\u00e9seaux Wifi accessibles<\/a><\/li>\n\n\n\n<li><a href=\"#T9.10\">9.10 \u2013 Connexion sur un r\u00e9seau Wifi<\/a><\/li>\n\n\n\n<li><a href=\"#T9.11\">9.11 \u2013 D\u00e9connexion d\u2019un r\u00e9seau Wifi<\/a><\/li>\n\n\n\n<li><a href=\"#T9.12\">9.12 \u2013 Lecture de la qualit\u00e9 de la connexion Wifi<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#T10\">10 &#8211; GPIO<\/a>\n<ul class=\"wp-block-list\">\n<li><a href=\"#T10.1\">10.1 &#8211; Liste des GPIO<\/a><\/li>\n\n\n\n<li><a href=\"#T10.2\">10.2 &#8211; R\u00e9servation d&rsquo;une ligne GPIO<\/a><\/li>\n\n\n\n<li><a href=\"#T10.3\">10.3 &#8211; Lib\u00e9ration d&rsquo;une ligne GPIO<\/a><\/li>\n\n\n\n<li><a href=\"#T10.4\">10.4 &#8211; Lecture d&rsquo;une valeur sur une ligne GPIO<\/a><\/li>\n\n\n\n<li><a href=\"#T10.5\">10.5 &#8211; \u00c9criture d&rsquo;une valeur sur une ligne GPIO<\/a><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"#conclusion\">Conclusion<\/a><\/li>\n<\/ul>\n\n\n\n<h1 id=\"T1\" class=\"wp-block-heading\">1 &#8211; Appels des requ\u00eates<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Pour tester l&#8217;emploi des requ\u00eates d\u00e9crites ci-dessous, deux possibilit\u00e9s&nbsp;: <\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>appel depuis un programme C\/C++ en utilisant la <strong>biblioth\u00e8que <code>liberis<\/code><\/strong> \u00e0 la compilation,<\/li>\n\n\n\n<li>utilisation d&rsquo;un outil ligne de commande pour appeler les <strong>requ\u00eates de l&rsquo;API REST<\/strong>.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"T1.1\" class=\"wp-block-heading\">1.1 &#8211; Utilisation de la biblioth\u00e8que <code>liberis<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Nous allons commencer par appeler une requ\u00eate simple qui remplit le buffer qu&rsquo;on lui passe avec la version d&rsquo;Eris Linux en cours d&rsquo;utilisation&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_version<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Cette fonction, comme la plupart de l&rsquo;API <code>liberis<\/code> renvoie <code>0<\/code> si elle r\u00e9ussit et <code>-1<\/code> en cas d&rsquo;erreur (en remplissant la variable <code>errno<\/code> avec un code d&rsquo;erreur).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour cela je pars de l&rsquo;exemple <code>06-api-test-tcp<\/code> des containers de d\u00e9monstration. Je le simplifie pour ne plus avoir que le fichier source suivant&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ liberis-test.c:\n\n#include &lt;errno.h&gt;\n#include &lt;stdarg.h&gt;\n#include &lt;stdio.h&gt;\n#include &lt;stdlib.h&gt;\n#include &lt;string.h&gt;\n#include &lt;unistd.h&gt;\n#include &lt;arpa\/inet.h&gt;\n\n#include &lt;liberis.h&gt;\n\n\n\/\/ ---------------------- Private macros.\n\n#define CONNECTION_PORT   20000\n\n\n\/\/ ---------------------- Private method declarations.\n\n\/\/ ---------------------- Private variables.\n\n\/\/ ---------------------- Public variable definitions.\n\n\/\/ ---------------------- Public methods\n\nint main(void)\n{\n\tint server_sock = socket(AF_INET, SOCK_STREAM, 0);\n\tif (server_sock == -1) {\n\t\tperror(\"socket\");\n\t\texit(EXIT_FAILURE);\n\t}\n\n\tint option = 1;\n\t(void) setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &amp;option, sizeof(option));\n\n\tstruct sockaddr_in server_addr;\n\tserver_addr.sin_family = AF_INET;\n\tserver_addr.sin_addr.s_addr = INADDR_ANY;\n\tserver_addr.sin_port = htons(CONNECTION_PORT);\n\tif (bind(server_sock, (struct sockaddr *)&amp;server_addr, sizeof(server_addr)) &lt; 0) {\n\t\tperror(\"bind\");\n\t\texit(EXIT_FAILURE);\n\t}\n\tlisten(server_sock, 3);\n\n\tint client_sock;\n\twhile ((client_sock = accept(server_sock, NULL, 0)) != -1) {\n\t\tFILE *fp = fdopen(client_sock, \"w\");\n\t\tif (fp != NULL) {\n\n\t\t\tchar buffer&#91;1024];\n\t\t\tif (<strong>eris_get_system_version(buffer, sizeof(buffer))<\/strong> == 0) {\n\t\t\t\tbuffer&#91;sizeof(buffer) - 1] = '\\0';\n\t\t\t\tfprintf(fp, \"Answer: %s\\n\", buffer);\n\t\t\t} else {\n\t\t\t\tfprintf(fp, \"Error: %d\\n\", errno);\n\t\t\t}\n\t\t\tfclose(fp);\n\t\t} else {\n\t\t\tclose(client_sock);\n\t\t}\n\t}\n\tclose(server_sock);\n\treturn EXIT_SUCCESS;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Beaucoup de code pour une seule ligne nous concernant vraiment&nbsp;! Mais comme ce code s&rsquo;ex\u00e9cute dans un container sur un syst\u00e8me embarqu\u00e9 potentiellement distant, on ne peut pas se contenter d&rsquo;un simple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int main(void)\n{\n    char buffer&#91;1024];\n    if (<strong>eris_get_system_version(buffer, sizeof(buffer))<\/strong> == 0) {\n        buffer&#91;sizeof(buffer) - 1] = '\\0';\n        printf(\"Answer: %s\\n\", buffer);\n    } else {\n        printf(\"Error: %d\\n\", errno);\n    }\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">(Ou plut\u00f4t si, on peut s&rsquo;en contenter mais il faudra rediriger les sorties <code>stdout<\/code> et <code>stderr<\/code> vers un syst\u00e8me distant, comme nous le verrons dans le prochain article d\u00e9di\u00e9 au d\u00e9bogage applicatif).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nous avons donc mis en place un exemple qui cr\u00e9e un serveur TCP\/IP sur le port 20000, et qui \u00e0 chaque connexion appelle la fonction d&rsquo;API qu&rsquo;on veut tester et renvoie le r\u00e9sultat.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s compilation (en utilisant le script <code>create-container<\/code> livr\u00e9 avec les containers de d\u00e9monstration), t\u00e9l\u00e9chargement sur le serveur Eris Linux et d\u00e9ploiement vers un groupe de test, on peut v\u00e9rifier le comportement en se connectant en utilisant un outil comme <code>telnet<\/code>, <code>putty<\/code> ou <code>nc<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>nc  192.168.3.36  20000<\/strong>\nAnswer: 1.0.0\n\n<\/code><\/pre>\n\n\n\n<h2 id=\"T1.2\" class=\"wp-block-heading\">1.2 &#8211; Appel de l&rsquo;API REST<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut obtenir la m\u00eame information en interrogeant la m\u00e9thode <code>GET<\/code> de l&rsquo;URI <code>\/api\/system\/version<\/code> sur le port 8080.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour tester cette URI, le plus simple est de l&rsquo;appeler de l&rsquo;int\u00e9rieur d&rsquo;un container, en utilisant l&rsquo;outil <code>curl<\/code> en ligne de commande. Pour cela, nous commen\u00e7ons par cr\u00e9er une image sp\u00e9cifique de container en copiant le <code>Dockerfile<\/code> de l&rsquo;exemple <code>01-ssh-server<\/code> (voir <strong><a href=\"https:\/\/www.blaess.fr\/christophe\/2026\/09\/08\/deployer-des-containers-sur-eris-linux\/\" data-type=\"post\" data-id=\"7232\">cet article<\/a><\/strong>) et en le modifiant l\u00e9g\u00e8rement pour ajouter <code>curl<\/code> apr\u00e8s <code>openssh<\/code> sur la ligne <code>apk add --no-cache<\/code> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>cp  -R  01-ssh-server\/  ssh-with-curl<\/strong>\n\n$ <strong>nano  ssh-with-curl\/Dockerfile<\/strong>\n\nFROM alpine:latest\nRUN apk update                             \\\n &amp;&amp; apk add --no-cache openssh <strong>curl<\/strong>        \\\n &amp;&amp; ssh-keygen -A                          \\\n &#91;...]\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">On produit le container de test&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ <strong>.\/create-container arm64 ssh-with-curl ssh-with-curl<\/strong><\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s copie sur le serveur Eris Linux et d\u00e9ploiement sur un groupe d\u2019\u00e9quipements de test, on peut se connecter sur l\u2019adresse IP de notre carte en utilisant SSH et essayer&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET   -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/version\"<\/strong>\n1.0.0<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019option <code>-w '\\n'<\/code> de <code>curl<\/code> permet d\u2019ajouter un retour-chariot apr\u00e8s la cha\u00eene pour \u00e9viter que le prompt du shell ne soit coll\u00e9 \u00e0 la suite de la r\u00e9ponse.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lorsqu\u2019une requ\u00eate n\u00e9cessitera des param\u00e8tres, comme <code>\/api\/container\/name<\/code> qui renvoie le nom du container dont le num\u00e9ro est pr\u00e9cis\u00e9 dans le param\u00e8tre <code>index<\/code>, on l\u2019ajoutera \u00e0 l\u2019URI ainsi&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/name?index=2\"<\/strong>\nSSH with Curl\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">J\u2019utiliserai pour la plupart des exemples ci-dessous cette m\u00e9thode car elle est plus simple et plus rapide \u00e0 mettre en oeuvre que la recompilation et le red\u00e9ploiement du programme d&rsquo;exemple.<\/p>\n\n\n\n<h1 id=\"T2\" class=\"wp-block-heading\">2 \u2013 Informations syst\u00e8me<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Il est souvent important pour une application embarqu\u00e9e d\u2019obtenir des <strong>informations sur le syst\u00e8me sous-jacent<\/strong> (environnement mat\u00e9riel et logiciel) afin de s\u2019adapter au mieux aux ressources disponibles. Les fonctions d\u00e9crites dans ce paragraphe renvoient des informations sur l&rsquo;image Eris Linux install\u00e9e et sa configuration.<\/p>\n\n\n\n<h2 id=\"T2.1\" class=\"wp-block-heading\">2.1 \u2013 Version d\u2019Eris Linux en cours d\u2019utilisation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Cette requ\u00eate a d\u00e9j\u00e0 \u00e9t\u00e9 vue ci-dessus. Dans la biblioth\u00e8que <code>liberis<\/code>, elle est fournie par la fonction suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_version<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/system\/version<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/version\"<\/strong>\n1.0.0<\/code><\/pre>\n\n\n\n<h2 id=\"T2.2\" class=\"wp-block-heading\">2.2 \u2013 Mod\u00e8le de carte mat\u00e9rielle<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eris Linux est disponible pour diff\u00e9rentes cartes embarqu\u00e9es. Les cartes du commerce sont disponibles directement, le support pour des cartes d\u00e9di\u00e9es \u00e0 un projet est d\u00e9velopp\u00e9 sp\u00e9cifiquement. On obtient avec la fonction suivante le nom du mat\u00e9riel supportant Eris Linux.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_model<\/strong>(char *buffer, size_t size);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/system\/model<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/model\"<\/strong>\nRaspberry-Pi-5<\/code><\/pre>\n\n\n\n<h2 id=\"T2.3\" class=\"wp-block-heading\">2.3 \u2013 Type d\u2019image Eris Linux<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Les images Eris Linux sont disponibles aujourd\u2019hui suivant deux types&nbsp;: <code>Headless<\/code> (sans interface graphique) ou <code>Graphical<\/code> (avec support d\u2019\u00e9cran). Il se peut que dans l&rsquo;avenir d&rsquo;autres types d&rsquo;images apparaissent.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_type<\/strong>(char *buffer, size_t size);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code>GET \/api\/system\/type<\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/type\"<\/strong>\nGraphical\n<\/code><\/pre>\n\n\n\n<h2 id=\"T2.4\" class=\"wp-block-heading\">2.4 \u2013 Version du noyau Linux<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Conna\u00eetre le num\u00e9ro de <strong>version du noyau Linux<\/strong> qui fait fonctionner tout le syst\u00e8me permet de s\u2019assurer de la disponibilit\u00e9 de certaines fonctionnalit\u00e9s. Cela pr\u00e9sente \u00e9galement un int\u00e9r\u00eat en termes de s\u00e9curit\u00e9 pour identifier la branche utilis\u00e9e et constitue une information utile pour d\u00e9terminer le niveau de correctifs de s\u00e9curit\u00e9.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_kernel<\/strong>(char *buffer, size_t size);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/system\/kernel<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/kernel\"<\/strong>\n6.6.63-v8-16k<\/code><\/pre>\n\n\n\n<h2 id=\"T2.5\" class=\"wp-block-heading\">2.5 \u2013 Identification de l\u2019\u00e9quipement<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Lors du premier <em>boot<\/em>, chaque \u00e9quipement se voit dot\u00e9 d\u2019<strong>un num\u00e9ro unique<\/strong>, servant \u00e0 l\u2019identifier ensuite vers le <em>Device Manager<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_uuid<\/strong>(char *buffer, size_t size);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest  sur le port 8080&nbsp;: <code><strong>GET \/api\/system\/uuid<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl -X GET -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/uuid\"<\/strong>\nbf2ec75d-d304-47bb-b89a-95b6e11343fd<\/code><\/pre>\n\n\n\n<h2 id=\"T2.6\" class=\"wp-block-heading\">2.6 \u2013 \u00c9tat du syst\u00e8me<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eris Linux assure la <strong>mise \u00e0 jour automatique du syst\u00e8me d&rsquo;exploitation<\/strong> lorsque des nouvelles versions apparaissent, essentiellement suite \u00e0 des corrections de vuln\u00e9rabilit\u00e9s. L&rsquo;\u00e9tat du syst\u00e8me et de ses mises \u00e0 jour est consultable par la fonction ci-dessous. Elle renvoie directement l\u2019un des codes suivants&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table class=\"has-fixed-layout\"><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td>Syst\u00e8me Ok, pas de mise \u00e0 jour en cours.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td>Installation en cours d\u2019une mise \u00e0 jour du syst\u00e8me.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td>Installation de mise \u00e0 jour termin\u00e9e, en attente de red\u00e9marrage.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td>Installation de mise \u00e0 jour \u00e9chou\u00e9e.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td>Red\u00e9marrage en cours.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">-1<\/td><td>Erreur, consulter la variable <code>errno<\/code>.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_update_status<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080 &nbsp;: <code><strong>GET \/api\/system\/status<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La cha\u00eene renvoy\u00e9e contient le code suivi du libell\u00e9 de l\u2019\u00e9tat du syst\u00e8me. Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl -X GET -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/status\"<\/strong>\n1 System OK.\n\n\n\n<\/code><\/pre>\n\n\n\n<h1 id=\"T3\" class=\"wp-block-heading\">3 &#8211; Contact entre l&rsquo;\u00e9quipement et le <em>Device Manager<\/em><\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Les cartes embarqu\u00e9es contactent r\u00e9guli\u00e8rement <strong>le <em>Device Manager<\/em><\/strong> en utilisant son adresse Internet pour lui remonter leur <strong>\u00e9tat de fonctionnement<\/strong> et recevoir en retour les informations de <strong>mise \u00e0 jour <\/strong>et les liens des <strong>containers \u00e0 installer<\/strong> (nous d\u00e9taillerons cela dans le prochain article). Pour les \u00e9quipements n&rsquo;ayant pas d&rsquo;acc\u00e8s \u00e0 Internet, nous pouvons proposer diverses variantes du <em>Device Manager<\/em> (contactez-moi par mail pour en savoir plus).<\/p>\n\n\n\n<h2 id=\"T3.1\" class=\"wp-block-heading\">3.1 &#8211; Lecture de la p\u00e9riode de contact<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La <strong>p\u00e9riode entre deux contacts<\/strong> de l&rsquo;\u00e9quipement vers le <em>Device Manager<\/em> est consultable avec la fonction suivante. La p\u00e9riode renvoy\u00e9e est en secondes. <strong>Une p\u00e9riode nulle<\/strong> signifie que l&rsquo;\u00e9quipement ne contacte le <em>Device Manager<\/em> que sur requ\u00eate explicite (cf <code><a href=\"#T3.3\">eris_contact_server()<\/a><\/code> ci-dessous).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_server_contact_period<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/contact\/period<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/contact\/period\"<\/strong>\n240\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Note&nbsp;: il est possible de modifier la p\u00e9riode de contact depuis le <em>Device Manager<\/em> ; cette valeur s&rsquo;applique \u00e0 tout le groupe d&rsquo;\u00e9quipements. La valeur que l&rsquo;on consulte avec la requ\u00eate ci-dessus (ou que l&rsquo;on modifie avec la requ\u00eate ci-dessous) est celle qui concerne uniquement l&rsquo;\u00e9quipement o\u00f9 elle a lieu et est prioritaire sur la valeur du groupe. Pour demander au <em>device<\/em> d&rsquo;utiliser \u00e0 nouveau la p\u00e9riode du groupe d&rsquo;\u00e9quipements, on lui donnera la valeur <code>-1<\/code>.<\/p>\n\n\n\n<h2 id=\"T3.2\" class=\"wp-block-heading\">3.2 &#8211; \u00c9criture de la p\u00e9riode de contact<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il est possible de <strong>modifier la p\u00e9riode de contact<\/strong> vers le <em>Device Manager<\/em>. Elle est initialement fix\u00e9e \u00e0 240 secondes (4 minutes). On la r\u00e9duira par exemple \u00e0 60&nbsp;secondes pour un groupe de <em>devices<\/em> sur lesquels on est en train de d\u00e9velopper et tester un nouveau container applicatif. On pourra ensuite l&rsquo;augmenter par exemple \u00e0 7200 secondes (2 heures) pour les \u00e9quipements d\u00e9ploy\u00e9s et valid\u00e9s sur lesquels on n&rsquo;a pas besoin d&rsquo;un retour fr\u00e9quent.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_server_contact_period<\/strong>(int <em>period_seconds<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">La valeur transmise est&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>-1<\/code> pour dire que l&rsquo;\u00e9quipement doit prendre en compte la p\u00e9riode fix\u00e9e au niveau du groupe,<\/li>\n\n\n\n<li><code>0<\/code> pour un \u00e9quipement qui ne contactera le <em>Device Manager<\/em> que sur demande explicite,<\/li>\n\n\n\n<li>[60, 86400] (de 1 minute \u00e0 24 heures) pour indiquer une p\u00e9riode donn\u00e9e.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/contact\/period?period=<em>&lt;value&gt;<\/em><\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/contact\/period\"<\/strong>\n240\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/contact\/period?period=60\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/contact\/period\"<\/strong>\n60\n#<\/code><\/pre>\n\n\n\n<h2 id=\"T3.3\" class=\"wp-block-heading\">3.3 &#8211; Contact du Device Manager d\u00e8s que possible<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour les \u00e9quipements qui ne contactent le <em>Device Manager<\/em> que sur <strong>requ\u00eate explicite<\/strong> (par exemple un syst\u00e8me embarqu\u00e9 dans un dispositif avec un acc\u00e8s r\u00e9seau intermittent) on utilisera&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_contact_server<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">qui renvoie <code>0<\/code> en cas de r\u00e9ussite et <code>-1<\/code> en cas d&rsquo;\u00e9chec.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/contact\/now<\/strong><\/code><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/contact\/period?period=0\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/contact\/period\"<\/strong>\n0\n# <strong>curl  -X POST  -w '\\n' \"http:\/\/host.docker.internal:8080\/api\/contact\/now\"<\/strong>\nOk\n\n<\/code><\/pre>\n\n\n\n<h1 id=\"T4\" class=\"wp-block-heading\">4 &#8211; Les containers<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Il peut \u00eatre important d&rsquo;obtenir certaines informations sur <strong>les containers install\u00e9s sur le syst\u00e8me<\/strong>. Cela permet par exemple de s&rsquo;assurer qu&rsquo;un service compl\u00e9mentaire \u00e0 l&rsquo;application principale est disponible dans un slot voisin.<\/p>\n\n\n\n<h2 id=\"T4.1\" class=\"wp-block-heading\">4.1 &#8211; Nombre de slots<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le <strong>nombre de <em>slots<\/em><\/strong> dans lesquels on peut installer des containers est aujourd&rsquo;hui fix\u00e9 \u00e0 <strong>4<\/strong>. Toutefois cette valeur pourra \u00e9voluer (augmenter) si le besoin s&rsquo;en fait sentir. Pour consulter le nombre de <em>slots<\/em> total, on peut appeler&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_number_of_slots<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/container\/count<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/count\"<\/strong>\n4\n<\/code><\/pre>\n\n\n\n<h2 id=\"T4.2\" class=\"wp-block-heading\">4.2 &#8211; Occupation d&rsquo;un <em>slot<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour savoir si un <em>slot<\/em> est <strong>occup\u00e9<\/strong> par un container, on peut utiliser la fonction&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_container_presence<\/strong>(int <em>slot<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;argument <em>slot<\/em> est compris entre 0 et le nombre maximal de slots moins 1 (actuellement [0, 3]). La valeur renvoy\u00e9e est <code>0<\/code> (<em>slot<\/em> vide) ou <code>1<\/code> (<em>slot<\/em> occup\u00e9). En cas d&rsquo;erreur (argument invalide), la valeur renvoy\u00e9e est <code>-1<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/container\/presence?index=&lt;slot&gt;<\/strong><\/code><br>La valeur renvoy\u00e9e est une cha\u00eene&nbsp;: <code>absent<\/code> ou <code>present<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/presence?index=0\"<\/strong>\npresent\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/presence?index=1\"<\/strong>\npresent\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/presence?index=3\"<\/strong>\nabsent\n# \n<\/code><\/pre>\n\n\n\n<h2 id=\"T4.3\" class=\"wp-block-heading\">4.3 &#8211; Nom du container install\u00e9 dans un <em>slot<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le <strong>nom du container<\/strong> est enregistr\u00e9 lors de sa cr\u00e9ation dans l&rsquo;onglet \u00ab\u00a0<em>My Containers<\/em>\u00a0\u00bb du <em>Device Manager<\/em>. Une fois install\u00e9 dans un slot, il peut \u00eatre consult\u00e9 (mais pas modifi\u00e9) avec la fonction suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_container_name<\/strong>(int <em>slot<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/container\/name?index=&lt;slot&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/name?index=0\"<\/strong>\nTest 1\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/name?index=1\"<\/strong>\nLiberis test\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/name?index=2\"<\/strong>\nSSH with Curl\n# <\/code><\/pre>\n\n\n\n<h2 id=\"T4.4\" class=\"wp-block-heading\">4.4 &#8211; Version du container install\u00e9 dans un <em>slot<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le <strong>num\u00e9ro de version<\/strong> d&rsquo;un container est, comme son nom, enregistr\u00e9 lors de sa cr\u00e9ation dans l&rsquo;onglet \u00ab\u00a0<em>My Containers<\/em>\u00a0\u00bb du <em>Device Manager<\/em>. Une fois install\u00e9 dans un <em>slot<\/em>, il peut \u00eatre consult\u00e9 avec la fonction suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_container_version<\/strong>(int <em>slot<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/container\/version?index=&lt;slot&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/version?index=1\"<\/strong>\n1.4\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/version?index=2\"<\/strong>\n1.0\n<\/code><\/pre>\n\n\n\n<h2 id=\"T4.5\" class=\"wp-block-heading\">4.5 &#8211; \u00c9tat du container install\u00e9 dans un <em>slot<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Il est possible de consulter l&rsquo;<strong>\u00e9tat d&rsquo;un container<\/strong> pour v\u00e9rifier s&rsquo;il fonctionne correctement.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_container_status<\/strong>(int <em>slot<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;\u00e9tat du container se trouvant dans le slot est repr\u00e9sent\u00e9 par la valeur num\u00e9rique renvoy\u00e9e, qui peut prendre l&rsquo;une des 14 valeurs suivantes&nbsp;:<\/p>\n\n\n\n<figure class=\"wp-block-table aligncenter\"><table><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Code<\/th><th class=\"has-text-align-left\" data-align=\"left\">Signification<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">-1<\/td><td class=\"has-text-align-left\" data-align=\"left\">Le slot est vide, il n&rsquo;y a pas de container.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">0<\/td><td class=\"has-text-align-left\" data-align=\"left\">Le container fonctionne correctement.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">1<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur lors du t\u00e9l\u00e9chargement de l&rsquo;image du container.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">2<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur lors du d\u00e9codage de l&rsquo;image du container.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">3<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur durant l&rsquo;extraction de l&rsquo;image du container.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">4<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur \u00e0 la v\u00e9rification de la <em>checksum<\/em> de l&rsquo;image du container.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">5<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur d&rsquo;importation de l&rsquo;image dans Docker.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">6<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur de lancement du container.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">7<\/td><td class=\"has-text-align-left\" data-align=\"left\">Impossible de faire d\u00e9marrer l&rsquo;application.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">8<\/td><td class=\"has-text-align-left\" data-align=\"left\">Application absente.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">9<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur durant l&rsquo;ex\u00e9cution.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">10<\/td><td class=\"has-text-align-left\" data-align=\"left\">Application termin\u00e9e.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">11<\/td><td class=\"has-text-align-left\" data-align=\"left\">Impossible de d\u00e9marrer le d\u00e9bogage.<\/td><\/tr><tr><td class=\"has-text-align-center\" data-align=\"center\">12<\/td><td class=\"has-text-align-left\" data-align=\"left\">Erreur interne du syst\u00e8me de container d&rsquo;Eris Linux.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/container\/status?index=&lt;slot&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La cha\u00eene en r\u00e9ponse \u00e0 la requ\u00eate Rest commence par le <strong>num\u00e9ro de status<\/strong> ci-dessus, suivi d&rsquo;un <strong>libell\u00e9 succinct<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/status?index=0\"<\/strong>\n-1 empty\n\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/status?index=1\"<\/strong>\n0 running\n\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/status?index=2\"<\/strong>\n0 running\n\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/status?index=3\"<\/strong>\n0 running\n<\/code><\/pre>\n\n\n\n<h2 id=\"T4.6\" class=\"wp-block-heading\">4.6 &#8211; Lecture de la politique de mise \u00e0 jour des containers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eris propose <strong>deux politiques diff\u00e9rentes<\/strong> pour les mises \u00e0 jour des containers embarquant le code applicatif&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>t\u00e9l\u00e9chargement, installation et red\u00e9marrage du container <strong>aussit\u00f4t que possible<\/strong> lors de la notification d&rsquo;une nouvelle version (politique \u00ab\u00a0<em>immediate<\/em>\u00a0\u00bb ),<\/li>\n\n\n\n<li>t\u00e9l\u00e9chargement imm\u00e9diat de la nouvelle version d&rsquo;un container, mais installation et d\u00e9marrage <strong>au reboot du syst\u00e8me<\/strong> (politique \u00ab\u00a0<em>atreboot<\/em>\u00a0\u00bb ).<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La fonction suivante renvoie <code>0<\/code> si la politique en cours est <em>atreboot<\/em> et <code>1<\/code> si c&rsquo;est <em>immediate<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_container_update_policy<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/container\/policy<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La requ\u00eate renvoie la cha\u00eene <code>atreboot<\/code> ou <code>immediate<\/code>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/policy\"<\/strong>\nimmediate\n<\/code><\/pre>\n\n\n\n<h2 id=\"T4.7\" class=\"wp-block-heading\">4.7 &#8211; \u00c9criture de la politique de mise \u00e0 jour des containers<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour <strong>fixer la politique de mise \u00e0 jour<\/strong> d\u00e9crite ci-dessus, on passe <code>0<\/code> en argument de la fonction suivante pour une mise \u00e0 jour <em>atreboot<\/em> et <code>1<\/code> pour une politique <em>immediate<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_container_update_policy<\/strong>(int <em>policy<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/container\/policy?policy=atreboot<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/policy?policy=atreboot\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/policy\"<\/strong>\natreboot\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/policy?policy=immediate\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/container\/policy\"<\/strong>\nimmediate\n<\/code><\/pre>\n\n\n\n<h1 id=\"T5\" class=\"wp-block-heading\">5 &#8211; Nomenclature logicielle (<em>SBOM<\/em>)<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Le terme de <em><strong>Bill of Materials<\/strong> (BOM)<\/em> est tr\u00e8s r\u00e9pandu dans les industries m\u00e9caniques et \u00e9lectroniques et recouvre l&rsquo;ensemble des composants n\u00e9cessaires pour un processus de fabrication. En informatique, principalement dans les syst\u00e8mes embarqu\u00e9s,  la <strong><em>Software BOM<\/em> <\/strong>ou \u00ab\u00a0<strong>nomenclature logicielle<\/strong>\u00a0\u00bb est un descriptif de tous les \u00e9l\u00e9ments logiciels (applications, biblioth\u00e8que, collection d&rsquo;utilitaires, etc.) n\u00e9cessaires pour le bon fonctionnement d&rsquo;un syst\u00e8me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dans l&rsquo;univers des logiciels libres, la SBOM prend <strong>une dimension l\u00e9gale<\/strong>, puisque la plupart des licences de type <em>Open Source<\/em> r\u00e9clament que l&rsquo;utilisateur final puisse conna\u00eetre la liste des packages libres int\u00e9gr\u00e9s dans un \u00e9quipement et, suivant le type de licence, leur num\u00e9ro de version, leur provenance, les modifications logicielles \u00e9ventuellement apport\u00e9es et le texte complet de la licence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La SBOM devient d&rsquo;autant plus importante de nos jours que l&rsquo;entr\u00e9e en application du <em><strong>Cyber Resilience Act<\/strong><\/em> (C.R.A) la rend indispensable. La mise en conformit\u00e9 avec le C.R.A. d&rsquo;un syst\u00e8me bas\u00e9 sur Eris Linux sera discut\u00e9e en d\u00e9tail dans un prochain article.<\/p>\n\n\n\n<h2 id=\"T5.1\" class=\"wp-block-heading\">5.1 &#8211; Liste des <em>packages<\/em> install\u00e9s<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La premi\u00e8re information importante \u00e0 obtenir est la <strong>liste des <em>packages<\/em> sous licences libres<\/strong> install\u00e9s sur le syst\u00e8me. Il n&rsquo;est pas n\u00e9cessaire que cette liste contienne les applications sous licences propri\u00e9taires que l&rsquo;on trouve dans les containers applicatifs. La fonction suivante remplit le buffer fourni avec la liste des <em>packages<\/em> install\u00e9s sans jamais d\u00e9passer la limite indiqu\u00e9e.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_list_of_packages<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/sbom\/package\/list<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/list\"<\/strong>\nbase-files base-passwd bluez-firmware-rpidistro-bcm4345c0-hcd bluez-firmware-rpidistro-bcm4345c5-hcd bluez-firmware-rpidistro-cypress-license bluez5 bridge-utils build-timestamp busybox busybox-syslog busybox-udhcpc ca-certificates cgroup-lite containerd-opencontainers cryptsetup dbus dbus-common dbus-lib dbus-tools docker-compose docker-moby docker-moby-cli dosfstools dtc e2fsprogs e2fsprogs-badblocks e2fsprogs-dumpe2fs e2fsprogs-e2fsck e2fsprogs-mke2fs early-init encodings eris-api-server-dbg eris-configuration-files eris-containers eris-containers-early eris-containers-network eris-dashboard eris-first-boot eris-ntp eris-rest-api eris-update-service eris-update-service-notifier eris-update-service-updater eris-wifi-monitor eudev eudev-hwdb expat f2fs-tools fast-reboot file font-adobe-100dpi font-adobe-utopia-100dpi font-bh-100dpi font-bh-lucidatypewriter-100dpi font-bitstream-100dpi font-util fontconfig fontconfig-utils formfactor freetype gdb gdbserver gdk-pixbuf gdk-pixbuf-locale-en-gb get-dmk glib-2.0 glib-2.0-locale-en-gb gmp gnutls hdparm init-ifupdown init-system-helpers-service initscripts initscripts-functions iptables iptables-module-ip6t-ah iptables-module-ip6t-dnpt iptables-module-ip6t-dst iptables-module-ip6t-eui64 iptables-module-ip6t-frag iptables-module-ip6t-hbh iptables-module-ip6t-hl\n&#91;...]\nutil-linux-mcookie util-linux-mesg util-linux-mkfs util-linux-mkfs.cramfs util-linux-mkswap util-linux-more util-linux-mount util-linux-mountpoint util-linux-namei util-linux-nologin util-linux-nsenter util-linux-partx util-linux-pipesz util-linux-pivot-root util-linux-prlimit util-linux-readprofile util-linux-rename util-linux-renice util-linux-resizepart util-linux-rev util-linux-rfkill util-linux-rtcwake util-linux-script util-linux-scriptlive util-linux-scriptreplay util-linux-setarch util-linux-setpriv util-linux-setsid util-linux-setterm util-linux-sfdisk util-linux-sulogin util-linux-swaplabel util-linux-swapoff util-linux-swapon util-linux-switch-root util-linux-taskset util-linux-uclampset util-linux-ul util-linux-umount util-linux-unshare util-linux-utmpdump util-linux-uuidd util-linux-uuidgen util-linux-uuidparse util-linux-waitpid util-linux-wall util-linux-wdctl util-linux-whereis util-linux-wipefs util-linux-write util-linux-zramctl wireless-regdb-static wpa-supplicant wpa-supplicant-cli wpa-supplicant-passphrase wpa-supplicant-plugins xauth xdpyinfo xf86-input-libinput xf86-video-modesetting xhost xinit xinput xinput-calibrator xkbcomp xkeyboard-config xkeyboard-config-locale-en-gb xmodmap xorg-fonts-100dpi xrandr xserver-nodm-init xserver-xf86-config xserver-xorg xserver-xorg-extension-glx xset xsetroot zlib \n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Il y a de tr\u00e8s nombreux petits <em>packages<\/em> (modules du noyau par exemple) qui forment des packages ind\u00e9pendants. Cette liste est donc plut\u00f4t longue.<\/p>\n\n\n\n<h2 id=\"T5.2\" class=\"wp-block-heading\">5.2 &#8211; Version d&rsquo;un package install\u00e9<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le <strong>num\u00e9ro de version d&rsquo;un package<\/strong> fait partie des informations l\u00e9gales \u00e0 fournir \u00e0 l&rsquo;utilisateur final s&rsquo;il en fait la demande. On l&rsquo;obtiendra avec la fonction suivante, qui remplit le <em>buffer<\/em> avec la version du package dont le nom est pass\u00e9 en argument (et qui doit appartenir \u00e0 la liste pr\u00e9c\u00e9demment renvoy\u00e9e), sans d\u00e9passer la taille maximale indiqu\u00e9e en dernier param\u00e8tre&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_package_version<\/strong>(const char *<em>package_name<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/sbom\/package\/version?name=&lt;package_name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/version?name=base-files\"<\/strong>\n3.0.14\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/version?name=busybox\"<\/strong>\n1.36.1\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/version?name=musl\"<\/strong>\n1.2.4+git\n<\/code><\/pre>\n\n\n\n<h2 id=\"T5.3\" class=\"wp-block-heading\">5.3 &#8211; Nom de recette d&rsquo;un package<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Eris Linux est construit en utilisant l&rsquo;environnement <strong>Yocto Project<\/strong>, qui s&rsquo;appuie sur des fichiers \u00ab\u00a0<strong>recettes<\/strong>\u00a0\u00bb pour produire les diff\u00e9rents composants du syst\u00e8me. La plupart du temps un composant donn\u00e9 est obtenu \u00e0 partir de la recette de m\u00eame nom. Parfois une m\u00eame recette peut produire plusieurs <em>packages<\/em>. Il peut \u00eatre important d&rsquo;identifier la recette ayant g\u00e9n\u00e9r\u00e9 un \u00e9l\u00e9ment, gr\u00e2ce \u00e0 la fonction suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_package_recipe<\/strong>(const char *<em>package_name<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/sbom\/package\/recipe?name=&lt;package_name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/recipe?name=busybox-syslog\"<\/strong>\nbusybox\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/recipe?name=kernel-module-ath9k-htc-6.6.63-v8-16k\"<\/strong>\nlinux-raspberrypi\n<\/code><\/pre>\n\n\n\n<h2 id=\"T5.4\" class=\"wp-block-heading\">5.4 &#8211; Licences d&rsquo;un <em>package<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La distribution d&rsquo;un composant peut \u00eatre soumise, selon le choix de son auteur, aux termes d&rsquo;<strong>une ou plusieurs licences logicielles<\/strong>. La fonction ci-dessous permet de retrouver les diff\u00e9rentes licences concernant un <em>package<\/em> :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_package_licenses<\/strong>(const char *<em>package_name<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/sbom\/package\/licenses?name=&lt;package_name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/licenses?name=busybox\"<\/strong>\nGPL-2.0-only &amp; bzip2-1.0.4\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/licenses?name=f2fs-tools\"<\/strong>\nGPL-2.0-only\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/package\/licenses?name=eris-rest-api\"<\/strong>\nLGPL-2.0-only\n# \n<\/code><\/pre>\n\n\n\n<h2 id=\"T5.5\" class=\"wp-block-heading\">5.5 &#8211; Liste des licences pr\u00e9sentes<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La fonction suivante remplit le buffer fourni avec la liste de <strong>toutes les licences utilis\u00e9es<\/strong> par au moins un <em>package<\/em> install\u00e9 sur le syst\u00e8me.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_list_of_licenses<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/sbom\/license\/list<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/license\/list\"<\/strong>\nAFL-2.1 Apache-2.0 binary-redist-Cypress-rpidistro BSD-1-Clause BSD-2-Clause BSD-3-Clause BSD-4-Clause bzip2-1.0.4 bzip2-1.0.6 CC-BY-SA-4.0 CLOSED Firmware-cypress-rpidistro FTL GPL-1.0-or-later GPL-2.0-only GPL-2.0-or-later GPL-2.0-with-OpenSSL-exception GPL-3.0-only GPL-3.0-or-later GPL-3.0-with-GCC-exception hdparm HPND HPND-sell-variant IJG ISC LGPL-2.0-only LGPL-2.0-or-later LGPL-2.1-only LGPL-2.1-or-later LGPL-3.0-only LGPL-3.0-or-later Libpng MIT MPL-2.0 OFL-1.1 PD PSF-2.0 Synaptics-rpidistro Unicode-DFS-2016 Unicode-TOU Zlib<\/code><\/pre>\n\n\n\n<h2 id=\"T5.6\" class=\"wp-block-heading\">5.6 &#8211; Texte d&rsquo;une licence<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut obtenir le <strong>texte complet d&rsquo;une licence<\/strong> utilis\u00e9e par un <em>package<\/em>, en appelant la fonction suivante en lui passant le nom de la licence d\u00e9sir\u00e9e en premier argument. Le <em>buffer<\/em> sera rempli avec le texte de la licence sans jamais d\u00e9passer la taille maximale indiqu\u00e9e.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_license_text<\/strong>(const char *<em>license_name<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/sbom\/license\/text?name=&lt;license_name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/sbom\/license\/text?name=GPL-2.0-only\"<\/strong>\n\nGNU GENERAL PUBLIC LICENSE\n\nVersion 2, June 1991\n\nCopyright (C) 1989, 1991 Free Software Foundation, Inc.  \n51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA\n\nEveryone is permitted to copy and distribute verbatim copies\nof this license document, but changing it is not allowed.\nPreamble\n\n&#91;...]\n\nThis General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License.\n<\/code><\/pre>\n\n\n\n<h1 id=\"T6\" class=\"wp-block-heading\">6 &#8211; Red\u00e9marrage du syst\u00e8me<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">La plupart des syst\u00e8mes embarqu\u00e9s sont amen\u00e9s \u00e0 red\u00e9marrer abruptement suite \u00e0 des coupures d&rsquo;alimentation brutales. Eris Linux ne fait pas exception et est <strong>pr\u00e9vu pour red\u00e9marrer correctement<\/strong> quelles que soient les circonstances de l&rsquo;arr\u00eat du syst\u00e8me.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il peut n\u00e9anmoins \u00eatre n\u00e9cessaire de red\u00e9marrer intentionnellement le syst\u00e8me, par exemple pour activer une nouvelle version d&rsquo;Eris Linux pr\u00e9alablement install\u00e9e.<\/p>\n\n\n\n<h2 id=\"T6.1\" class=\"wp-block-heading\">6.1 &#8211; Red\u00e9marrage imm\u00e9diat<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le fonction suivante demande un <strong>red\u00e9marrage imm\u00e9diat du syst\u00e8me<\/strong>. Elle doit \u00eatre \u00e9videmment employ\u00e9e avec la plus grande prudence pour \u00e9viter d&rsquo;interrompre un traitement important. Si une application est en train d&rsquo;enregistrer des donn\u00e9es dans un fichier, ces donn\u00e9es seront perdues, et dans de tr\u00e8s rares cas la partition de donn\u00e9es peut \u00eatre corrompue et n\u00e9cessiter une r\u00e9paration automatique, voire dans le pire des cas un reformatage complet.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_reboot_now<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/reboot\/now<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/now\"<\/strong>\nRead from remote host 192.168.3.6: Connection reset by peer\nConnection to 192.168.3.6 closed.\nclient_loop: send disconnect: Broken pipe\n\n<\/code><\/pre>\n\n\n\n<h2 id=\"T6.2\" class=\"wp-block-heading\">6.2 &#8211; \u00c9tat d&rsquo;attente de red\u00e9marrage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s une mise \u00e0 jour, le syst\u00e8me reste en attente de reboot pendant trente secondes environ. On peut v\u00e9rifier avec la fonction suivante si un <strong>red\u00e9marrage a \u00e9t\u00e9 demand\u00e9<\/strong> (par exemple avant de lancer une t\u00e2che prenant du temps). Elle renvoie <code>1<\/code> si un reboot est programm\u00e9 et <code>0<\/code> sinon.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int eris_get_pending_reboot_flag(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/reboot\/pending<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> # <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending\"<\/strong>\nno\n<\/code><\/pre>\n\n\n\n<h2 id=\"T6.3\" class=\"wp-block-heading\">6.3 &#8211; Demande de red\u00e9marrage <\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut avec la fonction suivante <strong>demander au syst\u00e8me de red\u00e9marrer<\/strong> lors du prochain cycle de trente secondes, ou <strong>annuler une demande<\/strong> d\u00e9j\u00e0 programm\u00e9e. L&rsquo;argument doit \u00eatre <code>1<\/code> pour programmer un red\u00e9marrage et <code>0<\/code> pour l&rsquo;annuler.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_reboot_pending_flag<\/strong>(int <em>reboot<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/reboot\/pending?reboot={y|n}<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending\"<\/strong>\nno\n# <strong>curl  -X POST  -w '\\n' \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending?reboot=y\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending\"<\/strong>\nyes\n# <strong>curl  -X POST  -w '\\n' \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending?reboot=n\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending\"<\/strong>\nno\n# <strong>curl  -X POST  -w '\\n' \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending?reboot=y\"<\/strong>\nOk\n\n(Attente environ 45 secondes)\n# Read from remote host 192.168.3.6: Connection reset by peer\nConnection to 192.168.3.6 closed.\nclient_loop: send disconnect: Broken pipe\n<\/code><\/pre>\n\n\n\n<h2 id=\"T6.4\" class=\"wp-block-heading\">6.4 &#8211; Lecture du red\u00e9marrage automatique apr\u00e8s mise \u00e0 jour<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Apr\u00e8s l&rsquo;installation d&rsquo;une nouvelle version du syst\u00e8me Eris Linux, deux comportements sont possibles&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>red\u00e9marrage automatique<\/strong> au bout de trente secondes pour basculer sur la nouvelle version,<\/li>\n\n\n\n<li><strong>attendre un red\u00e9marrage  explicitement demand\u00e9<\/strong> par le code applicatif via la fonction vue ci-dessus.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La fonction suivante permet de v\u00e9rifier le comportement actuel. Elle renvoie <code>1<\/code> si le red\u00e9marrage se fait automatiquement, et <code>0<\/code> sinon.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_automatic_reboot_flag<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/reboot\/automatic<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/automatic\"<\/strong>\nyes<\/code><\/pre>\n\n\n\n<h2 id=\"T6.5\" class=\"wp-block-heading\">6.5 &#8211; \u00c9criture du red\u00e9marrage automatique apr\u00e8s mise \u00e0 jour<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut <strong>modifier<\/strong> avec la fonction suivante <strong>le comportement apr\u00e8s mise \u00e0 jour<\/strong> d\u00e9crit ci-dessus, en passant un <code>1<\/code> en argument si l&rsquo;on souhaite que d\u00e9sormais le syst\u00e8me red\u00e9marre automatiquement quand une mise \u00e0 jour est install\u00e9e, ou un <code>0<\/code> si on pr\u00e9f\u00e8re g\u00e9rer les red\u00e9marrages depuis le code applicatif.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_automatic_reboot_flag<\/strong>(int <em>auto<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/reboot\/automatic<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/automatic?auto=n\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/automatic\"<\/strong>\nno\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/automatic?auto=y\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/automatic\"<\/strong>\nyes\n# \n<\/code><\/pre>\n\n\n\n<h2 id=\"T6.6\" class=\"wp-block-heading\">6.6 &#8211; Demande de <em>rollback<\/em><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le syst\u00e8me Eris Linux utilise un m\u00e9canisme de mise \u00e0 jour dit \u00ab\u00a0A\/B\u00a0\u00bb (et m\u00eame A\/B\/Recovery pour \u00eatre exact)&nbsp;: si apr\u00e8s une mise \u00e0 jour le syst\u00e8me \u00e9choue \u00e0 plusieurs reprises \u00e0 red\u00e9marrer correctement, il revient automatiquement \u00e0 la version pr\u00e9c\u00e9dente.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ceci s&rsquo;appuie sur la d\u00e9tection du fonctionnement correct des \u00e9tapes de boot et le d\u00e9marrage r\u00e9ussi des containers. Il peut n\u00e9anmoins subsister des probl\u00e8mes non d\u00e9tect\u00e9s par le syst\u00e8me Eris Linux et qui ne pourront \u00eatre observ\u00e9s que par le code applicatif. Dans ce cas, il peut \u00eatre n\u00e9cessaire de <strong>demander explicitement un <em>rollback<\/em><\/strong> (retour sur la version pr\u00e9c\u00e9dente) qui s&rsquo;appliquera au prochain red\u00e9marrage.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_rollback<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/reboot\/rollback<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/version\"<\/strong>\n1.0.0-dev-30\n# <strong>curl  -X POST  -w '\\n' \"http:\/\/host.docker.internal:8080\/api\/reboot\/rollback\"<\/strong>\nOk\n# <strong>curl  -X POST  -w '\\n' \"http:\/\/host.docker.internal:8080\/api\/reboot\/pending?reboot=y\"<\/strong>\nOk\n&#91;...]\nApr\u00e8s reboot...\n&#91;...]\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/system\/version\"<\/strong>\n1.0.0-dev-29\n\n<\/code><\/pre>\n\n\n\n<h2 id=\"T6.7\" class=\"wp-block-heading\">6.7 &#8211; Demande de r\u00e9initialisation du syst\u00e8me<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dans le cas o\u00f9 le syst\u00e8me est totalement incapable de red\u00e9marrer, m\u00eame apr\u00e8s un <em>rollback<\/em>, Eris Linux tente un d\u00e9marrage en r\u00e9initialisant la partition contenant toutes les donn\u00e9es. Ceci remet le syst\u00e8me dans un \u00e9tat proche de sa sortie d&rsquo;usine. (Toutefois on reste sur la derni\u00e8re version du code syst\u00e8me, on ne revient pas sur le code en sortie d&rsquo;usine qui contenait peut \u00eatre des vuln\u00e9rabilit\u00e9s corrig\u00e9es depuis).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Au niveau applicatif, on peut demander \u00e0 <strong>r\u00e9initialiser totalement la partition contenant les donn\u00e9es<\/strong> par exemple avant de revendre l&rsquo;\u00e9quipement sur le march\u00e9 de l&rsquo;occasion. Ceci peut \u00eatre effectu\u00e9 avec la fonction suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_restore_factory_preset<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">En r\u00e9alit\u00e9 cette fonction n&rsquo;est pas encore impl\u00e9ment\u00e9e et renvoie toujours la valeur <code>-1<\/code>, avec la variable globale <code>errno<\/code> positionn\u00e9e \u00e0 <code>ENOSYS<\/code> (fonction syst\u00e8me non impl\u00e9ment\u00e9e).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/reboot\/factory<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/reboot\/factory\"<\/strong>\nFeature not implemented yet.<\/code><\/pre>\n\n\n\n<h1 id=\"T7\" class=\"wp-block-heading\">7 &#8211; Watchdog<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Sur un syst\u00e8me embarqu\u00e9, un <em>watchdog<\/em> (chien de garde) est un composant \u00e9lectronique qu&rsquo;il faut notifier r\u00e9guli\u00e8rement. Au bout d&rsquo;un temps donn\u00e9 sans notification il <strong>force le red\u00e9marrage du syst\u00e8me<\/strong>. Pour les \u00e9quipements sans <em>watchdog<\/em> mat\u00e9riel, le noyau Linux peut \u00e9muler cette fonctionnalit\u00e9 (avec l&rsquo;inconv\u00e9nient qu&rsquo;il ne pourra pas d\u00e9tecter un <em>kernel panic<\/em>).<\/p>\n\n\n\n<h2 id=\"T7.1\" class=\"wp-block-heading\">7.1 &#8211; Alimentation du watchdog<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut appeler la fonction suivante r\u00e9guli\u00e8rement pour notifier le <em>watchdog<\/em>. Cela <strong>remet le compteur<\/strong> au d\u00e9lai maximal (configurable avec <code>eris_set_watchdog_delay()<\/code> ) et d\u00e9clenche le d\u00e9compte. Si le timer atteint z\u00e9ro, le syst\u00e8me red\u00e9marre.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_feed_watchdog<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/watchdog<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\"<\/strong>\nOk\n\n<\/code><\/pre>\n\n\n\n<h2 id=\"T7.2\" class=\"wp-block-heading\">7.2 &#8211; Arr\u00eat du watchdog<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour <strong>arr\u00eater le <em>watchdog<\/em><\/strong> (par exemple le temps de faire une op\u00e9ration tr\u00e8s co\u00fbteuse en charge processeur qui risque de retarder les notifications) on utilisera la fonction suivante. Il faut \u00eatre conscient qu&rsquo;une fois le watchdog arr\u00eat\u00e9, le syst\u00e8me ne sera plus prot\u00e9g\u00e9 contre les blocages du syst\u00e8me.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_disable_watchdog<\/strong>(void)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>DELETE \/api\/watchdog<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X DELETE  -w '\\n'  http:\/\/host.docker.internal:8080\/api\/watchdog<\/strong>\nOk<\/code><\/pre>\n\n\n\n<h2 id=\"T7.3\" class=\"wp-block-heading\">7.3 &#8211; Lecture du d\u00e9lai de red\u00e9marrage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le <strong>d\u00e9lai<\/strong> (en secondes) entre la derni\u00e8re notification et le red\u00e9marrage du syst\u00e8me par le <em>watchdog<\/em>, est consultable avec la fonction&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_watchdog_delay<\/strong>(void);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/watchdog\/delay<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/delay\"<\/strong>\n15\n<\/code><\/pre>\n\n\n\n<h2 id=\"T7.4\" class=\"wp-block-heading\">7.4 &#8211; \u00c9criture du d\u00e9lai de red\u00e9marrage<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut <strong>fixer le d\u00e9lai<\/strong> entre notification et red\u00e9marrage entre 1 et 48 secondes (pour \u00eatre compatible avec l&rsquo;essentiel des <em>watchdogs<\/em>) avec la fonction&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_watchdog_delay<\/strong>(int <em>seconds<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/watchdog\/delay?delay=&lt;seconds&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/delay\"<\/strong>\n15\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/delay?delay=30\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/delay\"<\/strong>\n30<\/code><\/pre>\n\n\n\n<h2 id=\"T7.5\" class=\"wp-block-heading\">7.5 &#8211; D\u00e9marrage d&rsquo;un thread d&rsquo;alimentation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si on ne souhaite pas d\u00e9velopper d&rsquo;application qui alimente r\u00e9guli\u00e8rement le <em>watchdog<\/em>, il est possible de laisser travailler un <strong>thread sp\u00e9cifique du serveur REST<\/strong> d\u00e9di\u00e9 \u00e0 cette t\u00e2che. Ce thread n&rsquo;est pas lanc\u00e9 par d\u00e9faut et n\u00e9cessite d&rsquo;\u00eatre explicitement d\u00e9clench\u00e9 au d\u00e9marrage du syst\u00e8me.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_start_watchdog_feeder<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/watchdog\/feeder<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nOk\n<\/code><\/pre>\n\n\n\n<h2 id=\"T7.6\" class=\"wp-block-heading\">7.6 &#8211; Arr\u00eat du thread d&rsquo;alimentation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut <strong>arr\u00eater le thread<\/strong> d&rsquo;alimentation automatique du <em>watchdog<\/em> avec&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_stop_watchdog_feeder<\/strong>(void)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>DELETE<code> \/api\/watchdog\/feeder<\/code><\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nOk\n<\/code><\/pre>\n\n\n\n<h2 id=\"T7.7\" class=\"wp-block-heading\">7.7 &#8211; \u00c9tat du thread d&rsquo;alimentation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut observer l&rsquo;<strong>\u00e9tat du thread d&rsquo;alimentation<\/strong> automatique. La fonction suivante \u00e9crit la cha\u00eene <code>running<\/code> ou <code>stopped<\/code> dans le <em>buffer<\/em> pass\u00e9 en argument sans jamais d\u00e9passer la taille indiqu\u00e9e.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_watchdog_feeder_status<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/watchdog\/feeder<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'   \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nstopped\n# <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'   \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nrunning\n# <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nAlready running\n# <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nstopped\n# <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/watchdog\/feeder\"<\/strong>\nAlready stopped\n\n\n<\/code><\/pre>\n\n\n\n<h1 id=\"T8\" class=\"wp-block-heading\">8 &#8211; Horloge<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Les syst\u00e8mes embarqu\u00e9s ont souvent besoin d&rsquo;interroger un serveur externe pour <strong>synchroniser l&rsquo;heure du syst\u00e8me<\/strong> sur celle d&rsquo;une horloge officielle. Pour cela on peut activer ou non le <strong>protocole NTP<\/strong> (<em>Network Time Protocol<\/em>) servant \u00e0 cette synchronisation, et le cas \u00e9ch\u00e9ant configurer le nom ou l&rsquo;adresse du serveur NTP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Eris Linux propose \u00e9galement de configurer et consulter une horloge syst\u00e8me. Il est \u00e9galement possible de choisir un fuseau horaire et de consulter l&rsquo;heure locale.<\/p>\n\n\n\n<h2 id=\"T8.1\" class=\"wp-block-heading\">8.1 &#8211; Lecture de l&rsquo;utilisation de NTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le protocole NTP (<em>Network Time Protocol<\/em>) permet de synchroniser un \u00e9quipement avec un serveur. On peut attendre la plupart du temps une pr\u00e9cision de quelques dizaines de millisecondes lors d&rsquo;un acc\u00e8s au serveur via Internet et quelques centaines de microsecondes lorsque le serveur et le client sont sur un r\u00e9seau local.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La fonction suivante permet de <strong>v\u00e9rifier si le protocole NTP est utilis\u00e9<\/strong> ou non sur l&rsquo;\u00e9quipement.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_ntp_enable<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/time\/ntp<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\"<\/strong>\nyes\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.2\" class=\"wp-block-heading\">8.2 &#8211; \u00c9criture de l&rsquo;utilisation de NTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avec la fonction suivante, on peut <strong>activer ou d\u00e9sactiver l&rsquo;utilisation de NTP<\/strong> sur l&rsquo;\u00e9quipement.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_ntp_enable<\/strong>(int <em>enable<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/time\/ntp?status={yes|no}<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp?status=no\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\"<\/strong>\nno\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp?status=yes\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\"<\/strong>\nyes\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.3\" class=\"wp-block-heading\">8.3 &#8211; Lecture du serveur NTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si le protocole NTP est utilis\u00e9, on peut employer la fonction suivante pour conna\u00eetre l&rsquo;<strong>adresse du serveur NTP<\/strong> actif. L&rsquo;adresse (ou le nom d&rsquo;h\u00f4te) est \u00e9crite dans le buffer transmis en argument sans d\u00e9passer la taille indiqu\u00e9e.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_ntp_server<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/time\/ntp\/server<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\/server\"<\/strong>\npool.ntp.org\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.4\" class=\"wp-block-heading\">8.4 &#8211; \u00c9criture du serveur NTP<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La fonction suivante permet d&rsquo;<strong>indiquer l&rsquo;adresse<\/strong>, ou le nom d&rsquo;h\u00f4te, <strong>du serveur NTP<\/strong> \u00e0 utiliser.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_ntp_server<\/strong>(const char *<em>server<\/em>);\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/time\/ntp\/server?server=&lt;address&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\/server?server=192.168.1.45\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\/server\"<\/strong>\n192.168.1.45\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\/server?server=pool.ntp.org\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/ntp\/server\"<\/strong>\npool.ntp.org\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.5\" class=\"wp-block-heading\">8.5 &#8211; Liste des fuseaux horaires<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour configurer l&rsquo;heure locale du syst\u00e8me, on pr\u00e9cise le fuseau horaire dans lequel il se trouve. On peut obtenir la <strong>liste des fuseaux horaires connus avec la fonction&nbsp;:<\/strong><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_list_time_zones<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/time\/zone\/list<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone\/list\"<\/strong>\nAfrica\/Abidjan Africa\/Accra Africa\/Addis_Ababa Africa\/Algiers Africa\/Asmara Africa\/Asmera Africa\/Bamako\nAfrica\/Bangui Africa\/Banjul Africa\/Bissau Africa\/Blantyre Africa\/Brazzaville Africa\/Bujumbura Africa\/Cairo\nAfrica\/Casablanca Africa\/Ceuta Africa\/Conakry Africa\/Dakar Africa\/Dar_es_Salaam Africa\/Djibouti Africa\/Douala\nAfrica\/El_Aaiun Africa\/Freetown Africa\/Gaborone Africa\/Harare Africa\/Johannesburg Africa\/Juba Africa\/Kampala\nAfrica\/Khartoum Africa\/Kigali Africa\/Kinshasa Africa\/Lagos Africa\/Libreville Africa\/Lome Africa\/Luanda\nAfrica\/Lubumbashi Africa\/Lusaka Africa\/Malabo Africa\/Maputo Africa\/Maseru Africa\/Mbabane Africa\/Mogadishu\nAfrica\/Monrovia Africa\/Nairobi Africa\/Ndjamena Africa\/Niamey Africa\/Nouakchott Africa\/Ouagadougou\nAfrica\/Porto-Novo Africa\/Sao_Tome Africa\/Timbuktu Africa\/Tripoli Africa\/Tunis Africa\/Windhoek America\/Adak\nAmerica\/Anchorage America\/Anguilla America\/Antigua America\/Araguaina America\/Aruba America\/Asuncion\nAmerica\/Atikokan America\/Atka America\/Bahia America\/Bahia_Banderas America\/Barbados America\/Belem\nAmerica\/Belize America\/Blanc-Sablon America\/Boa_Vista America\/Bogota America\/Boise America\/Buenos_Aires\nAmerica\/Cambridge_Bay America\/Campo_Grande America\/Cancun America\/Caracas America\/Catamarca America\/Cayenne\nAmerica\/Cayman America\/Chicago America\/Chihuahua America\/Ciudad_Juarez America\/Coral_Harbour America\/Cordoba\nAmerica\/Costa_Rica America\/Coyhaique America\/Creston America\/Cuiaba America\/Curacao America\/Danmarkshavn\nAmerica\/Dawson America\/Dawson_Creek America\/Denver America\/Detroit America\/Dominica America\/Edmonton\nAmerica\/Eirunepe America\/El_Salvador America\/Ensenada America\/Fort_Nelson America\/Fort_Wayne America\/Fortaleza\nAmerica\/Glace_Bay America\/Godthab America\/Goose_Bay America\/Grand_Turk America\/Grenada America\/Guadeloupe\nAmerica\/Guatemala America\/Guayaquil America\/Guyana America\/Halifax America\/Havana America\/Hermosillo\nAmerica\/Indianapolis America\/Inuvik America\/Iqaluit America\/Jamaica America\/Jujuy America\/Juneau\nAmerica\/Knox_IN America\/Kralendijk America\/La_Paz America\/Lima America\/Los_Angeles America\/Louisville\nAmerica\/Lower_Princes America\/Maceio America\/Managua America\/Manaus America\/Marigot America\/Martinique\nAmerica\/Matamoros America\/Mazatlan America\/Mendoza America\/Menominee America\/Merida America\/Metlakatla\nAmerica\/Mexico_City America\/Miquelon America\/Moncton America\/Monterrey America\/Montevideo America\/Montreal\nAmerica\/Montserrat America\/Nassau America\/New_York America\/Nipigon America\/Nome America\/Noronha America\/Nuuk\nAmerica\/Ojinaga America\/Panama America\/Pangnirtung America\/Paramaribo America\/Phoenix America\/Port-au-Prince\nAmerica\/Port_of_Spain America\/Porto_Acre America\/Porto_Velho America\/Puerto_Rico America\/Punta_Arenas\nAmerica\/Rainy_River America\/Rankin_Inlet America\/Recife America\/Regina America\/Resolute America\/Rio_Branco\nAmerica\/Rosario America\/Santa_Isabel America\/Santarem America\/Santiago America\/Santo_Domingo America\/Sao_Paulo\nAmerica\/Scoresbysund America\/Shiprock America\/Sitka America\/St_Barthelemy America\/St_Johns America\/St_Kitts\nAmerica\/St_Lucia America\/St_Thomas America\/St_Vincent America\/Swift_Current America\/Tegucigalpa America\/Thule\nAmerica\/Thunder_Bay America\/Tijuana America\/Toronto America\/Tortola America\/Vancouver America\/Virgin\nAmerica\/Whitehorse America\/Winnipeg America\/Yakutat America\/Yellowknife Antarctica\/Casey Antarctica\/Davis\nAntarctica\/DumontDUrville Antarctica\/Macquarie Antarctica\/Mawson Antarctica\/McMurdo Antarctica\/Palmer\nAntarctica\/Rothera Antarctica\/South_Pole Antarctica\/Syowa Antarctica\/Troll Antarctica\/Vostok Arctic\/Longyearbyen\nAsia\/Aden Asia\/Almaty Asia\/Amman Asia\/Anadyr Asia\/Aqtau Asia\/Aqtobe Asia\/Ashgabat Asia\/Ashkhabad Asia\/Atyrau\nAsia\/Baghdad Asia\/Bahrain Asia\/Baku Asia\/Bangkok Asia\/Barnaul Asia\/Beirut Asia\/Bishkek Asia\/Brunei Asia\/Calcutta\nAsia\/Chita Asia\/Choibalsan Asia\/Chongqing Asia\/Chungking Asia\/Colombo Asia\/Dacca Asia\/Damascus Asia\/Dhaka\nAsia\/Dili Asia\/Dubai Asia\/Dushanbe Asia\/Famagusta Asia\/Gaza Asia\/Harbin Asia\/Hebron Asia\/Ho_Chi_Minh\nAsia\/Hong_Kong Asia\/Hovd Asia\/Irkutsk Asia\/Istanbul Asia\/Jakarta Asia\/Jayapura Asia\/Jerusalem Asia\/Kabul\nAsia\/Kamchatka Asia\/Karachi Asia\/Kashgar Asia\/Kathmandu Asia\/Katmandu Asia\/Khandyga Asia\/Kolkata\nAsia\/Krasnoyarsk Asia\/Kuala_Lumpur Asia\/Kuching Asia\/Kuwait Asia\/Macao Asia\/Macau Asia\/Magadan Asia\/Makassar\nAsia\/Manila Asia\/Muscat Asia\/Nicosia Asia\/Novokuznetsk Asia\/Novosibirsk Asia\/Omsk Asia\/Oral Asia\/Phnom_Penh\nAsia\/Pontianak Asia\/Pyongyang Asia\/Qatar Asia\/Qostanay Asia\/Qyzylorda Asia\/Rangoon Asia\/Riyadh Asia\/Saigon\nAsia\/Sakhalin Asia\/Samarkand Asia\/Seoul Asia\/Shanghai Asia\/Singapore Asia\/Srednekolymsk Asia\/Taipei\nAsia\/Tashkent Asia\/Tbilisi Asia\/Tehran Asia\/Tel_Aviv Asia\/Thimbu Asia\/Thimphu Asia\/Tokyo Asia\/Tomsk\nAsia\/Ujung_Pandang Asia\/Ulaanbaatar Asia\/Ulan_Bator Asia\/Urumqi Asia\/Ust-Nera Asia\/Vientiane Asia\/Vladivostok\nAsia\/Yakutsk Asia\/Yangon Asia\/Yekaterinburg Asia\/Yerevan Atlantic\/Azores Atlantic\/Bermuda Atlantic\/Canary\nAtlantic\/Cape_Verde Atlantic\/Faeroe Atlantic\/Faroe Atlantic\/Jan_Mayen Atlantic\/Madeira Atlantic\/Reykjavik\nAtlantic\/South_Georgia Atlantic\/St_Helena Atlantic\/Stanley Australia\/ACT Australia\/Adelaide Australia\/Brisbane\nAustralia\/Broken_Hill Australia\/Canberra Australia\/Currie Australia\/Darwin Australia\/Eucla Australia\/Hobart\nAustralia\/LHI Australia\/Lindeman Australia\/Lord_Howe Australia\/Melbourne Australia\/NSW Australia\/North\nAustralia\/Perth Australia\/Queensland Australia\/South Australia\/Sydney Australia\/Tasmania Australia\/Victoria\nAustralia\/West Australia\/Yancowinna Brazil\/Acre Brazil\/DeNoronha Brazil\/East Brazil\/West CET CST6CDT\nCanada\/Atlantic Canada\/Central Canada\/Eastern Canada\/Mountain Canada\/Newfoundland Canada\/Pacific\nCanada\/Saskatchewan Canada\/Yukon Chile\/Continental Chile\/EasterIsland Cuba EET EST EST5EDT Egypt Eire Etc\/GMT\nEtc\/GMT+0 Etc\/GMT+1 Etc\/GMT+10 Etc\/GMT+11 Etc\/GMT+12 Etc\/GMT+2 Etc\/GMT+3 Etc\/GMT+4 Etc\/GMT+5 Etc\/GMT+6\nEtc\/GMT+7 Etc\/GMT+8 Etc\/GMT+9 Etc\/GMT-0 Etc\/GMT-1 Etc\/GMT-10 Etc\/GMT-11 Etc\/GMT-12 Etc\/GMT-13 Etc\/GMT-14\nEtc\/GMT-2 Etc\/GMT-3 Etc\/GMT-4 Etc\/GMT-5 Etc\/GMT-6 Etc\/GMT-7 Etc\/GMT-8 Etc\/GMT-9 Etc\/GMT0 Etc\/Greenwich Etc\/UCT\nEtc\/UTC Etc\/Universal Etc\/Zulu Europe\/Amsterdam Europe\/Andorra Europe\/Astrakhan Europe\/Athens Europe\/Belfast\nEurope\/Belgrade Europe\/Berlin Europe\/Bratislava Europe\/Brussels Europe\/Bucharest Europe\/Budapest Europe\/Busingen\nEurope\/Chisinau Europe\/Copenhagen Europe\/Dublin Europe\/Gibraltar Europe\/Guernsey Europe\/Helsinki\nEurope\/Isle_of_Man Europe\/Istanbul Europe\/Jersey Europe\/Kaliningrad Europe\/Kiev Europe\/Kirov Europe\/Kyiv\nEurope\/Lisbon Europe\/Ljubljana Europe\/London Europe\/Luxembourg Europe\/Madrid Europe\/Malta Europe\/Mariehamn\nEurope\/Minsk Europe\/Monaco Europe\/Moscow Europe\/Nicosia Europe\/Oslo Europe\/Paris Europe\/Podgorica Europe\/Prague\nEurope\/Riga Europe\/Rome Europe\/Samara Europe\/San_Marino Europe\/Sarajevo Europe\/Saratov Europe\/Simferopol\nEurope\/Skopje Europe\/Sofia Europe\/Stockholm Europe\/Tallinn Europe\/Tirane Europe\/Tiraspol Europe\/Ulyanovsk\nEurope\/Uzhgorod Europe\/Vaduz Europe\/Vatican Europe\/Vienna Europe\/Vilnius Europe\/Volgograd Europe\/Warsaw\nEurope\/Zagreb Europe\/Zaporozhye Europe\/Zurich Factory GB GB-Eire GMT GMT+0 GMT-0 GMT0 Greenwich HST Hongkong\nIceland Indian\/Antananarivo Indian\/Chagos Indian\/Christmas Indian\/Cocos Indian\/Comoro Indian\/Kerguelen Indian\/Mahe\nIndian\/Maldives Indian\/Mauritius Indian\/Mayotte Indian\/Reunion Iran Israel Jamaica Japan Kwajalein Libya MET MST\nMST7MDT Mexico\/BajaNorte Mexico\/BajaSur Mexico\/General NZ NZ-CHAT Navajo PRC PST8PDT Pacific\/Apia Pacific\/Auckland\nPacific\/Bougainville Pacific\/Chatham Pacific\/Chuuk Pacific\/Easter Pacific\/Efate Pacific\/Enderbury Pacific\/Fakaofo\nPacific\/Fiji Pacific\/Funafuti Pacific\/Galapagos Pacific\/Gambier Pacific\/Guadalcanal Pacific\/Guam Pacific\/Honolulu\nPacific\/Johnston Pacific\/Kanton Pacific\/Kiritimati Pacific\/Kosrae Pacific\/Kwajalein Pacific\/Majuro\nPacific\/Marquesas Pacific\/Midway Pacific\/Nauru Pacific\/Niue Pacific\/Norfolk Pacific\/Noumea Pacific\/Pago_Pago\nPacific\/Palau Pacific\/Pitcairn Pacific\/Pohnpei Pacific\/Ponape Pacific\/Port_Moresby Pacific\/Rarotonga\nPacific\/Saipan Pacific\/Samoa Pacific\/Tahiti Pacific\/Tarawa Pacific\/Tongatapu Pacific\/Truk Pacific\/Wake\nPacific\/Wallis Pacific\/Yap Poland Portugal ROC ROK Singapore Turkey UCT US\/Alaska US\/Aleutian US\/Arizona\nUS\/Central US\/East-Indiana US\/Eastern US\/Hawaii US\/Indiana-Starke US\/Michigan US\/Mountain US\/Pacific US\/Samoa UTC\nUniversal W-SU WET Zulu\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.6\" class=\"wp-block-heading\">8.6 &#8211; Lecture du fuseau horaire du syst\u00e8me<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut consulter le <strong>fuseau horaire actuellement configur\u00e9<\/strong> avec la fonction&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_time_zone<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/time\/zone<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone\"<\/strong>\nUTC\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.7\" class=\"wp-block-heading\">8.7 &#8211; \u00c9criture du fuseau horaire du syst\u00e8me<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour <strong>fixer le fuseau horaire<\/strong>, on utilisera la fonction suivante, en passant un argument un des noms de zones renvoy\u00e9s dans <a href=\"#T8.5\">la liste<\/a> pr\u00e9c\u00e9demment vue.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_time_zone<\/strong>(const char *<em>timezone<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/time\/zone?zone=&lt;zone-name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone?zone=Europe\/Paris\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone\"<\/strong>\nEurope\/Paris\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.8\" class=\"wp-block-heading\">8.8 &#8211; Lecture de l&rsquo;heure locale<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;<strong>heure locale<\/strong> du syst\u00e8me est d\u00e9termin\u00e9e en se basant sur son fuseau horaire. Elle est inscrite dans le <em>buffer<\/em> sans d\u00e9passer la taille indiqu\u00e9e. Le <strong>format<\/strong> contient&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>l&rsquo;ann\u00e9e sur 4 chiffres,<\/li>\n\n\n\n<li>le mois sur 2 chiffres,<\/li>\n\n\n\n<li>le jour sur 2 chiffres,<\/li>\n\n\n\n<li>l&rsquo;heure sur deux chiffres,<\/li>\n\n\n\n<li>les minutes sur deux chiffres,<\/li>\n\n\n\n<li>les secondes sur deux chiffres,<\/li>\n\n\n\n<li>les microsecondes sur 6 chiffres.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_local_time<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>)\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/time\/local<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone\"<\/strong>\nUTC\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/local\"<\/strong>\n2026-09-07 18:48:41:554132\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone?zone=Europe\/Paris\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/local\"<\/strong>\n2026-09-07 20:48:47:615302\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone?zone=America\/New_York\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/local\"<\/strong>\n2026-09-07 14:48:52:373670\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.9\" class=\"wp-block-heading\">8.9 &#8211; Lecture de l&rsquo;heure syst\u00e8me<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">L&rsquo;<strong>heure syst\u00e8me<\/strong> ne d\u00e9pend pas du fuseau horaire. Elle est normalement align\u00e9e sur l&rsquo;heure UTC, r\u00e9cup\u00e9r\u00e9e au d\u00e9marrage depuis un composant nomm\u00e9 \u00ab\u00a0RTC\u00a0\u00bb (<em>Real Time Clock<\/em>) et ajust\u00e9e r\u00e9guli\u00e8rement depuis un serveur NTP. On peut lire sa valeur avec la fonction suivante, le format est le m\u00eame que l&rsquo;heure locale&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_system_time<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>)<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/time\/system<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone?zone=UTC\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/system\"<\/strong>\n2026-09-07 18:58:14:578329\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/local\"<\/strong>\n2026-09-07 18:58:16:194981\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/zone?zone=Europe\/Paris\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/system\"<\/strong>\n2026-09-07 18:58:19:412932\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/local\"<\/strong>\n2026-09-07 20:58:21:126631\n<\/code><\/pre>\n\n\n\n<h2 id=\"T8.10\" class=\"wp-block-heading\">8.10 &#8211; \u00c9criture de l&rsquo;heure syst\u00e8me<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bien qu&rsquo;il soit pr\u00e9f\u00e9rable d&rsquo;utiliser un protocole comme NTP, il est possible de <strong>modifier l&rsquo;heure syst\u00e8me<\/strong> depuis une application avec la fonction suivante. La cha\u00eene <code>time_string<\/code> attendue est <code>&lt;year&gt;-&lt;month&gt;-&lt;day&gt;T&lt;hour&gt;:&lt;minute&gt;:&lt;second&gt;<\/code>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_system_time<\/strong>(const char *<em>time_string<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/time\/system?time=&lt;time-string&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/system\"<\/strong>\n2026-09-07 19:08:13:098130\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/system?time=2025-08-07T18:06:17\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/time\/system\"<\/strong>\n2025-08-07 18:06:20:480723\n<\/code><\/pre>\n\n\n\n<h1 id=\"T9\" class=\"wp-block-heading\">9 &#8211; R\u00e9seau<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Les exemples que nous utiliserons dans cette section sont ex\u00e9cut\u00e9s sur un Raspberry Pi 5 disposant de deux interfaces r\u00e9seau (Ethernet et Wifi), avec deux adresses sur le m\u00eame sous-r\u00e9seau, comme il l&rsquo;indique au <em>Device Manager<\/em> :<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/fig.5-01.png\"><img loading=\"lazy\" decoding=\"async\" width=\"853\" height=\"278\" src=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/fig.5-01.png\" alt=\"\" class=\"wp-image-7775\" srcset=\"https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/fig.5-01.png 853w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/fig.5-01-300x98.png 300w, https:\/\/www.blaess.fr\/christophe\/wp-content\/uploads\/2026\/09\/fig.5-01-768x250.png 768w\" sizes=\"auto, (max-width: 853px) 100vw, 853px\" \/><\/a><figcaption class=\"wp-element-caption\">Fig. 1 &#8211; Adresses IP du Raspberry Pi d&rsquo;exemple.<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 id=\"T9.1\" class=\"wp-block-heading\">9.1 &#8211; Liste des interfaces disponibles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La premi\u00e8re \u00e9tape de configuration du r\u00e9seau consiste souvent \u00e0 d\u00e9terminer la <strong>liste des interfaces disponibles<\/strong>. La fonction suivante remplit le <em>buffer<\/em> en argument avec cette liste, sans d\u00e9passer la taille maximale indiqu\u00e9e. Les interfaces list\u00e9es sont celles reposant sur des composants mat\u00e9riels physiques, pas d&rsquo;interface virtuelle, de communication avec un container ou de <em>loopback<\/em>.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_list_of_network_interfaces<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/network\/interface\/list<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  http:\/\/host.docker.internal:8080\/api\/network\/interface\/list<\/strong>\nwlan0 eth0\n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.2\" class=\"wp-block-heading\">9.2 &#8211; Lecture de l&rsquo;\u00e9tat d&rsquo;une interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut consulter l&rsquo;<strong>\u00e9tat d&rsquo;une interface<\/strong> pour savoir si elle est <strong>active<\/strong> (<em>up<\/em>) ou non (<em>down<\/em>). Si l&rsquo;interface est <em>up<\/em>, le r\u00e9sultat contient \u00e9galement son adresse IP et le masque du sous-r\u00e9seau.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_network_interface_status<\/strong>(const char *<em>interface_name<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/network\/interface\/status?name=&lt;interface-name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/status?name=eth0\"<\/strong>\nup 192.168.3.6 255.255.255.0 \n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/status?name=wlan0\"<\/strong>\nup 192.168.3.36 255.255.255.0 \n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.3\" class=\"wp-block-heading\">9.3 &#8211; \u00c9criture de l&rsquo;\u00e9tat d&rsquo;une interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut <strong>activer ou d\u00e9sactiver une interface<\/strong> avec la fonction suivante en lui passant <code>up<\/code> ou <code>down<\/code> en second argument.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int <strong>eris_set_network_interface_status<\/strong>(const char *<em>interface<\/em>, const char *<em>status<\/em>);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/network\/interface\/status<code><strong>?name=&lt;<code><strong>interface-<\/strong><\/code>name&gt;<\/strong><\/code>&amp;status={up|down}<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/status?name=eth0&amp;status=down\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/status?name=eth0\"<\/strong>\ndown \n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/status?name=eth0&amp;status=up\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/status?name=eth0\"<\/strong>\nup 192.168.3.6 255.255.255.0 \n\n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.4\" class=\"wp-block-heading\">9.4 &#8211; Lecture de la configuration d&rsquo;une interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La <strong>configuration d&rsquo;une interface r\u00e9seau<\/strong> est une suite de champs s\u00e9par\u00e9s par des espaces&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>nom de l&rsquo;interface (par exemple <code>eth0<\/code>),<\/li>\n\n\n\n<li><code>atboot<\/code> si l&rsquo;interface doit \u00eatre automatiquement activ\u00e9e au d\u00e9marrage du syst\u00e8me ou <code>ondemand<\/code> si l&rsquo;activation doit se faire par la m\u00e9thode vue ci-dessus,<\/li>\n\n\n\n<li><code>dhcp<\/code> si l&rsquo;interface doit interroger un serveur pour obtenir sa configuration IP, ou <code>static<\/code> si la configuration est fournie \u00e0 la suite,<\/li>\n\n\n\n<li>(si configuration <code>static<\/code>) <code>ipv4<\/code> ou <code>ipv6<\/code> selon le type d&rsquo;adresse accept\u00e9e,<\/li>\n\n\n\n<li>(si configuration <code>static<\/code>) adresse IP de l&rsquo;\u00e9quipement sur l&rsquo;interface,<\/li>\n\n\n\n<li>(si configuration <code>static<\/code>) masque de sous-r\u00e9seau de l&rsquo;interface,<\/li>\n\n\n\n<li>(si configuration <code>static<\/code>) adresse IP d&rsquo;une passerelle pour sortir du sous-r\u00e9seau.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_network_interface_config<\/strong>(const char *<em>interface<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/network\/interface\/config<\/strong><code><strong>?name=&lt;<code>interface-<\/code>name&gt;<\/strong><\/code><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/config?name=eth0\"<\/strong>\neth0 atboot dhcp\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/config?name=wlan0\"<\/strong>\nwlan0 ondemand dhcp\n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.5\" class=\"wp-block-heading\">9.5 &#8211; \u00c9criture de la configuration d&rsquo;une interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La <strong>configuration d&rsquo;une interface<\/strong> peut se faire en pr\u00e9cisant les arguments suivants&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>activation de l&rsquo;interface d\u00e8s le d\u00e9marrage (<code>atboot<\/code>) ou sur requ\u00eate explicite (<code>ondemand<\/code>),<\/li>\n\n\n\n<li>mode d&rsquo;initialisation de l&rsquo;adresse IP (<code>dhcp<\/code> ou <code>static<\/code>),<\/li>\n\n\n\n<li>(si mode <code>static<\/code>) choix entre adresses <code>ipv4<\/code> ou <code>ipv6<\/code>,<\/li>\n\n\n\n<li>(si mode <code>static<\/code>) adresse IP de l&rsquo;\u00e9quipement,<\/li>\n\n\n\n<li>(si mode <code>static<\/code>) masque du sous-r\u00e9seau,<\/li>\n\n\n\n<li>(si mode <code>static<\/code>) adresse de la passerelle de sortie du sous-r\u00e9seau.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_network_interface_config<\/strong>(const char *<em>interface<\/em>, const char *<em>activate<\/em>, const char *<em>mode<\/em>, const char *<em>ip<\/em>, const char *<em>address<\/em>, const char *<em>netmask<\/em>, const char *<em>gateway<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/network\/interface\/config<code><strong>?name=&lt;<code><strong>interface-<\/strong><\/code>name&gt;<\/strong><\/code>&amp;activate={atboot|ondemand}&amp;mode={dhcp|static}&amp;ip={ipv4|ipv6}&amp;address=&lt;ip-address&gt;&amp;netmask=&lt;ip-mask&gt;&amp;gateway=&lt;gw-address&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/config?name=eth0&amp;activate=ondemand&amp;mode=static&amp;ip=ipv4&amp;address=192.168.3.100&amp;netmask=255.255.255.0&amp;gateway=192.168.3.254\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/config?name=eth0\"<\/strong>\neth0 ondemand static ipv4 192.168.3.100 255.255.255.0 192.168.3.254\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/config?name=eth0&amp;activate=atboot&amp;mode=dhcp\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/config?name=eth0\"<\/strong>\neth0 atboot dhcp\n# \n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.6\" class=\"wp-block-heading\">9.6 &#8211; Lecture de la connectivit\u00e9 d&rsquo;une interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut v\u00e9rifier avec la fonction suivante si une interface est filaire (valeur renvoy\u00e9e <code>0<\/code>) ou sans fil (valeur renvoy\u00e9e <code>1<\/code>)&nbsp;;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_is_network_interface_wireless<\/strong>(const char *<em>interface<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/network\/interface\/wireless&amp;name=&lt;<code><strong>interface-<\/strong><\/code>name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/wireless?name=eth0\"<\/strong>\nno\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/interface\/wireless?name=wlan0\"<\/strong>\nyes\n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.7\" class=\"wp-block-heading\">9.7 &#8211; Lecture de l&rsquo;adresse du DNS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Le serveur de nom ou <strong>DNS<\/strong> (<em>Domain Name Server<\/em>) fait la r\u00e9solution des noms d&rsquo;h\u00f4tes pour obtenir des adresses IP. La fonction suivante permet de <strong>r\u00e9cup\u00e9rer l&rsquo;adresse du serveur DNS actuellement utilis\u00e9<\/strong> dans la variable <code>buffer<\/code> sans d\u00e9passer la taille maximale indiqu\u00e9e&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_nameserver_address<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/network\/dns<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/dns\"<\/strong>\n192.168.3.254\n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.8\" class=\"wp-block-heading\">9.8 &#8211; \u00c9criture de l&rsquo;adresse du DNS<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour <strong>fixer l&rsquo;adresse du serveur DNS<\/strong> on utilisera la fonction&nbsp;: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_set_nameserver_address<\/strong>(const char *<em>address<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/network\/dns?address=&lt;ip-address&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/dns?address=8.8.8.8\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/dns\"<\/strong>\n8.8.8.8\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/dns?address=192.168.3.254\"<\/strong>\nOk\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/dns\"<\/strong>\n192.168.3.254\n# \n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.9\" class=\"wp-block-heading\">9.9 &#8211; Scan des r\u00e9seaux Wifi accessibles<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Si une interface est <em>wireless<\/em>, on peut r\u00e9cup\u00e9rer la <strong>liste des r\u00e9seaux wifi<\/strong> d\u00e9tect\u00e9s.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Le m\u00eame nom de r\u00e9seau peut \u00eatre pr\u00e9sent \u00e0 plusieurs reprises, si plusieurs fr\u00e9quences (exemple 2.4 GHz et 5 GHz).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_scan_wifi<\/strong>(const char *<em>interface<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/network\/wifi?name=&lt;<code><strong>interface-<\/strong><\/code>name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/wifi?name=wlan0\"<\/strong>\nLogilinLab\nGuest\nLogilinLab\n\n# \n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.10\" class=\"wp-block-heading\">9.10 &#8211; Connexion sur un r\u00e9seau Wifi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La connexion sur un r\u00e9seau Wifi peut se faire avec la fonction suivante en passant le nom de l&rsquo;interface <em>wireless<\/em> concern\u00e9e, l&rsquo;identifiant <em>SSID<\/em> du r\u00e9seau (comprise dans la liste renvoy\u00e9e par la fonction pr\u00e9c\u00e9dente), et le mot de passe d&rsquo;acc\u00e8s au r\u00e9seau. La commande REST est susceptible d&rsquo;\u00e9voluer dans l&rsquo;avenir pour que le SSID et le mot de passe soient transmis dans le corps de la requ\u00eate.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_connect_wifi<\/strong>(const char *<em>interface<\/em>, const char *<em>ssid<\/em>, const char *<em>password<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/network\/wifi\/connection?name=&lt;interface-name&gt;&amp;ssid=&lt;ssid-string&gt;&amp;pass=&lt;password&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/wifi\/connection?name=wlan0&amp;ssid=Guest&amp;pass=Welcome\"<\/strong>\nok\n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.11\" class=\"wp-block-heading\">9.11 &#8211; D\u00e9connexion d&rsquo;un r\u00e9seau Wifi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La d\u00e9connexion du r\u00e9seau wifi sur lequel l&rsquo;\u00e9quipement est connect\u00e9 peut s&rsquo;obtenir avec&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_disconnect_wifi<\/strong>(void);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>DELETE \/api\/network\/wifi\/connection<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/wifi\/connection\"<\/strong>\nOk\n<\/code><\/pre>\n\n\n\n<h2 id=\"T9.12\" class=\"wp-block-heading\">9.12 &#8211; Lecture de la qualit\u00e9 de la connexion Wifi<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La qualit\u00e9 de la connexion Wifi est renvoy\u00e9e sous forme de trois valeurs&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>link<\/code> : (qualit\u00e9 du lien) valeur calcul\u00e9e pour estimer la qualit\u00e9 du lien. L&rsquo;\u00e9chelle peut d\u00e9pendre du driver et est g\u00e9n\u00e9ralement entre 0 et 70. Plus la valeur est \u00e9lev\u00e9e, meilleure est la connexion.<\/li>\n\n\n\n<li><code>level<\/code>: valeur mesur\u00e9e en dBm de force du signal. Plus elle est \u00e9lev\u00e9e, mieux c&rsquo;est. Un niveau de -30dBm \u00e0 -50dBm est tr\u00e8s bon. En dessous de -80 dBm, le lien est trop faible pour une connexion fiable.<\/li>\n\n\n\n<li><code>noise<\/code> : mesure physique du niveau de bruit entourant le signal utile. En dessous de -90dBm on consid\u00e8re le niveau de bruit tr\u00e8s faible (liaison tr\u00e8s bonne). Au dessus de -70dBm le signal est tr\u00e8s bruit\u00e9.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ces valeurs sont tr\u00e8s d\u00e9pendantes du driver. Je suppose que le niveau de bruit de <code>-256dB<\/code> que l&rsquo;on voit ci-dessous signifie plut\u00f4t que la mesure n&rsquo;est pas disponible.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_wifi_quality<\/strong>(const char *<em>interface<\/em>, char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/network\/wifi\/quality&amp;name=&lt;interface-name&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/network\/wifi\/quality?name=wlan0\"<\/strong>\nlink=64 level=-46 noise=-256<\/code><\/pre>\n\n\n\n<h1 id=\"T10\" class=\"wp-block-heading\">10 &#8211; GPIO<\/h1>\n\n\n\n<h2 id=\"T10.1\" class=\"wp-block-heading\">10.1 &#8211; Liste des GPIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">La liste des GPIO est disponible sous forme d&rsquo;un tableau au format JSON avec une entr\u00e9e pour chaque GPIO. Chaque entr\u00e9e contient deux champs&nbsp;:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>id<\/code> est la r\u00e9f\u00e9rence de la ligne GPIO. Elle est construite en associant le nom du contr\u00f4leur GPIO, un caract\u00e8re deux-points et l&rsquo;<em>offset<\/em> de la ligne vis-\u00e0-vis du contr\u00f4leur. Par exemple <code>gpiochip0:23<\/code>. Ce champ identifie la GPIO de mani\u00e8re unique.<\/li>\n\n\n\n<li><code> name<\/code> est le nom indiqu\u00e9 pour la ligne GPIO dans le <em>device tree<\/em> (description du mat\u00e9riel). Ce champ peut \u00eatre significatif, par exemple <code>GPIO23<\/code>, mais peut \u00e9galement \u00eatre vide ou ne contenir que des caract\u00e8res <em>underscore<\/em> <code>_<\/code>.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_get_list_of_gpio<\/strong>(char *<em>buffer<\/em>, size_t <em>size<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/gpio\/list<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio\/list<\/strong>\"\n&#91;{\"id\":\"gpiochip10:0\",\"name\":\"_\"},{\"id\":\"gpiochip10:1\",\"name\":\"2712_BOOT_CS_N\"},{\"id\":\"gpiochip10:2\",\"name\":\"2712_BOOT_MISO\"},{\"id\":\"gpiochip10:3\",\"name\":\"2712_BOOT_MOSI\"},\n {\"id\":\"gpiochip10:4\",\"name\":\"2712_BOOT_SCLK\"},{\"id\":\"gpiochip10:5\",\"name\":\"_\"},{\"id\":\"gpiochip10:6\",\"name\":\"_\"},{\"id\":\"gpiochip10:7\",\"name\":\"_\"},\n {\"id\":\"gpiochip10:8\",\"name\":\"_\"},{\"id\":\"gpiochip10:9\",\"name\":\"_\"},{\"id\":\"gpiochip10:10\",\"name\":\"_\"},{\"id\":\"gpiochip10:11\",\"name\":\"_\"},\n {\"id\":\"gpiochip10:12\",\"name\":\"_\"},{\"id\":\"gpiochip10:13\",\"name\":\"_\"},{\"id\":\"gpiochip10:14\",\"name\":\"PCIE_SDA\"},{\"id\":\"gpiochip10:15\",\"name\":\"PCIE_SCL\"},\n &#91;...]\n {\"id\":\"gpiochip0:22\",\"name\":\"GPIO22\"},{\"id\":\"gpiochip0:23\",\"name\":\"GPIO23\"},{\"id\":\"gpiochip0:24\",\"name\":\"GPIO24\"},{\"id\":\"gpiochip0:25\",\"name\":\"GPIO25\"},\n {\"id\":\"gpiochip0:26\",\"name\":\"GPIO26\"},{\"id\":\"gpiochip0:27\",\"name\":\"GPIO27\"},{\"id\":\"gpiochip0:28\",\"name\":\"PCIE_RP1_WAKE\"},{\"id\":\"gpiochip0:29\",\"name\":\"FAN_TACH\"},\n {\"id\":\"gpiochip0:30\",\"name\":\"HOST_SDA\"},{\"id\":\"gpiochip0:31\",\"name\":\"HOST_SCL\"},{\"id\":\"gpiochip0:32\",\"name\":\"ETH_RST_N\"},{\"id\":\"gpiochip0:33\",\"name\":\"_\"},\n {\"id\":\"gpiochip0:34\",\"name\":\"CD0_IO0_MICCLK\"},{\"id\":\"gpiochip0:35\",\"name\":\"CD0_IO0_MICDAT0\"},{\"id\":\"gpiochip0:36\",\"name\":\"RP1_PCIE_CLKREQ_N\"},{\"id\":\"gpiochip0:37\",\"name\":\"_\"},\n {\"id\":\"gpiochip0:38\",\"name\":\"CD0_SDA\"},{\"id\":\"gpiochip0:39\",\"name\":\"CD0_SCL\"},{\"id\":\"gpiochip0:40\",\"name\":\"CD1_SDA\"},{\"id\":\"gpiochip0:41\",\"name\":\"CD1_SCL\"},\n {\"id\":\"gpiochip0:42\",\"name\":\"USB_VBUS_EN\"},{\"id\":\"gpiochip0:43\",\"name\":\"USB_OC_N\"},{\"id\":\"gpiochip0:44\",\"name\":\"RP1_STAT_LED\"},{\"id\":\"gpiochip0:45\",\"name\":\"FAN_PWM\"},\n {\"id\":\"gpiochip0:46\",\"name\":\"CD1_IO0_MICCLK\"},{\"id\":\"gpiochip0:47\",\"name\":\"2712_WAKE\"},{\"id\":\"gpiochip0:48\",\"name\":\"CD1_IO1_MICDAT1\"},{\"id\":\"gpiochip0:49\",\"name\":\"EN_MAX_USB_CUR\"},\n {\"id\":\"gpiochip0:50\",\"name\":\"_\"},{\"id\":\"gpiochip0:51\",\"name\":\"_\"},{\"id\":\"gpiochip0:52\",\"name\":\"_\"},{\"id\":\"gpiochip0:53\",\"name\":\"_\"}\n]\n<\/code><\/pre>\n\n\n\n<h2 id=\"T10.2\" class=\"wp-block-heading\">10.2 &#8211; R\u00e9servation d&rsquo;une ligne GPIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Avec les fonctions suivantes on peut r\u00e9server une ligne GPIO en entr\u00e9e ou en sortie. Dans le cas d&rsquo;une sortie, on pr\u00e9cisera la valeur initiale (<code>0<\/code> ou <code>1<\/code>) \u00e0 appliquer \u00e0 cette ligne d\u00e8s sa r\u00e9servation. La fonction renvoie <code>0<\/code> si la r\u00e9servation a r\u00e9ussi ou <code>-1<\/code> en cas d&rsquo;erreur. Si la GPIO est d\u00e9j\u00e0 r\u00e9serv\u00e9e, la fonction \u00e9choue.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_request_gpio_for_input<\/strong>(const char *<em>id<\/em>);\nint <strong>eris_request_gpio_for_output<\/strong>(const char *<em>id<\/em>, int <em>value<\/em>);\n\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>POST \/api\/gpio?id=&lt;gpio-id&gt;&amp;direction={in|out}&amp;value={0|1}<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:23&amp;direction=in\"<\/strong>\nOk\n\n# <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:24&amp;direction=out&amp;value=1\"<\/strong>\nOk\n\n# <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:23&amp;direction=in\"<\/strong>\nGPIO line is already reserved by Eris API.\n<\/code><\/pre>\n\n\n\n<h2 id=\"T10.3\" class=\"wp-block-heading\">10.3 &#8211; Lib\u00e9ration d&rsquo;une ligne GPIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Une ligne pr\u00e9c\u00e9demment r\u00e9serv\u00e9e peut \u00eatre lib\u00e9r\u00e9e avec la fonction suivante. Une tentative de double lib\u00e9ration renvoie une erreur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_release_gpio<\/strong>(const char *<em>id<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>DELETE \/api\/gpio?id=&lt;gpio-id&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:23\"<\/strong>\nOk\n\n# <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:24\"<\/strong>\nOk\n\n# <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:24\"<\/strong>\nGPIO already free.\n<\/code><\/pre>\n\n\n\n<h2 id=\"T10.4\" class=\"wp-block-heading\">10.4 &#8211; Lecture d&rsquo;une valeur sur une ligne GPIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On peut lire l&rsquo;\u00e9tat d&rsquo;une entr\u00e9e GPIO pr\u00e9c\u00e9demment r\u00e9serv\u00e9e avec la fonction&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_read_gpio_value<\/strong>(const char *<em>id<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>GET \/api\/gpio\/value?id=&lt;gpio-id&gt;<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:23&amp;direction=in\"<\/strong>\nOk\n\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio\/value?id=gpiochip0:23\"<\/strong>\n0   (GPIO 23 broche 16 reli\u00e9e \u00e0 la masse broche 20)\n\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio\/value?id=gpiochip0:23\"<\/strong>\n1   (GPIO 23 broche 16 reli\u00e9e au +3.3 broche 17)\n\n# <strong>curl  -X GET  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio\/value?id=gpiochip0:23\"<\/strong>\n0   (GPIO 23 broche 16 reli\u00e9e \u00e0 la masse broche 20)\n\n# <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:23\"<\/strong>\nOk\n<\/code><\/pre>\n\n\n\n<h2 id=\"T10.5\" class=\"wp-block-heading\">10.5 &#8211; \u00c9criture d&rsquo;une valeur sur une ligne GPIO<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Pour \u00e9crire la valeur de sortie d&rsquo;une GPIO pr\u00e9c\u00e9demment r\u00e9serv\u00e9e on utilisera la fonction suivante&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>int <strong>eris_write_gpio_value<\/strong>(const char *<em>id<\/em>, int <em>value<\/em>);<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Point d\u2019acc\u00e8s Rest sur le port 8080&nbsp;: <code><strong>PUT \/api\/gpio\/value?id=&lt;gpio-id&gt;&amp;value={0|1}<\/strong><\/code><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Exemple&nbsp;:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># <strong>curl  -X POST  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:24&amp;direction=out&amp;value=0\"<\/strong>\nOk\n\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio\/value?id=gpiochip0:24&amp;value=1\"<\/strong>\nOk   (On mesure 3.3V sur la broche 18 GPIO 24)\n\n# <strong>curl  -X PUT  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio\/value?id=gpiochip0:24&amp;value=0\"<\/strong>\nOk   (On mesure 0V sur la broche 18 GPIO 24)\n\n# <strong>curl  -X DELETE  -w '\\n'  \"http:\/\/host.docker.internal:8080\/api\/gpio?id=gpiochip0:24\"<\/strong>\nOk\n<\/code><\/pre>\n\n\n\n<h1 id=\"conclusion\" class=\"wp-block-heading\">Conclusion<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Les fonctions et requ\u00eates REST vues ci-dessus constituent les possibilit\u00e9s <span style=\"text-decoration: underline;\">actuelles<\/span> d&rsquo;interaction entre les applications se trouvant dans les containers et le syst\u00e8me Eris Linux sous-jacent. Toutefois le projet Eris est toujours en \u00e9volution et de nouvelles m\u00e9thodes seront prochainement ajout\u00e9es. Par exemple des fonctions sont en cours de d\u00e9veloppement pour la communication bas-niveau avec des \u00e9quipements sur des bus comme SPI et I\u00b2C. D&rsquo;autre part des fonctionnalit\u00e9s de haut-niveau seront bient\u00f4t ajout\u00e9es comme la g\u00e9olocalisation si un r\u00e9cepteur GPS est pr\u00e9sent ou l&rsquo;orientation de l&rsquo;\u00e9quipement pour rotation automatique de l&rsquo;\u00e9cran si un acc\u00e9l\u00e9rom\u00e8tre est disponible.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Pour enrichir ces API, le concours d&rsquo;utilisateurs ou d&rsquo;entreprises souhaitant exp\u00e9rimenter Eris Linux nous est tr\u00e8s pr\u00e9cieux. N&rsquo;h\u00e9sitez pas \u00e0 me contacter si vous souhaitez tester Eris et nous faire des retours sur des cas d&rsquo;usage r\u00e9els.<br><\/p>","protected":false},"excerpt":{"rendered":"<p>Nous avons vu dans les articles pr&eacute;c&eacute;dents de cette s&eacute;rie&nbsp;: Les applications que l&rsquo;on embarque sous forme de code &laquo;&nbsp;m&eacute;tier&nbsp;&raquo; ne sont que tr&egrave;s rarement auto-suffisantes. Elles ont souvent besoin de communiquer avec le syst&egrave;me sous-jacent pour consulter ou configurer des &eacute;l&eacute;ments du syst&egrave;me (par exemple le param&eacute;trage r&eacute;seau, la configuration du watchdog, celle des [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[],"class_list":["post-7543","post","type-post","status-publish","format-standard","hentry","category-linux-2"],"_links":{"self":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/7543","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/comments?post=7543"}],"version-history":[{"count":151,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/7543\/revisions"}],"predecessor-version":[{"id":7867,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/posts\/7543\/revisions\/7867"}],"wp:attachment":[{"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/media?parent=7543"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/categories?post=7543"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blaess.fr\/christophe\/wp-json\/wp\/v2\/tags?post=7543"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}