
{
    "version": "https://jsonfeed.org/version/1",
    "title": "Stéphane HUC :: IT Log",
    "home_page_url": "http://doc.huc.fr.eu.org/",
    "feed_url": "http://doc.huc.fr.eu.org/fr/feed.json",
    "description": "Documentations Administration Système, Réseaux par Stéphane HUC",
    
    "author": {
        "avatar": "/svg/Logo_final.svg",
        "name": "Stéphane HUC",
        "url": "http://doc.huc.fr.eu.org/"
        },
    "icon": "/svg/Logo_final.svg",
    "favicon": "/img/favicon.ico",
    "items": [{
            "id": "urn:uuid:1aa16bd3-2cb8-f0c3-c9a6-1f22d33bdf75",
            "url": "http://doc.huc.fr.eu.org/fr/sys/debian/amdgpu-rocm-opencl/",
            "title": "Debian : Ajouter le support d'OpenCL pour les GPU AMD Radeon (amdgpu + ROCm = OpenCL, OpenMP, HIP support)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Environnement de test :\nOS : Debian Sid Logiciels : LACT ; OCCT Matériel : AMD Radeon RX 7600 XT Pour faire fonctionner une carte AMD Radeon RX, il est nécessaire d\u0026rsquo;utiliser le pilote amdgpu ; ceci est d\u0026rsquo;ailleurs aussi valable si vous avez un APU AMD Ryzen.\nMais pour pouvoir utiliser les frameworks logiciels, tel OpenCL, il faut en plus installer le paquet logiciel rocm-opencl-icd qui se trouve être dans les dépôts officiels Debian depuis quelque temps.\nEt, oui, bien que ne faisant par partie des matériels officiellement supportés, la carte RX 7600 XT utilise bien OpenCL.\nVous pouvez aussi ajouter l\u0026rsquo;utilitaire clinfo qui informe du support de votre matériel.\nConfiguration Ajouter votre utilisateur aux groupes render et video, puis redémarrer la session.\n#: usermod -a -G render,video $LOGNAME Documentation La documentation de ROCm :\nla page System requirements (Linux) qui permet de voir les requis matériels sous Linux, où le support est officiel à partir de la Radeon RX 7700, et ce depuis Debian 12 \u0026ldquo;Bookworm\u0026rdquo;. Le manpage logname(1) FR\nRemerciements la page OpenCL with the open-source amdgpu kernel module Enjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eEnvironnement de test :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOS : Debian Sid\u003c/li\u003e\n\u003cli\u003eLogiciels : \u003ca title=\"Linux GPU Configuration And Monitoring Tool\" href=\"https://github.com/ilya-zlobintsev/LACT\" rel=\"external\"\u003eLACT\u003c/a\u003e ; \u003ca href=\"https://www.ocbase.com/download\" rel=\"external\"\u003eOCCT\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eMatériel : AMD Radeon RX 7600 XT\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour faire fonctionner une carte AMD Radeon RX, il est nécessaire d\u0026rsquo;utiliser le\npilote \u003ccode\u003eamdgpu\u003c/code\u003e ; ceci est d\u0026rsquo;ailleurs aussi valable si vous avez un APU AMD Ryzen.\u003c/p\u003e\n\u003cp\u003eMais pour pouvoir utiliser les frameworks logiciels, tel OpenCL, il faut en plus\ninstaller le paquet logiciel \u003ccode\u003erocm-opencl-icd\u003c/code\u003e qui se trouve être dans les dépôts\nofficiels Debian depuis quelque temps.\u003c/p\u003e\n\u003cp\u003eEt, oui, bien que ne faisant par partie des matériels officiellement supportés,\nla carte RX 7600 XT utilise bien OpenCL.\u003c/p\u003e\n\u003cp\u003eVous pouvez aussi ajouter l\u0026rsquo;utilitaire \u003ccode\u003eclinfo\u003c/code\u003e qui informe du support de votre\nmatériel.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eAjouter votre utilisateur aux groupes \u003ccode\u003erender\u003c/code\u003e et \u003ccode\u003evideo\u003c/code\u003e, puis redémarrer la\nsession.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#: usermod -a -G render,video $LOGNAME\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLa \u003ca href=\"https://rocm.docs.amd.com/en/latest/\" rel=\"external\"\u003edocumentation de ROCm\u003c/a\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela page \u003ca href=\"https://rocm.docs.amd.com/projects/install-on-linux/en/latest/reference/system-requirements.html\" rel=\"external\"\u003eSystem requirements (Linux)\u003c/a\u003e qui permet de voir les requis matériels sous Linux, où le support\nest officiel à partir de la Radeon RX 7700, et ce depuis Debian 12 \u0026ldquo;Bookworm\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe \u003ca href=\"https://manpages.debian.org/unstable/manpages-fr/logname.1.fr.html\" rel=\"external\"\u003emanpage logname(1) FR\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ela page \u003ca href=\"https://math.dartmouth.edu/~sarunas/amdgpu-opencl.html\" rel=\"external\"\u003e\u003cstrong\u003eOpenCL with the open-source amdgpu kernel module\u003c/strong\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID! \u003cbr\u003e\nEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Ajouter le support logiciels des frameworks OpenCL, OpenMP, HIP au pilote amdgpu sous Debian Sid",
            "tags": ["Debian", "amdgpu", "ROCm", "OpenCL", "OpenMP"],
            "date_published": "2026-02-24T13:46:26+01:00",
            "date_modified": "2026-02-24T18:08:50+01:00"
        },{
            "id": "urn:uuid:b14f656f-af56-b8a9-e894-6e7c2cbc764e",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/factory-reset/",
            "title": "OpenWRT : Factory Reset",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description AttentionAttention tous les paramètres seront absolument supprimés, il faudra se connecter à l\u0026rsquo;interface accessible par défaut sur l\u0026rsquo;adresse IP 192.168.1.1 (ce qui peut poser problème si votre routeur principal a la même adresse IP ; veillez à le faire hors réseau). Restaurer les paramètres par défaut est simple en soit.\n⇒ En mode CLI, il y a deux possibilités de restauration par défaut :\nLe mode Soft : il suffit d\u0026rsquo;utiliser la commande firstboot puis de redémarrer la machine, tel que : # firsboot \u0026amp;\u0026amp; reboot\nIl peut y avoir dans certains cas un soucis avec l\u0026rsquo;exécution de la commande firstboot ; dans ce cas essayez avec l\u0026rsquo;option -y et d\u0026rsquo;exécuter la commande reboot sur une ligne séparée.\nLe mode Hard :\nExécutez en premier lieu la commande sysupgrade pour réinstaller n\u0026rsquo;importe quel firmware\nRéinitialiser la partition JFFS2 : # umount /overlay \u0026amp;\u0026amp; jffs2reset \u0026amp;\u0026amp; reboot\npuis réinitialiser partition FFS2 : # dd if=/dev/zero of=/dev/loop0 bs=1M; reboot\n⇒ Depuis l\u0026rsquo;interface LUCI, cliquez sur le menu System \u0026gt; Backup / Flash firmware, puis dans la section Restore, cliquez sur le bouton rouge titré [ Perform reset ] .\nDocumentation OpenWRT Failsafe mode, factory reset, and recovery mode ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eAttention tous les paramètres seront absolument supprimés, il faudra se connecter\nà l\u0026rsquo;interface accessible par défaut sur l\u0026rsquo;adresse IP \u003ccode\u003e192.168.1.1\u003c/code\u003e \u003cem\u003e(ce qui peut\nposer problème si votre routeur principal a la même adresse IP ; veillez à le\nfaire hors réseau)\u003c/em\u003e.\u003c/div\u003e\n\n\u003cp\u003eRestaurer les paramètres par défaut est simple en soit.\u003c/p\u003e\n\u003cp\u003e⇒ En mode CLI, il y a deux possibilités de restauration par défaut :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe mode \u003cstrong\u003eSoft\u003c/strong\u003e : il suffit d\u0026rsquo;utiliser la commande \u003ccode\u003efirstboot\u003c/code\u003e puis de\nredémarrer la machine, tel que : \u003ccode\u003e# firsboot \u0026amp;\u0026amp; reboot\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl peut y avoir dans certains cas un soucis avec l\u0026rsquo;exécution de la commande\n\u003ccode\u003efirstboot\u003c/code\u003e ; dans ce cas essayez avec l\u0026rsquo;option \u003ccode\u003e-y\u003c/code\u003e et d\u0026rsquo;exécuter la\ncommande \u003ccode\u003ereboot\u003c/code\u003e sur une ligne séparée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe mode \u003cstrong\u003eHard\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eExécutez en premier lieu la commande \u003ccode\u003esysupgrade\u003c/code\u003e pour réinstaller\nn\u0026rsquo;importe quel firmware\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRéinitialiser la partition JFFS2 :\n\u003ccode\u003e# umount /overlay \u0026amp;\u0026amp; jffs2reset \u0026amp;\u0026amp; reboot\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epuis réinitialiser partition FFS2 :\n\u003ccode\u003e# dd if=/dev/zero of=/dev/loop0 bs=1M; reboot\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Depuis l\u0026rsquo;interface LUCI, cliquez sur le menu \u003cstrong\u003eSystem\u003c/strong\u003e \u0026gt; \u003cstrong\u003eBackup / Flash firmware\u003c/strong\u003e,\npuis dans la section \u003cstrong\u003eRestore\u003c/strong\u003e, cliquez sur le bouton rouge titré\n\u003cspan class=\"red\"\u003e[ Perform reset ]\u003c/span\u003e\n.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/troubleshooting/failsafe_and_factory_reset#factory_reset\" rel=\"external\"\u003eOpenWRT Failsafe mode, factory reset, and recovery mode\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment restaurer par défaut les paramètres systèmes d'OpenWRT, en mode usine.",
            "tags": ["OpenWRT", "Dépannage", "Usine"],
            "date_published": "2025-09-23T18:46:10+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:52a4ebd4-2dde-f844-85fa-ecde557f5ea2",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/wifi-repeter/",
            "title": "OpenWRT : Créer un répéteur WIFI",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Transformer son routeur sous OpenWRT en point d\u0026rsquo;accès (répéteur) est assez simple en soit ; cela va impacter principalement trois des fichiers du système :\n/etc/config/network /etc/config/dhcp /etc/config/wireless Configuration Il est important de partir sur une base d\u0026rsquo;OpenWRT fraîchement installée, voire de réinitialiser les paramètres en mode usine par défaut.\nLa première chose à faire est de connecter physiquement par cable réseau le routeur qui sera répéteur wifi au routeur principal, puis ensuite de modifier la configuration du répéteur wifi. Ainsi, c\u0026rsquo;est le serveur DHCP du routeur principal qui enverra les paquets nécessaires pour permettre la connexion réseau wifi par le biais du point d\u0026rsquo;accès.\nAttentionVérifiez absolument que le câble réseau qui vient du routeur principal ne soit connecté QUE sur un des ports LAN de votre répéteur, et non pas sur le port WAN. Par défaut, si c\u0026rsquo;était le cas, la future configuration ne serait pas fonctionnelle ! Comme bien souvent, sous OpenWRT, il est possible de le faire de manières différentes, en éditant en mode CLI les fichiers concernés, ou de passer par l\u0026rsquo;interface LUCI.\nCet article se focalise sur la manière CLI.\nCLI network Editez en premier le fichier /etc/config/network pour que la configuration de l\u0026rsquo;interface lan soit le futur point d\u0026rsquo;accès dans votre réseau actuel, tel que pour l\u0026rsquo;exemple :\nconfig interface \u0026#39;lan\u0026#39; option device \u0026#39;br-lan\u0026#39; option proto \u0026#39;static\u0026#39; option ipaddr \u0026#39;192.168.1.3\u0026#39; option netmask \u0026#39;255.255.255.0\u0026#39; # option ip6assign \u0026#39;60\u0026#39; option gateway \u0026#39;192.168.1.1\u0026#39; list dns \u0026#39;192.168.1.1\u0026#39; La commande uci nous permet de la modifier directement :\nuci batch \u0026lt;\u0026lt; EOF set network.lan.dns=\u0026#39;192.168.1.1\u0026#39; set network.lan.ipaddr=\u0026#39;192.168.1.3\u0026#39; set network.lan.netmask=\u0026#39;255.255.255.0\u0026#39; set network.lan.gateway=\u0026#39;192.168.1.1\u0026#39; set network.lan.proto=\u0026#39;static\u0026#39; EOF uci commit wireless Maintenant il faut éditer le fichier /etc/config/wireless la ou les sections wifi-device et wifi-iface pour changer les paramètres SSID, type de chiffrement, passphrase nécessaire, le code pays, puis pour finir par activer le module radio.\nVoici pour l\u0026rsquo;exemple sur un routeur Xiaomi AX3000T, qui comporte deux modules radio :\n# cat /etc/config/wireless config wifi-device \u0026#39;radio0\u0026#39; option type \u0026#39;mac80211\u0026#39; option path \u0026#39;platform/soc/18000000.wifi\u0026#39; option channel \u0026#39;1\u0026#39; option band \u0026#39;2g\u0026#39; option htmode \u0026#39;HT20\u0026#39; option country \u0026#39;FR\u0026#39; option cell_density \u0026#39;0\u0026#39; config wifi-device \u0026#39;radio1\u0026#39; option type \u0026#39;mac80211\u0026#39; option path \u0026#39;platform/soc/18000000.wifi+1\u0026#39; option channel \u0026#39;36\u0026#39; option band \u0026#39;5g\u0026#39; option htmode \u0026#39;HE80\u0026#39; option country \u0026#39;FR\u0026#39; option cell_density \u0026#39;0\u0026#39; config wifi-iface \u0026#39;wifinet0\u0026#39; option device \u0026#39;radio0\u0026#39; option mode \u0026#39;ap\u0026#39; option ssid \u0026#39;***\u0026#39; option encryption \u0026#39;sae-mixed\u0026#39; option dtim_period \u0026#39;3\u0026#39; option key \u0026#39;***\u0026#39; # option ieee80211r \u0026#39;1\u0026#39; # option mobility_domain \u0026#39;4772\u0026#39; option ft_over_ds \u0026#39;0\u0026#39; option network \u0026#39;lan\u0026#39; config wifi-iface \u0026#39;wifinet1\u0026#39; option device \u0026#39;radio1\u0026#39; option mode \u0026#39;ap\u0026#39; option ssid \u0026#39;***\u0026#39; option encryption \u0026#39;sae\u0026#39; option dtim_period \u0026#39;3\u0026#39; option key \u0026#39;***\u0026#39; # option ieee80211r \u0026#39;1\u0026#39; # option mobility_domain \u0026#39;4772\u0026#39; option ft_over_ds \u0026#39;0\u0026#39; option wpa_disable_eapol_key_retries \u0026#39;1\u0026#39; option network \u0026#39;lan\u0026#39; Remarquez dans les deux sections wifi-device l\u0026rsquo;option de pays paramétrée pour la france : option country 'FR'.\nLes deux sections wifi-iface concernant chacun des deux modules radio sont bien paramétrées en option mode 'ap' et cible bien le réseau lan : option network 'lan'.\nModifiez les option ssid, option encryption et option key selon les identifiants wifi du routeur Wifi principal, ainsi que l\u0026rsquo;algorythme de chiffrement utilisé et la clé paramétrée. Ici dans l\u0026rsquo;exemple, la section wifi-iface du module radio0 est configurée pour utiliser le chiffrement WPA2/WPA3 PSK, SAE (CCMP), soit option encryption 'sae-mixed', ce qui permet à des appareils un peu plus vieux ou nécessitant absolument l\u0026rsquo;usage de la bande 2G, tout en gardant un chiffrement WPA2 assez sécurisé, et en permettant que les périphériques wifi capables de se connecter en WPA3 choisiront ce chiffrement offert par défaut, alors que celle du module radio1 est configurée pour n\u0026rsquo;utiliser que le chiffrement WPA3.\nAstuceIl est intéressant de configurer, si votre routeur a des modules radio 2G et 5G, d\u0026rsquo;utiliser les mêmes SSID et protocoles de chiffrement, cela permet au périphérique client de choisir automatiquement quel est le meilleur protocole pour lui. La commande uci permet de modifier juste le nécessaire :\nuci batch \u0026lt;\u0026lt; EOF set.wireless.wifi_device[0].country=\u0026#39;FR\u0026#39; set.wireless.wifi_device[1].country=\u0026#39;FR\u0026#39; set.wireless.wifi_iface[0].mode=\u0026#39;ap\u0026#39; set.wireless.wifi_iface[1].mode=\u0026#39;ap\u0026#39; set.wireless.wifi_iface[0].network=\u0026#39;lan\u0026#39; set.wireless.wifi_iface[1].network=\u0026#39;lan\u0026#39; set.wireless.wifi_iface[0].encryption=\u0026#39;sae-mixed\u0026#39; set.wireless.wifi_iface[1].encryption=\u0026#39;sae\u0026#39; set wireless.wifi_iface[0].ssid=\u0026#39;Votre_SSID\u0026#39; set.wireless.wifi_iface[1].ssid=\u0026#39;Votre_SSID\u0026#39; set wireless.wifi_iface[0].key=\u0026#39;Votre_Passphrase\u0026#39; set.wireless.wifi_iface[1].key=\u0026#39;Votre_Passphrase\u0026#39; EOF uci commit DHCP Il est critique de désactiver l\u0026rsquo;utilisation du serveur DHCP interne au point d\u0026rsquo;accès, pour deux raisons :\ns\u0026rsquo;assurer que seul le serveur DHCP du routeur principal envoie les trames nécessaires à la connexion des périphériques wifi lors des mises-à-jours du point d\u0026rsquo;accès, le serveur DHCP du point d\u0026rsquo;accès va être réactivé ! Désactivez le serveur DHCP du point d\u0026rsquo;accès se fait, par le biais de LUCI, en cliquant sur le menu System \u0026gt; Startup puis de cliquer sur le bouton [ Enable ] relatif à dnsmaq (normalement en ligne 19) pour le désactiver puis appuyer sur le bouton [ Stop ]. Modifiez le fichier /etc/config/dhcp pour ajouter l\u0026rsquo;option suivante option ignore '1' dans la section config dhcp 'lan' ; supprimez aussi toutes les options relatives à IPv6 ! Exemple :\nconfig dhcp \u0026#39;lan\u0026#39; option interface \u0026#39;lan\u0026#39; option start \u0026#39;100\u0026#39; option limit \u0026#39;150\u0026#39; option leasetime \u0026#39;12h\u0026#39; option ignore \u0026#39;1\u0026#39; option dhcpv4 \u0026#39;disabled\u0026#39; option dhcpv6 \u0026#39;disabled\u0026#39; option ndp \u0026#39;disabled\u0026#39; option ra \u0026#39;disabled\u0026#39; L\u0026rsquo;utilisation de l\u0026rsquo;option ignore activée est le seul moyen actuel de permettre à ce que le routeur répéteur n\u0026rsquo;utilise absolument que les paquets envoyés par le serveur DHCP du routeur principal, même si son propre serveur DHCP est actif (ce qui sera malheureusement le cas lors des mises-à-jours d\u0026rsquo;OpenWRT).\nL\u0026rsquo;utilisation de la commande uci :\nuci batch \u0026lt;\u0026lt; EOF set dhcp.lan.ignore=\u0026#39;1\u0026#39; EOF uci commit # Attention à bien assimiler qu\u0026#39;au prochain `sysupgrade`, le service sera à nouveau activé : service dnsmasq stop service dnsmasq disable Maintenant que ces différentes configurations ont été faites, le plus simple reste de démarrer le répéteur et de profitez de l\u0026rsquo;usage du wifi.\nWAN → LAN Transformer le port WAN en port LAN est possible.\nPar défaut, les ports WAN et WAN6 sont configurés dans OpenWRT ; il faut donc supprimer les configurations relatives dans le fichier /etc/config/network puis ajouter l\u0026rsquo;interface wan au pont br-lan, tel que :\nconfig device option name \u0026#39;br-lan\u0026#39; option type \u0026#39;bridge\u0026#39; list ports \u0026#39;lan1\u0026#39; list ports \u0026#39;lan2\u0026#39; list ports \u0026#39;lan3\u0026#39; list ports \u0026#39;lan4\u0026#39; list ports \u0026#39;wan\u0026#39; Et supprimez dans le même fichier les informations relatives à WAN / WAN6 :\nconfig interface \u0026#39;wan\u0026#39; option device \u0026#39;wan\u0026#39; option proto \u0026#39;dhcp\u0026#39; config interface \u0026#39;wan6\u0026#39; option device \u0026#39;wan\u0026#39; option proto \u0026#39;dhcpv6\u0026#39; InfoParfois certains matériels sont capricieux avec l\u0026rsquo;utilisation de WAN en tant que LAN. Dans certaines circonstances, les performances réseaux peuvent diminuer lors du transfert entre l\u0026rsquo;interface LAN et WAN, voire s\u0026rsquo;effondrer. C\u0026rsquo;est souvent le cas pour les routeurs logiciellement optimisés pour le routage.\nSi malheureusement, une telle baisse de performance s\u0026rsquo;illustre dans votre cas, le seul reméde est de garder l\u0026rsquo;interface WAN hors du pont et séparée ! Dans ce cas, il faut restaurer le fichier nertwork.\nPar le biais d\u0026rsquo;uci :\nuci batch \u0026lt;\u0026lt; EOF set network.@device[0].ports=\u0026#39;lan2\u0026#39; \u0026#39;lan3\u0026#39; \u0026#39;lan4\u0026#39; \u0026#39;wan\u0026#39; set network.wan.disabled=\u0026#39;1\u0026#39; set network.wan6.disabled=\u0026#39;1\u0026#39; EOF uci commit TL;DR À vous de modifier selon votre matériel, le résumé ci-dessous - pour mieux comprendre de quoi il s\u0026rsquo;agit, soit vous lisez l\u0026rsquo;ensemble de l\u0026rsquo;article, soit vous allez sur le documentation officielle !\nuci batch \u0026lt;\u0026lt; EOF set network.lan.dns=\u0026#39;192.168.1.1\u0026#39; set network.lan.ipaddr=\u0026#39;192.168.1.3\u0026#39; set network.lan.netmask=\u0026#39;255.255.255.0\u0026#39; set network.lan.gateway=\u0026#39;192.168.1.1\u0026#39; set network.lan.proto=\u0026#39;static\u0026#39; set.wireless.wifi_device[0].country=\u0026#39;FR\u0026#39; set.wireless.wifi_device[1].country=\u0026#39;FR\u0026#39; set.wireless.wifi_iface[0].mode=\u0026#39;ap\u0026#39; set.wireless.wifi_iface[1].mode=\u0026#39;ap\u0026#39; set.wireless.wifi_iface[0].network=\u0026#39;lan\u0026#39; set.wireless.wifi_iface[1].network=\u0026#39;lan\u0026#39; set.wireless.wifi_iface[0].encryption=\u0026#39;sae-mixed\u0026#39; set.wireless.wifi_iface[1].encryption=\u0026#39;sae\u0026#39; set wireless.wifi_iface[0].ssid=\u0026#39;Votre_SSID\u0026#39; set.wireless.wifi_iface[1].ssid=\u0026#39;Votre_SSID\u0026#39; set wireless.wifi_iface[0].key=\u0026#39;Votre_Passphrase\u0026#39; set.wireless.wifi_iface[1].key=\u0026#39;Votre_Passphrase\u0026#39; set dhcp.lan.ignore=\u0026#39;1\u0026#39; set dhcp.lan.dhcpv4=\u0026#39;disabled\u0026#39; set dhcp.lan.dhcpv6=\u0026#39;disabled\u0026#39; set dhcp.lan.ndp=\u0026#39;disabled\u0026#39; set dhcp.lan.ra=\u0026#39;disabled\u0026#39; set network.@device[0].ports=\u0026#39;lan2\u0026#39; \u0026#39;lan3\u0026#39; \u0026#39;lan4\u0026#39; \u0026#39;wan\u0026#39; set network.wan.disabled=\u0026#39;1\u0026#39; set network.wan6.disabled=\u0026#39;1\u0026#39; EOF uci commit Remerciement Je tiens à remercier @salim/jdh.net pour ses judicieuses remarques à-propos d\u0026rsquo;uci !\nDocumentation Le guide actuel, en anglais, se trouve sur : https://openwrt.org/docs/guide-user/network/wifi/wifiextenders/bridgedap ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTransformer son routeur sous OpenWRT en point d\u0026rsquo;accès (répéteur) est assez simple\nen soit ; cela va impacter principalement trois des fichiers du système :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/network/network_configuration\" rel=\"external\"\u003e/etc/config/network\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/base-system/dhcp\" rel=\"external\"\u003e/etc/config/dhcp\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/network/wifi/basic\" rel=\"external\"\u003e/etc/config/wireless\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eIl est important de partir sur une base d\u0026rsquo;OpenWRT fraîchement installée, voire\nde réinitialiser les \n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/factory-reset/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Factory Reset'\"\u003eparamètres en mode usine\u003c/a\u003e\n\npar défaut.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLa première chose à faire est de \u003cstrong\u003econnecter physiquement par cable réseau le\nrouteur qui sera répéteur wifi au routeur principal\u003c/strong\u003e, puis ensuite de modifier\nla configuration du répéteur wifi. Ainsi, c\u0026rsquo;est le serveur DHCP du routeur principal\nqui enverra les paquets nécessaires pour permettre la connexion réseau wifi par\nle biais du point d\u0026rsquo;accès.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVérifiez absolument que le câble réseau qui vient du routeur principal ne soit\nconnecté QUE sur un des ports LAN de votre répéteur, et non pas sur le port WAN.\nPar défaut, si c\u0026rsquo;était le cas, la future configuration ne serait pas fonctionnelle !\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eComme bien souvent, sous OpenWRT, il est possible de le faire de manières différentes,\nen éditant en mode CLI les fichiers concernés, ou de passer par l\u0026rsquo;interface LUCI.\u003c/p\u003e\n\u003cp\u003eCet article se focalise sur la manière CLI.\u003c/p\u003e\n\u003ch3 id=\"cli\"\u003eCLI\u003c/h3\u003e\n\u003ch4 id=\"network\"\u003enetwork\u003c/h4\u003e\n\u003cp\u003eEditez en premier le fichier \u003ccode\u003e/etc/config/network\u003c/code\u003e pour que la configuration de\nl\u0026rsquo;interface \u003ccode\u003elan\u003c/code\u003e soit le futur point d\u0026rsquo;accès dans votre réseau actuel, tel que\npour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig interface \u0026#39;lan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption device \u0026#39;br-lan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption proto \u0026#39;static\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ipaddr \u0026#39;192.168.1.3\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption netmask \u0026#39;255.255.255.0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#    option ip6assign \u0026#39;60\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption gateway \u0026#39;192.168.1.1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elist dns \u0026#39;192.168.1.1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eLa commande \u003ccode\u003euci\u003c/code\u003e nous permet de la modifier directement :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci batch \u0026lt;\u0026lt; EOF\n    set network.lan.dns=\u0026#39;192.168.1.1\u0026#39;\n    set network.lan.ipaddr=\u0026#39;192.168.1.3\u0026#39;\n    set network.lan.netmask=\u0026#39;255.255.255.0\u0026#39;\n    set network.lan.gateway=\u0026#39;192.168.1.1\u0026#39;\n    set network.lan.proto=\u0026#39;static\u0026#39;\nEOF\nuci commit\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"wireless\"\u003ewireless\u003c/h4\u003e\n\u003cp\u003eMaintenant il faut éditer le fichier \u003ccode\u003e/etc/config/wireless\u003c/code\u003e la ou les sections\n\u003ccode\u003ewifi-device\u003c/code\u003e et \u003ccode\u003ewifi-iface\u003c/code\u003e pour changer les paramètres SSID, type de chiffrement,\npassphrase nécessaire, le code pays, puis pour finir par activer le module radio.\u003c/p\u003e\n\u003cp\u003eVoici pour l\u0026rsquo;exemple sur un routeur Xiaomi AX3000T, qui comporte deux modules\nradio :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cat /etc/config/wireless\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig wifi-device \u0026#39;radio0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption type \u0026#39;mac80211\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption path \u0026#39;platform/soc/18000000.wifi\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption channel \u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption band \u0026#39;2g\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption htmode \u0026#39;HT20\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption country \u0026#39;FR\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption cell_density \u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig wifi-device \u0026#39;radio1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption type \u0026#39;mac80211\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption path \u0026#39;platform/soc/18000000.wifi+1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption channel \u0026#39;36\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption band \u0026#39;5g\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption htmode \u0026#39;HE80\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption country \u0026#39;FR\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption cell_density \u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig wifi-iface \u0026#39;wifinet0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption device \u0026#39;radio0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption mode \u0026#39;ap\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ssid \u0026#39;***\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption encryption \u0026#39;sae-mixed\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption dtim_period \u0026#39;3\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption key \u0026#39;***\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   option ieee80211r \u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   option mobility_domain \u0026#39;4772\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ft_over_ds \u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption network \u0026#39;lan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig wifi-iface \u0026#39;wifinet1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption device \u0026#39;radio1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption mode \u0026#39;ap\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ssid \u0026#39;***\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption encryption \u0026#39;sae\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption dtim_period \u0026#39;3\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption key \u0026#39;***\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   option ieee80211r \u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   option mobility_domain \u0026#39;4772\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ft_over_ds \u0026#39;0\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption wpa_disable_eapol_key_retries \u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption network \u0026#39;lan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eRemarquez dans les deux sections \u003ccode\u003ewifi-device\u003c/code\u003e l\u0026rsquo;option de pays paramétrée pour\nla france : \u003ccode\u003eoption country 'FR'\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes deux sections \u003ccode\u003ewifi-iface\u003c/code\u003e concernant chacun des deux modules radio sont\nbien paramétrées en \u003ccode\u003eoption mode 'ap'\u003c/code\u003e et cible bien le réseau lan :\n\u003ccode\u003eoption network 'lan'\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eModifiez les \u003ccode\u003eoption ssid\u003c/code\u003e, \u003ccode\u003eoption encryption\u003c/code\u003e et \u003ccode\u003eoption key\u003c/code\u003e selon les\nidentifiants wifi du routeur Wifi principal, ainsi que l\u0026rsquo;algorythme de\nchiffrement utilisé et la clé paramétrée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIci dans l\u0026rsquo;exemple, la section \u003ccode\u003ewifi-iface\u003c/code\u003e du module \u003ccode\u003eradio0\u003c/code\u003e est configurée\npour utiliser le chiffrement \u003cstrong\u003eWPA2/WPA3 PSK, SAE (CCMP)\u003c/strong\u003e, soit\n\u003ccode\u003eoption encryption 'sae-mixed'\u003c/code\u003e, ce qui permet à des appareils un peu plus\nvieux ou nécessitant absolument l\u0026rsquo;usage de la bande 2G, tout en gardant un\nchiffrement WPA2 assez sécurisé, et en permettant que les périphériques wifi\ncapables de se connecter en WPA3 choisiront ce chiffrement offert par défaut,\nalors que celle du module \u003ccode\u003eradio1\u003c/code\u003e est configurée pour n\u0026rsquo;utiliser que le\nchiffrement WPA3.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eIl est intéressant de configurer, si votre routeur a des modules radio 2G et 5G,\nd\u0026rsquo;utiliser les mêmes SSID et protocoles de chiffrement, cela permet au périphérique\nclient de choisir automatiquement quel est le meilleur protocole pour lui.\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eLa commande \u003ccode\u003euci\u003c/code\u003e permet de modifier juste le nécessaire :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci batch \u0026lt;\u0026lt; EOF\n    set.wireless.wifi_device[0].country=\u0026#39;FR\u0026#39;\n    set.wireless.wifi_device[1].country=\u0026#39;FR\u0026#39;\n\n    set.wireless.wifi_iface[0].mode=\u0026#39;ap\u0026#39;\n    set.wireless.wifi_iface[1].mode=\u0026#39;ap\u0026#39;\n\n    set.wireless.wifi_iface[0].network=\u0026#39;lan\u0026#39;\n    set.wireless.wifi_iface[1].network=\u0026#39;lan\u0026#39;\n\n    set.wireless.wifi_iface[0].encryption=\u0026#39;sae-mixed\u0026#39;\n    set.wireless.wifi_iface[1].encryption=\u0026#39;sae\u0026#39;\n\n    set wireless.wifi_iface[0].ssid=\u0026#39;Votre_SSID\u0026#39;\n    set.wireless.wifi_iface[1].ssid=\u0026#39;Votre_SSID\u0026#39;\n\n    set wireless.wifi_iface[0].key=\u0026#39;Votre_Passphrase\u0026#39;\n    set.wireless.wifi_iface[1].key=\u0026#39;Votre_Passphrase\u0026#39;\nEOF\nuci commit\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"dhcp\"\u003eDHCP\u003c/h4\u003e\n\u003cp\u003eIl est critique de \u003cstrong\u003edésactiver l\u0026rsquo;utilisation du serveur DHCP interne\u003c/strong\u003e au point\nd\u0026rsquo;accès, pour deux raisons :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003es\u0026rsquo;assurer que seul le serveur DHCP du routeur principal envoie les trames\nnécessaires\u003c/strong\u003e à la connexion des périphériques wifi\u003c/li\u003e\n\u003cli\u003elors des mises-à-jours du point d\u0026rsquo;accès, le serveur DHCP du point d\u0026rsquo;accès va\nêtre réactivé !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003col\u003e\n\u003cli\u003eDésactivez le serveur DHCP du point d\u0026rsquo;accès se fait, par le biais de LUCI, en\ncliquant sur le menu \u003cstrong\u003eSystem\u003c/strong\u003e \u0026gt; \u003cstrong\u003eStartup\u003c/strong\u003e puis de cliquer sur le bouton [ Enable ]\nrelatif à \u003cstrong\u003ednsmaq\u003c/strong\u003e \u003cem\u003e(normalement en ligne 19)\u003c/em\u003e pour le désactiver puis\nappuyer sur le bouton [ Stop ].\u003c/li\u003e\n\u003cli\u003eModifiez le fichier \u003ccode\u003e/etc/config/dhcp\u003c/code\u003e pour ajouter l\u0026rsquo;option suivante \u003ccode\u003eoption ignore '1'\u003c/code\u003e\ndans la section \u003ccode\u003econfig dhcp 'lan'\u003c/code\u003e ; supprimez aussi toutes les options\nrelatives à IPv6 !\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig dhcp \u0026#39;lan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption interface \u0026#39;lan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption start \u0026#39;100\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption limit \u0026#39;150\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption leasetime \u0026#39;12h\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ignore \u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption dhcpv4 \u0026#39;disabled\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption dhcpv6 \u0026#39;disabled\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ndp \u0026#39;disabled\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption ra \u0026#39;disabled\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;utilisation de l\u0026rsquo;option \u003ccode\u003eignore\u003c/code\u003e activée est le seul moyen actuel de permettre\nà ce que le routeur répéteur n\u0026rsquo;utilise absolument que les paquets envoyés par le\nserveur DHCP du routeur principal, même si son propre serveur DHCP est actif\n\u003cem\u003e(ce qui sera malheureusement le cas lors des mises-à-jours d\u0026rsquo;OpenWRT)\u003c/em\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;utilisation de la commande \u003ccode\u003euci\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci batch \u0026lt;\u0026lt; EOF\n    set dhcp.lan.ignore=\u0026#39;1\u0026#39;\nEOF\nuci commit\n\n# Attention à bien assimiler qu\u0026#39;au prochain `sysupgrade`, le service sera à nouveau activé :\nservice dnsmasq stop\nservice dnsmasq disable\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003eMaintenant que ces différentes configurations ont été faites, le plus simple\nreste de démarrer le répéteur et de profitez de l\u0026rsquo;usage du wifi.\u003c/p\u003e\n\u003ch4 id=\"wan--lan\"\u003eWAN → LAN\u003c/h4\u003e\n\u003cp\u003eTransformer le port WAN en port LAN est possible.\u003c/p\u003e\n\u003cp\u003ePar défaut, les ports WAN et WAN6 sont configurés dans OpenWRT ; il faut donc\nsupprimer les configurations relatives dans le fichier \u003ccode\u003e/etc/config/network\u003c/code\u003e\npuis ajouter l\u0026rsquo;interface \u003ccode\u003ewan\u003c/code\u003e au pont \u003ccode\u003ebr-lan\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig device\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption name \u0026#39;br-lan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption type \u0026#39;bridge\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elist ports \u0026#39;lan1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elist ports \u0026#39;lan2\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elist ports \u0026#39;lan3\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elist ports \u0026#39;lan4\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elist ports \u0026#39;wan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt supprimez dans le même fichier les informations relatives à WAN / WAN6 :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig interface \u0026#39;wan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption device \u0026#39;wan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption proto \u0026#39;dhcp\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econfig interface \u0026#39;wan6\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption device \u0026#39;wan\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoption proto \u0026#39;dhcpv6\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eParfois certains matériels sont capricieux avec l\u0026rsquo;utilisation de WAN en tant que\nLAN. Dans certaines circonstances, les performances réseaux peuvent diminuer lors\ndu transfert entre l\u0026rsquo;interface LAN et WAN, voire s\u0026rsquo;effondrer. C\u0026rsquo;est souvent le\ncas pour les routeurs logiciellement optimisés pour le routage.\u003c/p\u003e\n\u003cp\u003eSi malheureusement, une telle baisse de performance s\u0026rsquo;illustre dans votre cas,\nle seul reméde est de garder l\u0026rsquo;interface WAN hors du pont et séparée !\nDans ce cas, il faut restaurer le fichier \u003ccode\u003enertwork\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003ePar le biais d\u0026rsquo;\u003ccode\u003euci\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci batch \u0026lt;\u0026lt; EOF\n    set network.@device[0].ports=\u0026#39;lan2\u0026#39; \u0026#39;lan3\u0026#39; \u0026#39;lan4\u0026#39; \u0026#39;wan\u0026#39;\n    set network.wan.disabled=\u0026#39;1\u0026#39;\n    set network.wan6.disabled=\u0026#39;1\u0026#39;\nEOF\nuci commit\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"tldr\"\u003eTL;DR\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eÀ vous de modifier selon votre matériel\u003c/strong\u003e, le résumé ci-dessous - \u003cem\u003epour mieux\ncomprendre de quoi il s\u0026rsquo;agit, soit vous lisez l\u0026rsquo;ensemble de l\u0026rsquo;article, soit\nvous allez sur le documentation officielle\u003c/em\u003e !\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci batch \u0026lt;\u0026lt; EOF\n    set network.lan.dns=\u0026#39;192.168.1.1\u0026#39;\n    set network.lan.ipaddr=\u0026#39;192.168.1.3\u0026#39;\n    set network.lan.netmask=\u0026#39;255.255.255.0\u0026#39;\n    set network.lan.gateway=\u0026#39;192.168.1.1\u0026#39;\n    set network.lan.proto=\u0026#39;static\u0026#39;\n\n    set.wireless.wifi_device[0].country=\u0026#39;FR\u0026#39;\n    set.wireless.wifi_device[1].country=\u0026#39;FR\u0026#39;\n\n    set.wireless.wifi_iface[0].mode=\u0026#39;ap\u0026#39;\n    set.wireless.wifi_iface[1].mode=\u0026#39;ap\u0026#39;\n\n    set.wireless.wifi_iface[0].network=\u0026#39;lan\u0026#39;\n    set.wireless.wifi_iface[1].network=\u0026#39;lan\u0026#39;\n\n    set.wireless.wifi_iface[0].encryption=\u0026#39;sae-mixed\u0026#39;\n    set.wireless.wifi_iface[1].encryption=\u0026#39;sae\u0026#39;\n\n    set wireless.wifi_iface[0].ssid=\u0026#39;Votre_SSID\u0026#39;\n    set.wireless.wifi_iface[1].ssid=\u0026#39;Votre_SSID\u0026#39;\n\n    set wireless.wifi_iface[0].key=\u0026#39;Votre_Passphrase\u0026#39;\n    set.wireless.wifi_iface[1].key=\u0026#39;Votre_Passphrase\u0026#39;\n\n    set dhcp.lan.ignore=\u0026#39;1\u0026#39;\n    set dhcp.lan.dhcpv4=\u0026#39;disabled\u0026#39;\n    set dhcp.lan.dhcpv6=\u0026#39;disabled\u0026#39;\n    set dhcp.lan.ndp=\u0026#39;disabled\u0026#39;\n    set dhcp.lan.ra=\u0026#39;disabled\u0026#39;\n\n    set network.@device[0].ports=\u0026#39;lan2\u0026#39; \u0026#39;lan3\u0026#39; \u0026#39;lan4\u0026#39; \u0026#39;wan\u0026#39;\n    set network.wan.disabled=\u0026#39;1\u0026#39;\n    set network.wan6.disabled=\u0026#39;1\u0026#39;\nEOF\nuci commit\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"remerciement\"\u003eRemerciement\u003c/h2\u003e\n\u003cp\u003eJe tiens à remercier @salim/jdh.net pour ses judicieuses remarques à-propos d\u0026rsquo;\u003ccode\u003euci\u003c/code\u003e !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe guide actuel, en anglais, se trouve sur :\n\u003ca href=\"https://openwrt.org/docs/guide-user/network/wifi/wifiextenders/bridgedap\" rel=\"external\"\u003ehttps://openwrt.org/docs/guide-user/network/wifi/wifiextenders/bridgedap\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "OpenWRT : transformer facilement votre routeur en point d'accès Wifi (répéteur), appelé aussi 'Point d'accès passif', 'Dumb AP' (en anglais) .",
            "tags": ["OpenWRT", "Wifi", "répéteur", "point", "accès"],
            "date_published": "2025-09-23T16:45:37+02:00",
            "date_modified": "2025-11-20T14:51:28+01:00"
        },{
            "id": "urn:uuid:879215fd-735b-6de6-0e79-13f176543275",
            "url": "http://doc.huc.fr.eu.org/fr/post/openrgb/",
            "title": "OpenRGB : Gestion des matériels RGB",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Logo OpenRGB OpenRGB est LE projet Open Source de gestion de différents matériels RGB par différents fabriquants/vendeurs, complétement indépendants desdits fabriquants.\nIl permet de centraliser la gestion, soit par une interface graphique, soit en mode CLI.\nLe projet est multi-plateformes (Linux, MacOS, Windows), et multi-architectures (32 et 64 bits, x86 et ARM).\nDe même, il existe quelques plugins pour interagir selon différents profils d\u0026rsquo;événements systèmes.\nLicence : GNU/GPL v2 Site web : https://openrgb.org/ Installation Installons le binaire :\n⇒ Debian (et assimilés) : apt install openrgb\nL\u0026rsquo;interface graphique se situe normalement, depuis le menu Accessoires.\nSMBus Il est préférable d\u0026rsquo;installer en plus la gestion des accès du bus SMB, en installant le paquet i2c-tools : apt install i2c-tools.\nEnsuite, il faut charger les modules correspondants :\ni2c-dev : sudo modprobe i2c-dev Si AMD : sudo modprobe i2c-piix4 Si Intel : sudo modprobe i2c-i801 InfoCertaines carte-mères Gigabyte, Aorus ont un conflit ACPI avec leur controleur SMB ; il est recommandé d\u0026rsquo;ajouter le paramètre suivant acpi_enforce_resources=lax au kernel. Voir ci-dessous comment faire… Configuration Les fichiers de configuration s\u0026rsquo;enregistrent dans le répertoire personnel, généralement sous ~/.config/OpenRGB où se trouvent les plugins installés, ainsi que les logs.\nPériphériques Vos périphériques, s\u0026rsquo;ils sont supportés, seront affichés dans le premier menu bien nommé Périphériques.\nIl est possible d\u0026rsquo;activer ou non le support de périphériques dans l\u0026rsquo;onglet Périphériques supportés du menu Paramètres.\nRégionalisation ⇒ Menu Paramètres \u0026gt; onglets Paramètres généraux, la gestion de la langue est le premier choix possible.\nPlugins Les plugins sont des extensions du projet ; une fois téléchargés, il faut en premier les décompresser.\nLe plus simple est d\u0026rsquo;ouvrir l\u0026rsquo;onglet \u0026lsquo;Plugins\u0026rsquo; accessible depuis le menu Paramètres. puis de cliquer sur le bouton [ Installer un plugin ]. Ils seront enregistrés dans le répertoire personnel ~/.config/OpenRGB/plugins.\nIl semble qu\u0026rsquo;à chaque ajout est créé un nouveau menu afin de paramètrer le plugin correspondant.\nAccès SMBus automatique Pour charger les modules SMBus automatiquement au démarrage de votre machine, il faut créer un fichier /etc/modules-load.d/i2c.conf et y ajouter les noms des modules nécessaires, tel que, pour l\u0026rsquo;exemple :\n⇒ Exemple pour une carte-mère AMD :\ni2c-dev i2c-piix4 ⇒ Exemple pour une carte-mère Intel :\ni2c-dev i2c-i801 Ensuite, préférez redémarrer la machine.\nParamètre kernel Si et seulement si nécessaire, voici comment ajouter un paramètre au noyau pour qu\u0026rsquo;il soit actif au démarrage de la machine :\nAvec des droits administrateurs, éditez le fichier /etc/default/grub Se positionner sur la ligne GRUB_CMDLINE_LINUX_DEFAULT et ajouter le paramètre nécessaire à l\u0026rsquo;intérieur des doubles quotes \u0026quot;\u0026quot; (si nécessaire, ajouter un espace). Après avoir sauvegardé, exécuter la commande update-grub toujours avec les droits admin. Redémarrer la machine Documentation Liste des matériels + ou - supportés : https://openrgb.org/devices.html Liste des plugins : https://openrgb.org/plugins.html Gestion des accès : SMBus USB ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openrgb/OpenRGB.png\" title=\"Logo OpenRGB\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openrgb/OpenRGB_hu_54c7a592c89cae0d.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Logo OpenRGB\" height=\"106\" loading=\"lazy\" src=\"/images/openrgb/OpenRGB_hu_c451c8cba0e5dbdd.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eLogo OpenRGB\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003e\u003cstrong\u003eOpenRGB\u003c/strong\u003e est LE projet Open Source de gestion de différents matériels RGB par\ndifférents fabriquants/vendeurs, complétement indépendants desdits fabriquants.\u003c/p\u003e\n\u003cp\u003eIl permet de centraliser la gestion, soit par une interface graphique, soit en\nmode CLI.\u003c/p\u003e\n\u003cp\u003eLe projet est multi-plateformes \u003cem\u003e(Linux, MacOS, Windows)\u003c/em\u003e, et multi-architectures\n\u003cem\u003e(32 et 64 bits, x86 et ARM)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eDe même, il existe quelques plugins pour interagir selon différents profils\nd\u0026rsquo;événements systèmes.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLicence : GNU/GPL v2\u003c/li\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://openrgb.org/\" rel=\"external\"\u003ehttps://openrgb.org/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eInstallons le binaire :\u003c/p\u003e\n\u003cp\u003e⇒ Debian \u003cem\u003e(et assimilés)\u003c/em\u003e : \u003ccode\u003eapt install openrgb\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;interface graphique se situe normalement, depuis le menu \u003cstrong\u003eAccessoires\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"smbus\"\u003eSMBus\u003c/h3\u003e\n\u003cp\u003eIl est préférable d\u0026rsquo;installer en plus la gestion des accès du bus SMB, en installant\nle paquet \u003ccode\u003ei2c-tools\u003c/code\u003e : \u003ccode\u003eapt install i2c-tools\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEnsuite, il faut charger les modules correspondants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ei2c-dev\u003c/strong\u003e : \u003ccode\u003esudo modprobe i2c-dev\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSi AMD : \u003ccode\u003esudo modprobe i2c-piix4\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSi Intel : \u003ccode\u003esudo modprobe i2c-i801\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCertaines carte-mères Gigabyte, Aorus ont un conflit ACPI avec leur controleur\nSMB ; il est recommandé d\u0026rsquo;ajouter le paramètre suivant \u003ccode\u003eacpi_enforce_resources=lax\u003c/code\u003e\nau kernel. \u003cbr\u003e\n\u003cem\u003eVoir ci-dessous comment faire…\u003c/em\u003e\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLes fichiers de configuration s\u0026rsquo;enregistrent dans le répertoire personnel,\ngénéralement sous \u003ccode\u003e~/.config/OpenRGB\u003c/code\u003e où se trouvent les plugins installés,\nainsi que les logs.\u003c/p\u003e\n\u003ch3 id=\"périphériques\"\u003ePériphériques\u003c/h3\u003e\n\u003cp\u003eVos périphériques, s\u0026rsquo;ils sont supportés, seront affichés dans le premier menu\nbien nommé \u003cstrong\u003ePériphériques\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;activer ou non le support de périphériques dans l\u0026rsquo;onglet\n\u003cstrong\u003ePériphériques supportés\u003c/strong\u003e du menu \u003cstrong\u003eParamètres\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"régionalisation\"\u003eRégionalisation\u003c/h3\u003e\n\u003cp\u003e⇒ Menu \u003cstrong\u003eParamètres\u003c/strong\u003e \u0026gt; onglets \u003cstrong\u003eParamètres généraux\u003c/strong\u003e, la gestion de la langue\nest le premier choix possible.\u003c/p\u003e\n\u003ch3 id=\"plugins\"\u003ePlugins\u003c/h3\u003e\n\u003cp\u003eLes plugins sont des extensions du projet ; une fois téléchargés, il faut en\npremier les décompresser.\u003c/p\u003e\n\u003cp\u003eLe plus simple est d\u0026rsquo;ouvrir l\u0026rsquo;onglet \u0026lsquo;Plugins\u0026rsquo; accessible depuis le menu \u003cstrong\u003eParamètres\u003c/strong\u003e.\npuis de cliquer sur le bouton [ Installer un plugin ]. \u003cbr\u003e\nIls seront enregistrés dans le répertoire personnel \u003ccode\u003e~/.config/OpenRGB/plugins\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl semble qu\u0026rsquo;à chaque ajout est créé un nouveau menu afin de paramètrer le plugin\ncorrespondant.\u003c/p\u003e\n\u003ch3 id=\"accès-smbus-automatique\"\u003eAccès SMBus automatique\u003c/h3\u003e\n\u003cp\u003ePour charger les modules SMBus automatiquement au démarrage de votre machine,\nil faut créer un fichier \u003ccode\u003e/etc/modules-load.d/i2c.conf\u003c/code\u003e et y ajouter les noms\ndes modules nécessaires, tel que, pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cp\u003e⇒ Exemple pour une carte-mère AMD :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ei2c-dev\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ei2c-piix4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Exemple pour une carte-mère Intel :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ei2c-dev\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ei2c-i801\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, préférez redémarrer la machine.\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"paramètre-kernel\"\u003eParamètre kernel\u003c/h4\u003e\n\u003cp\u003eSi et seulement si nécessaire, voici comment ajouter un paramètre au noyau pour\nqu\u0026rsquo;il soit actif au démarrage de la machine :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAvec des droits administrateurs, éditez le fichier \u003ccode\u003e/etc/default/grub\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSe positionner sur la ligne \u003cstrong\u003eGRUB_CMDLINE_LINUX_DEFAULT\u003c/strong\u003e et ajouter le paramètre\nnécessaire à l\u0026rsquo;intérieur des doubles quotes \u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e \u003cem\u003e(si nécessaire, ajouter\nun espace)\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eAprès avoir sauvegardé, exécuter la commande \u003ccode\u003eupdate-grub\u003c/code\u003e \u003cem\u003etoujours avec les\ndroits admin\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eRedémarrer la machine\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eListe des matériels + ou - supportés : \u003ca href=\"https://openrgb.org/devices.html\" rel=\"external\"\u003ehttps://openrgb.org/devices.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eListe des plugins : \u003ca href=\"https://openrgb.org/plugins.html\" rel=\"external\"\u003ehttps://openrgb.org/plugins.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eGestion des accès :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gitlab.com/CalcProgrammer1/OpenRGB/-/blob/master/Documentation/SMBusAccess.md\" rel=\"external\"\u003eSMBus\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gitlab.com/CalcProgrammer1/OpenRGB/-/blob/master/Documentation/USBAccess.md\" rel=\"external\"\u003eUSB\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Découverte du Projet Open Source OpenRGB de gestion des matériels RGB.",
            "tags": ["RGB"],
            "date_published": "2025-08-31T14:49:50+02:00",
            "date_modified": "2025-08-31T16:29:58+02:00"
        },{
            "id": "urn:uuid:3bbb7ad7-e17d-f148-b75b-200bcd79ea63",
            "url": "http://doc.huc.fr.eu.org/fr/sys/debian/gnome-fr/",
            "title": "Debian : Gnome en français, svp !",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Avoir sa session utilisateur Gnome Shell en français semble être le parcours du combattant !\nMalheureusement, en 2025, il ne suffit toujours pas de configurer dans les paramètres systèmes, le format et la langue en Français (France) (dans mon cas) pour que la session utilisateur soit régionalisée en français ! L\u0026rsquo;interface reste en anglais.\nSincèrement, c\u0026rsquo;est abérrant :(\n$ locale LANG=fr_FR.UTF-8 LANGUAGE=fr_FR LC_CTYPE=\u0026#34;C\u0026#34; LC_NUMERIC=\u0026#34;C\u0026#34; LC_TIME=\u0026#34;C\u0026#34; LC_COLLATE=\u0026#34;C\u0026#34; LC_MONETARY=\u0026#34;C\u0026#34; LC_MESSAGES=\u0026#34;C\u0026#34; LC_PAPER=\u0026#34;C\u0026#34; LC_NAME=\u0026#34;C\u0026#34; LC_ADDRESS=\u0026#34;C\u0026#34; LC_TELEPHONE=\u0026#34;C\u0026#34; LC_MEASUREMENT=\u0026#34;C\u0026#34; LC_IDENTIFICATION=\u0026#34;C\u0026#34; LC_ALL=C Configuration Pour rappel, voici la signification des variables d\u0026rsquo;environnements liés à la gestion locale de la langue :\nLANG détermine la langue locale par défaut en absence de toute autre définition de variables d\u0026rsquo;environnements LANGUAGE traduit les messages dans la langue locale désirée LC_ADDRESS est une convention pour le formatage d\u0026rsquo;adresses postales LC_ALL surcharge toutes les variables d\u0026rsquo;environnements locales, à l\u0026rsquo;exception de LANGUAGE. LC_COLLATE définit l\u0026rsquo;ordre de classement selon la langue désirée LC_CTYPE classifie la gestion des caractères et la conversion de la casse de police, selon la langue locale désirée LC_MONETARY formate les informations monétaires LC_MEASUREMENT définit le système de mesure par défaut utilisé dans la région concernée LC_MESSAGES formate les messages et les réponses systèmes selon la langue concernée LC_NUMERIC formate l\u0026rsquo;affichage numérique LC_PAPER modifie le taille d\u0026rsquo;(une feuille de) papier selon la région utilisée LC_RESPONSE détermine comment les réponses (par exemple, Oui, Non) apparaissent à l\u0026rsquo;écran LC_TELEPHONE est utilisée pour la représentation des numéros de téléphone LC_TIME formate le temps et les dates, ainsi que le comportement par défaut du premier jour de semaine dans les calendriers. dpkg-reconfigure locales L\u0026rsquo;utilisation de la langue locale peut être normalement changée, en tant qu\u0026rsquo;administrateur système, par le biais de la commande dpkg-reconfigure locales qui permet de sélectionner celles désirées, ainsi que celle par défaut.\nSSH Concernant les utilisateurs systèmes par SSH, il semble recommandé de choisir aucune langue par défaut.\n.dmrc Vérifiez dans le fichier personnel .dmrc que la variable d\u0026rsquo;environnement Language corresponde bien au français, tel que :\n[Desktop] Session=gnome Language=fr_FR.UTF-8 Ce paramétrage influt sur l\u0026rsquo;écran de démarrage GDM, seulement, et peut normalement être modifié depuis l\u0026rsquo;écran GDM, en bas à droite de celui-ci.\nenvironment Depuis Debian Lenny, il semble recommandé de commenter la variable LANG du fichier /etc/environment si elle avait été précédemment paramétrée.\nlocale-gen Vérifiez le fichier /etc/locale-gen !\nSi vous effectuez un changement en commentant ou décommentant une langue, exécutez avec des droits administrateurs la commande locale-gen.\n.profile Une astuce est de paramètrer, dans le fichier personnel .profile, la variable d\u0026rsquo;environnement LANG tel que :\nexport LANG=fr_FR.UTF-8 Fin Si les nouveaux paramétrages n\u0026rsquo;ont été fait qu\u0026rsquo;en session utilisateur, sortir de la session pour la redémarrer…\nSi l\u0026rsquo;usage des droits administrateurs a été nécessaire, redémarrez la machine.\nRemerciements Astuce .profile : https://tssr.eklablog.fr/mettre-gnome-en-francais-a215686845 ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eAvoir sa session utilisateur Gnome Shell en français semble être le parcours du\ncombattant !\u003c/p\u003e\n\u003cp\u003eMalheureusement, en 2025, il ne suffit toujours pas de configurer dans les paramètres\nsystèmes, le format et la langue en \u003ccode\u003eFrançais (France)\u003c/code\u003e (dans mon cas) pour que\nla session utilisateur soit régionalisée en français ! \u003cbr\u003e\nL\u0026rsquo;interface reste en anglais.\u003c/p\u003e\n\u003cp\u003eSincèrement, c\u0026rsquo;est abérrant :(\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ locale\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLANG\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003efr_FR.UTF-8\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLANGUAGE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003efr_FR\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_CTYPE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_NUMERIC\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_TIME\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_COLLATE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_MONETARY\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_MESSAGES\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_PAPER\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_NAME\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_ADDRESS\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_TELEPHONE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_MEASUREMENT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_IDENTIFICATION\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLC_ALL\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eC\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePour rappel, voici la signification des variables d\u0026rsquo;environnements liés à la\ngestion locale de la langue :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eLANG\u003c/code\u003e détermine la langue locale par défaut en absence de toute autre définition\nde variables d\u0026rsquo;environnements\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLANGUAGE\u003c/code\u003e traduit les messages dans la langue locale désirée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_ADDRESS\u003c/code\u003e est une convention pour le formatage d\u0026rsquo;adresses postales\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_ALL\u003c/code\u003e surcharge toutes les variables d\u0026rsquo;environnements locales, à l\u0026rsquo;exception\nde \u003ccode\u003eLANGUAGE\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_COLLATE\u003c/code\u003e définit l\u0026rsquo;ordre de classement selon la langue désirée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_CTYPE\u003c/code\u003e classifie la gestion des caractères et la conversion de la casse\nde police, selon la langue locale désirée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_MONETARY\u003c/code\u003e formate les informations monétaires\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_MEASUREMENT\u003c/code\u003e définit le système de mesure par défaut utilisé dans la région\nconcernée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_MESSAGES\u003c/code\u003e formate les messages et les réponses systèmes selon la langue\nconcernée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_NUMERIC\u003c/code\u003e formate l\u0026rsquo;affichage numérique\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_PAPER\u003c/code\u003e modifie le taille d\u0026rsquo;(une feuille de) papier selon la région utilisée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_RESPONSE\u003c/code\u003e détermine comment les réponses (par exemple, \u003ccode\u003eOui\u003c/code\u003e, \u003ccode\u003eNon\u003c/code\u003e) apparaissent\nà l\u0026rsquo;écran\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_TELEPHONE\u003c/code\u003e est utilisée pour la représentation des numéros de téléphone\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLC_TIME\u003c/code\u003e formate le temps et les dates, ainsi que le comportement par défaut\ndu premier jour de semaine dans les calendriers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"dpkg-reconfigure-locales\"\u003edpkg-reconfigure locales\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;utilisation de la langue locale peut être normalement changée, en tant qu\u0026rsquo;administrateur\nsystème, par le biais de la commande \u003ccode\u003edpkg-reconfigure locales\u003c/code\u003e qui permet de\nsélectionner celles désirées, ainsi que celle par défaut.\u003c/p\u003e\n\u003ch4 id=\"ssh\"\u003eSSH\u003c/h4\u003e\n\u003cp\u003eConcernant les utilisateurs systèmes par SSH, il semble recommandé de choisir\naucune langue par défaut.\u003c/p\u003e\n\u003ch3 id=\"dmrc\"\u003e.dmrc\u003c/h3\u003e\n\u003cp\u003eVérifiez dans le fichier personnel \u003ccode\u003e.dmrc\u003c/code\u003e que la variable d\u0026rsquo;environnement\n\u003ccode\u003eLanguage\u003c/code\u003e corresponde bien au français, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[Desktop]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSession\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003egnome\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLanguage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003efr_FR.UTF-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe paramétrage influt sur l\u0026rsquo;écran de démarrage GDM, seulement, et peut normalement\nêtre modifié depuis l\u0026rsquo;écran GDM, en bas à droite de celui-ci.\u003c/p\u003e\n\u003ch3 id=\"environment\"\u003eenvironment\u003c/h3\u003e\n\u003cp\u003eDepuis Debian Lenny, il semble recommandé de commenter la variable \u003ccode\u003eLANG\u003c/code\u003e du\nfichier \u003ccode\u003e/etc/environment\u003c/code\u003e si elle avait été précédemment paramétrée.\u003c/p\u003e\n\u003ch3 id=\"locale-gen\"\u003elocale-gen\u003c/h3\u003e\n\u003cp\u003eVérifiez le fichier \u003ccode\u003e/etc/locale-gen\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eSi vous effectuez un changement en commentant ou décommentant une langue, exécutez\navec des droits administrateurs la commande \u003ccode\u003elocale-gen\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"profile\"\u003e.profile\u003c/h3\u003e\n\u003cp\u003eUne astuce est de paramètrer, dans le fichier personnel \u003ccode\u003e.profile\u003c/code\u003e, la variable\nd\u0026rsquo;environnement \u003ccode\u003eLANG\u003c/code\u003e tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport LANG\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003efr_FR.UTF-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"fin\"\u003eFin\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSi les nouveaux paramétrages n\u0026rsquo;ont été fait qu\u0026rsquo;en session utilisateur, sortir\nde la session pour la redémarrer…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi l\u0026rsquo;usage des droits administrateurs a été nécessaire, redémarrez la machine.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAstuce \u003ccode\u003e.profile\u003c/code\u003e : \u003ca href=\"https://tssr.eklablog.fr/mettre-gnome-en-francais-a215686845\" rel=\"external\"\u003ehttps://tssr.eklablog.fr/mettre-gnome-en-francais-a215686845\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Avoir une session utilisateur en français avec Gnome Shell sous Debian.",
            "tags": ["Debian", "Gnome", "FR"],
            "date_published": "2025-08-05T12:14:59+02:00",
            "date_modified": "2025-08-07T17:50:42+02:00"
        },{
            "id": "urn:uuid:8805fe1d-f748-b956-cc20-7c4a467b9fc6",
            "url": "http://doc.huc.fr.eu.org/fr/sys/debian/qemu-bridge-network/",
            "title": "Debian : Pont réseau pour QEMU",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Comment créer un pont réseau logiciel sous Debian, pour faciliter les communications réseaux avec les machines virtuelles, gérées par QEMU.\nLa machine hôte et la|les VM invitées sont sur le même segment réseau.\nAttentionLes interfaces réseaux Ethernet de type Wifi ne peuvent pas être utilisées pour créer un pont réseau logiciel ; il faut impérativement utiliser un périphérique réseau Ethernet filaire. Installation Le premier point est d\u0026rsquo;installer les outils nécessaires au pont réseau logiciel :\n$: sudo apt install bridge-utils Configuration Cet article propose la configuration soit en mode CLI, soit par le biais de l\u0026rsquo;interface graphique de Network Manager.\nChoisissez l\u0026rsquo;un ou l\u0026rsquo;autre, pas les deux !\nCLI Pour le principe, voici comment configurer le pont en mode CLI :\nPour connaître le nom de votre interface réseau Ethernet filaire : $: ip a 1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever 2: enp0s31f6: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 inet 192.168.***.***/24 brd 192.168.***.255 scope global enp0s31f6 valid_lft forever preferred_lft forever Dans mon cas, l\u0026rsquo;interface filaire 2 en question se nomme enp0s31f6… adaptez à votre cas !\nCréation du pont : $: sudo brctl addbr br0 ajout de l\u0026rsquo;interface réseau : $: sudo brctl addif br0 enp0s31f6 configurez le pont dans un fichier dédié, nommé pour l\u0026rsquo;exemple, /etc/network/interfaces.d/br0 : ## DHCP ip config file for br0 ## auto br0 # Bridge setup iface br0 inet dhcp bridge_ports enp0s31f6 Si vous préférez avoir une adresse IP statique sur le même segment réseau que votre machine hôte, adaptez en utilisant static au lieu de dhcp et en modifiant selon votre besoin.\nVérifiez quand même que la configuration par défaut des interfaces réseaux : $: cat /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback Si ce n\u0026rsquo;est pas le cas, adaptez ! (cela signifie que vous avez déjà modifié votre fichier)\nVotre pont logiciel br0 est créé et devrait être fonctionnel.\nNetwork Manager GUI Ce qui suit configure le pont réseau depuis l\u0026rsquo;interface graphique de Network Manager.\nL\u0026rsquo;interface graphique de Network Manager est utilisable depuis l\u0026rsquo;applet réseau de votre bureau, soit en ligne de commande grâce à :\n$: sudo nm-connection-editor Cliquez sur le bouton [ + ] pour ajouter une nouvelle connection Sélectionnez dans la catégorie Virtuel, le choix Pont Network Manager : ajout d’un pont Nommez la connexion, telle que br0, ainsi que l\u0026rsquo;interface dans l\u0026rsquo;onglet \u0026lsquo;Pont\u0026rsquo; (ouvert par défaut) Network Manager : nommer nouvelle connection Cliquez sur le bouton [ Ajouter ] pour ajouter un nouveau type de connexion Laissez le choix par défaut Ethernet puis cliquez sur le bouton [ Créer… ] Dans l\u0026rsquo;onglet \u0026lsquo;Ethernet\u0026rsquo; (ouvert par défaut), à \u0026lsquo;Périphérique\u0026rsquo;, choisissez le périphérique réseau de type Ethernet avec lequel vous souhaitez fonctionner Cliquez sur le bouton [ Enregistrer ] Network Manager : ajout d’une connection Ethernet Vérifiez dans les onglets \u0026lsquo;Paramètres IPv4\u0026rsquo; et \u0026lsquo;Paramètres IPv6\u0026rsquo;, que les méthodes soient de types Automatique - bien sûr ceci est valable si sur votre réseau, vous avez un serveur DHCP ; autrement en choisissant selon votre cas, par exemple si vous préférez un adresse IP statique, en paramétrant sur \u0026lsquo;Manuel\u0026rsquo;, etc… Une fois terminé, clique sur le bouton [ Enregistrer ] Network Manager : ajout d’un pont Votre pont réseau logiciel est créé !\nQEMU Hormis le fait d\u0026rsquo;installer QEMU sur votre machine hôte, il est nécessaire d\u0026rsquo;installer les bibliothèques libvirt ; celles-ci s\u0026rsquo;installent en dépendance du paquet virt-manager.\n$: sudo apt install libosinfo-bin qemu-system virt-manager Si vous voulez gérer virt-manager avec vos droits utilisateurs, il faut ajouter votre identifiant aux groupes libvirt et libvirt-qemu.\nvirt-manager Lors de la création de votre machine virtuelle, dans les détails de l\u0026rsquo;interface réseau, il faut paramètrer selon votre propre pont réseau, tel que pour reprendre le propos d\u0026rsquo;un pont nommé \u0026lsquo;br0\u0026rsquo; :\nSource du réseau : bridge device… Device name : br0 Modèle du périphérique : soit virtio, soit e1000e (de dernier émule un périphérique de marque Intel de qualité réseau indéniable) État du lien : veillez à ce que la case à cocher [ ] actif, le soit. Pour l\u0026rsquo;exemple : virt-manager : exemple d’interface réseau paramétrée sur le pont ‘br0’ L\u0026rsquo;édition de votre machine virtuelle peut se faire en mode CLI, aussi, en appelant l\u0026rsquo;outil virsh, tel que pour l\u0026rsquo;exemple :\n$: virsh --connect qemu:///system edit nom-votre-vm ce qui vous donnera accès à son fichier XML où vous pourrez entre autre modifier la section interface, tel que :\n(…) \u0026lt;interface type=\u0026#39;bridge\u0026#39;\u0026gt; \u0026lt;mac address=\u0026#39;00:00:00:ad:a1:9f\u0026#39;/\u0026gt; \u0026lt;source bridge=\u0026#39;br0\u0026#39;/\u0026gt; \u0026lt;model type=\u0026#39;e1000e\u0026#39;/\u0026gt; \u0026lt;address type=\u0026#39;pci\u0026#39; domain=\u0026#39;0x0000\u0026#39; bus=\u0026#39;0x01\u0026#39; slot=\u0026#39;0x00\u0026#39; function=\u0026#39;0x0\u0026#39;/\u0026gt; \u0026lt;/interface\u0026gt; (…) virt-install Si jamais vous créez votre VM avec l\u0026rsquo;outil virt-install, utilisez le paramètre network pour spécifier l\u0026rsquo;utilisation du pont br0, tel que pour l\u0026rsquo;exemple :\n$: vir-install … --network bridge=br0,model.type=e1000,type=bridge … Vérifications AstucePensez à redémarrer soit la machine hôte, soit à redémarrer la couche réseau\n$: sudo systemctl restart NetworkManager ⇒ Vérifions avec l\u0026rsquo;outil contrôleur :\n$: brctl show bridge name bridge id STP enabled interfaces br0 8000.2ef40298a3d6 yes enp0s31f6 On a bien un pont nommé br0 avec pour interface ethernet enp0s31f6, comme le montre la capture écran de l\u0026rsquo;interface graphique ci-dessus.\n⇒ puis par vérifier avec l\u0026rsquo;outil bridge :\n$: bridge link 2: enp0s31f6: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 master br0 state forwarding priority 32 cost 100 ⇒ continuons avec l\u0026rsquo;outil ip pour vérifier les différentes interfaces réseaux :\n$: ip a s 1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host noprefixroute valid_lft forever preferred_lft forever 2: enp0s31f6: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000 link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff 3: br0: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff inet 192.168.***.128/24 brd 192.168.***.255 scope global dynamic noprefixroute br0 valid_lft 36709sec preferred_lft 36709sec inet6 fe80::****:****:****:****/64 scope link noprefixroute valid_lft forever preferred_lft forever nous avons bien le pont br0 en tant qu\u0026rsquo;interface 3 l\u0026rsquo;interface réseau 2 enp0s31f6 ayant pour master br0, donc faisant bien partie du pont br0 ⇒ puis vérifions la route par défaut :\n$: ip r default via 192.168.***.1 dev br0 proto dhcp src 192.168.***.128 metric 425 192.168.***.0/24 dev br0 proto kernel scope link src 192.168.***.128 metric 425 la route par défaut est bien celle de ma passerelle passant par le pont… Voilà !\nRien de bien compliqué pour créer un pont logiciel réseau pour la communication de vos VM, sur le même segment réseau que votre machine hôte.\nInfoPour rappel : non, un pont logiciel réseau n\u0026rsquo;est pas une interface de type NAT ; il n\u0026rsquo;y a pas besoin ni de configurer le système, ni le parefeu pour transférer (forward) le trafic réseau ! Enjoy-IT! Enjoy-ID!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eComment créer un pont réseau logiciel sous Debian, pour faciliter les\ncommunications réseaux avec les machines virtuelles, gérées par QEMU.\u003c/p\u003e\n\u003cp\u003eLa machine hôte et la|les VM invitées sont sur le même segment réseau.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eLes interfaces réseaux Ethernet de type Wifi ne peuvent pas être utilisées\npour créer un pont réseau logiciel ; il faut impérativement utiliser\nun périphérique réseau Ethernet filaire.\u003c/div\u003e\n\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eLe premier point est d\u0026rsquo;installer les outils nécessaires au pont réseau\nlogiciel :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo apt install bridge-utils\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eCet article propose la configuration soit en mode CLI, soit par le biais\nde l\u0026rsquo;interface graphique de Network Manager.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eChoisissez l\u0026rsquo;un ou l\u0026rsquo;autre, pas les deux !\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"cli\"\u003eCLI\u003c/h3\u003e\n\u003cp\u003ePour le principe, voici comment configurer le pont en mode CLI :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour connaître le nom de votre interface réseau Ethernet filaire :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: ip a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e65536\u003c/span\u003e qdisc noqueue state UNKNOWN group default qlen \u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inet 127.0.0.1/8 scope host lo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       valid_lft forever preferred_lft forever\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inet6 ::1/128 scope host noprefixroute\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       valid_lft forever preferred_lft forever\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2: enp0s31f6: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e1500\u003c/span\u003e qdisc pfifo_fast state UP group default qlen \u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inet 192.168.***.***/24 brd 192.168.***.255 scope global enp0s31f6\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       valid_lft forever preferred_lft forever\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans mon cas, l\u0026rsquo;interface filaire 2 en question se nomme \u003ccode\u003eenp0s31f6\u003c/code\u003e… adaptez à votre cas !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCréation du pont :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo brctl addbr br0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eajout de l\u0026rsquo;interface réseau :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo brctl addif br0 enp0s31f6\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003econfigurez le pont dans un fichier dédié, nommé pour l\u0026rsquo;exemple,\n\u003ccode\u003e/etc/network/interfaces.d/br0\u003c/code\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## DHCP ip config file for br0 ##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauto br0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Bridge setup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#06b6ef\"\u003eiface br0 inet dhcp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebridge_ports enp0s31f6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eSi vous préférez avoir une adresse IP statique sur le même segment réseau\nque votre machine hôte, adaptez en utilisant \u003ccode\u003estatic\u003c/code\u003e au lieu de \u003ccode\u003edhcp\u003c/code\u003e\net en modifiant selon votre besoin.\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVérifiez quand même que la configuration par défaut des interfaces réseaux :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: cat /etc/network/interfaces\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# This file describes the network interfaces available on your system\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# and how to activate them. For more information, see interfaces(5).\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003esource /etc/network/interfaces.d/*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# The loopback network interface\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauto lo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eiface lo inet loopback\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi ce n\u0026rsquo;est pas le cas, adaptez ! \u003cem\u003e(cela signifie que vous avez déjà modifié votre fichier)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eVotre pont logiciel \u003cstrong\u003ebr0\u003c/strong\u003e est créé et devrait être fonctionnel.\u003c/p\u003e\n\u003ch3 id=\"network-manager-gui\"\u003eNetwork Manager GUI\u003c/h3\u003e\n\u003cp\u003eCe qui suit configure le pont réseau depuis l\u0026rsquo;interface graphique de\nNetwork Manager.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;interface graphique de Network Manager est utilisable depuis l\u0026rsquo;applet\nréseau de votre bureau, soit en ligne de commande grâce à :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo nm-connection-editor\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003col\u003e\n\u003cli\u003eCliquez sur le bouton [ + ] pour ajouter une nouvelle connection\u003c/li\u003e\n\u003cli\u003eSélectionnez dans la catégorie \u003cstrong\u003eVirtuel\u003c/strong\u003e, le choix \u003cstrong\u003ePont\u003c/strong\u003e\n\n    \n                \u003cfigure role=\"figure\" aria-label=\"Network Manager : ajout d’un pont\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-1.1-ajout-pont.png\" title=\"Network Manager : ajout d’un pont\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/nm-connection-1.1-ajout-pont.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/nm-connection-1.1-ajout-pont_hu_6a9a07fae549af5b.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Network Manager : ajout d’un pont\" height=\"209\" id=\"img_images_debian_nm-connection-1.1-ajout-pont.png_0\" loading=\"lazy\" src=\"/images/debian/nm-connection-1.1-ajout-pont.png\" type=\"image/png\" width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eNetwork Manager : ajout d’un pont\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003cli\u003eNommez la connexion, telle que \u003cstrong\u003ebr0\u003c/strong\u003e, ainsi que l\u0026rsquo;interface dans\nl\u0026rsquo;onglet \u0026lsquo;Pont\u0026rsquo; \u003cem\u003e(ouvert par défaut)\u003c/em\u003e\n\n    \n                \u003cfigure role=\"figure\" aria-label=\"Network Manager : nommer nouvelle connection\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-2.br0.png\" title=\"Network Manager : nommer nouvelle connection\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/nm-connection-2.br0.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/nm-connection-2.br0_hu_f70162d8e90753e4.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Network Manager : nommer nouvelle connection\" height=\"353\" id=\"img_images_debian_nm-connection-2.br0.png_1\" loading=\"lazy\" src=\"/images/debian/nm-connection-2.br0.png\" type=\"image/png\" width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eNetwork Manager : nommer nouvelle connection\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cul\u003e\n\u003cli\u003eCliquez sur le bouton [ Ajouter ] pour ajouter un nouveau type de connexion\u003c/li\u003e\n\u003cli\u003eLaissez le choix par défaut \u003cstrong\u003eEthernet\u003c/strong\u003e puis cliquez sur le bouton [ Créer… ]\n\u003cul\u003e\n\u003cli\u003eDans l\u0026rsquo;onglet \u0026lsquo;Ethernet\u0026rsquo; \u003cem\u003e(ouvert par défaut)\u003c/em\u003e, à \u0026lsquo;Périphérique\u0026rsquo;,\nchoisissez le périphérique réseau de type Ethernet avec lequel\nvous souhaitez fonctionner\u003c/li\u003e\n\u003cli\u003eCliquez sur le bouton [ Enregistrer ]\n\n    \n                \u003cfigure role=\"figure\" aria-label=\"Network Manager : ajout d’une connection Ethernet\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-3.Ethernet.png\" title=\"Network Manager : ajout d’une connection Ethernet\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/nm-connection-3.Ethernet.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/nm-connection-3.Ethernet_hu_7005b9ee350295e7.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Network Manager : ajout d’une connection Ethernet\" height=\"249\" id=\"img_images_debian_nm-connection-3.Ethernet.png_2\" loading=\"lazy\" src=\"/images/debian/nm-connection-3.Ethernet.png\" type=\"image/png\" width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eNetwork Manager : ajout d’une connection Ethernet\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eVérifiez dans les onglets \u0026lsquo;Paramètres IPv4\u0026rsquo; et \u0026lsquo;Paramètres IPv6\u0026rsquo;, que\nles méthodes soient de types \u003cstrong\u003eAutomatique\u003c/strong\u003e - \u003cem\u003ebien sûr ceci\nest valable si sur votre réseau, vous avez un serveur DHCP ; autrement\nen choisissant selon votre cas, par exemple si vous préférez un\nadresse IP statique, en paramétrant sur \u0026lsquo;Manuel\u0026rsquo;, etc…\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eUne fois terminé, clique sur le bouton [ Enregistrer ]\n\n    \n                \u003cfigure role=\"figure\" aria-label=\"Network Manager : ajout d’un pont\"\u003e\n    \u003ca href=\"/images/debian/nm-connection-exemple-pont-ethernet.png\" title=\"Network Manager : ajout d’un pont\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/nm-connection-exemple-pont-ethernet.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/nm-connection-exemple-pont-ethernet_hu_1ce8ab11271839b2.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Network Manager : ajout d’un pont\" height=\"213\" id=\"img_images_debian_nm-connection-exemple-pont-ethernet.png_3\" loading=\"lazy\" src=\"/images/debian/nm-connection-exemple-pont-ethernet.png\" type=\"image/png\" width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eNetwork Manager : ajout d’un pont\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVotre pont réseau logiciel est créé !\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"qemu\"\u003eQEMU\u003c/h3\u003e\n\u003cp\u003eHormis le fait d\u0026rsquo;installer QEMU sur votre machine hôte, il est nécessaire\nd\u0026rsquo;installer les bibliothèques \u003cstrong\u003elibvirt\u003c/strong\u003e ; celles-ci s\u0026rsquo;installent en\ndépendance du paquet \u003cstrong\u003evirt-manager\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo apt install libosinfo-bin qemu-system virt-manager\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi vous voulez gérer \u003cstrong\u003evirt-manager\u003c/strong\u003e avec vos droits utilisateurs, il faut\najouter votre identifiant aux groupes \u003ccode\u003elibvirt\u003c/code\u003e et \u003ccode\u003elibvirt-qemu\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"virt-manager\"\u003evirt-manager\u003c/h4\u003e\n\u003cp\u003eLors de la création de votre machine virtuelle, dans les détails de l\u0026rsquo;interface\nréseau, il faut paramètrer selon votre propre pont réseau, tel que pour\nreprendre le propos d\u0026rsquo;un pont nommé \u0026lsquo;br0\u0026rsquo; :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSource du réseau : \u003cstrong\u003ebridge device…\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003eDevice name : \u003cstrong\u003ebr0\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eModèle du périphérique : soit \u003cstrong\u003evirtio\u003c/strong\u003e, soit \u003cstrong\u003ee1000e\u003c/strong\u003e\n\u003cem\u003e(de dernier émule un périphérique de marque Intel de qualité réseau indéniable)\u003c/em\u003e\n\u003cul\u003e\n\u003cli\u003eÉtat du lien : veillez à ce que la case à cocher \u003cstrong\u003e[ ] actif\u003c/strong\u003e, le soit.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePour l\u0026rsquo;exemple :\n\n    \n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : exemple d’interface réseau paramétrée sur le pont ‘br0’\"\u003e\n    \u003ca href=\"/images/debian/virt-manager-interface-exemple.png\" title=\"virt-manager : exemple d’interface réseau paramétrée sur le pont ‘br0’\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/virt-manager-interface-exemple.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/virt-manager-interface-exemple_hu_f28d5ba008115905.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : exemple d’interface réseau paramétrée sur le pont ‘br0’\" height=\"108\" id=\"img_images_debian_virt-manager-interface-exemple.png_4\" loading=\"lazy\" src=\"/images/debian/virt-manager-interface-exemple.png\" type=\"image/png\" width=\"300\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : exemple d’interface réseau paramétrée sur le pont ‘br0’\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;édition de votre machine virtuelle peut se faire en mode CLI, aussi,\nen appelant l\u0026rsquo;outil \u003ccode\u003evirsh\u003c/code\u003e, tel que pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: virsh --connect qemu:///system edit nom-votre-vm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ece qui vous donnera accès à son fichier XML où vous pourrez entre autre\nmodifier la section \u003ccode\u003einterface\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(…)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;interface\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;bridge\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;mac\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eaddress=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;00:00:00:ad:a1:9f\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;source\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ebridge=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;br0\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;model\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;e1000e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;address\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;pci\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edomain=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0x0000\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ebus=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0x01\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eslot=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0x00\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003efunction=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;0x0\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/interface\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(…)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch4 id=\"virt-install\"\u003evirt-install\u003c/h4\u003e\n\u003cp\u003eSi jamais vous créez votre VM avec l\u0026rsquo;outil \u003ccode\u003evirt-install\u003c/code\u003e, utilisez le\nparamètre \u003ccode\u003enetwork\u003c/code\u003e pour spécifier l\u0026rsquo;utilisation du pont \u003cstrong\u003ebr0\u003c/strong\u003e,\ntel que pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: vir-install … --network \u003cspan style=\"color:#ef6155\"\u003ebridge\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ebr0,model.type\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ee1000,type\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ebridge …\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"vérifications\"\u003eVérifications\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003ePensez à redémarrer soit la machine hôte, soit à redémarrer la couche réseau\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo systemctl restart NetworkManager\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003e⇒ Vérifions avec l\u0026rsquo;outil contrôleur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: brctl show\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebridge name bridge id       STP enabled interfaces\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebr0     8000.2ef40298a3d6   yes     enp0s31f6\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn a bien un pont nommé \u003ccode\u003ebr0\u003c/code\u003e avec pour interface ethernet \u003ccode\u003eenp0s31f6\u003c/code\u003e,\ncomme le montre la capture écran de l\u0026rsquo;interface graphique ci-dessus.\u003c/p\u003e\n\u003cp\u003e⇒ puis par vérifier avec l\u0026rsquo;outil \u003ccode\u003ebridge\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: bridge link\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2: enp0s31f6: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e1500\u003c/span\u003e master br0 state forwarding priority \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e cost \u003cspan style=\"color:#f99b15\"\u003e100\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ continuons avec l\u0026rsquo;outil \u003ccode\u003eip\u003c/code\u003e pour vérifier les différentes interfaces réseaux :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: ip a s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e1: lo: \u0026lt;LOOPBACK,UP,LOWER_UP\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e65536\u003c/span\u003e qdisc noqueue state UNKNOWN group default qlen \u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inet 127.0.0.1/8 scope host lo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       valid_lft forever preferred_lft forever\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inet6 ::1/128 scope host noprefixroute\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       valid_lft forever preferred_lft forever\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2: enp0s31f6: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e1500\u003c/span\u003e qdisc fq_codel master br0 state UP group default qlen \u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e3: br0: \u0026lt;BROADCAST,MULTICAST,UP,LOWER_UP\u0026gt; mtu \u003cspan style=\"color:#f99b15\"\u003e1500\u003c/span\u003e qdisc noqueue state UP group default qlen \u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inet 192.168.***.128/24 brd 192.168.***.255 scope global dynamic noprefixroute br0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       valid_lft 36709sec preferred_lft 36709sec\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    inet6 fe80::****:****:****:****/64 scope link noprefixroute\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e       valid_lft forever preferred_lft forever\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003enous avons bien le pont \u003ccode\u003ebr0\u003c/code\u003e en tant qu\u0026rsquo;interface 3\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;interface réseau 2 \u003ccode\u003eenp0s31f6\u003c/code\u003e ayant pour \u003ccode\u003emaster br0\u003c/code\u003e, donc faisant\nbien partie du pont \u003ccode\u003ebr0\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ puis vérifions la route par défaut :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: ip r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edefault via 192.168.***.1 dev br0 proto dhcp src 192.168.***.128 metric \u003cspan style=\"color:#f99b15\"\u003e425\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e192.168.***.0/24 dev br0 proto kernel scope link src 192.168.***.128 metric \u003cspan style=\"color:#f99b15\"\u003e425\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ela route par défaut est bien celle de ma passerelle passant par le pont…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003eRien de bien compliqué pour créer un pont logiciel réseau pour la communication\nde vos VM, sur le même segment réseau que votre machine hôte.\u003c/p\u003e\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePour rappel : \u003cstrong\u003enon\u003c/strong\u003e, un pont logiciel réseau n\u0026rsquo;est pas une interface de type\nNAT ; il n\u0026rsquo;y a pas besoin ni de configurer le système, ni le parefeu pour\ntransférer (\u003cem\u003eforward\u003c/em\u003e) le trafic réseau !\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-IT! \u003cbr\u003e\nEnjoy-ID!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Créer un pont réseau logiciel sous Debian, à utiliser avec Qemu",
            "tags": ["Debian", "QEMU", "Bridge"],
            "date_published": "2024-02-25T16:56:54+01:00",
            "date_modified": "2026-03-08T02:41:09+01:00"
        },{
            "id": "urn:uuid:81a4d3e8-13e4-9184-7092-8c543b7259e3",
            "url": "http://doc.huc.fr.eu.org/fr/sys/debian/vm-windows11/",
            "title": "[Debian :: Virtualisation] Windows 11",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Abordons la virtualisation de Windows 11, sous Debian Sid, avec QEMU, avec pour prérequis nécessaire l\u0026rsquo;utilisation de TPM, Secure-Boot, partage de données entre la machine hôte et la VM, … sans oublier l\u0026rsquo;UEFI.\nCe processus convient aussi pour un Windows 10 virtualisé nécessitant les mêmes prérequis.\nPré-requis L\u0026rsquo;hôte sera paramétré en tant que pont et la VM fera partie du même réseau que l\u0026rsquo;hôte.\nJe n\u0026rsquo;aborde pas ici la configuration de l\u0026rsquo;hôte en tant que bridge réseau. Lire mon article : Debian : Pont réseau pour QEMU\nWindows 11 Le téléchargement de l\u0026rsquo;image ISO de Windows 11 se fait depuis : https://www.microsoft.com/software-download/windows11\nProcurez-vous légalement une clé de licence Windows.\n⇒ Les prérequis minimum pour une machine virtuelle exécutant Windows 11 sont les suivants :\n64 Go de stockage 4 Go mémoire 2 CPU virtuels QEMU QEMU doit être installé:\n$: sudo apt install libosinfo-bin qemu-system virt-manager virtiofsd libosinfo-bin est un outil pour interroger la base de données osinfo. virt-manager est une application de bureau pour gérer des machines virtuelles. virtiofsd est le service qui montera le système de fichier virtuel. TPM, Secure-Boot, UEFI Parmi les pré-requis de Windows 11, il y a la gestion :\nde TPM. du Secure Boot et de l\u0026rsquo;UEFI. Il nous installer les binaires suivants :\n$: sudo apt install ovmf swtpm swtpm-tools Client graphique Pour accéder à l\u0026rsquo;interface graphique de la VM, au choix\nle serveur Spice (par défaut) ou VNC. Spice Par défaut l\u0026rsquo;interface graphique de la VM est configurée sur spice.\nIl faut installer les paquets spice-vdagent et spice-client-gtk :\n$: sudo apt install spice-vdagent spice-client-gtk Ce tutoriel se base sur l\u0026rsquo;utilisation de spice.\nVNC Pour utiliser l\u0026rsquo;interface graphique avec le serveur VNC, un client comme tigervnc-viewer peut être suffisant.\n$: sudo apt install tigervnc-viewer Ce tutoriel n\u0026rsquo;aborde pas plus cette utilisation… si ce n\u0026rsquo;est de pararmètrer le client VNC d\u0026rsquo;interroger localhost et le port VNC par défaut (à moins que vous l\u0026rsquo;ayez changé, dans ce cas agissez en conséquence).\nCréation de la VM Droits utilisateur Ajoutez votre utilisateur au groupe libvirt, voire libvirt-qemu.\n$: sudo adduser your-id libvirt $: sudo adduser your-id libvirt-qemu Ensuite, choisissez pour faire l\u0026rsquo;installation de la VM :\nsoit en mode CLI, soit par l\u0026rsquo;installateur graphique virt-manager virt-install CLI Partant du principe d\u0026rsquo;un répertoire dédié dans votre homme, nommé VM :\nCréation de la VM: $: cd ~/VM $: ROOT=\u0026#34;$(pwd)\u0026#34; $: name=Win11Test $: path=\u0026#34;${ROOT}/${name}.qcow2\u0026#34; $: size=64 $: qemu-img create -f qcow2 \u0026#34;${path}\u0026#34; \u0026#34;${size}G\u0026#34; Démarrage de l\u0026rsquo;installation : $: isofile=Win11_23H2_French_x64v2.iso $: fs_dest=\u0026#34;C:\\\\vmshare\u0026#34; $: fs_src=\u0026#34;${ROOT}/vmshare\u0026#34; $: cdrom=\u0026#34;${ROOT}/${isofile}\u0026#34; $: conn=\u0026#34;qemu:///system\u0026#34; $: cpu=\u0026#34;check=none,mode=host-passthrough,migratable=on\u0026#34; $: disk=\u0026#34;device=disk,format=qcow2,path=${path},size=${size},target.bus=sata,target.dev=sda,type=file\u0026#34; $: fs=\u0026#34;accessmode=passthrough,source=${fs_src},target=${fs_dest},type=mount,driver.type=virtiofs\u0026#34; $: graphic=spice $: machine=q35 $: mem=\u0026#34;4096,maxMemory=16384\u0026#34; $: memBacking=\u0026#34;source.type=memfd,access.mode=shared\u0026#34; $: net=\u0026#34;bridge=br0,model.type=e1000,type=bridge\u0026#34; $: os=\u0026#34;detect=on,name=win11\u0026#34; $: tpm=\u0026#34;emulator,version=2.0\u0026#34; $: vcpu=\u0026#34;2,maxvcpus=4\u0026#34; $: virt-install --accelerate --cdrom \u0026#34;${cdrom}\u0026#34; --connect \u0026#34;${conn}\u0026#34; --cpu \u0026#34;${cpu}\u0026#34; --disk \u0026#34;${disk}\u0026#34; --filesystem \u0026#34;${fs}\u0026#34; --graphics type=\u0026#34;${graphic}\u0026#34; --hvm --machine \u0026#34;${machine}\u0026#34; --memory \u0026#34;${mem}\u0026#34; --memorybacking=\u0026#34;${memBacking}\u0026#34; --name ${name} --network \u0026#34;${net}\u0026#34; --os-variant \u0026#34;${os}\u0026#34; --tpm \u0026#34;${tpm}\u0026#34; --vcpus \u0026#34;${vcpu}\u0026#34; Direction vers l\u0026rsquo;interface graphique de la nouvelle fenêtre qui vient de s\u0026rsquo;ouvrir, titrée \u0026ldquo;Win11Test\u0026rdquo;, assez rapidement pour pouvoir valider le choix de démarrer sur le CD-ROM.\nSelon votre puissance machine hôte, l\u0026rsquo;installation de Windows se fait en quelques minutes…\nGestionnaire graphique virt-manager Veillez à activer l\u0026rsquo;option d\u0026rsquo;architecture en spécifiant l\u0026rsquo;*Architecture : x86_64 : virt-manager : création de la nouvelle VM Choisir le chemin de l\u0026rsquo;ISO d\u0026rsquo;installation de Windows : virt-manager : choisir le média d’installation Choisir les paramètres mémoire et CPU : virt-manager : choisir les paramètres mémoire et CPU Activer le stockage en sélectionnant un personnalisé : virt-manager : activer le stockage personnalisé Dans votre home, créez un volume de stockage personnalisé virt-manager : créer un volume de stockage virt-manager : créer du volume de stockage virt-manager : localiser le stockage personnalisé virt-manager : gérer le stockage personnalisé Commençons l\u0026rsquo;installation de la VM Veillez à sélectionner le type de réseau, en tant que Bridge device et à lui donner le nom correct de votre pont, dans le champ Device name virt-manager : activer le stockage Le reste est le processus d\u0026rsquo;installation de Windows…\nInstallation de Windows Je ne développe pas le processus d\u0026rsquo;installation en lui-même ; il ne différe en rien d\u0026rsquo;une installation sur une machine physique.\nPartage Le moyen le plus simple actuellement pour partager des copier-coller, des fichiers entre l\u0026rsquo;hôte et l\u0026rsquo;invité est l\u0026rsquo;utilisation du serveur spice ; l\u0026rsquo;utilisation de VNC n\u0026rsquo;est pas compatible pour ce propos.\nD\u0026rsquo;autres possibilités sont l\u0026rsquo;usage de SSHFS, voire Samba, qui ne seront pas abordés dans cet article.\n⇒ Sur l\u0026rsquo;hôte :\n$: sudo apt install qemu-guest-agent spice-vdagent ⇒ Dans la VM :\nUne fois l\u0026rsquo;installation de Windows terminée, et dans votre session utilisateur, avec n\u0026rsquo;importe quel navigateur web, allez télécharger :\nl\u0026rsquo;utilitaire WinFSP : https://winfsp.dev/rel/ C\u0026rsquo;est l\u0026rsquo;équivalent de Fuse pour Windows.\nVeillez à l\u0026rsquo;installation du Core - ce qui est normalement proposé par défaut (voir ci-dessous : WinFSP) les outils VirtIO : https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win-guest-tools.exe Cet ensemble packagé par l\u0026rsquo;équipe Fedora comprend les pilotes logiciels nécessaires à la paravirtualisation et l\u0026rsquo;émulation matérielle ; il embarque aussi l\u0026rsquo;agent Spice pour la gestion de l\u0026rsquo;affichage graphique, et son redimensionnement automatique, le copier-coller entre l\u0026rsquo;hôte et la VM, la redirection des périphériques USB vers la VM.\nVeillez à l\u0026rsquo;installation de Viofs (voir ci-dessous : VirtIO) AttentionL\u0026rsquo;installation de WinFSP doit se faire avant celle de VirtioFS, autrement le service ad hoc refusera de démarrer. virt-install Lors de l\u0026rsquo;installation par le biais de l\u0026rsquo;outil virt-install en CLI, normalement vous avez paramétré :\nles variables fs_dest et fs_src nécessaires pour paramétrer correctement la variable --filesystem ainsi que la variable memoryBacking qui est nécessaire pour le partage mémoire. virt-manager Si vous avez fait l\u0026rsquo;installation de la VM par le biais de virt-manager, arrêtez proprement la VM, puis paramétrez le partage de fichier.\nAffichez les détails de la VM Cliquez sur Mémoire pour activer l\u0026rsquo;option Enable shared memory virt-manager : activer la mémoire partagée Puis cliquez sur le bouton [ Ajouter un matériel ], en bas à gauche de la + fenêtre des détails… Sélectionnez le choix Système de fichiers et paramétrez : Pilote : virtiofs Chemin de la source : Parcourez vers votre répertoire de partage sur votre hôte, tel que ~/VM/vmshare chemin de la cible : C:\\vmshare vous pouvez choisir d\u0026rsquo;exporter les fichiers en lecture seule, en cliquant sur la case à cocher adéquate. cliquez sur le bouton [ Terminer ] virt-manager : activer le système de fichiers Au redémarrage de la VM, le chemin de la cible sera privilégié en tant que lecteur Z:… si bien sûr, vous avez réalisé l\u0026rsquo;installation des deux binaires WinFSP et VirtIO ; sinon faites-le.\nWinFSP Démarrage de l’installation de WinFSP Phase de personnalisation de l’installation de WinFSP Veillez à ce que le module Core soit validé - ce qui est normalement le cas par défaut.\nTerminez classiquement l\u0026rsquo;installation, sans autre détail.\nVirtIO Démarrage de l’installation de Virtio-win Phase de personnalisation de l’installation de Virtio-win\u0026amp;#34; s=\u0026amp;#34;/debian/qemu/Virtio-win de l’installation de Virtio-win Veillez à ce que le module Viofs soit validé - ce qui est normalement le cas par défaut.\nPendant la phase d\u0026rsquo;installation:\nl\u0026rsquo;affichage de la VM va clignoter et se redimentionner automatiquement - c\u0026rsquo;est normal. le copier-coller entre l\u0026rsquo;hôte et la VM est disponible, aussi. Une fois l\u0026rsquo;installation terminée, allez dans le gestionnaire de services :\nDéroulez jusqu\u0026rsquo;au service Virtio-FS Service, double-cliquez dessus changez le type de démarrage pour le mettre en mode Automatique en lieu du mode Manuel cliquez sur le bouton [ Démarrer ] Gestion du service Virtio-FS Démarrage du service Virtio-FS Redémarrez la VM\nUne fois à nouveau dans la session, cliquez sur l\u0026rsquo;explorateur de fichiers, puis sur Ce PC, vous devrez y trouver le lecteur Z: connecté sur C:\\vmshare. Vous pouvez maintenant faire transiter les fichiers désirés entre l\u0026rsquo;hôte et la VM. Vue de l’Explorateur de Fichiers Z: Test partage fichier Depuis la VM : Vue de l’Explorateur de Fichiers Z: du fichier True.txt Depuis l’hôte : Vue de l’Explorateur de Fichiers du fichier True.txt Voilà !\nÀ partir de maintenant, vous êtes opérationnel ;)\nDépannage Incapable de trouver un virtiofsd satisfaisant Q : Après avoir ajouté le système de fichiers pour le partage de fichiers entre l\u0026rsquo;hôte et la VM, la VM refuse de démarrer avec le message d\u0026rsquo;erreur suivant : incapable de trouver un virtiofsd satisfaisant ; que se passe-t-il !?\nR : Depuis QEMU v8, le projet a cessé d\u0026rsquo;inclure virtiofsd ; ce dernier est ajouté en tant que paquet dans le dépôt officiel Debian. Si ce n\u0026rsquo;est pas fait, suite à une migration Debian, par exemple, ajoutez-le !\nVirtio-FS ne démarre pas Q : Le service Virtio-FS refuse de démarrer !\nR : Avez-vous installé WinFSP en premier ? Si ce n\u0026rsquo;est pas le cas, faites-le ; ensuite vous pourrez le démarrer.\nLe partage de fichiers n\u0026rsquo;est pas actif Q : J\u0026rsquo;ai redémarré la VM, mais le partage de fichiers sur Z: n\u0026rsquo;est pas actif !\nR :\nDans les paramètres de la VM, avez-vous bien paramétré un Système de fichiers ? Vérifiez vos chemin de la source (sur l\u0026rsquo;hôte) et chemin de la cible (celui dans la VM). Avez-vous bien paramétré le service Virtio-FS ? Vérifiez qu\u0026rsquo;il soit démarré ! Documentations https://libvirt.org/formatdomain.html\nhttps://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers\nhttps://www.spice-space.org/\nhttps://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md\nhttps://www.debugpoint.com/install-windows-ubuntu-virt-manager/\nhttps://www.debugpoint.com/kvm-share-folder-windows-guest/\nhttps://getlabsdone.com/how-to-enable-tpm-and-secure-boot-on-kvm/\nhttps://getlabsdone.com/how-to-install-windows-11-on-kvm/\nRemerciements Tout particulièrement à @Clochette ;)\nEnjoy-IT! Enjoy-ID!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eAbordons la virtualisation de Windows 11, sous Debian Sid, avec QEMU,\navec pour prérequis nécessaire l\u0026rsquo;utilisation de TPM, Secure-Boot,\npartage de données entre la machine hôte et la VM, … sans oublier l\u0026rsquo;UEFI.\u003c/p\u003e\n\u003cp\u003eCe processus convient aussi pour un Windows 10 virtualisé nécessitant les\nmêmes prérequis.\u003c/p\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;hôte sera paramétré en tant que pont et la VM fera partie du même réseau\nque l\u0026rsquo;hôte.\u003c/p\u003e\n\u003cp\u003eJe n\u0026rsquo;aborde pas ici la configuration de l\u0026rsquo;hôte en tant que bridge réseau. \u003cbr\u003e\n\u003cem\u003eLire mon article : \u003ca href=\"http://doc.huc.fr.eu.org/fr/sys/debian/qemu-bridge-network/\"\u003eDebian : Pont réseau pour QEMU\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"windows-11\"\u003eWindows 11\u003c/h3\u003e\n\u003cp\u003eLe téléchargement de l\u0026rsquo;image ISO de Windows 11 se fait depuis :\n\u003ca href=\"https://www.microsoft.com/software-download/windows11\" rel=\"external\"\u003ehttps://www.microsoft.com/software-download/windows11\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eProcurez-vous légalement une clé de licence Windows.\u003c/p\u003e\n\u003cp\u003e⇒ Les prérequis minimum pour une \u003ca href=\"https://learn.microsoft.com/fr-fr/windows/whats-new/windows-11-requirements#virtual-machine-support\" rel=\"external\"\u003emachine virtuelle exécutant Windows\u003c/a\u003e\n11 sont les suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e64 Go de stockage\u003c/li\u003e\n\u003cli\u003e4 Go mémoire\u003c/li\u003e\n\u003cli\u003e2 CPU virtuels\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"qemu\"\u003eQEMU\u003c/h3\u003e\n\u003cp\u003eQEMU doit être installé:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo apt install libosinfo-bin qemu-system virt-manager virtiofsd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elibosinfo-bin\u003c/code\u003e est un outil pour interroger la base de données osinfo.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evirt-manager\u003c/code\u003e est une application de bureau pour gérer des machines virtuelles.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evirtiofsd\u003c/code\u003e est le service qui montera le système de fichier virtuel.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"tpm-secure-boot-uefi\"\u003eTPM, Secure-Boot, UEFI\u003c/h3\u003e\n\u003cp\u003eParmi les pré-requis de Windows 11, il y a la gestion :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ede TPM.\u003c/li\u003e\n\u003cli\u003edu Secure Boot\u003c/li\u003e\n\u003cli\u003eet de l\u0026rsquo;UEFI.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl nous installer les binaires suivants :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo apt install ovmf swtpm swtpm-tools\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"client-graphique\"\u003eClient graphique\u003c/h3\u003e\n\u003cp\u003ePour accéder à l\u0026rsquo;interface graphique de la VM, au choix\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele serveur Spice (par défaut)\u003c/li\u003e\n\u003cli\u003eou VNC.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"spice\"\u003eSpice\u003c/h4\u003e\n\u003cp\u003ePar défaut l\u0026rsquo;interface graphique de la VM est configurée sur \u003cstrong\u003espice\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eIl faut installer les paquets \u003cstrong\u003espice-vdagent\u003c/strong\u003e et \u003cstrong\u003espice-client-gtk\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo apt install spice-vdagent spice-client-gtk\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe tutoriel se base sur l\u0026rsquo;utilisation de spice.\u003c/p\u003e\n\u003ch4 id=\"vnc\"\u003eVNC\u003c/h4\u003e\n\u003cp\u003ePour utiliser l\u0026rsquo;interface graphique avec le serveur VNC, un client comme\n\u003cstrong\u003etigervnc-viewer\u003c/strong\u003e peut être suffisant.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo apt install tigervnc-viewer\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe tutoriel n\u0026rsquo;aborde pas plus cette utilisation… si ce n\u0026rsquo;est de pararmètrer\nle client VNC d\u0026rsquo;interroger localhost et le port VNC par défaut \u003cem\u003e(à moins\nque vous l\u0026rsquo;ayez changé, dans ce cas agissez en conséquence)\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"création-de-la-vm\"\u003eCréation de la VM\u003c/h2\u003e\n\u003ch3 id=\"droits-utilisateur\"\u003eDroits utilisateur\u003c/h3\u003e\n\u003cp\u003eAjoutez votre utilisateur au groupe \u003cstrong\u003elibvirt\u003c/strong\u003e, voire \u003cstrong\u003elibvirt-qemu\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo adduser your-id libvirt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: sudo adduser your-id libvirt-qemu\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, choisissez pour faire l\u0026rsquo;installation de la VM :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esoit en mode CLI,\u003c/li\u003e\n\u003cli\u003esoit par l\u0026rsquo;installateur graphique virt-manager\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"virt-install-cli\"\u003evirt-install CLI\u003c/h3\u003e\n\u003cp\u003ePartant du principe d\u0026rsquo;un répertoire dédié dans votre homme, nommé \u003cstrong\u003eVM\u003c/strong\u003e :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCréation de la VM:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: cd ~/VM\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003epwd\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eWin11Test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003epath\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.qcow2\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003esize\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: qemu-img create -f qcow2 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003epath\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003esize\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eG\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eDémarrage de l\u0026rsquo;installation :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003eisofile\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eWin11_23H2_French_x64v2.iso\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003efs_dest\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;C:\\\\vmshare\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003efs_src\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/vmshare\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003ecdrom\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eisofile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003econn\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;qemu:///system\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003ecpu\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;check=none,mode=host-passthrough,migratable=on\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003edisk\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;device=disk,format=qcow2,path=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003epath\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e,size=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003esize\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e,target.bus=sata,target.dev=sda,type=file\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003efs\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;accessmode=passthrough,source=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efs_src\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e,target=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efs_dest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e,type=mount,driver.type=virtiofs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003egraphic\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003espice\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003emachine\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eq35\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003emem\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;4096,maxMemory=16384\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003ememBacking\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;source.type=memfd,access.mode=shared\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003enet\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;bridge=br0,model.type=e1000,type=bridge\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003eos\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;detect=on,name=win11\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003etpm\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;emulator,version=2.0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: \u003cspan style=\"color:#ef6155\"\u003evcpu\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;2,maxvcpus=4\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$: virt-install --accelerate --cdrom \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecdrom\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --connect \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003econn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --cpu \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecpu\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --disk \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edisk\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --filesystem \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efs\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --graphics \u003cspan style=\"color:#ef6155\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003egraphic\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --hvm --machine \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003emachine\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --memory \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003emem\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --memorybacking\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ememBacking\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --name \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e --network \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enet\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --os-variant \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eos\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --tpm \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etpm\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --vcpus \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003evcpu\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDirection vers l\u0026rsquo;interface graphique de la nouvelle fenêtre qui vient de\ns\u0026rsquo;ouvrir, titrée \u0026ldquo;Win11Test\u0026rdquo;, assez rapidement pour pouvoir valider le\nchoix de démarrer sur le CD-ROM.\u003c/p\u003e\n\u003cp\u003eSelon votre puissance machine hôte, l\u0026rsquo;installation de Windows se fait en\nquelques minutes…\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"gestionnaire-graphique-virt-manager\"\u003eGestionnaire graphique virt-manager\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVeillez à activer l\u0026rsquo;option d\u0026rsquo;architecture en spécifiant l\u0026rsquo;*\u003cem\u003eArchitecture\u003c/em\u003e : \u003cstrong\u003ex86_64\u003c/strong\u003e :\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : création de la nouvelle VM\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-1.creation.png\" title=\"virt-manager : création de la nouvelle VM\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-1.creation.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-1.creation_hu_58a22f068deb1d96.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : création de la nouvelle VM\" height=\"536\" id=\"img_images_debian_qemu_virt-manager-1.creation.png_0\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-1.creation.png\" type=\"image/png\" width=\"509\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : création de la nouvelle VM\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChoisir le chemin de l\u0026rsquo;ISO d\u0026rsquo;installation de Windows :\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : choisir le média d’installation\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-2.media-installation.png\" title=\"virt-manager : choisir le média d’installation\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-2.media-installation.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-2.media-installation_hu_d06c0ea26e03d10a.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : choisir le média d’installation\" height=\"543\" id=\"img_images_debian_qemu_virt-manager-2.media-installation.png_1\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-2.media-installation.png\" type=\"image/png\" width=\"602\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : choisir le média d’installation\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChoisir les paramètres mémoire et CPU :\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : choisir les paramètres mémoire et CPU\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu.png\" title=\"virt-manager : choisir les paramètres mémoire et CPU\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu_hu_326415fbe9c41fc6.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : choisir les paramètres mémoire et CPU\" height=\"536\" id=\"img_images_debian_qemu_virt-manager-3.parametres-mem-cpu.png_2\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-3.parametres-mem-cpu.png\" type=\"image/png\" width=\"507\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : choisir les paramètres mémoire et CPU\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eActiver le stockage en sélectionnant un personnalisé :\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : activer le stockage personnalisé\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.0.stockage.png\" title=\"virt-manager : activer le stockage personnalisé\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-4.0.stockage.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-4.0.stockage_hu_2414f2c57d3b1f2.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : activer le stockage personnalisé\" height=\"535\" id=\"img_images_debian_qemu_virt-manager-4.0.stockage.png_3\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-4.0.stockage.png\" type=\"image/png\" width=\"513\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : activer le stockage personnalisé\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDans votre home, créez un volume de stockage personnalisé\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : créer un volume de stockage\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.1.stockage-creation.png\" title=\"virt-manager : créer un volume de stockage\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-4.1.stockage-creation.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-4.1.stockage-creation_hu_881a9a735b29b0dc.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : créer un volume de stockage\" height=\"628\" id=\"img_images_debian_qemu_virt-manager-4.1.stockage-creation.png_4\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-4.1.stockage-creation.png\" type=\"image/png\" width=\"794\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : créer un volume de stockage\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : créer du volume de stockage\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.2.stockage-creation.png\" title=\"virt-manager : créer du volume de stockage\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-4.2.stockage-creation.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-4.2.stockage-creation_hu_bdf50985d64764a5.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : créer du volume de stockage\" height=\"645\" id=\"img_images_debian_qemu_virt-manager-4.2.stockage-creation.png_5\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-4.2.stockage-creation.png\" type=\"image/png\" width=\"764\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : créer du volume de stockage\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : localiser le stockage personnalisé\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume.png\" title=\"virt-manager : localiser le stockage personnalisé\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume_hu_b40d418a4602295e.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : localiser le stockage personnalisé\" height=\"534\" id=\"img_images_debian_qemu_virt-manager-4.3.stockage-choix-volume.png_6\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-4.3.stockage-choix-volume.png\" type=\"image/png\" width=\"758\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : localiser le stockage personnalisé\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : gérer le stockage personnalisé\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise.png\" title=\"virt-manager : gérer le stockage personnalisé\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise_hu_6620676cd26905da.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : gérer le stockage personnalisé\" height=\"537\" id=\"img_images_debian_qemu_virt-manager-4.4.stockage-personnalise.png_7\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-4.4.stockage-personnalise.png\" type=\"image/png\" width=\"512\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : gérer le stockage personnalisé\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCommençons l\u0026rsquo;installation de la VM\n\u003cul\u003e\n\u003cli\u003eVeillez à sélectionner le type de réseau, en tant que \u003cstrong\u003eBridge device\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eet à lui donner le nom correct de votre pont, dans le champ \u003cstrong\u003eDevice name\u003c/strong\u003e\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : activer le stockage\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-5.start-install.png\" title=\"virt-manager : activer le stockage\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-5.start-install.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-5.start-install_hu_43fe3cbbb8b94c85.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : activer le stockage\" height=\"535\" id=\"img_images_debian_qemu_virt-manager-5.start-install.png_8\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-5.start-install.png\" type=\"image/png\" width=\"510\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : activer le stockage\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLe reste est le processus d\u0026rsquo;installation de Windows…\u003c/p\u003e\n\u003ch2 id=\"installation-de-windows\"\u003eInstallation de Windows\u003c/h2\u003e\n\u003cp\u003eJe ne développe pas le processus d\u0026rsquo;installation en lui-même ; il ne différe\nen rien d\u0026rsquo;une installation sur une machine physique.\u003c/p\u003e\n\u003ch2 id=\"partage\"\u003ePartage\u003c/h2\u003e\n\u003cp\u003eLe moyen le plus simple actuellement pour partager des copier-coller,\ndes fichiers entre l\u0026rsquo;hôte et l\u0026rsquo;invité est l\u0026rsquo;utilisation du serveur \u003cstrong\u003espice\u003c/strong\u003e ;\nl\u0026rsquo;utilisation de VNC n\u0026rsquo;est pas compatible pour ce propos.\u003c/p\u003e\n\u003cp\u003eD\u0026rsquo;autres possibilités sont l\u0026rsquo;usage de SSHFS, voire Samba, qui ne seront\npas abordés dans cet article.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Sur l\u0026rsquo;hôte :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-dash\" data-lang=\"dash\"\u003e$: sudo apt install qemu-guest-agent spice-vdagent\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Dans la VM :\u003c/p\u003e\n\u003cp\u003eUne fois l\u0026rsquo;installation de Windows terminée, et dans votre session utilisateur,\navec n\u0026rsquo;importe quel navigateur web, allez télécharger :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;utilitaire \u003cstrong\u003eWinFSP\u003c/strong\u003e : \u003ca href=\"https://winfsp.dev/rel/\" rel=\"external\"\u003ehttps://winfsp.dev/rel/\u003c/a\u003e \u003cbr\u003e\nC\u0026rsquo;est l\u0026rsquo;équivalent de \u003cstrong\u003eFuse\u003c/strong\u003e pour Windows.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVeillez à l\u0026rsquo;installation du \u003cstrong\u003eCore\u003c/strong\u003e - \u003cem\u003ece qui est normalement proposé par défaut\u003c/em\u003e \u003cbr\u003e\n(voir ci-dessous : \u003ca href=\"/fr/sys/debian/vm-windows11/#winfsp\"\u003eWinFSP\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles outils \u003cstrong\u003eVirtIO\u003c/strong\u003e : \u003cbr\u003e\n\u003ca href=\"https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win-guest-tools.exe\" rel=\"external\"\u003ehttps://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win-guest-tools.exe\u003c/a\u003e \u003cbr\u003e\nCet ensemble packagé par l\u0026rsquo;équipe Fedora comprend les pilotes logiciels\nnécessaires à la paravirtualisation et l\u0026rsquo;émulation matérielle ; il\nembarque aussi l\u0026rsquo;agent Spice pour la gestion de l\u0026rsquo;affichage graphique,\net son redimensionnement automatique, le copier-coller entre l\u0026rsquo;hôte\net la VM, la redirection des périphériques USB vers la VM.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVeillez à l\u0026rsquo;installation de \u003cstrong\u003eViofs\u003c/strong\u003e \u003cbr\u003e\n(voir ci-dessous : \u003ca href=\"/fr/sys/debian/vm-windows11/#virtio\"\u003eVirtIO\u003c/a\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eL\u0026rsquo;installation de WinFSP doit se faire avant celle de VirtioFS, autrement\nle service ad hoc refusera de démarrer.\u003c/div\u003e\n\n\u003ch3 id=\"virt-install\"\u003evirt-install\u003c/h3\u003e\n\u003cp\u003eLors de l\u0026rsquo;installation par le biais de l\u0026rsquo;outil \u003cstrong\u003evirt-install\u003c/strong\u003e en CLI,\nnormalement vous avez paramétré :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles variables \u003ccode\u003efs_dest\u003c/code\u003e et \u003ccode\u003efs_src\u003c/code\u003e nécessaires pour paramétrer correctement\nla variable \u003ccode\u003e--filesystem\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eainsi que la variable \u003ccode\u003ememoryBacking\u003c/code\u003e qui est nécessaire pour le partage\nmémoire.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"virt-manager\"\u003evirt-manager\u003c/h3\u003e\n\u003cp\u003eSi vous avez fait l\u0026rsquo;installation de la VM par le biais de virt-manager,\narrêtez proprement la VM, puis paramétrez le partage de fichier.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eAffichez les détails de la VM\u003c/li\u003e\n\u003cli\u003eCliquez sur \u003cstrong\u003eMémoire\u003c/strong\u003e pour activer l\u0026rsquo;option \u003cstrong\u003eEnable shared memory\u003c/strong\u003e\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : activer la mémoire partagée\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-6.0.partage-memoire.png\" title=\"virt-manager : activer la mémoire partagée\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-6.0.partage-memoire.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-6.0.partage-memoire_hu_84f717ccd2ba14c4.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : activer la mémoire partagée\" height=\"309\" id=\"img_images_debian_qemu_virt-manager-6.0.partage-memoire.png_9\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-6.0.partage-memoire.png\" type=\"image/png\" width=\"702\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : activer la mémoire partagée\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003cli\u003ePuis cliquez sur le bouton [ Ajouter un matériel ], \u003cem\u003een bas à gauche de la +\nfenêtre des détails\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003eSélectionnez le choix \u003cstrong\u003eSystème de fichiers\u003c/strong\u003e et paramétrez :\n\u003cul\u003e\n\u003cli\u003ePilote : \u003cstrong\u003evirtiofs\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eChemin de la source : Parcourez vers votre répertoire de partage sur\nvotre hôte, tel que \u003ccode\u003e~/VM/vmshare\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003echemin de la cible : \u003ccode\u003eC:\\vmshare\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003evous pouvez choisir d\u0026rsquo;exporter les fichiers en lecture seule, en cliquant\nsur la case à cocher adéquate.\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ecliquez sur le bouton [ Terminer ]\n\n                \u003cfigure role=\"figure\" aria-label=\"virt-manager : activer le système de fichiers\"\u003e\n    \u003ca href=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers.png\" title=\"virt-manager : activer le système de fichiers\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers_hu_cd6d05ca6928196d.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"virt-manager : activer le système de fichiers\" height=\"649\" id=\"img_images_debian_qemu_virt-manager-6.1.Systeme-fichiers.png_10\" loading=\"lazy\" src=\"/images/debian/qemu/virt-manager-6.1.Systeme-fichiers.png\" type=\"image/png\" width=\"756\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003evirt-manager : activer le système de fichiers\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAu redémarrage de la VM, le chemin de la cible sera privilégié en tant\nque lecteur Z:… \u003cem\u003esi bien sûr, vous avez réalisé l\u0026rsquo;installation des deux\nbinaires WinFSP et VirtIO ; sinon faites-le.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"winfsp\"\u003eWinFSP\u003c/h3\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"Démarrage de l’installation de WinFSP\"\u003e\n    \u003ca href=\"/images/debian/qemu/WinFSP-installer-1.start.png\" title=\"Démarrage de l’installation de WinFSP\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/WinFSP-installer-1.start.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/WinFSP-installer-1.start_hu_4de7c1f187242f0f.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Démarrage de l’installation de WinFSP\" height=\"386\" id=\"img_images_debian_qemu_WinFSP-installer-1.start.png_11\" loading=\"lazy\" src=\"/images/debian/qemu/WinFSP-installer-1.start.png\" type=\"image/png\" width=\"498\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eDémarrage de l’installation de WinFSP\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"Phase de personnalisation de l’installation de WinFSP\"\u003e\n    \u003ca href=\"/images/debian/qemu/WinFSP-installer-2.custom-setup.png\" title=\"Phase de personnalisation de l’installation de WinFSP\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/WinFSP-installer-2.custom-setup.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/WinFSP-installer-2.custom-setup_hu_11961c67b86e938e.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Phase de personnalisation de l’installation de WinFSP\" height=\"389\" id=\"img_images_debian_qemu_WinFSP-installer-2.custom-setup.png_12\" loading=\"lazy\" src=\"/images/debian/qemu/WinFSP-installer-2.custom-setup.png\" type=\"image/png\" width=\"494\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003ePhase de personnalisation de l’installation de WinFSP\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVeillez à ce que le module \u003cstrong\u003eCore\u003c/strong\u003e soit validé - \u003cem\u003ece qui est normalement le cas par défaut\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTerminez classiquement l\u0026rsquo;installation, sans autre détail.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"virtio\"\u003eVirtIO\u003c/h3\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"Démarrage de l’installation de Virtio-win\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-1.start.png\" title=\"Démarrage de l’installation de Virtio-win\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-1.start.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-1.start_hu_c997569a1a4bab32.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Démarrage de l’installation de Virtio-win\" height=\"386\" id=\"img_images_debian_qemu_Virtio-win-installer-1.start.png_13\" loading=\"lazy\" src=\"/images/debian/qemu/Virtio-win-installer-1.start.png\" type=\"image/png\" width=\"501\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eDémarrage de l’installation de Virtio-win\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"Phase de personnalisation de l’installation de Virtio-win\u0026amp;#34; s=\u0026amp;#34;/debian/qemu/Virtio-win de l’installation de Virtio-win\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup.png\" title=\"Phase de personnalisation de l’installation de Virtio-win\u0026amp;#34; s=\u0026amp;#34;/debian/qemu/Virtio-win de l’installation de Virtio-win\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup_hu_e52f002196847499.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Phase de personnalisation de l’installation de Virtio-win\u0026#34; s=\u0026#34;/debian/qemu/Virtio-win de l’installation de Virtio-win\" height=\"391\" id=\"img_images_debian_qemu_Virtio-win-installer-2.custom-setup.png_14\" loading=\"lazy\" src=\"/images/debian/qemu/Virtio-win-installer-2.custom-setup.png\" type=\"image/png\" width=\"500\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003ePhase de personnalisation de l’installation de Virtio-win\u0026amp;#34; s=\u0026amp;#34;/debian/qemu/Virtio-win de l’installation de Virtio-win\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVeillez à ce que le module \u003cstrong\u003eViofs\u003c/strong\u003e soit validé - \u003cem\u003ece qui est normalement le cas par défaut\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePendant la phase d\u0026rsquo;installation:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;affichage de la VM va clignoter et se redimentionner automatiquement - \u003cem\u003ec\u0026rsquo;est normal.\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ele copier-coller entre l\u0026rsquo;hôte et la VM est disponible, aussi.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUne fois l\u0026rsquo;installation terminée, allez dans le gestionnaire de services :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDéroulez jusqu\u0026rsquo;au service \u003cstrong\u003eVirtio-FS Service\u003c/strong\u003e, double-cliquez dessus\n\u003cul\u003e\n\u003cli\u003echangez le type de démarrage pour le mettre en mode \u003cstrong\u003eAutomatique\u003c/strong\u003e\nen lieu du mode \u003cstrong\u003eManuel\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ecliquez sur le bouton [ Démarrer ]\n\n                \u003cfigure role=\"figure\" aria-label=\"Gestion du service Virtio-FS\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-3.service.png\" title=\"Gestion du service Virtio-FS\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-3.service.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-3.service_hu_55bc71fc874be75f.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Gestion du service Virtio-FS\" height=\"593\" id=\"img_images_debian_qemu_Virtio-win-installer-3.service.png_15\" loading=\"lazy\" src=\"/images/debian/qemu/Virtio-win-installer-3.service.png\" type=\"image/png\" width=\"806\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eGestion du service Virtio-FS\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n                \u003cfigure role=\"figure\" aria-label=\"Démarrage du service Virtio-FS\"\u003e\n    \u003ca href=\"/images/debian/qemu/Virtio-win-installer-4.service-start.png\" title=\"Démarrage du service Virtio-FS\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-4.service-start.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/Virtio-win-installer-4.service-start_hu_3aa699bb47eae0a0.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Démarrage du service Virtio-FS\" height=\"513\" id=\"img_images_debian_qemu_Virtio-win-installer-4.service-start.png_16\" loading=\"lazy\" src=\"/images/debian/qemu/Virtio-win-installer-4.service-start.png\" type=\"image/png\" width=\"406\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eDémarrage du service Virtio-FS\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRedémarrez la VM\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUne fois à nouveau dans la session, cliquez sur l\u0026rsquo;explorateur de fichiers,\npuis sur \u003cstrong\u003eCe PC\u003c/strong\u003e, vous devrez y trouver le lecteur Z: connecté sur C:\\vmshare. \u003cbr\u003e\nVous pouvez maintenant faire transiter les fichiers désirés entre l\u0026rsquo;hôte et la VM.\n\n                \u003cfigure role=\"figure\" aria-label=\"Vue de l’Explorateur de Fichiers Z:\"\u003e\n    \u003ca href=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z.png\" title=\"Vue de l’Explorateur de Fichiers Z:\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z_hu_bf089e9b7117a2fa.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Vue de l’Explorateur de Fichiers Z:\" height=\"499\" id=\"img_images_debian_qemu_Windows11-Fichiers-vue-vmshare-Z.png_17\" loading=\"lazy\" src=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z.png\" type=\"image/png\" width=\"1127\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eVue de l’Explorateur de Fichiers Z:\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch4 id=\"test-partage-fichier\"\u003eTest partage fichier\u003c/h4\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"Depuis la VM : Vue de l’Explorateur de Fichiers Z: du fichier True.txt\"\u003e\n    \u003ca href=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True.png\" title=\"Depuis la VM : Vue de l’Explorateur de Fichiers Z: du fichier True.txt\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True_hu_f1d645367e4c6adb.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Depuis la VM : Vue de l’Explorateur de Fichiers Z: du fichier True.txt\" height=\"498\" id=\"img_images_debian_qemu_Windows11-Fichiers-vue-vmshare-Z-True.png_18\" loading=\"lazy\" src=\"/images/debian/qemu/Windows11-Fichiers-vue-vmshare-Z-True.png\" type=\"image/png\" width=\"799\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eDepuis la VM : Vue de l’Explorateur de Fichiers Z: du fichier True.txt\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003e\n                \u003cfigure role=\"figure\" aria-label=\"Depuis l’hôte : Vue de l’Explorateur de Fichiers du fichier True.txt\"\u003e\n    \u003ca href=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True.png\" title=\"Depuis l’hôte : Vue de l’Explorateur de Fichiers du fichier True.txt\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True_hu_bdaef7b55d996162.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Depuis l’hôte : Vue de l’Explorateur de Fichiers du fichier True.txt\" height=\"354\" id=\"img_images_debian_qemu_Host-Fichiers-vue-vmshare-True.png_19\" loading=\"lazy\" src=\"/images/debian/qemu/Host-Fichiers-vue-vmshare-True.png\" type=\"image/png\" width=\"763\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eDepuis l’hôte : Vue de l’Explorateur de Fichiers du fichier True.txt\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003eÀ partir de maintenant, vous êtes opérationnel ;)\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"incapable-de-trouver-un-virtiofsd-satisfaisant\"\u003eIncapable de trouver un virtiofsd satisfaisant\u003c/h3\u003e\n\u003cp\u003e\u003cabbr title=\"Question\"\u003eQ\u003c/abbr\u003e\n : Après avoir ajouté le système de fichiers pour le\npartage de fichiers entre l\u0026rsquo;hôte et la VM, la VM refuse de démarrer avec le message\nd\u0026rsquo;erreur suivant : \u003cstrong\u003eincapable de trouver un virtiofsd satisfaisant\u003c/strong\u003e ; que se\npasse-t-il !?\u003c/p\u003e\n\u003cp\u003e\u003cabbr title=\"Réponse\"\u003eR\u003c/abbr\u003e\n : Depuis QEMU v8, le projet a cessé d\u0026rsquo;inclure virtiofsd ;\nce dernier est ajouté en tant que paquet dans le dépôt officiel Debian. Si ce\nn\u0026rsquo;est pas fait, suite à une migration Debian, par exemple, ajoutez-le !\u003c/p\u003e\n\u003ch3 id=\"virtio-fs-ne-démarre-pas\"\u003eVirtio-FS ne démarre pas\u003c/h3\u003e\n\u003cp\u003e\u003cabbr title=\"Question\"\u003eQ\u003c/abbr\u003e\n : Le service Virtio-FS refuse de démarrer !\u003c/p\u003e\n\u003cp\u003e\u003cabbr title=\"Réponse\"\u003eR\u003c/abbr\u003e\n : Avez-vous installé WinFSP en premier ? Si ce\nn\u0026rsquo;est pas le cas, faites-le ; ensuite vous pourrez le démarrer.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"le-partage-de-fichiers-nest-pas-actif\"\u003eLe partage de fichiers n\u0026rsquo;est pas actif\u003c/h3\u003e\n\u003cp\u003e\u003cabbr title=\"Question\"\u003eQ\u003c/abbr\u003e\n : J\u0026rsquo;ai redémarré la VM, mais le partage de fichiers\nsur Z: n\u0026rsquo;est pas actif !\u003c/p\u003e\n\u003cp\u003e\u003cabbr title=\"Réponse\"\u003eR\u003c/abbr\u003e\n :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDans les paramètres de la VM, avez-vous bien paramétré un \u003cstrong\u003eSystème de fichiers\u003c/strong\u003e ?\n\u003cul\u003e\n\u003cli\u003eVérifiez vos \u003cstrong\u003echemin de la source\u003c/strong\u003e \u003cem\u003e(sur l\u0026rsquo;hôte)\u003c/em\u003e et \u003cstrong\u003echemin de la cible\u003c/strong\u003e\n(\u003cem\u003ecelui dans la VM)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eAvez-vous bien paramétré le service Virtio-FS ? Vérifiez qu\u0026rsquo;il soit démarré !\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://libvirt.org/formatdomain.html\" rel=\"external\"\u003ehttps://libvirt.org/formatdomain.html\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers\" rel=\"external\"\u003ehttps://www.linux-kvm.org/page/WindowsGuestDrivers/Download_Drivers\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.spice-space.org/\" rel=\"external\"\u003ehttps://www.spice-space.org/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md\" rel=\"external\"\u003ehttps://github.com/virtio-win/virtio-win-pkg-scripts/blob/master/README.md\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.debugpoint.com/install-windows-ubuntu-virt-manager/\" rel=\"external\"\u003ehttps://www.debugpoint.com/install-windows-ubuntu-virt-manager/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.debugpoint.com/kvm-share-folder-windows-guest/\" rel=\"external\"\u003ehttps://www.debugpoint.com/kvm-share-folder-windows-guest/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://getlabsdone.com/how-to-enable-tpm-and-secure-boot-on-kvm/\" rel=\"external\"\u003ehttps://getlabsdone.com/how-to-enable-tpm-and-secure-boot-on-kvm/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://getlabsdone.com/how-to-install-windows-11-on-kvm/\" rel=\"external\"\u003ehttps://getlabsdone.com/how-to-install-windows-11-on-kvm/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eTout particulièrement à @Clochette ;)\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-IT! \u003cbr\u003e\nEnjoy-ID!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Virtualiser Windows 11 sous Debian Sid avec QEMU",
            "tags": ["Debian", "Virtualisation", "Windows", "QEMU"],
            "date_published": "2024-02-03T14:21:48+01:00",
            "date_modified": "2026-03-08T02:41:09+01:00"
        },{
            "id": "urn:uuid:b6fa3ab2-d693-53f5-0e5b-9d2762350f62",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/sysclean/",
            "title": "sysclean : un outil pour nettoyer son OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Sysclean est un script perl(1) conçu pour aider à supprimer les fichiers obsolètes entre chacune des mises-à-niveau d\u0026rsquo;OpenBSD.\nPar lui-même, sysclean ne retire aucun fichier ; il compare les fichiers installés par référence à ce qui devrait être dans le système de base et prend en compte les paquets installés.\nLes options sont :\n-a : liste tous les fichiers installés par les packages -p : liste les noms des packages utilisant des fichiers obsolètes -i : inclut les noms de fichiers à ignorer, en utilisant le fichier /etc/sysclean.ignore - un par ligne, chemin absolu vers le fichier. Processus Vérifions les packages \u0026ldquo;obsolètes\u0026rdquo; : # sysclean -p\nSi le résultat convient à nos attentes, on effectue : # pkg_delete $(sysclean -p | awk '{print $2}')\nEt, pour terminer, retirons les dépendances inutiles : # pkg_delete -a\nAstuce L\u0026rsquo;autre outil, lui, natif au système de base sur OpenBSD est pkg_check ;-)\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSysclean est un script \u003ca href=\"http://man.openbsd.org/perl\" rel=\"external\"\u003eperl(1)\u003c/a\u003e conçu\npour aider à supprimer les fichiers obsolètes entre chacune des\nmises-à-niveau d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003cp\u003ePar lui-même, sysclean ne retire aucun fichier ; il compare les fichiers\ninstallés par référence à ce qui devrait être dans le système de base\net prend en compte les paquets installés.\u003c/p\u003e\n\u003cp\u003eLes options sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-a\u003c/code\u003e : liste tous les fichiers installés par les packages\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e : liste les noms des packages utilisant des fichiers obsolètes\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-i\u003c/code\u003e : inclut les noms de fichiers à ignorer, en utilisant le fichier\n\u003ccode\u003e/etc/sysclean.ignore\u003c/code\u003e - un par ligne, chemin absolu vers le fichier.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"processus\"\u003eProcessus\u003c/h2\u003e\n\u003cp\u003eVérifions les packages \u0026ldquo;obsolètes\u0026rdquo; : \u003ccode\u003e# sysclean -p\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi le résultat convient à nos attentes, on effectue : \u003cbr\u003e\n\u003ccode\u003e# pkg_delete $(sysclean -p | awk '{print $2}')\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEt, pour terminer, retirons les dépendances inutiles : \u003cbr\u003e\n\u003ccode\u003e# pkg_delete -a\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"astuce\"\u003eAstuce\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;autre outil, lui, natif au système de base sur OpenBSD est\n\u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#etat\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003epkg_check\u003c/a\u003e\n\u003c/code\u003e ;-)\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer les fichiers obsolètes sous OpenBSD, grâce à l'outil système, nommé 'sysclean'",
            "tags": ["OpenBSD", "sysclean"],
            "date_published": "2023-05-10T16:24:58+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:c5e5dd7a-7d49-70a1-3392-4ee7153f699b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/unbound-dot/",
            "title": "OpenWRT + Unbound : utiliser le protocole DoT ",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Le propos de cet article est d\u0026rsquo;ajouter unbound pour permettre les requêtes DNS (Domain Name Service) sur le protocole DoT (DNS-over-TCP) , tout en modifiant légèrement dnsmasq, installé par défaut.\nLe but est de :\nchiffrer le trafic DNS afin d\u0026rsquo;améliorer la confidentialité de celui-ci. prévenir d\u0026rsquo;une fuite DNS et les détournements de votre trafic DNS bypasser les restrictions régionales ou celles du FAI (Fournisseur d\u0026#39;Accès Internet) . Installation Installons les paquets nécessaires : unbound unbound-control luci-app-unbound\n:# opkg update :# opkg install unbound unbound-control luci-app-unbound Il peut être utile d\u0026rsquo;installer ces autres paquets liés à unbound :\nunbound-checkconf : qui permet de s\u0026rsquo;assurer de la conformité de la configuration unbound-control-setup : qui permet d\u0026rsquo;installer/créer les certificats nécessaires pour le contrôle de l\u0026rsquo;outil unbound-host : pour tester… Configuration dnsmasq Éditons le fichier de configuration du serveur dnsmasq /etc/config/dhcp, pour s\u0026rsquo;assurer des deux options suivantes :\noption noresolv \u0026#39;1\u0026#39; list server \u0026#39;127.0.0.1#531\u0026#39; la première oblige à ne pas utiliser le fichier /etc/resolv.conf la seconde oblige à rediriger les requêtes DNS localement vers le port choisi, ici 531. Bien-sûr, ces options peuvent être modifiées directement par LuCI :\nonglet \u0026lsquo;Resolv and Hosts Files\u0026rsquo; \u0026gt; option Ignore resolv file, pour la première onglet \u0026lsquo;General Settings\u0026rsquo; \u0026gt; option DNS forwardings, pour la seconde. Quant à l\u0026rsquo;usage de la commande uci dans votre terminal :\nuci set dhcp.@dnsmasq[0].noresolv=\u0026#39;1\u0026#39; uci set dhcp.@dnsmasq[0].server=\u0026#39;127.0.0.1#531\u0026#39; uci commit Pensez à redémarrer le service dnsmasq !\nunbound La chose la plus simple est d\u0026rsquo;activer Unbound, et de cocher l\u0026rsquo;option Manual Conf pour modifier manuellement le fichier de configuration, au-travers de LuCI. Ajoutez vos réseaux dans l\u0026rsquo;option Trigger Networks, à-minima lan.\nFichier de configuration : /var/lib/unbound/unbound.conf Les changements minimum à faire correspondent aux variables suivantes :\nserver: (…) port: 531 do-ip4: yes do-ip6: yes do-tcp: yes hide-identity: yes hide-version: yes qname-minimisation: yes prefetch: yes rrset-roundrobin: yes minimal-responses: yes tls-cert-bundle: \u0026#34;/etc/ssl/certs/ca-certificates.crt\u0026#34; (…) À-propos du numéro de port choisi, ici 531 : non, on ne choisit pas 5353 qui est réservé normalement au service mdns ; bien-sûr, vous pouvez le modifier, faites-le en conséquence dans la configuration de dnsmasq, mais veillez à le choisir dans le contexte des numéros de ports privilégiés, à savoir en deçà des 1024 premiers…\n⇒ Pensez absolument à ajouter/modifier des variables access-control pour n\u0026rsquo;autoriser que :\naccess-control: 0.0.0.0/0 refuse access-control: ::0/0 refuse access-control: 127.0.0.0/8 allow access-control: ::1 allow Puis à déclarer l\u0026rsquo;adressage IPv(4|6) de votre LAN, voire de votre Wifi…\nIl est nécessaire ensuite de modifier la section forward-zone :\nforward-zone: name: \u0026#34;.\u0026#34; forward-tls-upstream: yes Puis d\u0026rsquo;ajouter toutes les adresses IP de serveurs concernés par DoT ; bien-sûr les deux protocoles IPv4 et IPv6 sont fonctionnels.\nforward-addr: 9.9.9.9@853 # Quad9 forward-addr: 1.1.1.1@853 # Cloudflare forward-addr: 149.112.112.112@853 # Quad9 secondaire forward-addr: 1.0.0.1@853 # Cloudflare secondaire forward-addr: 2620:fe::fe@853 # Quad9 / IPv6 forward-addr: 2606:4700:4700::1111@853 # Cloudflare / IPv6 forward-addr: 2606:4700:4700::1001@853 # Cloudflare secondaire / IPv6 Cet exemple ci-dessus montre l\u0026rsquo;usage des \u0026ldquo;grands\u0026rdquo; de ce monde… Voici pour le propos des alternatives intéressantes :\n# FDN DoT forward-addr: 80.67.169.12@853 forward-addr: 80.67.169.40@853 forward-addr: 2001:910:800::12@853 forward-addr: 2001:910:800::40@853 # dns.sb forward-addr: 185.222.222.222@853 forward-addr: 45.11.45.11@853 forward-addr: 2a09::@853 forward-addr: 2a11::@853 # dns4eu forward-addr: 86.54.11.11@853 forward-addr: 86.54.11.211@853 forward-addr: 2a13:1001::86:54:11:11@853 forward-addr: 2a13:1001::86:54:11:211@853 # dot.bortzmeyer.fr forward-addr: 193.70.85.11@853 forward-addr: 2001:41d0:302:2200::180@853 # applied-privacy.net forward-addr: 146.255.56.98@853 forward-addr: 2a02:1b8:10:234::2@853 # cleanbrowsing.org: family filter https://cleanbrowsing.org/filters/ forward-addr: 185.228.168.168@853 forward-addr: 185.228.169.168@853 forward-addr: 2a0d:2a00:1::@853 forward-addr: 2a0d:2a00:2::@853 # cz.nic #forward-addr: 193.17.47.1@853 #forward-addr: 185.43.135.1@853 #forward-addr: 2001:148f:ffff::1@853 #forward-addr: 2001:148f:fffe::1@853 # dnsforfamily.com forward-addr: 78.47.64.161@853 forward-addr: 94.130.180.225@853 forward-addr: 2a01:4f8:1c0c:40db::1@853 forward-addr: 2a01:4f8:1c17:4df8::1@853 # he.net #forward-addr: 74.82.42.42@853 #forward-addr: 2001:470:20::2@853 # libredns.gr forward-addr: 116.202.176.26@853 forward-addr: 2a01:4f8:1c0c:8274::1@853 # dns4all forward-addr: 194.0.5.3@853 forward-addr: 194.0.5.64@853 forward-addr: 2001:678:8::3@853 forward-addr: 2001:678:8::64@853 Voilà pour la configuration de base, qui doit/devrait permettre d\u0026rsquo;utiliser unbound conjointement avec dnsmasq.\nPensez impérativement à redémarrer le service unbound !\nVérifications Si vous avez eu l\u0026rsquo;idée d\u0026rsquo;installer l\u0026rsquo;outil unbound-checkconf, c\u0026rsquo;est le moment de l\u0026rsquo;exécuter pour vérifier que les modifications/écritures faites dans le fichier de configuration sont correctes. Si tout va bien, l\u0026rsquo;outil vous retournera ce message d\u0026rsquo;information :\n:# unbound-checkconf unbound-checkconf: no errors in /var/lib/unbound/unbound.conf S\u0026rsquo;il y a des erreurs, il vous dira où !\nSi vous avez eu l\u0026rsquo;idée d\u0026rsquo;installer l\u0026rsquo;outil unbound-host, il sera possible de tester la connexion qui devrait être sécurisée, de telle manière, par exemple :\n:# unbound-host -vf /var/lib/unbound/root.key com. com. has no address (secure) com. has no IPv6 address (secure) com. has no mail handler record (secure) Faites de même pour les adresses www.ripe.net, www.afnic.fr, dnssec.cz. La mention (secure) assure de la connexion sécurisée.\nContrôler Un petit laïus à-propos du fait de contrôler le fonctionnement d\u0026rsquo;unbound. Il est nécessaire d\u0026rsquo;initialiser le paramètrage :\n:# unbound-control-setup setup in directory /var/lib/unbound/ generating unbound_server.key Generating RSA private key, 3072 bit long modulus ...............................................................................................................++ ............................................................++ e is 65537 (0x10001) generating unbound_control.key Generating RSA private key, 3072 bit long modulus ........................................................................++ ..................++ e is 65537 (0x10001) create unbound_server.pem (self signed certificate) create unbound_control.pem (signed client certificate) Signature ok subject=/CN=unbound-control Getting CA Private Key Setup success. Certificates created. Enable in unbound.conf file to use Puis de modifier le fichier de configuration d\u0026rsquo;unbound, pour ajouter/décommenter la section remote-control, tel que :\nremote-control: control-enable: yes control-interface: 127.0.0.1 control-interface: ::1 control-port: 8953 control-use-cert: no server-key-file: \u0026#34;/var/lib/unbound/unbound_server.key\u0026#34; server-cert-file: \u0026#34;/var/lib/unbound/unbound_server.pem\u0026#34; control-key-file: \u0026#34;/var/lib/unbound/unbound_control.key\u0026#34; control-cert-file: \u0026#34;/var/lib/unbound/unbound_control.pem\u0026#34; Après avoir redémarré le service, il ne reste plus qu\u0026rsquo;à tester avec l\u0026rsquo;outil unbound-control, tel que pour l\u0026rsquo;exemple :\n:# unbound-control -s ::1 status version: 1.17.0 verbosity: 1 threads: 4 modules: 2 [ validator iterator ] uptime: 3482 seconds options: reuseport control unbound (pid 32307) is running... Il est ainsi possible de connaître la valeur de toute option par l\u0026rsquo;usage de l\u0026rsquo;option get_option suivie du nom de l\u0026rsquo;option. De même, il reste possible de faire un dump du cache pour analyse du flux, par le biais de l\u0026rsquo;option dump_cache redirigé vers un nom de fichier.\nVoilà, c\u0026rsquo;est terminé.\nDocumentation Et sinon, OpenWRT peut aussi agir en tant que proxy DoH (DNS-over-HTTPS) ; n\u0026rsquo;hésitez pas à lire : OpenWRT : proxy DNS DoH Enjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe propos de cet article est d\u0026rsquo;ajouter unbound pour permettre les requêtes\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDNS \u003cem\u003e(Domain Name Service)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sur le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDoT \u003cem\u003e(DNS-over-TCP)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, tout en modifiant\nlégèrement dnsmasq, installé par défaut.\u003c/p\u003e\n\u003cp\u003eLe but est de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echiffrer le trafic DNS afin d\u0026rsquo;améliorer la confidentialité de celui-ci.\u003c/li\u003e\n\u003cli\u003eprévenir d\u0026rsquo;une fuite DNS et les détournements de votre trafic \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/li\u003e\n\u003cli\u003ebypasser les restrictions régionales ou celles du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"fr\"\u003eFAI \u003cem\u003e(Fournisseur d\u0026#39;Accès Internet)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eInstallons les paquets nécessaires : \u003cstrong\u003eunbound unbound-control luci-app-unbound\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# opkg update\n:# opkg install unbound unbound-control luci-app-unbound\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl peut être utile d\u0026rsquo;installer ces autres paquets liés à unbound :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eunbound-checkconf\u003c/strong\u003e : qui permet de s\u0026rsquo;assurer de la conformité de la\nconfiguration\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eunbound-control-setup\u003c/strong\u003e : qui permet d\u0026rsquo;installer/créer les certificats\nnécessaires pour le contrôle de l\u0026rsquo;outil\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eunbound-host\u003c/strong\u003e : pour tester…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"dnsmasq\"\u003ednsmasq\u003c/h3\u003e\n\u003cp\u003eÉditons le fichier de configuration du serveur dnsmasq \u003ccode\u003e/etc/config/dhcp\u003c/code\u003e,\npour s\u0026rsquo;assurer des deux options suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eoption noresolv \u0026#39;1\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elist server \u0026#39;127.0.0.1#531\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ela première oblige à ne pas utiliser le fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ela seconde oblige à rediriger les requêtes DNS localement vers le port\nchoisi, ici \u003ccode\u003e531\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eBien-sûr, ces options peuvent être modifiées directement par LuCI :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eonglet \u0026lsquo;Resolv and Hosts Files\u0026rsquo; \u0026gt; option \u003cstrong\u003eIgnore resolv file\u003c/strong\u003e, pour\nla première\u003c/li\u003e\n\u003cli\u003eonglet \u0026lsquo;General Settings\u0026rsquo; \u0026gt; option \u003cstrong\u003eDNS forwardings\u003c/strong\u003e, pour la seconde.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eQuant à l\u0026rsquo;usage de la commande \u003ccode\u003euci\u003c/code\u003e dans votre terminal :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci set dhcp.@dnsmasq[0].noresolv=\u0026#39;1\u0026#39;\nuci set dhcp.@dnsmasq[0].server=\u0026#39;127.0.0.1#531\u0026#39;\nuci commit\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003ePensez à \u003cstrong\u003eredémarrer le service dnsmasq\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"unbound\"\u003eunbound\u003c/h3\u003e\n\u003cp\u003eLa chose la plus simple est d\u0026rsquo;activer Unbound, et de cocher l\u0026rsquo;option\n\u003cstrong\u003eManual Conf\u003c/strong\u003e pour modifier manuellement le fichier de configuration,\nau-travers de LuCI.\nAjoutez vos réseaux dans l\u0026rsquo;option \u003cstrong\u003eTrigger Networks\u003c/strong\u003e, à-minima \u003cstrong\u003elan\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/var/lib/unbound/unbound.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLes changements minimum à faire correspondent aux variables suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eport: 531\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edo-ip4: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edo-ip6: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edo-tcp: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehide-identity: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehide-version: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eqname-minimisation: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprefetch: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003errset-roundrobin: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eminimal-responses: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls-cert-bundle: \u0026#34;/etc/ssl/certs/ca-certificates.crt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eÀ-propos du numéro de port choisi, ici \u003ccode\u003e531\u003c/code\u003e : non, on ne choisit pas\n\u003ccode\u003e5353\u003c/code\u003e qui est réservé normalement au service mdns ; bien-sûr, vous pouvez\nle modifier, faites-le en conséquence dans la configuration de dnsmasq,\nmais veillez à le choisir dans le contexte des numéros de ports privilégiés,\nà savoir en deçà des 1024 premiers…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Pensez absolument à ajouter/modifier des variables \u003ccode\u003eaccess-control\u003c/code\u003e pour\nn\u0026rsquo;autoriser que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaccess-control: 0.0.0.0/0 refuse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaccess-control: ::0/0 refuse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaccess-control: 127.0.0.0/8 allow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaccess-control: ::1 allow\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis à déclarer l\u0026rsquo;adressage IPv(4|6) de votre LAN, voire de votre Wifi…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl est nécessaire ensuite de modifier la section \u003ccode\u003eforward-zone\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eforward-zone:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename: \u0026#34;.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-tls-upstream: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis d\u0026rsquo;ajouter toutes les adresses IP de serveurs concernés par DoT ;\nbien-sûr les deux protocoles IPv4 et IPv6 sont fonctionnels.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 9.9.9.9@853       # Quad9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 1.1.1.1@853       # Cloudflare\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 149.112.112.112@853       # Quad9 secondaire\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 1.0.0.1@853       # Cloudflare secondaire\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2620:fe::fe@853       # Quad9 / IPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2606:4700:4700::1111@853  # Cloudflare / IPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2606:4700:4700::1001@853  # Cloudflare secondaire / IPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet exemple ci-dessus montre l\u0026rsquo;usage des \u0026ldquo;grands\u0026rdquo; de ce monde…\nVoici pour le propos des alternatives intéressantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# FDN DoT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 80.67.169.12@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 80.67.169.40@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2001:910:800::12@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2001:910:800::40@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# dns.sb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 185.222.222.222@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 45.11.45.11@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a09::@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a11::@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# dns4eu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 86.54.11.11@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 86.54.11.211@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a13:1001::86:54:11:11@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a13:1001::86:54:11:211@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# dot.bortzmeyer.fr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 193.70.85.11@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2001:41d0:302:2200::180@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# applied-privacy.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 146.255.56.98@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a02:1b8:10:234::2@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# cleanbrowsing.org: family filter https://cleanbrowsing.org/filters/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 185.228.168.168@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 185.228.169.168@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a0d:2a00:1::@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a0d:2a00:2::@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# cz.nic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#forward-addr: 193.17.47.1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#forward-addr: 185.43.135.1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#forward-addr: 2001:148f:ffff::1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#forward-addr: 2001:148f:fffe::1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# dnsforfamily.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 78.47.64.161@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 94.130.180.225@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a01:4f8:1c0c:40db::1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a01:4f8:1c17:4df8::1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# he.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#forward-addr: 74.82.42.42@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#forward-addr: 2001:470:20::2@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# libredns.gr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 116.202.176.26@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2a01:4f8:1c0c:8274::1@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# dns4all\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 194.0.5.3@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 194.0.5.64@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2001:678:8::3@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward-addr: 2001:678:8::64@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eVoilà pour la configuration de base, qui doit/devrait permettre d\u0026rsquo;utiliser\nunbound conjointement avec dnsmasq.\u003c/p\u003e\n\u003cp\u003ePensez impérativement à redémarrer le service unbound !\u003c/p\u003e\n\u003ch2 id=\"vérifications\"\u003eVérifications\u003c/h2\u003e\n\u003cp\u003eSi vous avez eu l\u0026rsquo;idée d\u0026rsquo;installer l\u0026rsquo;outil \u003cstrong\u003eunbound-checkconf\u003c/strong\u003e, c\u0026rsquo;est\nle moment de l\u0026rsquo;exécuter pour vérifier que les modifications/écritures\nfaites dans le fichier de configuration sont correctes.\nSi tout va bien, l\u0026rsquo;outil vous retournera ce message d\u0026rsquo;information :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# unbound-checkconf\nunbound-checkconf: no errors in /var/lib/unbound/unbound.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eS\u0026rsquo;il y a des erreurs, il vous dira où !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eSi vous avez eu l\u0026rsquo;idée d\u0026rsquo;installer l\u0026rsquo;outil \u003cstrong\u003eunbound-host\u003c/strong\u003e, il sera possible\nde tester la connexion qui devrait être sécurisée, de telle manière, par\nexemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# unbound-host -vf /var/lib/unbound/root.key com.\ncom. has no address (secure)\ncom. has no IPv6 address (secure)\ncom. has no mail handler record (secure)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eFaites de même pour les adresses \u003cstrong\u003e\u003ca href=\"https://www.ripe.net\" rel=\"external\"\u003ewww.ripe.net\u003c/a\u003e\u003c/strong\u003e, \u003cstrong\u003e\u003ca href=\"https://www.afnic.fr\" rel=\"external\"\u003ewww.afnic.fr\u003c/a\u003e\u003c/strong\u003e,\n\u003cstrong\u003ednssec.cz\u003c/strong\u003e.\nLa mention \u003cstrong\u003e(secure)\u003c/strong\u003e assure de la connexion sécurisée.\u003c/p\u003e\n\u003ch2 id=\"contrôler\"\u003eContrôler\u003c/h2\u003e\n\u003cp\u003eUn petit laïus à-propos du fait de contrôler le fonctionnement d\u0026rsquo;unbound.\nIl est nécessaire d\u0026rsquo;initialiser le paramètrage :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# unbound-control-setup\nsetup in directory /var/lib/unbound/\ngenerating unbound_server.key\nGenerating RSA private key, 3072 bit long modulus\n...............................................................................................................++\n............................................................++\ne is 65537 (0x10001)\ngenerating unbound_control.key\nGenerating RSA private key, 3072 bit long modulus\n........................................................................++\n..................++\ne is 65537 (0x10001)\ncreate unbound_server.pem (self signed certificate)\ncreate unbound_control.pem (signed client certificate)\nSignature ok\nsubject=/CN=unbound-control\nGetting CA Private Key\nSetup success. Certificates created. Enable in unbound.conf file to use\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis de modifier le fichier de configuration d\u0026rsquo;unbound, pour ajouter/décommenter\nla section \u003ccode\u003eremote-control\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eremote-control:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-enable: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-interface: 127.0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-interface: ::1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-port: 8953\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-use-cert: no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eserver-key-file: \u0026#34;/var/lib/unbound/unbound_server.key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eserver-cert-file: \u0026#34;/var/lib/unbound/unbound_server.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-key-file: \u0026#34;/var/lib/unbound/unbound_control.key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-cert-file: \u0026#34;/var/lib/unbound/unbound_control.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eAprès avoir redémarré le service\u003c/strong\u003e, il ne reste plus qu\u0026rsquo;à tester avec\nl\u0026rsquo;outil \u003ccode\u003eunbound-control\u003c/code\u003e, tel que pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# unbound-control -s ::1 status\nversion: 1.17.0\nverbosity: 1\nthreads: 4\nmodules: 2 [ validator iterator ]\nuptime: 3482 seconds\noptions: reuseport control\nunbound (pid 32307) is running...\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl est ainsi possible de connaître la valeur de toute option par l\u0026rsquo;usage\nde l\u0026rsquo;option \u003ccode\u003eget_option\u003c/code\u003e suivie du nom de l\u0026rsquo;option.\nDe même, il reste possible de faire un dump du cache pour analyse du flux,\npar le biais de l\u0026rsquo;option \u003ccode\u003edump_cache\u003c/code\u003e redirigé vers un nom de fichier.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà, c\u0026rsquo;est terminé.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eEt sinon, OpenWRT peut aussi agir en tant que proxy \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDoH \u003cem\u003e(DNS-over-HTTPS)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n;\nn\u0026rsquo;hésitez pas à lire : \n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/dns-doh-proxy/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : proxy DNS DoH'\"\u003eOpenWRT : proxy DNS DoH\u003c/a\u003e\n\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID! \u003cbr\u003e\nEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Ajouter unbound pour faire des requêtes DNS chiffrées par le protocole DoT à OpenWRT.",
            "tags": ["OpenWRT", "unbound", "DNS", "DNSSEC", "DoT"],
            "date_published": "2023-02-19T15:37:43+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:927c0ac4-4166-1234-b244-167df7dc173b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/vm-debian-11-bullseye/",
            "title": "[OpenBSD :: Virtualisation] Debian Bullseye (11.x)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description La virtualisation de machine virtuelle sous OpenBSD est officiellement disponible nativement dans le système de base depuis OpenBSD 5.9.\nVersion : native OS : OpenBSD 7.0 → 7.2 Pour rappel : utiliser le virtualisateur vmd d\u0026rsquo;OpenBSD a quelques restrictions, dont celles de ne pas pouvoir utiliser d\u0026rsquo;interface graphique, …\nPré-requis AttentionATTENTION : Ce tutoriel ne documente pas dans les moindres détails les phases d\u0026rsquo;installation, voire de configuration.\nIl est VRAIMENT nécessaire de faire preuve de réflexion, discernement et d\u0026rsquo;avoir un minimum de compétences, pour comprendre les liens entre les différentes briques !\nMerci de votre compréhension…\nIl est nécessaire que votre machine sur laquelle vous souhaitez virtualiser ait un CPU compatible avec les fonctions adéquates. Pour le vérifier, tapez dans votre terminal/console la commande suivante :\n:$ dmesg | egrep \u0026#39;(VMX/EPT|SVM/RVI)\u0026#39; La réponse du système doit être :\n⇒ pour CPU Intel :\nvmm0 at mainbus0: VMX/EPT ⇒ pour CPU Amd :\nvmm0 at mainbus0: SVM/RVI Si aucune ligne n\u0026rsquo;apparaît, aucune virtualisation ne sera possible. Par acquis de conscience, vérifiez votre BIOS|UEFI que celle-ci ne soit pas désactivée.\nInfoDe même, en rapport avec les failles CPU relatives à Meltdown, Spectre, certains CPU Intel sont patchés pour remédier à L1TF. Sous OpenBSD, ces CPU reçoivent un correctif approprié. Malheureusement, cela impacte la virtualisation et rend celle-ci difficile pour certains, voire impossible.\nVous pouvez vous retrouver dans la situation où vous auriez un CPU compatible, mais dans les faits, la virtualisation ne pourrait être pleinement fonctionnelle.\nPréférez AMD, en attendant ARM… voire RISC V.\nIl est nécessaire d\u0026rsquo;installer le firmware vmm pour que le kernel gère.\n:# fw_update vmm Par convention, créons un répertoire \u0026lsquo;\u0026lsquo;vm\u0026rsquo;\u0026rsquo; dans notre répertoire personnel, et nous travaillerons à partir de celui-ci : :$ mkdir vm \u0026amp;\u0026amp; cd vm\nPrécisions réseaux L\u0026rsquo;interface vether0 de l\u0026rsquo;hôte aura pour adresse IPv4 : 192.168.0.1, cette adresse IP sera l\u0026rsquo;adresse de la passerelle pour l\u0026rsquo;interface réseau de la VM. L\u0026rsquo;interface enp0s3 de la VM Debian aura pour adresse IPv4 : 192.168.0.2 Dans les deux cas, le masque de réseau est de 24 bits. La passerelle de la VM sera l\u0026rsquo;adresse IP de l\u0026rsquo;interface vether ;) Les serveurs DNS renseignés dans le fichier /etc/resolv.conf de la VM sont les serveurs publics de la FDN, respectueux de la confidentialité… Ces même serveurs DNS peuvent être renseignés dans la règle PF de redirection de flux DNS vers la VM. Cet article ne montre rien concernant, ou si peu, le fonctionnement avec le protocole IPv6, mais les principes ci-dessus s\u0026rsquo;appliquent, pourvu que vous comprenez ce que vous faites. Création de l\u0026rsquo;image qcow2 Dans les deux cas présentés, nous commencerons par créer la VM, très simplement avec l\u0026rsquo;outil natif à OpenBSD, nommé vmctl :\n:$ vmctl create -s 50G ~/vm/bullseye.qcow2\nTéléchargement de l\u0026rsquo;iso Debian Téléchargeons l\u0026rsquo;iso Debian :\n:$ ftp https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/{debian-11.5.0-amd64-netinst.iso,SHA512SUMS}\nUne fois téléchargée, vérifions sa somme de contrôle : \\\n:$ sha512 -C SHA512SUMS debian-10.1.0-amd64-netinst.iso (SHA512) debian-10.1.0-amd64-netinst.iso: OK Si OK, alors c\u0026rsquo;est bon… sinon, re-téléchargez !\nConfiguration Le fichier de configuration : /etc/vm.conf. switch \u0026#34;sw\u0026#34; { interface bridge0 } vm \u0026#34;bullseye\u0026#34; { disable memory 1G cdrom /home/id/vm/debian-11.5.0-amd64-netinst.iso disk /home/id/vm/bullseye.qcow2 interface { switch \u0026#34;sw\u0026#34; } owner votre-identifiant } Bien sûr, remplacez :\n/home/id par votre répertoire home votre-identifiant par votre identifiant de session Vérifiez la configuration à l\u0026rsquo;aide de l\u0026rsquo;option -n de vmd :\n:$ vmd -n\nAprès avoir configuré les interfaces réseaux, il faut maintenant démarrer le service de gestion des VMs : :# rcctl enable vmd \u0026amp;\u0026amp; rcctl start vmd\npuis il faut s\u0026rsquo;occuper de la traduction d\u0026rsquo;adresses réseaux, et aussi des règles du parefeu…\nInterfaces réseaux Créons les interfaces réseaux nécessaires que sont vether0 et bridge0 qui permettront un contrôle fin de l\u0026rsquo;adressage IP et des règles PF.\nbridge0 Le fichier relatif est /etc/hostname.bridge0 :\n:# echo \u0026quot;add vether0\u0026quot; \u0026gt; /etc/hostname.bridge0\nvether0 Le fichier relatif est /etc/hostname.vether0 :\n:# echo \u0026quot;inet 192.168.0.1 255.255.255.0\u0026quot; \u0026gt; /etc/hostname.vether0\nUne fois les fichiers d\u0026rsquo;interfaces créés, donnez des droits 0600 dessus, puis démarrez les deux interfaces :\n:# chmod 0600 /etc/hostname.{bridge,vether}0 :# sh /etc/netstart {bridge,vether}0 NAT Dans ce contexte où la VM invitée est sur un segment réseau différent de l\u0026rsquo;hôte, il faut autoriser la redirection des paquets IP, pour que la VM puisse communiquer sur Internet - ne serait-ce que pour faire les mises à jour…\n:# sysctl net.inet.ip.forwarding=1 :# sysctl net.inet6.ip6.forwarding=1 La première ligne est pour IPv4, la seconde pour IPv6.\nPuis, pour garder les paramètres au redémarrage, modifiez le fichier /etc/sysctl.conf pour ajouter : net.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1\nPF le fichier de configuration /etc/pf.conf Ajouter au moins les règles suivantes :\n(…) domain = \u0026#34;80.67.169.12 80.67.169.40\u0026#34; match out on egress from (vether0:network) to any nat-to (egress) (…) pass in quick proto { udp tcp } from (vether0:network) to any port domain rdr-to { $domain } port domain pass on vether0 from 127.0.0.1 to any pass on vether0 from (vether0:network) to any (…) La première règle indique que tout ce qui vient du réseau lié à l\u0026rsquo;interface vether0 doit être traduit (NATé) vers les adresses IP faisant partie du groupe egress. La deuxième règle demande à ce que tout flux entrant qui vient du service domain (port 53) sur les protocoles udp et tcp depuis le réseau lié à l\u0026rsquo;interface vether0 soit redirigée vers le service en question. Les adresses IPv4 80.67.169.12 et 80.67.169.40 sont celles des serveurs DNS publics de la FDN. Elles peuvent être très bien celle de tout autre serveur DNS. La troisième règle autorise tout ce qui passe en entrée et en sortie sur l\u0026rsquo;interface vether0 depuis l\u0026rsquo;interface locale vers ailleurs… Quant à la quatrième, elle autorise tout du réseau, en entrée et en sortie, lié à l\u0026rsquo;interface vether0 vers partout ! Installation Démarrer la VM pour l\u0026rsquo;installation :\n:$ vmctl start -c bullseye\nChoisir le menu \u0026ldquo;Install\u0026rdquo; - NE PAS APPUYEZ sur la touche ENTRÉE ; appuyez sur la touche TAB pour éditer le menu. Il va falloir corriger la ligne : \u0026gt; /install.amd/vmlinuz vga=788 initrd=/install.amd/initrd.gz --- quiet en \u0026gt; /install.amd/vmlinuz vga=off initrd=/install.amd/initrd.gz --- quiet console=ttyS0,115200n8 ; une fois, transformée, appuyez sur la touche ENTRÉE !\nLe reste de l\u0026rsquo;installation de Debian se fait comme tout autre installation…\nLors de la configuration réseau, pensez bien à paramétrer la VM correctement, si nécessaire, revoyez le chapitre sur les précisions réseaux.\nUne fois l\u0026rsquo;installation terminée, ne redémarrez pas par le biais de l\u0026rsquo;installateur, choisissez d\u0026rsquo;exécuter le shell, puis écrivez la commande : :# halt afin d\u0026rsquo;arrêter la VM proprement !\nPour finir Une fois que vous avez fini l\u0026rsquo;installation de Debian dans votre VM, que vous avez fait les derniers réglages nécessaires pour son bon fonctionnement, pensez à éditer à nouveau le fichier /etc/vm.conf :\nSupprimer/commenter toute écriture relative à la déclaration cdrom… Remplacer le mot clé disable par enable pour la VM Debian - si vous désirez que la VM correspondante démarre, soit lors du démarrage de votre machine, si et seulement si le service vmd est bien actif et démarré lors du processus de démarrage machine, soit lorsque vous redémarrez le service vmd par vos soins. Voilà !\nDépannage vmctl vmm bios firmware not found Vous n\u0026rsquo;avez tout simplement pas installé le firmware vmm !\nvmx_fault_page: uvm_fault returns 14, GPA=0xffffca78, rip=0xfbd49 Si vous avez ce message d\u0026rsquo;erreur ou similaire dans dmesg, de fait malheureusement, vous ne pourrez pas faire de la virtualisation ! :(\nVoici un exemple - en anglais - de CPU Intel patché L1TF où le média de démarrage n\u0026rsquo;était pas trouvé.\nDocumentations FAQ Merci de lire la documentation officielle FAQ Virtualisation (EN), ou sa traduction officieuse FR. manpage vmctl(8) , vmd(8) , vm.conf(5) , vmm(4) VM guest sur le même réseau que l\u0026rsquo;hôte. Oui, il est possible que la VM invitée fasse partie du même segment IP que celui de votre hôte.\nJ\u0026rsquo;explique le propos dans cet article : [OpenBSD :: Virtualisation] Hôte et invité(s) sont sur le même bateau Si jamais vous vous y essayer après cet article, comprenez bien :\nle fonctionnement réseau, IP, les interfaces virtuelles bridge, vether, mais aussi et surtout tap. que les règles du parefeu sont de fait différentes et son fonctionnement, aussi ! et que non, dans ce cas, il n\u0026rsquo;y a pas besoin de la redirection NAT, donc il vous faudra supprimer/commenter les modifications sysctl. Mais tout est fait dans l\u0026rsquo;article, pour que vous compreniez bien le propos.\nEnjoy-IT! Enjoy-ID!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa virtualisation de machine virtuelle sous OpenBSD est officiellement\ndisponible nativement dans le système de base depuis OpenBSD 5.9.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion : \u003cstrong\u003enative\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eOS : OpenBSD \u003cstrong\u003e7.0\u003c/strong\u003e → \u003cstrong\u003e7.2\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour rappel : utiliser le virtualisateur vmd d\u0026rsquo;OpenBSD a quelques restrictions,\ndont celles de ne pas pouvoir utiliser d\u0026rsquo;interface graphique, …\u003c/p\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Ce tutoriel ne documente pas dans les moindres détails\nles phases d\u0026rsquo;installation, voire de configuration.\u003c/p\u003e\n\u003cp\u003eIl est \u003cstrong\u003eVRAIMENT\u003c/strong\u003e nécessaire de faire preuve de réflexion, discernement\net d\u0026rsquo;avoir un minimum de compétences, pour comprendre les liens entre les\ndifférentes briques !\u003c/p\u003e\n\u003cp\u003eMerci de votre compréhension…\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl est nécessaire que votre machine sur laquelle vous souhaitez virtualiser\nait un CPU compatible avec les fonctions adéquates. Pour le vérifier, tapez\ndans votre terminal/console la commande suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ dmesg | egrep \u003cspan style=\"color:#48b685\"\u003e\u0026#39;(VMX/EPT|SVM/RVI)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa réponse du système doit être :\u003c/p\u003e\n\u003cp\u003e⇒ pour CPU Intel :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmm0 at mainbus0: VMX/EPT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ pour CPU Amd :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmm0 at mainbus0: SVM/RVI\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi aucune ligne n\u0026rsquo;apparaît, aucune virtualisation ne sera possible. Par\nacquis de conscience, vérifiez votre BIOS|UEFI que celle-ci ne soit pas\ndésactivée.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eDe même, en rapport avec les failles CPU relatives à Meltdown, Spectre,\ncertains CPU Intel sont patchés pour remédier à \u003ca href=\"https://www.intel.fr/content/www/fr/fr/architecture-and-technology/l1tf.html\" rel=\"external\"\u003eL1TF\u003c/a\u003e.\nSous OpenBSD, ces CPU reçoivent un correctif approprié. Malheureusement,\ncela impacte la virtualisation et rend celle-ci difficile pour certains,\nvoire impossible.\u003cbr\u003e\nVous pouvez vous retrouver dans la situation où vous auriez un CPU\ncompatible, mais dans les faits, la virtualisation ne pourrait être\npleinement fonctionnelle.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePréférez AMD, en attendant ARM… voire RISC V.\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eIl est nécessaire d\u0026rsquo;installer le firmware \u003ccode\u003evmm\u003c/code\u003e pour que le kernel gère.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# fw_update vmm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003ePar convention, créons un répertoire \u0026lsquo;\u0026lsquo;vm\u0026rsquo;\u0026rsquo; dans notre répertoire personnel,\net nous travaillerons à partir de celui-ci : \u003cbr\u003e\n\u003ccode\u003e:$ mkdir vm \u0026amp;\u0026amp; cd vm\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"précisions-réseaux\"\u003ePrécisions réseaux\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e de l\u0026rsquo;hôte aura pour adresse IPv4 : \u003ccode\u003e192.168.0.1\u003c/code\u003e,\ncette adresse IP sera l\u0026rsquo;adresse de la passerelle pour l\u0026rsquo;interface\nréseau de la VM.\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;interface \u003ccode\u003eenp0s3\u003c/code\u003e de la VM Debian aura pour adresse IPv4 : \u003ccode\u003e192.168.0.2\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eDans les deux cas, le masque de réseau est de 24 bits.\u003c/li\u003e\n\u003cli\u003eLa passerelle de la VM sera l\u0026rsquo;adresse IP de l\u0026rsquo;interface vether ;)\u003c/li\u003e\n\u003cli\u003eLes serveurs DNS renseignés dans le fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e de la VM\nsont les serveurs publics de la FDN, respectueux de la confidentialité…\u003c/li\u003e\n\u003cli\u003eCes même serveurs DNS peuvent être renseignés dans la règle PF de\nredirection de flux DNS vers la VM.\u003c/li\u003e\n\u003cli\u003eCet article ne montre rien concernant, ou si peu, le fonctionnement\navec le protocole IPv6, mais les principes ci-dessus s\u0026rsquo;appliquent,\npourvu que vous comprenez ce que vous faites.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"création-de-limage-qcow2\"\u003eCréation de l\u0026rsquo;image qcow2\u003c/h2\u003e\n\u003cp\u003eDans les deux cas présentés, nous commencerons par créer la VM, très\nsimplement avec l\u0026rsquo;outil natif à OpenBSD, nommé \u003ccode\u003evmctl\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ vmctl create -s 50G ~/vm/bullseye.qcow2\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"téléchargement-de-liso-debian\"\u003eTéléchargement de l\u0026rsquo;iso Debian\u003c/h2\u003e\n\u003cp\u003eTéléchargeons l\u0026rsquo;iso Debian :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ ftp https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/{debian-11.5.0-amd64-netinst.iso,SHA512SUMS}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUne fois téléchargée, vérifions sa somme de contrôle : \\\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ sha512 -C SHA512SUMS debian-10.1.0-amd64-netinst.iso\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eSHA512\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e debian-10.1.0-amd64-netinst.iso: OK\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi \u003cstrong\u003eOK\u003c/strong\u003e, alors c\u0026rsquo;est bon… \u003cspan class=\"red\"\u003esinon, re-téléchargez\u003c/span\u003e\n !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration : \u003ccode\u003e/etc/vm.conf\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eswitch \u0026#34;sw\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einterface bridge0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003evm \u0026#34;bullseye\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edisable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ememory 1G\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ecdrom /home/id/vm/debian-11.5.0-amd64-netinst.iso\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edisk /home/id/vm/bullseye.qcow2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einterface { switch \u0026#34;sw\u0026#34; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eowner votre-identifiant\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien sûr, remplacez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/home/id\u003c/code\u003e par votre répertoire home\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003evotre-identifiant\u003c/code\u003e par votre identifiant de session\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVérifiez la configuration à l\u0026rsquo;aide de l\u0026rsquo;option \u003ccode\u003e-n\u003c/code\u003e de vmd :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ vmd -n\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAprès avoir configuré les \u003ca href=\"/fr/sys/openbsd/vm-debian-11-bullseye/#interfaces-réseaux\"\u003einterfaces réseaux\u003c/a\u003e,\nil faut maintenant démarrer le service de gestion des VMs :  \u003cbr\u003e\n\u003ccode\u003e:# rcctl enable vmd \u0026amp;\u0026amp; rcctl start vmd\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003epuis il faut s\u0026rsquo;occuper de la \u003ca href=\"/fr/sys/openbsd/vm-debian-11-bullseye/#nat\"\u003etraduction d\u0026rsquo;adresses réseaux\u003c/a\u003e,\net aussi des \u003ca href=\"/fr/sys/openbsd/vm-debian-11-bullseye/#pf\"\u003erègles du parefeu\u003c/a\u003e…\u003c/p\u003e\n\u003ch3 id=\"interfaces-réseaux\"\u003eInterfaces réseaux\u003c/h3\u003e\n\u003cp\u003eCréons les interfaces réseaux nécessaires que sont \u003ccode\u003evether0\u003c/code\u003e et \u003ccode\u003ebridge0\u003c/code\u003e\nqui permettront un contrôle fin de l\u0026rsquo;adressage IP et des règles PF.\u003c/p\u003e\n\u003ch4 id=\"bridge0\"\u003ebridge0\u003c/h4\u003e\n\u003cp\u003eLe fichier relatif est \u003ccode\u003e/etc/hostname.bridge0\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# echo \u0026quot;add vether0\u0026quot; \u0026gt; /etc/hostname.bridge0\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"vether0\"\u003evether0\u003c/h4\u003e\n\u003cp\u003eLe fichier relatif est \u003ccode\u003e/etc/hostname.vether0\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:#  echo \u0026quot;inet 192.168.0.1 255.255.255.0\u0026quot; \u0026gt; /etc/hostname.vether0\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eUne fois les fichiers d\u0026rsquo;interfaces créés, donnez des droits 0600 dessus,\npuis démarrez les deux interfaces :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chmod \u003cspan style=\"color:#f99b15\"\u003e0600\u003c/span\u003e /etc/hostname.\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003ebridge,vether\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sh /etc/netstart \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003ebridge,vether\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"nat\"\u003eNAT\u003c/h3\u003e\n\u003cp\u003eDans ce contexte où la VM invitée est sur un segment réseau différent de\nl\u0026rsquo;hôte, il faut autoriser la redirection des paquets IP, pour que la VM\npuisse communiquer sur Internet - \u003cem\u003ene serait-ce que pour faire les mises à jour\u003c/em\u003e…\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sysctl net.inet.ip.forwarding\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sysctl net.inet6.ip6.forwarding\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa première ligne est pour IPv4, la seconde pour IPv6.\u003c/p\u003e\n\u003cp\u003ePuis, pour garder les paramètres au redémarrage, modifiez le fichier\n\u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e pour ajouter :  \u003cbr\u003e\n\u003ccode\u003enet.inet.ip.forwarding=1\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003enet.inet6.ip6.forwarding=1\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier de configuration \u003ccode\u003e/etc/pf.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAjouter au moins les règles suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edomain\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;80.67.169.12 80.67.169.40\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch out on egress from (vether0:network) to any nat-to (egress)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick proto { udp tcp } from (vether0:network) to any port domain rdr-to { $domain } port domain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass on vether0 from 127.0.0.1 to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass on vether0 from (vether0:network) to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eLa première règle indique que tout ce qui vient du réseau lié à l\u0026rsquo;interface\n\u003ccode\u003evether0\u003c/code\u003e doit être traduit (NATé) vers les adresses IP faisant partie\ndu groupe \u003ccode\u003eegress\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eLa deuxième règle demande à ce que tout flux entrant qui vient du service\n\u003ccode\u003edomain\u003c/code\u003e (port \u003ccode\u003e53\u003c/code\u003e) sur les protocoles \u003ccode\u003eudp\u003c/code\u003e et \u003ccode\u003etcp\u003c/code\u003e depuis\nle réseau lié à l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e soit redirigée vers le service\nen question. \u003cbr\u003e\nLes adresses IPv4 \u003ccode\u003e80.67.169.12\u003c/code\u003e et \u003ccode\u003e80.67.169.40\u003c/code\u003e sont celles des\n\u003ca href=\"https://www.fdn.fr/actions/dns/\" rel=\"external\"\u003eserveurs DNS publics de la FDN\u003c/a\u003e.\n\u003cem\u003eElles peuvent être très bien celle de tout autre serveur DNS\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eLa troisième règle autorise tout ce qui passe en entrée et en sortie\nsur l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e depuis l\u0026rsquo;interface \u003ccode\u003elocale\u003c/code\u003e  vers ailleurs…\u003c/li\u003e\n\u003cli\u003eQuant à la quatrième, elle autorise tout du réseau, en entrée et en sortie,\nlié à l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e vers partout !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDémarrer la VM pour l\u0026rsquo;installation :\u003cbr\u003e\n\u003ccode\u003e:$ vmctl start -c bullseye\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChoisir le menu \u0026ldquo;Install\u0026rdquo; - \u003cstrong\u003eNE PAS APPUYEZ sur la touche \u003ckbd\u003eENTRÉE\u003c/kbd\u003e\u003c/strong\u003e ;\nappuyez sur la touche \u003ckbd\u003eTAB\u003c/kbd\u003e pour éditer le menu. Il va falloir\ncorriger la ligne : \u003cbr\u003e\n\u003ccode\u003e\u0026gt; /install.amd/vmlinuz vga=788 initrd=/install.amd/initrd.gz --- quiet\u003c/code\u003e en \u003cbr\u003e\n\u003ccode\u003e\u0026gt; /install.amd/vmlinuz vga=off initrd=/install.amd/initrd.gz --- quiet console=ttyS0,115200n8\u003c/code\u003e ; \u003cbr\u003e\nune fois, transformée, appuyez sur la touche \u003ckbd\u003eENTRÉE\u003c/kbd\u003e !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe reste de l\u0026rsquo;installation de Debian se fait comme tout autre installation…\u003c/p\u003e\n\u003cp\u003eLors de la configuration réseau, pensez bien à paramétrer la VM correctement,\nsi nécessaire, revoyez le chapitre sur les \u003ca href=\"/fr/sys/openbsd/vm-debian-11-bullseye/#précisions-réseaux\"\u003eprécisions réseaux\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUne fois l\u0026rsquo;installation terminée, ne redémarrez pas par le biais de l\u0026rsquo;installateur,\nchoisissez d\u0026rsquo;exécuter le shell, puis écrivez la commande : \u003cbr\u003e\n\u003ccode\u003e:# halt\u003c/code\u003e afin d\u0026rsquo;arrêter la VM proprement !\u003c/p\u003e\n\u003ch3 id=\"pour-finir\"\u003ePour finir\u003c/h3\u003e\n\u003cp\u003eUne fois que vous avez fini l\u0026rsquo;installation de Debian dans votre VM, que\nvous avez fait les derniers réglages nécessaires pour son bon fonctionnement,\npensez à éditer à nouveau le fichier \u003ccode\u003e/etc/vm.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSupprimer/commenter toute écriture relative à la déclaration \u003ccode\u003ecdrom\u003c/code\u003e…\u003c/li\u003e\n\u003cli\u003eRemplacer le mot clé \u003ccode\u003edisable\u003c/code\u003e par \u003ccode\u003eenable\u003c/code\u003e pour la VM Debian -\nsi vous désirez que la VM correspondante démarre, soit lors du démarrage\nde votre machine, si et seulement si le service \u003ccode\u003evmd\u003c/code\u003e est bien actif\net démarré lors du processus de démarrage machine, soit lorsque vous\nredémarrez le service \u003ccode\u003evmd\u003c/code\u003e par vos soins.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"vmctl-vmm-bios-firmware-not-found\"\u003evmctl vmm bios firmware not found\u003c/h3\u003e\n\u003cp\u003eVous n\u0026rsquo;avez tout simplement pas installé le firmware \u003cstrong\u003evmm\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"vmx_fault_page-uvm_fault-returns-14-gpa0xffffca78-rip0xfbd49\"\u003evmx_fault_page: uvm_fault returns 14, GPA=0xffffca78, rip=0xfbd49\u003c/h3\u003e\n\u003cp\u003eSi vous avez ce message d\u0026rsquo;erreur ou similaire dans dmesg, de fait\nmalheureusement, vous ne pourrez pas faire de la virtualisation ! :(\u003c/p\u003e\n\u003cp\u003eVoici un \u003ca href=\"http://daemonforums.org/showthread.php?t=11628\" rel=\"external\"\u003eexemple\u003c/a\u003e - \u003cem\u003een anglais\u003c/em\u003e -\nde CPU Intel patché L1TF où le média de démarrage n\u0026rsquo;était pas trouvé.\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003ch3 id=\"faq\"\u003eFAQ\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eMerci de lire la documentation officielle \u003cstrong\u003eFAQ Virtualisation\u003c/strong\u003e (\u003ca href=\"https://www.openbsd.org/faq/faq16.html\" rel=\"external\"\u003eEN\u003c/a\u003e),\nou sa traduction officieuse \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/faq16\" rel=\"external\"\u003eFR\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manpage\"\u003emanpage\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmctl.8\" title=\"Page du Manuel OpenBSD pour : vmctl\"\u003evmctl(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmd.8\" title=\"Page du Manuel OpenBSD pour : vmd\"\u003evmd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/vm.conf.5\" title=\"Page du Manuel OpenBSD pour : vm.conf\"\u003evm.conf(5)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmm.4\" title=\"Page du Manuel OpenBSD pour : vmm\"\u003evmm(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"vm-guest-sur-le-même-réseau-que-lhôte\"\u003eVM guest sur le même réseau que l\u0026rsquo;hôte.\u003c/h3\u003e\n\u003cp\u003eOui, il est possible que la VM invitée fasse partie du même segment IP\nque celui de votre hôte.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;explique le propos dans cet article : \n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/vmd-hote-invite-meme-reseau/\" title=\"Lien interne vers l\u0026#39;article : '[OpenBSD :: Virtualisation] Hôte et invité(s) sont sur le même bateau'\"\u003e[OpenBSD :: Virtualisation] Hôte et invité(s) sont sur le même bateau\u003c/a\u003e\n\n\u003c/p\u003e\n\u003cp\u003eSi jamais vous vous y essayer après cet article, comprenez bien :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fonctionnement réseau, IP, les interfaces virtuelles bridge, vether,\nmais aussi et surtout tap.\u003c/li\u003e\n\u003cli\u003eque les règles du parefeu sont de fait différentes et son fonctionnement,\naussi !\u003c/li\u003e\n\u003cli\u003eet que non, dans ce cas, il n\u0026rsquo;y a pas besoin de la redirection \u003ca href=\"/fr/sys/openbsd/vm-debian-11-bullseye/#nat\"\u003eNAT\u003c/a\u003e,\ndonc il vous faudra supprimer/commenter les modifications \u003ccode\u003esysctl\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMais tout est fait dans l\u0026rsquo;article, pour que vous compreniez bien le propos.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-IT! \u003cbr\u003e\nEnjoy-ID!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Virtualiser Debian Bullseye (11.x) sous OpenBSD grâce à vmd",
            "tags": ["OpenBSD", "Virtualisation", "Debian", "Bullseye", "vmd"],
            "date_published": "2022-11-28T17:36:21+01:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:63c19ccc-c376-cb4c-b079-f051fe3f1796",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/moc/",
            "title": "moc - Music on Console / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description MOC (musique en console) est un lecteur audio en mode console/terminal pour Linux/Unix conçu pour être puissant et simple à utiliser.\nLa lecture faite par MOC est fluide, quelle que soit la charge du système ou des E/S , car elle utilise le tampon de sortie dans un thread/processus séparé. Il permet une lecture sans interruption car le prochain fichier à lire est mis en cache pendant la lecture du fichier en cours.\nLes formats de fichiers supportés sont : MP3, Ogg Vorbis, FLAC, Musepack (mpc), Speex, Opus, WAVE, tous ceux supportés par la bibliothèque FFmpeg/LibAV (e.g., WMA, RealAudio, AAC, MP4), AIFF, AU, SVX, Sphere Nist WAV, IRCAM SF, Creative VOC, SID, wavpack.\nSite web : http://moc.daper.net/ Architectures supportées : aarch64 alpha amd64 arm hppa i386 mips64 mips64el powerpc powerpc64 riscv64 sh sparc64 Ce lecteur audio est pratique pour exécuter de l\u0026rsquo;audio sur un serveur multimédia, par le biais d\u0026rsquo;une session SSH, en mode console.\nInstallation Sous OpenBSD, installez moc !\nUtilisation Très simplement, dans un terminal ou en mode console, un appel du binaire mocp suffit. C\u0026rsquo;est une interface ressemblant à celle de Midnight Commander, avec deux fenêtres, une à gauche pour naviguer dans le système de fichiers, l\u0026rsquo;autre affichant la playlist en cours, sinon l\u0026rsquo;espace est vide.\nVoici quelques interactions possibles depuis l\u0026rsquo;appui de touches :\nla touche a permet d\u0026rsquo;ajouter un répertoire/fichier dans la playlist\nla touche h permet d\u0026rsquo;avoir accès à la liste des différentes commandes\nla touche L affiche les paroles si elles sont disponibles\nla touche n permet de passer au morceau suivant\nla touche o permet de jouer une piste musicale depuis une URL\nles touches p et ESPACE permettent de mettre en pause\nla touche q ferme le lecteur, sans arrêter la lecture audio\nla touche Q arrête la lecture et ferme le lecteur, et la connexion au serveur de son\nla touche R active ou non la relecture\nla touche s arrête la lecture musicale\nla touche S active ou non la lecture aléatoire\nla touche V permet d\u0026rsquo;enregistrer la playlist, là où vous le désirez et au nom que vous désirez\nla touche X active ou non la prise en charge de la lecture suivante\nla touche , diminue le son de 5%\nla touche . augmente le son de 5%\netc…\nCapture d'écran du logiciel mocp en cours de fonctionnement Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMOC\u003c/strong\u003e (musique en console) est un lecteur audio en mode console/terminal\npour Linux/Unix conçu pour être puissant et simple à utiliser.\u003c/p\u003e\n\u003cp\u003eLa lecture faite par MOC est fluide, quelle que soit la charge du système\nou des \u003cabbr title=\"Entrées/Sorties\"\u003eE/S\u003c/abbr\u003e\n, car elle utilise le tampon\nde sortie dans un thread/processus séparé. Il permet une lecture sans\ninterruption car le prochain fichier à lire est mis en cache pendant la\nlecture du fichier en cours.\u003c/p\u003e\n\u003cp\u003eLes formats de fichiers supportés sont : MP3, Ogg Vorbis, FLAC, Musepack (mpc),\nSpeex, Opus, WAVE, tous ceux supportés par la bibliothèque FFmpeg/LibAV\n(e.g., WMA, RealAudio, AAC, MP4), AIFF, AU, SVX, Sphere Nist WAV, IRCAM SF,\nCreative VOC, SID, wavpack.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"http://moc.daper.net/\" rel=\"external\"\u003ehttp://moc.daper.net/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eArchitectures supportées : aarch64 alpha amd64 arm hppa i386 mips64\nmips64el powerpc powerpc64 riscv64 sh sparc64\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eCe lecteur audio est pratique pour exécuter de l\u0026rsquo;audio sur un serveur\nmultimédia, par le biais d\u0026rsquo;une session SSH, en mode console.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD, \u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n\n\u003cstrong\u003e\u003ccode\u003emoc\u003c/code\u003e\u003c/strong\u003e\u003c/strong\u003e !\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eTrès simplement, dans un terminal ou en mode console, un appel du binaire\n\u003ccode\u003emocp\u003c/code\u003e suffit. \u003cbr\u003e\nC\u0026rsquo;est une interface ressemblant à celle de Midnight Commander, avec deux\nfenêtres, une à gauche pour naviguer dans le système de fichiers, l\u0026rsquo;autre\naffichant la playlist en cours, sinon l\u0026rsquo;espace est vide.\u003c/p\u003e\n\u003cp\u003eVoici quelques interactions possibles depuis l\u0026rsquo;appui de touches :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003ea\u003c/kbd\u003e permet d\u0026rsquo;ajouter un répertoire/fichier dans la playlist\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eh\u003c/kbd\u003e permet d\u0026rsquo;avoir accès à la liste des différentes commandes\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eL\u003c/kbd\u003e affiche les paroles si elles sont disponibles\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003en\u003c/kbd\u003e permet de passer au morceau suivant\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eo\u003c/kbd\u003e permet de jouer une piste musicale depuis une URL\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles touches \u003ckbd\u003ep\u003c/kbd\u003e et \u003ckbd\u003eESPACE\u003c/kbd\u003e permettent de mettre en pause\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eq\u003c/kbd\u003e ferme le lecteur, sans arrêter la lecture audio\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eQ\u003c/kbd\u003e arrête la lecture et ferme le lecteur, et la\nconnexion au serveur de son\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eR\u003c/kbd\u003e active ou non la relecture\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003es\u003c/kbd\u003e arrête la lecture musicale\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eS\u003c/kbd\u003e active ou non la lecture aléatoire\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eV\u003c/kbd\u003e permet d\u0026rsquo;enregistrer la playlist, là où vous le\ndésirez et au nom que vous désirez\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003eX\u003c/kbd\u003e active ou non la prise en charge de la lecture\nsuivante\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003e,\u003c/kbd\u003e diminue le son de 5%\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela touche \u003ckbd\u003e.\u003c/kbd\u003e augmente le son de 5%\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eetc…\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/mocp.png\" title=\"Capture d\u0026#39;écran du logiciel mocp en cours de fonctionnement\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/mocp_hu_6bc0ffd41f8066be.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Capture d\u0026#39;écran du logiciel mocp en cours de fonctionnement\" height=\"152\" loading=\"lazy\" src=\"/images/openbsd/mocp_hu_8318cfe41fc16dbc.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eCapture d'écran du logiciel mocp en cours de fonctionnement\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Écouter de l'audio en mode console sous OpenBSD, avec le lecteur mocp, du projet moc",
            "tags": ["OpenBSD", "moc"],
            "date_published": "2022-11-24T18:48:06+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:66458b85-ce84-2f4d-e453-b995ba4f1c46",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/introduction-influxdb-openbsd/",
            "title": "Influxdb : Introduction (OpenBSD)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Introduction Get\u0026rsquo;in Start: #!/bin/introduction\ninfluxdb est une base de données de séries temporelles. Elle s\u0026rsquo;utilise en complément de logiciels tiers, tels des services collectant des métriques systèmes et applications, à intervalles réguliers (telegraf, collectd) ainsi que des logiciels générant des graphes personnalisés par le biais de requêtes sur la base de données (Grafana, …)\nInstallation Sous OpenBSD ≤ 7.3, influxdb est disponible en tant que paquet, dans sa version 1.x.\nUn groupe _influx et un utilisateur _influx sont créés.\nVérification de démarrage ⇒ Après avoir démarré le service influxdb, il est possible de vérifier le bon fonctionnement de la base de données.\nDeux manières :\nEn requêtant directement la base de données : :$ influx Connected to http://localhost:8086 version unknown InfluxDB shell version: unknown \u0026gt; show databases name: databases name ---- _internal En utilisant l\u0026rsquo;outil curl pour tester une réponse locale par requête HTTP : :$ curl -G http://localhost:8086/query --data-urlencode \u0026#34;q=SHOW DATABASES\u0026#34; {\u0026#34;results\u0026#34;:[{\u0026#34;statement_id\u0026#34;:0,\u0026#34;series\u0026#34;:[{\u0026#34;name\u0026#34;:\u0026#34;databases\u0026#34;,\u0026#34;columns\u0026#34;:[\u0026#34;name\u0026#34;],\u0026#34;values\u0026#34;:[[\u0026#34;_internal\u0026#34;]]}]}]} Dans les deux cas, si vous avez le même résultat, c\u0026rsquo;est tout bon !\nConfiguration Le fichier de configuration : /etc/influxdb/influxdb.conf\nUtilisateur admin Avant de toucher au fichier de configuration, créons un premier utilisateur administrateur :\n:$ doas influx Connected to http://localhost:8086 version unknown InfluxDB shell version: unknown \u0026gt; CREATE USER admin WITH PASSWORD \u0026#39;password\u0026#39; WITH ALL PRIVILEGES \u0026gt; SHOW USERS user admin ---- ----- admin true \u0026gt; QUIT Ici, le nom de l\u0026rsquo;utilisateur est admin avec des droits d\u0026rsquo;administrateur. password est pour l\u0026rsquo;exemple… La prochaine connexion à la base de données nécessitera d\u0026rsquo;utiliser le compte administrateur.\nLà, encore deux manières de faire :\nconnexion puis utilisation de la commande auth : :$ influx Connected to http://localhost:8086 version unknown InfluxDB shell version: unknown \u0026gt; auth username: admin password: \u0026gt; *n instructions* \u0026gt; QUIT connexion en précisant directement le nom de l\u0026rsquo;utilisateur en argument : :$ influx -username admin -password \u0026#39;\u0026#39; password: Connected to http://localhost:8086 version unknown InfluxDB shell version: unknown \u0026gt; quit (en réalité, il existe d\u0026rsquo;autres manières de faire…)\nSi c\u0026rsquo;est bon dans les deux cas, c\u0026rsquo;est tout bon !\nÀ partir de maintenant, la base de données n\u0026rsquo;est pas ouverte à tout le monde.\nAuthentification HTTP Pour activer l\u0026rsquo;authentification HTTP, il faut modifier le fichier de configuration. Aller à la section [http] puis décommenter à minima les variables suivantes :\nenabled = true auth-enabled = true [http] # Determines whether HTTP endpoint is enabled. enabled = true # Determines whether the Flux query endpoint is enabled. # flux-enabled = false # Determines whether the Flux query logging is enabled. # flux-log-enabled = false # The bind address used by the HTTP service. bind-address = \u0026#34;:8086\u0026#34; # Determines whether user authentication is enabled over HTTP/HTTPS. auth-enabled = true (…) Puis redémarrer le service…\nTestons à nouveau une requête HTTP :\n:$ curl -G http://localhost:8086/query --data-urlencode \u0026#34;q=SHOW DATABASES\u0026#34; {\u0026#34;error\u0026#34;:\u0026#34;unable to parse authentication credentials\u0026#34;} Puisqu\u0026rsquo;il demande une authentification, utilisons curl en précisant l\u0026rsquo;utilisateur :\n:$ curl -G http://localhost:8086/query -u admin -p \u0026#39;\u0026#39; --data-urlencode \u0026#34;q=SHOW DATABASES\u0026#34; Enter host password for user \u0026#39;admin\u0026#39;: {\u0026#34;results\u0026#34;:[{\u0026#34;statement_id\u0026#34;:0,\u0026#34;series\u0026#34;:[{\u0026#34;name\u0026#34;:\u0026#34;databases\u0026#34;,\u0026#34;columns\u0026#34;:[\u0026#34;name\u0026#34;],\u0026#34;values\u0026#34;:[[\u0026#34;_internal\u0026#34;]]}]}]} Après avoir entré le bon mot-de-passe, la requête pour voir les bases de données aboutit bien.\nSi c\u0026rsquo;est le cas, nous avons réussi le principal : installer influxdb, faire une configuration de base fonctionnelle. Voilà.\nHTTPS Maintenant, allons plus loin, pour utiliser le protocole HTTPS qui permettra de sécuriser la connexion avec les autres services, d\u0026rsquo;autant si ceux-ci sont à distance.\nCréation des certificats InfoDans ce contexte tutoriel, nous utilisons des certificats auto-signés. En conséquence, ils ne sont pas certifiés par une Autorité de Certification.\nPas besoin de passer par cette étape, si vous utiliser une AC ; il suffit de renseigner le chemin absolu vers les certificats générés par l\u0026rsquo;AC. Dans ce cas, allez directement à la partie de la configuration correspondante à la section [http].\nIci, nous utilisons l\u0026rsquo;outil certtool :\n:$ apropos certtool certtool(1) - GnuTLS certificate tool Si le paquet gnutls n\u0026rsquo;est pas installé, faites-le.\nPuis avec des droits administrateurs, allez dans /etc/ssl, créer un répertoire influxdb dans lequel faire les opérations suivantes :\n:# mkdir -p /etc/ssl/influxdb :# cd /etc/ssl/influxdb ⇒ Création de la clé privée\n:# certtool -p --hash SHA3-256 --sec-param ULTRA --outfile $(hostname).priv.k.pem ⇒ puis création de la clé publique :\n:# certtool -s --load-privkey $(hostname).priv.k.pem --outfile $(hostname).cert.pem qui vous posera plein de questions concernant l\u0026rsquo;identification, raison sociale et le but de ce certificat.\nAstuceLors de la génération du certificat publique, il vous a été demandé une période en nombre de jours de validité. Faites-vous un mémo, selon la périodicité, pour vous générer une nouvelle clé publique, si besoin, avant la fin de ladite période. Autrement votre service par HTTPS deviendrait indisponible à date échue. ⇒ modifions les droits utilisateurs :\n:# chown _influx:_influx *.pem Ceci étant fait, retournons modifier le fichier de configuration, à nouveau à la section [http], mais cette fois-ci pour modifier les valeurs suivantes :\nhttps-enabled = true https-certificate = \u0026quot;/etc/ssl/influxdb/votre-nom-hote.cert.pem\u0026quot; https-private-key = \u0026quot;/etc/ssl/influxdb/votre-nom-hote.priv.k.pem\u0026quot; (…) # Determines whether HTTPS is enabled. https-enabled = true # The SSL certificate to use when HTTPS is enabled. https-certificate = \u0026#34;/etc/ssl/influxdb/votre-nom-hote.cert.pem\u0026#34; # Use a separate private key location. https-private-key = \u0026#34;/etc/ssl/influxdb/votre-nom-hote.priv.k.pem\u0026#34; (…) ⇒ Relancer le service !\nTestons la connexion :\n:$ influx -ssl -unsafeSsl -username admin -password \u0026#39;\u0026#39; password: Connected to https://localhost:8086 version unknown InfluxDB shell version: unknown \u0026gt; SHOW DATABASES name: databases name ---- _internal \u0026gt; SHOW USERS user admin ---- ----- admin true \u0026gt; QUIT $ curl -G https://localhost:8086/query -k -u admin -p \u0026#39;\u0026#39; --data-urlencode \u0026#34;q=SHOW DATABASES\u0026#34; Enter host password for user \u0026#39;admin\u0026#39;: {\u0026#34;results\u0026#34;:[{\u0026#34;statement_id\u0026#34;:0,\u0026#34;series\u0026#34;:[{\u0026#34;name\u0026#34;:\u0026#34;databases\u0026#34;,\u0026#34;columns\u0026#34;:[\u0026#34;name\u0026#34;],\u0026#34;values\u0026#34;:[[\u0026#34;_internal\u0026#34;]]}]}]} Remarquez l\u0026rsquo;utilisation de l\u0026rsquo;option -k, sans elle, étant donné ce contexte d\u0026rsquo;utilisation de certificats auto-signés, curl refuserait de se connecter avec le message d\u0026rsquo;erreur suivant : curl: (60) SSL certificate problem: unable to get local issuer certificate\nJournalisation HTTP Par défaut, la journalisation des traces HTTP(S) se fait dans le moteur interne de journalisation d\u0026rsquo;influxdb et sera visible dans le log \u0026lsquo;daemon\u0026rsquo;.\nIl est possible de changer ce comportement pour avoir le suivi HTTP(S) au sein d\u0026rsquo;un fichier dédié. Toujours dans la section [http], modifiez la variable access-log-path.\nAvant de redémarrer le service, créer impérativement le répertoire dans lequel influxdb écrira le fichier log et donnez lui les droits systèmes liés, tel que :\n:# mkdir -p /var/log/influxdb/ :# chown _influx:_influx /var/log/influxdb/ Puis pour la configuration :\naccess-log-path = \u0026#34;/var/log/influxdb/access.log\u0026#34; Pour finir, pensez à modifier le fichier /etc/newsyslog.conf pour ajouter une ligne, telle que :\n/var/log/influxdb/access.log _influx:_influx 644 7 * * Z EOD End of Documentation\nVoilà. Maintenant, influxdb est prêt pour une utilisation interne et n\u0026rsquo;attend plus qu\u0026rsquo;à être configurer pour discuter avec tout plein d\u0026rsquo;autres services…\nDépannage curl curl se plaint… et me casse les pieds, par la même occasion. Voici quelques pistes face à certaines erreurs :\ncurl: (35) error:1400442E:SSL routines:CONNECT_CR_SRVR_HELLO:tlsv1 alert protocol version Êtes-vous sûr d\u0026rsquo;avoir activer l\u0026rsquo;option https-enabled dans la section [http] ?\nVérifiez !\ncurl: (60) SSL certificate problem: unable to get local issuer certificate Comme le contexte d\u0026rsquo;utilisation décrit dans ce guide de démarrage, vous avez généré vos propres certificats sans utiliser d\u0026rsquo;Autorité de Certification.\nAjoutez l\u0026rsquo;option -k !\ninfluxdb unable to open access log, falling back to stderr Le message d\u0026rsquo;erreur dans le log daemon est du type :\nlvl=error msg=\u0026quot;unable to open access log, falling back to stderr\u0026quot; log_id=0eMCqvRl000 service=httpd error=\u0026quot;open /var/log/influxdb/: is a directory\u0026quot; path=/var/log/influxdb/\nLe chemin spécifié dans la variable access-log-path est soit inexistant, soit influxdb n\u0026rsquo;a pas les droits systèmes pour y accéder.\nVérifiez !\nDocumentation https://docs.influxdata.com/influxdb/v1.8/administration/config/ https://docs.influxdata.com/influxdb/v1.8/administration/authentication_and_authorization/ ",
            "content_html": "\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGet\u0026rsquo;in Start: \u003ccode\u003e#!/bin/introduction\u003c/code\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003einfluxdb\u003c/strong\u003e est une base de données de séries temporelles. Elle s\u0026rsquo;utilise\nen complément de logiciels tiers, tels des services collectant des métriques\nsystèmes et applications, à intervalles réguliers (\u003cstrong\u003etelegraf\u003c/strong\u003e, \u003cstrong\u003ecollectd\u003c/strong\u003e)\nainsi que des logiciels générant des graphes personnalisés par le biais\nde requêtes sur la base de données (\u003cstrong\u003eGrafana\u003c/strong\u003e, …)\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD ≤ 7.3, \u003cstrong\u003einfluxdb\u003c/strong\u003e est disponible en tant que paquet,\ndans sa version \u003cstrong\u003e1.x\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUn groupe \u003ccode\u003e_influx\u003c/code\u003e et un utilisateur \u003ccode\u003e_influx\u003c/code\u003e sont créés.\u003c/p\u003e\n\u003ch2 id=\"vérification-de-démarrage\"\u003eVérification de démarrage\u003c/h2\u003e\n\u003cp\u003e⇒ Après avoir démarré le service \u003cstrong\u003e\u003ccode\u003einfluxdb\u003c/code\u003e\u003c/strong\u003e, il est possible de vérifier\nle bon fonctionnement de la base de données.\u003c/p\u003e\n\u003cp\u003eDeux manières :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eEn requêtant directement la base de données :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ influx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnected to http://localhost:8086 version unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInfluxDB shell version: unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; show databases\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ename: databases\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ename\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e----\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_internal\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eEn utilisant l\u0026rsquo;outil \u003cstrong\u003ecurl\u003c/strong\u003e pour tester une réponse locale par requête\nHTTP :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ curl -G http://localhost:8086/query --data-urlencode \u003cspan style=\"color:#48b685\"\u003e\u0026#34;q=SHOW DATABASES\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;results\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;statement_id\u0026#34;\u003c/span\u003e:0,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;series\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;databases\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;columns\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;values\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_internal\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]]}]}]}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans les deux cas, si vous avez le même résultat, c\u0026rsquo;est tout bon !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration : \u003ccode\u003e/etc/influxdb/influxdb.conf\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"utilisateur-admin\"\u003eUtilisateur admin\u003c/h3\u003e\n\u003cp\u003eAvant de toucher au fichier de configuration, \u003cstrong\u003ecréons un premier utilisateur\u003c/strong\u003e\nadministrateur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas influx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnected to http://localhost:8086 version unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInfluxDB shell version: unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; CREATE USER admin WITH PASSWORD \u003cspan style=\"color:#48b685\"\u003e\u0026#39;password\u0026#39;\u003c/span\u003e WITH ALL PRIVILEGES\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; SHOW USERS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euser   admin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e----   -----\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eadmin true\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; QUIT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eIci, le nom de l\u0026rsquo;utilisateur est \u003cem\u003e\u003ccode\u003eadmin\u003c/code\u003e\u003c/em\u003e avec des droits d\u0026rsquo;administrateur.\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e\u003ccode\u003epassword\u003c/code\u003e\u003c/em\u003e est pour l\u0026rsquo;exemple…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLa prochaine connexion à la base de données nécessitera d\u0026rsquo;utiliser le compte\nadministrateur.\u003c/p\u003e\n\u003cp\u003eLà, encore deux manières de faire :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003econnexion puis utilisation de la commande \u003ccode\u003eauth\u003c/code\u003e :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ influx\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnected to http://localhost:8086 version unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInfluxDB shell version: unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; auth\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusername: admin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epassword:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; *n instructions*\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; QUIT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003econnexion en précisant directement le nom de l\u0026rsquo;utilisateur en argument :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ influx -username admin -password \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epassword:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnected to http://localhost:8086 version unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInfluxDB shell version: unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; quit\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(en réalité, il existe d\u0026rsquo;autres manières de faire…)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est bon dans les deux cas, c\u0026rsquo;est tout bon !\u003c/p\u003e\n\u003cp\u003eÀ partir de maintenant, la base de données n\u0026rsquo;est pas ouverte à tout le monde.\u003c/p\u003e\n\u003ch3 id=\"authentification-http\"\u003eAuthentification HTTP\u003c/h3\u003e\n\u003cp\u003ePour activer l\u0026rsquo;authentification HTTP, il faut modifier le fichier de configuration.\nAller à la section \u003ccode\u003e[http]\u003c/code\u003e puis décommenter à minima les variables suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eenabled = true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauth-enabled = true\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[http]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# Determines whether HTTP endpoint is enabled.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eenabled\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# Determines whether the Flux query endpoint is enabled.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# flux-enabled = false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# Determines whether the Flux query logging is enabled.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# flux-log-enabled = false\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# The bind address used by the HTTP service.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003ebind-address\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;:8086\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# Determines whether user authentication is enabled over HTTP/HTTPS.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eauth-enabled\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis \u003cstrong\u003eredémarrer\u003c/strong\u003e le service…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eTestons à nouveau une requête HTTP :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ curl -G http://localhost:8086/query --data-urlencode \u003cspan style=\"color:#48b685\"\u003e\u0026#34;q=SHOW DATABASES\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;error\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;unable to parse authentication credentials\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuisqu\u0026rsquo;il demande une authentification, utilisons curl en précisant l\u0026rsquo;utilisateur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ curl -G http://localhost:8086/query -u admin -p \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e --data-urlencode \u003cspan style=\"color:#48b685\"\u003e\u0026#34;q=SHOW DATABASES\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter host password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e user \u003cspan style=\"color:#48b685\"\u003e\u0026#39;admin\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;results\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;statement_id\u0026#34;\u003c/span\u003e:0,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;series\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;databases\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;columns\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;values\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_internal\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]]}]}]}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAprès avoir entré le bon mot-de-passe, la requête pour voir les bases de\ndonnées aboutit bien.\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est le cas, nous avons réussi le principal : installer influxdb, faire\nune configuration de base fonctionnelle. Voilà.\u003c/p\u003e\n\u003ch3 id=\"https\"\u003eHTTPS\u003c/h3\u003e\n\u003cp\u003eMaintenant, allons plus loin, pour utiliser le protocole HTTPS qui permettra\nde sécuriser la connexion avec les autres services, d\u0026rsquo;autant si ceux-ci\nsont à distance.\u003c/p\u003e\n\u003ch4 id=\"création-des-certificats\"\u003eCréation des certificats\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eDans ce contexte tutoriel, nous utilisons des certificats auto-signés.\nEn conséquence, ils ne sont pas certifiés par une Autorité de Certification.\u003c/p\u003e\n\u003cp\u003ePas besoin de passer par cette étape, si vous utiliser une AC ; il suffit\nde renseigner le chemin absolu vers les certificats générés par l\u0026rsquo;AC. \u003cbr\u003e\nDans ce cas, allez directement à la partie de la configuration correspondante\nà la section \u003ccode\u003e[http]\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIci, nous utilisons l\u0026rsquo;outil \u003cstrong\u003e\u003ccode\u003ecerttool\u003c/code\u003e\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ apropos certtool\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecerttool\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e - GnuTLS certificate tool\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi le paquet \u003cstrong\u003egnutls\u003c/strong\u003e n\u0026rsquo;est pas installé, faites-le.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePuis avec des droits administrateurs, allez dans \u003ccode\u003e/etc/ssl\u003c/code\u003e, créer un\nrépertoire \u003ccode\u003einfluxdb\u003c/code\u003e dans lequel faire les opérations suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /etc/ssl/influxdb\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cd /etc/ssl/influxdb\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Création de la clé privée\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# certtool -p --hash SHA3-256 --sec-param ULTRA --outfile \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e.priv.k.pem\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ puis création de la clé publique :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# certtool -s --load-privkey \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e.priv.k.pem --outfile \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e.cert.pem\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003equi vous posera plein de questions concernant l\u0026rsquo;identification, raison\nsociale et le but de ce certificat.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eLors de la génération du certificat publique, il vous a été demandé\nune période en nombre de jours de validité. Faites-vous un mémo, selon\nla périodicité, pour vous générer une nouvelle clé publique, si besoin,\navant la fin de ladite période. Autrement votre service par HTTPS\ndeviendrait indisponible à date échue.\u003c/div\u003e\n\n\u003cp\u003e⇒ modifions les droits utilisateurs :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown _influx:_influx *.pem\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eCeci étant fait, retournons modifier le fichier de configuration, à nouveau\nà la section \u003ccode\u003e[http]\u003c/code\u003e, mais cette fois-ci pour modifier les valeurs suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ehttps-enabled = true\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttps-certificate = \u0026quot;/etc/ssl/influxdb/votre-nom-hote.cert.pem\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttps-private-key = \u0026quot;/etc/ssl/influxdb/votre-nom-hote.priv.k.pem\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# Determines whether HTTPS is enabled.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003ehttps-enabled\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# The SSL certificate to use when HTTPS is enabled.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003ehttps-certificate\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/ssl/influxdb/votre-nom-hote.cert.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e# Use a separate private key location.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003ehttps-private-key\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/ssl/influxdb/votre-nom-hote.priv.k.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Relancer le service !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eTestons la connexion :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ influx -ssl -unsafeSsl -username admin -password \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epassword:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConnected to https://localhost:8086 version unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInfluxDB shell version: unknown\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; SHOW DATABASES\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ename: databases\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ename\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e----\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_internal\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; SHOW USERS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euser     admin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e----     -----\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eadmin   true\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; QUIT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ curl -G https://localhost:8086/query -k -u admin -p \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e --data-urlencode \u003cspan style=\"color:#48b685\"\u003e\u0026#34;q=SHOW DATABASES\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter host password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e user \u003cspan style=\"color:#48b685\"\u003e\u0026#39;admin\u0026#39;\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;results\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;statement_id\u0026#34;\u003c/span\u003e:0,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;series\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;databases\u0026#34;\u003c/span\u003e,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;columns\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e,\u003cspan style=\"color:#48b685\"\u003e\u0026#34;values\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#5bc4bf\"\u003e[[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_internal\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]]}]}]}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRemarquez l\u0026rsquo;utilisation de l\u0026rsquo;option \u003ccode\u003e-k\u003c/code\u003e, sans elle, étant donné ce\ncontexte d\u0026rsquo;utilisation de certificats auto-signés, curl refuserait de se\nconnecter avec le message d\u0026rsquo;erreur suivant : \u003cbr\u003e\n\u003ccode\u003ecurl: (60) SSL certificate problem: unable to get local issuer certificate\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"journalisation-http\"\u003eJournalisation HTTP\u003c/h3\u003e\n\u003cp\u003ePar défaut, la journalisation des traces HTTP(S) se fait dans le moteur\ninterne de journalisation d\u0026rsquo;influxdb et sera visible dans le log \u0026lsquo;daemon\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003eIl est possible de changer ce comportement pour avoir le suivi HTTP(S)\nau sein d\u0026rsquo;un fichier dédié. Toujours dans la section \u003ccode\u003e[http]\u003c/code\u003e, modifiez\nla variable \u003ccode\u003eaccess-log-path\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAvant de redémarrer le service, créer impérativement le répertoire dans\nlequel influxdb écrira le fichier log et donnez lui les droits systèmes\nliés, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /var/log/influxdb/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown _influx:_influx /var/log/influxdb/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis pour la configuration :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eaccess-log-path\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/log/influxdb/access.log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour finir, pensez à modifier le fichier \u003ccode\u003e/etc/newsyslog.conf\u003c/code\u003e pour ajouter\nune ligne, telle que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/log/influxdb/access.log    _influx:_influx 644     7       *       *       Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"eod\"\u003eEOD\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnd of Documentation\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eVoilà. Maintenant, influxdb est prêt pour une utilisation interne et\nn\u0026rsquo;attend plus qu\u0026rsquo;à être configurer pour discuter avec tout plein d\u0026rsquo;autres\nservices…\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"curl\"\u003ecurl\u003c/h3\u003e\n\u003cp\u003ecurl se plaint… et me casse les pieds, par la même occasion.\nVoici quelques pistes face à certaines erreurs :\u003c/p\u003e\n\u003ch4 id=\"curl-35-error1400442essl-routinesconnect_cr_srvr_hellotlsv1-alert-protocol-version\"\u003ecurl: (35) error:1400442E:SSL routines:CONNECT_CR_SRVR_HELLO:tlsv1 alert protocol version\u003c/h4\u003e\n\u003cp\u003eÊtes-vous sûr d\u0026rsquo;avoir activer l\u0026rsquo;option \u003ccode\u003ehttps-enabled\u003c/code\u003e dans la section \u003ccode\u003e[http]\u003c/code\u003e ?\u003c/p\u003e\n\u003cp\u003eVérifiez !\u003c/p\u003e\n\u003ch4 id=\"curl-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate\"\u003ecurl: (60) SSL certificate problem: unable to get local issuer certificate\u003c/h4\u003e\n\u003cp\u003eComme le contexte d\u0026rsquo;utilisation décrit dans ce guide de démarrage, vous\navez généré vos propres certificats sans utiliser d\u0026rsquo;Autorité de Certification.\u003c/p\u003e\n\u003cp\u003eAjoutez l\u0026rsquo;option \u003ccode\u003e-k\u003c/code\u003e !\u003c/p\u003e\n\u003ch3 id=\"influxdb\"\u003einfluxdb\u003c/h3\u003e\n\u003ch4 id=\"unable-to-open-access-log-falling-back-to-stderr\"\u003eunable to open access log, falling back to stderr\u003c/h4\u003e\n\u003cp\u003eLe message d\u0026rsquo;erreur dans le log daemon est du type :\u003cbr\u003e\n\u003ccode\u003elvl=error msg=\u0026quot;unable to open access log, falling back to stderr\u0026quot; log_id=0eMCqvRl000 service=httpd error=\u0026quot;open /var/log/influxdb/: is a directory\u0026quot; path=/var/log/influxdb/\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLe chemin spécifié dans la variable \u003ccode\u003eaccess-log-path\u003c/code\u003e est soit inexistant,\nsoit influxdb n\u0026rsquo;a pas les droits systèmes pour y accéder.\u003c/p\u003e\n\u003cp\u003eVérifiez !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.influxdata.com/influxdb/v1.8/administration/config/\" rel=\"external\"\u003ehttps://docs.influxdata.com/influxdb/v1.8/administration/config/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.influxdata.com/influxdb/v1.8/administration/authentication_and_authorization/\" rel=\"external\"\u003ehttps://docs.influxdata.com/influxdb/v1.8/administration/authentication_and_authorization/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Guide de démarrage : Introduction à influxdb sur OpenBSD",
            "tags": ["Introduction", "Supervision", "influxdb"],
            "date_published": "2022-11-24T07:07:42+01:00",
            "date_modified": "2025-11-11T15:44:28+01:00"
        },{
            "id": "urn:uuid:deeadbd9-c6e9-ac3c-ae3f-f06b3fdf1b2a",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/multimedia/",
            "title": "OpenBSD : Gestion de l'audio ET de la vidéo",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Voyons ensemble comment gérer les fonctionnalités multimédias sous OpenBSD.\nAudio Gestion du Bip Le bip sonore qui se fait entendre parfois dans certains contextes, tel lors de l\u0026rsquo;utilisation de la complétion de commande avec la touche Tab, peut être rendu muet.\nAvant OpenBSD 6.7, c\u0026rsquo;est l\u0026rsquo;outil mixerctl qui le permettait : :# mixerctl inputs.mix_beep = 0\nDepuis OpenBSD 6.7, ce paramètre est géré par le pilote wscons(4) et configuré par le biais du contrôleur wsconsctl(8) — ce qui nécessite des droits administrateurs.\nPour le rendre muet : :# wsconsctl keyboard.bell.volume=0\nPour le désactiver définitivement et garder le paramètre au redémarrage, copiez-le fichier /etc/examples/wsconsctl.conf vers /etc et décommentez la ligne : #keyboard.bell.volume=0\nEnregistrement audio Depuis OpenBSD 6.4, pour des raisons de confidentialité, l\u0026rsquo;enregistrement audio est désactivé. Pour le réactiver :\n:# sysctl kern.audio.record=1\nPensez à modifier le fichier /etc/sysctl.conf !\nCela sera utile dans le contexte d\u0026rsquo;utilisation d\u0026rsquo;un microphone, d\u0026rsquo;une webcam ayant un micro, etc… ce qui permettra d\u0026rsquo;utiliser correctement tout logiciel tel audacity… ainsi que lors de l\u0026rsquo;utilisation du protocole WebRTC avec les navigateurs web, que sont Firefox et Chromium.\nGestion des niveaux La gestion des niveaux de volume se fait en espace utilisateur, grâce à l\u0026rsquo;outil sndioctl(1). Pas besoin de droits administrateur dans la session utilisateur.\npour augmenter/diminuer le niveau : :$ sndioctl output.level=+0.1 pour mettre/enlever le mode muet : :$ sndioctl output.mute=! pour voir les niveaux en pourcentage : :$ sndioctl output.level | awk -F = '{printf \u0026quot;%d\\n\u0026quot;,$2*100}' Pensez à modifier votre fichier ~/.kshrc pour ajouter la commande si vous voulez un niveau audio par défaut lors du démarrage de la session.\nGestion des paramètres Pour la gestion des paramètres, c\u0026rsquo;est l\u0026rsquo;outil mixerctl(1) qui est à utiliser. Celui-ci s\u0026rsquo;utilise toujours avec des droits administrateurs !\n:# mixerctl -av permet de savoir ce qui de votre matériel est reconnu. Toute modification de paramètres devra être enregistré dans le fichier /etc/mixerctl.conf qui n\u0026rsquo;existe pas par défaut. Il faut le copier depuis les fichiers d\u0026rsquo;exemples : :# cp /etc/examples/mixerctl.conf /etc/\nIllustrons par le cas d\u0026rsquo;utilisation d\u0026rsquo;une sortie USB Audio et SPDIF :\nHDMI Audio C\u0026rsquo;est apparemment une situation complexe qui semble n\u0026rsquo;avoir encore à ce jour pas de solution.\nPour comprendre le propos lire la discussion suivante et suivez le fil : https://marc.info/?l=openbsd-tech\u0026m=158780750403100\u0026w=2\nUSB Audio DAC USB InfoCette sortie est considérée comme une sortie analogique. Par défaut, c\u0026rsquo;est le mode de sortie utilisé… si ce n\u0026rsquo;est pas/plus le cas, reconfigurez-la : outputs.mode=analog Il est de plus en plus courant d\u0026rsquo;avoir un périphérique Audio par USB, voir un DAC Audio USB. Une fois connecté, pour vérifier son support, utilisons la commande suivante : dmesg | grep uaudio ainsi que la commande usbdevs.\nTel que, pour l\u0026rsquo;exemple :\nuaudio0 at uhub0 port 1 configuration 1 interface 1 \u0026#34;Logitech Logitech USB Headset\u0026#34; rev 1.10/10.13 addr 2 uaudio0: class v1, full-speed, sync, channels: 2 play, 1 rec, 7 ctls audio1 at uaudio0 qui est reconnu en tant que périphérique uaudio0 qui est connecté sur le périphérique spécial audio audio1.\nLe serveur sndiod le reconnaît en tant que périphérique snd/1.\nDeux manières différentes de procéder :\nla plus simple est de reconfigurer la variable server.device pour qu\u0026rsquo;il écoute le périphérique snd/1 : :$ sndioctl server.device=1 ce qui a pour avantage de ne pas avoir à reconfigurer tout autre logiciel pour écouter ledit périphérique. la deuxième est liée aux programmes gérant de l\u0026rsquo;audio capables d\u0026rsquo;utiliser directement le périphérique snd/1. Par exemple, avec le logiciel audacious, il faut aller dans les Paramètres \u0026gt; Paramètre de son, puis face au champ Greffon de sortie, il y a deux boutons, dont l\u0026rsquo;un nommé [Paramètres] qui ouvre une autre fenêtre où pour le champ Périphérique :, il faudra écrire le nom du périphérique audio USB, soit snd/1, puis valider et écouter du son…\nIl existe une manière alternative pour que le serveur sndiod reconnaisse automatiquement le périphérique USB en tant que périphérique par défaut, lorsqu\u0026rsquo;il est connecté physiquement, puis de rebasculer sur le périphérique snd/0 dès que ce n\u0026rsquo;est plus le cas.\nPour ce contexte, il faut redéfinir les drapeaux du serveur sndiod puis le relancer :\n:# rcctl set sndiod flags -f rsnd/0 -F rsnd/1 :# rcctl restart sndiod Le serveur n\u0026rsquo;est pas capable de se relancer automatiquement si vous connectez le périphérique USB après le (re)démarrage du serveur. Une fois, le périphérique connecté, rechargez tout simplement le serveur : :# rcctl reload sndiod forcera le serveur a détecter à nouveau le périphérique.\nUn autre outil disponible est l\u0026rsquo;utilisation de la commande usbhidaction…\nJe vous renvoie au manpage relatif — cf la section Documentations.\nMicrophone USB ⇒ Après avoir connecté physiquement votre microphone USB, vérifiez la reconnaissance :\n:$ dmesg | grep audio uaudio0 at uhub4 port 2 configuration 1 interface 1 \u0026#34;BIRD UM1 BIRD UM1\u0026#34; rev 1.10/1.00 addr 2 uaudio0: class v1, full-speed, sync, channels: 0 play, 1 rec, 2 ctls audio1 at uaudio0 (dans mon cas, le microphone est bien le BIRD UM1.)\nSi vous avez une sortie similaire, alors votre microphone USB est bien reconnu et sera utilisable ; si non, dommage.\nLà encore du fait d\u0026rsquo;être un périphérique USB, le serveur sndiod capture l\u0026rsquo;enregistrement micro en tant que périphérique snd/1 principalement.\n⇒ Pour utiliser le microphone USB sous OpenBSD :\nDans un premier temps, veillez à activer l' enregistrement audio. Puis, il faut paramètrer le serveur sndiod, tel que : \\ :# rcctl set sndiod flags -s default -m play,mon -s mon puis le (re)démarrer… Optionnellement, vous pouvez vous assurer des paramètres d\u0026rsquo;entrée par le contrôleur sndioctl, tel que : :$ sndioctl input.mute=0 :$ sndioctl input.level=1 Un petit test de fonctionnement, en parlant près du microphone :\n:$ aucat -f snd/1 -o output.wav Et pour l\u0026rsquo;écoute :\n:$ aucat -i output.wav Sortie SPDIF Pour utiliser une sortie SPDIF, il faut modifier le mode de sortie ; en effet, par défaut le mode de sortie correspond à l\u0026rsquo;analogique.\nAvec l\u0026rsquo;outil mixerctl, modifiez ce mode, tel que : outputs.mode=digital\nEnsuite, il faut modifier le serveur de son sndiod(8) pour qu\u0026rsquo;il gère les canaux audio correspondants, car par défaut, il ne gère que les deux premiers canaux, à savoir 0:1 ; ce qui permet d\u0026rsquo;avoir quand même un son stéréo.\nAvant de le modifier, vérifions dans un premier temps, la sortie SPDIF, tel que : :# mixerctl outputs.SPDIF_source\nDans le contexte de la carte-mère que j\u0026rsquo;utilise :\n:$ doas mixerctl outputs.SPDIF_source outputs.SPDIF_source=dig-dac-2:3 Ainsi, la sortie SPDIF se fait sur les canaux 2 et 3.\nModifions le serveur sndiod pour ajouter la gestion des canaux 2 et 3, au démarrage de celui-ci :\n:# rcctl set sndiod flags -c 0:3 :# rcctl restart sndiod InfoIl est possible de lui signifier de n\u0026rsquo;utiliser que les canaux 2 et 3.\nDe plus, votre matériel peut certainement utiliser encore plus de canaux. À vous de modifier en conséquence…\nLire le manpage sndiod(8) qui montre dans les exemples son utilisation en espace utilisateur.\nVidéo Enregistrement vidéo Par défaut, depuis OpenBSD 6.9, pour des raisons de confidentialité, l\u0026rsquo;enregistrement vidéo est désactivé !\nPour le réactiver :\n:# sysctl kern.video.record=1\nPensez à modifier le fichier /etc/sysctl.conf !\nCela sera utile dans le contexte d\u0026rsquo;utilisation d\u0026rsquo;une webcam ayant un micro, etc… ce qui permettra d\u0026rsquo;utiliser correctement tout logiciel tel fswebcam… ainsi que lors de l\u0026rsquo;utilisation du protocole WebRTC avec les navigateurs web, que sont Firefox et Chromium.\nDépannage mixerctl: AUDIO_MIXER_WRITE: Device busy Lorsque vous essayez de changer le mode de sortie de l\u0026rsquo;analogique vers le digital et réciproquement, le système vous répond avec ce message interdisant la modification.\narrêtez d\u0026rsquo;abord le serveur sndiod ; vérifiez qu\u0026rsquo;il est correctement éteint. refaites la modification désirée, avec l\u0026rsquo;outil mixerctl redémarrez le serveur sndiod vérifier le fonctionnement du serveur sndiod Pour vérifier le fonctionnement du serveur sndiod(8), hormis de vérifier le status de son démon, utilisez la commande suivante : :$ pgrep -lf sndiod\nPar exemple\n:$ pgrep -lf sndiod 44982 /usr/bin/sndiod -c0:3 16091 sndiod: helper qui montre le fonctionnement du serveur…\nDocumentations Effortless OpenBSD Audio and Desktop Screen Recording Guide manpage mixerctl , sndioctl , sndiod(8) usbhidaction wscons(4) , wsconsctl(8) Enjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoyons ensemble comment gérer les fonctionnalités multimédias sous OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"audio\"\u003eAudio\u003c/h2\u003e\n\u003ch3 id=\"gestion-du-bip\"\u003eGestion du Bip\u003c/h3\u003e\n\u003cp\u003eLe bip sonore qui se fait entendre parfois dans certains contextes, tel\nlors de l\u0026rsquo;utilisation de la complétion de commande avec la touche \u003ckbd\u003eTab\u003c/kbd\u003e,\npeut être rendu muet.\u003c/p\u003e\n\u003cp\u003eAvant OpenBSD 6.7, c\u0026rsquo;est l\u0026rsquo;outil \u003ccode\u003emixerctl\u003c/code\u003e qui le permettait : \u003cbr\u003e\n\u003ccode\u003e:# mixerctl inputs.mix_beep = 0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDepuis OpenBSD 6.7, ce paramètre est géré par le pilote \u003ccode\u003ewscons(4)\u003c/code\u003e\net configuré par le biais du contrôleur \u003ccode\u003ewsconsctl(8)\u003c/code\u003e — ce qui\nnécessite des droits administrateurs.\u003c/p\u003e\n\u003cp\u003ePour le rendre muet :\n\u003ccode\u003e:# wsconsctl keyboard.bell.volume=0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour le désactiver définitivement et garder le paramètre au redémarrage,\ncopiez-le fichier \u003ccode\u003e/etc/examples/wsconsctl.conf\u003c/code\u003e vers \u003ccode\u003e/etc\u003c/code\u003e et\ndécommentez la ligne : \u003ccode\u003e#keyboard.bell.volume=0\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"enregistrement-audio\"\u003eEnregistrement audio\u003c/h3\u003e\n\u003cp\u003eDepuis OpenBSD 6.4, pour des raisons de confidentialité, l\u0026rsquo;enregistrement\naudio est désactivé. Pour le réactiver :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# sysctl kern.audio.record=1\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePensez à modifier le fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eCela sera utile dans le contexte d\u0026rsquo;utilisation d\u0026rsquo;un microphone, d\u0026rsquo;une\nwebcam ayant un micro, etc… ce qui permettra d\u0026rsquo;utiliser correctement\ntout logiciel tel audacity… ainsi que lors de l\u0026rsquo;utilisation\ndu protocole \u003cstrong\u003eWebRTC\u003c/strong\u003e avec les navigateurs web, que sont Firefox et\nChromium.\u003c/p\u003e\n\u003ch3 id=\"gestion-des-niveaux\"\u003eGestion des niveaux\u003c/h3\u003e\n\u003cp\u003eLa gestion des niveaux de volume se fait en espace utilisateur, grâce à\nl\u0026rsquo;outil \u003cstrong\u003esndioctl(1)\u003c/strong\u003e. Pas besoin de droits administrateur dans la session\nutilisateur.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour augmenter/diminuer le niveau : \u003ccode\u003e:$ sndioctl output.level=+0.1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour mettre/enlever le mode muet : \u003ccode\u003e:$ sndioctl output.mute=!\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour voir les niveaux en pourcentage :\n\u003ccode\u003e:$ sndioctl output.level | awk -F = '{printf \u0026quot;%d\\n\u0026quot;,$2*100}'\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePensez à modifier votre fichier \u003ccode\u003e~/.kshrc\u003c/code\u003e pour ajouter la commande\nsi vous voulez un niveau audio par défaut lors du démarrage de la session.\u003c/p\u003e\n\u003ch3 id=\"gestion-des-paramètres\"\u003eGestion des paramètres\u003c/h3\u003e\n\u003cp\u003ePour la gestion des paramètres, c\u0026rsquo;est l\u0026rsquo;outil \u003cstrong\u003emixerctl(1)\u003c/strong\u003e qui est à\nutiliser. Celui-ci s\u0026rsquo;utilise toujours avec des droits administrateurs !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e:# mixerctl -av\u003c/code\u003e permet de savoir ce qui de votre matériel est reconnu.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eToute modification de paramètres devra être enregistré dans le fichier\n\u003ccode\u003e/etc/mixerctl.conf\u003c/code\u003e qui n\u0026rsquo;existe pas par défaut. Il faut le copier depuis\nles fichiers d\u0026rsquo;exemples : \u003cbr\u003e\n\u003ccode\u003e:# cp /etc/examples/mixerctl.conf /etc/\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIllustrons par le cas d\u0026rsquo;utilisation d\u0026rsquo;une sortie USB Audio et SPDIF :\u003c/p\u003e\n\u003ch3 id=\"hdmi-audio\"\u003eHDMI Audio\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est apparemment une situation complexe qui semble n\u0026rsquo;avoir encore à ce\njour pas de solution.\u003c/p\u003e\n\u003cp\u003ePour comprendre le propos lire la discussion suivante et suivez le fil :\n\u003ca href=\"https://marc.info/?l=openbsd-tech\u0026amp;m=158780750403100\u0026amp;w=2\" rel=\"external\"\u003ehttps://marc.info/?l=openbsd-tech\u0026m=158780750403100\u0026w=2\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"usb-audio\"\u003eUSB Audio\u003c/h3\u003e\n\u003ch4 id=\"dac-usb\"\u003eDAC USB\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCette sortie est considérée comme une sortie analogique. Par défaut, c\u0026rsquo;est\nle mode de sortie utilisé… si ce n\u0026rsquo;est pas/plus le cas, reconfigurez-la : \u003cbr\u003e\n\u003ccode\u003eoutputs.mode=analog\u003c/code\u003e\u003c/div\u003e\n\n\u003cp\u003eIl est de plus en plus courant d\u0026rsquo;avoir un périphérique Audio par USB, voir\nun DAC Audio USB. Une fois connecté, pour vérifier son support, utilisons\nla commande suivante : \u003cbr\u003e\n\u003ccode\u003edmesg | grep uaudio\u003c/code\u003e ainsi que la commande \u003ccode\u003eusbdevs\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eTel que, pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euaudio0 at uhub0 port \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Logitech Logitech USB Headset\u0026#34;\u003c/span\u003e rev 1.10/10.13 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euaudio0: class v1, full-speed, sync, channels: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e play, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e rec, \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e ctls\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaudio1 at uaudio0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003equi est reconnu en tant que périphérique \u003ccode\u003euaudio0\u003c/code\u003e qui est connecté sur\nle périphérique spécial audio \u003ccode\u003eaudio1\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLe serveur sndiod le reconnaît en tant que périphérique \u003ccode\u003esnd/1\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDeux manières différentes de procéder :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela plus simple est de reconfigurer la variable \u003ccode\u003eserver.device\u003c/code\u003e pour qu\u0026rsquo;il\nécoute le périphérique \u003ccode\u003esnd/1\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003e:$ sndioctl server.device=1\u003c/code\u003e \u003cbr\u003e\nce qui a pour avantage de ne pas avoir à reconfigurer tout autre logiciel\npour écouter ledit périphérique.\u003c/li\u003e\n\u003cli\u003ela deuxième est liée aux programmes gérant de l\u0026rsquo;audio capables d\u0026rsquo;utiliser\ndirectement le périphérique \u003ccode\u003esnd/1\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePar exemple, avec le logiciel \u003cstrong\u003eaudacious\u003c/strong\u003e, il faut aller dans les\n\u003cstrong\u003eParamètres \u0026gt; Paramètre de son\u003c/strong\u003e, puis face au champ \u003cstrong\u003eGreffon de sortie\u003c/strong\u003e,\nil y a deux boutons, dont l\u0026rsquo;un nommé \u003cstrong\u003e[Paramètres]\u003c/strong\u003e qui ouvre une autre\nfenêtre où pour le champ \u003cstrong\u003ePériphérique :\u003c/strong\u003e, il faudra écrire le nom du\npériphérique audio USB, soit \u003ccode\u003esnd/1\u003c/code\u003e, puis valider et écouter du son…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl existe une manière alternative pour que le serveur sndiod reconnaisse\nautomatiquement le périphérique USB en tant que périphérique par défaut,\nlorsqu\u0026rsquo;il est connecté physiquement, puis de rebasculer sur le périphérique\n\u003ccode\u003esnd/0\u003c/code\u003e dès que ce n\u0026rsquo;est plus le cas.\u003c/p\u003e\n\u003cp\u003ePour ce contexte, il faut redéfinir les drapeaux du serveur sndiod puis\nle relancer :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl set sndiod flags -f rsnd/0 -F rsnd/1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl restart sndiod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe serveur n\u0026rsquo;est pas capable de se relancer automatiquement si vous connectez\nle périphérique USB après le (re)démarrage du serveur. Une fois, le périphérique\nconnecté, rechargez tout simplement le serveur : \u003cbr\u003e\n\u003ccode\u003e:# rcctl reload sndiod\u003c/code\u003e\nforcera le serveur a détecter à nouveau le périphérique.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eUn autre outil disponible est l\u0026rsquo;utilisation de la commande \u003ccode\u003eusbhidaction\u003c/code\u003e…\u003c/p\u003e\n\u003cp\u003eJe vous renvoie au manpage relatif — cf la section \u003ca href=\"/fr/sys/openbsd/multimedia/#documentations\"\u003eDocumentations\u003c/a\u003e.\u003c/p\u003e\n\u003ch4 id=\"microphone-usb\"\u003eMicrophone USB\u003c/h4\u003e\n\u003cp\u003e⇒ Après avoir connecté physiquement votre microphone USB, vérifiez la reconnaissance :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ dmesg | grep audio\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euaudio0 at uhub4 port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;BIRD UM1 BIRD UM1\u0026#34;\u003c/span\u003e rev 1.10/1.00 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euaudio0: class v1, full-speed, sync, channels: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e play, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e rec, \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e ctls\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaudio1 at uaudio0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(dans mon cas, le microphone est bien le \u003cstrong\u003eBIRD UM1\u003c/strong\u003e.)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSi vous avez une sortie similaire, alors votre microphone USB est bien\nreconnu et sera utilisable ; si non, dommage.\u003c/p\u003e\n\u003cp\u003eLà encore du fait d\u0026rsquo;être un périphérique USB, le serveur sndiod capture\nl\u0026rsquo;enregistrement micro en tant que périphérique \u003ccode\u003esnd/1\u003c/code\u003e principalement.\u003c/p\u003e\n\u003cp\u003e⇒ Pour utiliser le microphone USB sous OpenBSD :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDans un premier temps, veillez à activer l'\n\u003ca href=\"/fr/sys/openbsd/multimedia/#enregistrement-audio\"\u003eenregistrement audio\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003ePuis, il faut paramètrer le serveur sndiod, tel que : \\\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl set sndiod flags -s default -m play,mon -s mon\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003epuis le (re)démarrer…\u003c/li\u003e\n\u003cli\u003eOptionnellement, vous pouvez vous assurer des paramètres d\u0026rsquo;entrée par\nle contrôleur \u003cstrong\u003esndioctl\u003c/strong\u003e, tel que :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ sndioctl input.mute\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ sndioctl input.level\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eUn petit test de fonctionnement, en parlant près du microphone :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ aucat -f snd/1 -o output.wav\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt pour l\u0026rsquo;écoute :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ aucat -i output.wav\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"sortie-spdif\"\u003eSortie SPDIF\u003c/h3\u003e\n\u003cp\u003ePour utiliser une sortie SPDIF, il faut modifier le mode de sortie ; en\neffet, par défaut le mode de sortie correspond à l\u0026rsquo;analogique.\u003c/p\u003e\n\u003cp\u003eAvec l\u0026rsquo;outil \u003ccode\u003emixerctl\u003c/code\u003e, modifiez ce mode, tel que : \u003cbr\u003e\n\u003ccode\u003eoutputs.mode=digital\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite, il faut modifier le serveur de son \u003cstrong\u003esndiod(8)\u003c/strong\u003e pour qu\u0026rsquo;il gère\nles canaux audio correspondants, car par défaut, il ne gère que les deux\npremiers canaux, à savoir \u003ccode\u003e0:1\u003c/code\u003e ; ce qui permet d\u0026rsquo;avoir quand même un son\nstéréo.\u003c/p\u003e\n\u003cp\u003eAvant de le modifier, vérifions dans un premier temps, la sortie SPDIF,\ntel que : \u003cbr\u003e\n\u003ccode\u003e:# mixerctl outputs.SPDIF_source\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eDans le contexte de la carte-mère que j\u0026rsquo;utilise :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas mixerctl outputs.SPDIF_source\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoutputs.SPDIF_source\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003edig-dac-2:3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi, la sortie SPDIF se fait sur les canaux 2 et 3.\u003c/p\u003e\n\u003cp\u003eModifions le serveur sndiod pour ajouter la gestion des canaux 2 et 3, au\ndémarrage de celui-ci :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl set sndiod flags -c 0:3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl restart sndiod\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eIl est possible de lui signifier de n\u0026rsquo;utiliser que les canaux 2 et 3.\u003c/p\u003e\n\u003cp\u003eDe plus, votre matériel peut certainement utiliser encore plus de canaux.\nÀ vous de modifier en conséquence…\u003c/p\u003e\n\u003cp\u003eLire le manpage \u003cstrong\u003esndiod(8)\u003c/strong\u003e qui montre dans les exemples son utilisation\nen espace utilisateur.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"vidéo\"\u003eVidéo\u003c/h2\u003e\n\u003ch3 id=\"enregistrement-vidéo\"\u003eEnregistrement vidéo\u003c/h3\u003e\n\u003cp\u003ePar défaut, depuis OpenBSD 6.9, pour des raisons de confidentialité,\nl\u0026rsquo;enregistrement vidéo est désactivé !\u003c/p\u003e\n\u003cp\u003ePour le réactiver :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# sysctl kern.video.record=1\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePensez à modifier le fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eCela sera utile dans le contexte d\u0026rsquo;utilisation d\u0026rsquo;une webcam ayant un micro,\netc… ce qui permettra d\u0026rsquo;utiliser correctement tout logiciel tel fswebcam…\nainsi que lors de l\u0026rsquo;utilisation du protocole \u003cstrong\u003eWebRTC\u003c/strong\u003e avec les navigateurs\nweb, que sont Firefox et Chromium.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"mixerctl-audio_mixer_write-device-busy\"\u003emixerctl: AUDIO_MIXER_WRITE: Device busy\u003c/h3\u003e\n\u003cp\u003eLorsque vous essayez de changer le mode de sortie de l\u0026rsquo;analogique vers le\ndigital et réciproquement, le système vous répond avec ce message interdisant\nla modification.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003earrêtez d\u0026rsquo;abord le serveur sndiod ; vérifiez qu\u0026rsquo;il est correctement éteint.\u003c/li\u003e\n\u003cli\u003erefaites la modification désirée, avec l\u0026rsquo;outil \u003ccode\u003emixerctl\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eredémarrez le serveur sndiod\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"vérifier-le-fonctionnement-du-serveur-sndiod\"\u003evérifier le fonctionnement du serveur sndiod\u003c/h3\u003e\n\u003cp\u003ePour vérifier le fonctionnement du serveur sndiod(8), hormis de vérifier\nle status de son démon, utilisez la commande suivante :\n\u003ccode\u003e:$ pgrep -lf sndiod\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePar exemple\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ pgrep -lf sndiod\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e44982\u003c/span\u003e /usr/bin/sndiod -c0:3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e16091\u003c/span\u003e sndiod: helper\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003equi montre le fonctionnement du serveur…\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://rsadowski.de/posts/2024-01-14-openbsd-video-audio-screen-recording/\" rel=\"external\"\u003eEffortless OpenBSD Audio and Desktop Screen Recording Guide\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manpage\"\u003emanpage\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/mixerctl\" title=\"Page du Manuel OpenBSD pour : mixerctl\"\u003emixerctl\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sndioctl\" title=\"Page du Manuel OpenBSD pour : sndioctl\"\u003esndioctl\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sndiod.8\" title=\"Page du Manuel OpenBSD pour : sndiod\"\u003esndiod(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/usbhidaction\" title=\"Page du Manuel OpenBSD pour : usbhidaction\"\u003eusbhidaction\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/wscons.4\" title=\"Page du Manuel OpenBSD pour : wscons\"\u003ewscons(4)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/wsconsctl.8\" title=\"Page du Manuel OpenBSD pour : wsconsctl\"\u003ewsconsctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID! \u003cbr\u003e\nEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gestion du son, de la vidéo sous OpenBSD : USB Audio, sortie SPDIF, enregistrement audio et vidéo",
            "tags": ["OpenBSD", "mixerctl", "sndiod", "sndioctl"],
            "date_published": "2022-11-22T12:44:25+01:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:a45795d2-03fa-9d35-4403-7d38342c070a",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/obsdfreqd/",
            "title": "obsdfreqd : un service pour gérer la fréquence CPU / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description obsdfreqd est un service/démon permettant de gérer la fréquence de votre CPU dans l\u0026rsquo;espace utilisateur.\nBeaucoup de paramètres permettent de configurer la fréquence tels que la fréquence min/max, l\u0026rsquo;inertie, etc. obsdfreqd supporte aussi la limitation de la fréquence une fois qu\u0026rsquo;une certaine température est atteinte afin de protéger le système, en le faisant revenir sous le seuil. Bien qu\u0026rsquo;il y ait beaucoup de paramètres, ceux par défaut sont suffisamment bon pour chacun.\nAuteure : Solène Rapenne Dépôt git : https://git.sr.ht/~solene/obsdfreqd Disponible dans les ports officiellement depuis : OpenBSD 7.1 InfoDepuis OpenBSD 7.6, ce projet semble moins pertinent, puisque la variable hw.perfpolicy géré par sysctl a été ajoutée au système, paramétrée par défaut sur la valeur auto. Cf le manpage Installation Installez le paquet obsdfreqd.\nConfiguration Démarrage du service Il est nécessaire :\nd\u0026rsquo;Activer le service obsdfreqd. d\u0026rsquo;Arrêter le service apmd s\u0026rsquo;il est utilisé, puis de le paramétrer pour l\u0026rsquo;exécuter avec le drapeau -L. et enfin de démarrer les services obsdfreqd et apmd InfoNote : Il est possible de ne pas utiliser le service apmd ; quoiqu\u0026rsquo;il en soit de par le fonctionnement du service d\u0026rsquo;obsdfreqd, apmd doit être exécuté en paramètre manuel qui mettra la fréquence CPU au minimum, obsdfreqd prend le relais correctement.\nUtiliser apmd en mode manuel est utile pour la gestion d’événements, tels que la veille et l\u0026rsquo;hibernation.\nUtilisation Si besoin, il est possible de paramétrer manuellement obsdfreqd.\nRetrouvez les différentes options sur la page du projet : https://tildegit.org/solene/obsdfreqd/#usage\nDocumentation sysctl(2)#HW_PERFPOLICY~2 Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eobsdfreqd\u003c/strong\u003e est un service/démon permettant de gérer la fréquence de\nvotre CPU dans l\u0026rsquo;espace utilisateur.\u003c/p\u003e\n\u003cp\u003eBeaucoup de paramètres permettent de configurer la fréquence tels que la\nfréquence min/max, l\u0026rsquo;inertie, etc. obsdfreqd supporte aussi la limitation\nde la fréquence une fois qu\u0026rsquo;une certaine température est atteinte afin\nde protéger le système, en le faisant revenir sous le seuil. Bien qu\u0026rsquo;il\ny ait beaucoup de paramètres, ceux par défaut sont suffisamment bon pour\nchacun.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAuteure : Solène Rapenne\u003c/li\u003e\n\u003cli\u003eDépôt git : \u003ca href=\"https://git.sr.ht/~solene/obsdfreqd\" rel=\"external\"\u003ehttps://git.sr.ht/~solene/obsdfreqd\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eDisponible dans les ports officiellement depuis : OpenBSD 7.1\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eDepuis OpenBSD 7.6, ce projet semble moins pertinent, puisque la variable \u003ccode\u003ehw.perfpolicy\u003c/code\u003e\ngéré par \u003cstrong\u003esysctl\u003c/strong\u003e a été ajoutée au système, paramétrée par défaut sur la valeur\n\u003ccode\u003eauto\u003c/code\u003e. \u003cem\u003eCf le \u003ca href=\"https://man.openbsd.org/sysctl.2#HW_PERFPOLICY~2\" rel=\"external\"\u003emanpage\u003c/a\u003e\u003c/em\u003e\u003c/div\u003e\n\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003eobsdfreqd\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"démarrage-du-service\"\u003eDémarrage du service\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ed\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eActiver le service\u003c/a\u003e\n\n\u003ccode\u003eobsdfreqd\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#arr%c3%aater\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eArrêter le service\u003c/a\u003e\n\n\u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/apm/\" title=\"Lien interne vers l\u0026#39;article : 'Apm : Programme de contrôle de la gestion de l\u0026#39;énergie et de l\u0026#39;hibernation'\"\u003eapmd\u003c/a\u003e\n\u003c/code\u003e s\u0026rsquo;il est utilisé,\u003c/li\u003e\n\u003cli\u003epuis de le \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#param%c3%a9trer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eparamétrer\u003c/a\u003e\n\npour l\u0026rsquo;exécuter avec le drapeau \u003ccode\u003e-L\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eet enfin de \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003edémarrer les services\u003c/a\u003e\n\n\u003ccode\u003eobsdfreqd\u003c/code\u003e et \u003ccode\u003eapmd\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eNote : Il est possible de ne pas utiliser le service \u003ccode\u003eapmd\u003c/code\u003e ; quoiqu\u0026rsquo;il\nen soit de par le fonctionnement du service d\u0026rsquo;obsdfreqd, apmd doit être\nexécuté en paramètre manuel qui mettra la fréquence CPU au minimum,\nobsdfreqd prend le relais correctement.\u003c/p\u003e\n\u003cp\u003eUtiliser apmd en mode manuel est utile pour la gestion d’événements,\ntels que la veille et l\u0026rsquo;hibernation.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eSi besoin, il est possible de\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#param%c3%a9trer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eparamétrer\u003c/a\u003e\n\nmanuellement \u003cstrong\u003eobsdfreqd\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eRetrouvez les différentes options sur la page du projet : \u003cbr\u003e\n\u003ca href=\"https://tildegit.org/solene/obsdfreqd/#usage\" rel=\"external\"\u003ehttps://tildegit.org/solene/obsdfreqd/#usage\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/sysctl.2#HW_PERFPOLICY~2\" title=\"Page du Manuel OpenBSD pour : sysctl\"\u003esysctl(2)#HW_PERFPOLICY~2\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer correctement les fréquences CPU grâce à l'outil 'obsdfreqd' sous OpenBSD",
            "tags": ["OpenBSD", "obsdfreqd", "apm"],
            "date_published": "2022-11-19T12:28:54+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:bc8d27ba-fd2a-6fd1-ad7f-f9159f8f42fc",
            "url": "http://doc.huc.fr.eu.org/fr/post/pass-gestionnaire-mot-passe-unix/",
            "title": "Pass : À la Découverte d'un Gestionnaire de Mot de Passe",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description pass est un gestionnaire de mot-de-passe, respectant la philosophie Unix, qui se veut être simple. Et, pour d\u0026rsquo;aucuns, il est CLI… mais pas que !\nDes gestionnaires de mot-de-passe, il en existe pléthore ; pour n\u0026rsquo;en citer quelques uns, tel KeePass (et ses déclinaisons), BitWarden, etc…\nComme beaucoup, c\u0026rsquo;est plus un gestionnaire d\u0026rsquo;identités et d\u0026rsquo;informations personnelles confidentielles qu\u0026rsquo;un basique gestionnaire de mots de passe.\nEn bref, c\u0026rsquo;est un coffre fort numérique, en CLI, à la sauce GPG !\nQu\u0026rsquo;a donc de SI particulier pass ?\nIl est :\nCLI chiffré par GPG simple à utiliser (peut) utilise(r) Git mettre très temporairement en copie les infos dans le presse-papier. Mais encore ?\nIl fait de la complétion pour les shells suivants : Bash fish zsh Et pour finir, il a des extensions intéressantes, certaines pour navigateurs web, et des clients GUI pour différentes plateformes.\nLicence : GNU/GPL v2 Site web: https://www.passwordstore.org Installation Installons le binaire et l\u0026rsquo;interface graphique — cette dernière n\u0026rsquo;est pas nécessaire, mais utile — :\n⇒ Debian/*Buntu (et assimilés) : apt install pass qtpass\n⇒ OpenBSD : pkg_add password-store qtpass\nExtensions Parmi les extensions utiles, il y a :\npass-import pour importer depuis de nombreux autres gestionnaires de mot-de passes ;\npour Debian/*Buntu, il faut l\u0026rsquo;installer depuis le dépôt de l\u0026rsquo;auteur, qui fournit un paquet .deb. quant à OpenBSD, installable depuis les ports, pass-extension-tail pour afficher les informations secondaires, renfermées dans un des fichiers chiffrés.\npour Debian/*Buntu, depuis les dépôts officiels pour OpenBSD, depuis le dépôt git, avec la cible make install pass-otp qui ajoute le support des tokens OTP. Dans le contexte de sécurité multi-facteurs, il vaut mieux utiliser une autre application, qui sera elle seule responsable de cet aspect.\npour Debian/*Buntu : pass-extension-otp, depuis les dépôts officiels pour OpenBSD : pass-otp, depuis les ports Il en existe quelques autres… dont pass-tomb.\nClients compatibles Parmi les clients compatibles actifs, il existe principalement :\nqtpass : interface QT pour Linux, *BSD\nPassword Store : pour Android, disponible, entre autres, sur F-Droid ; à coupler avec l\u0026rsquo;app OpenKeychain pour gérer la clé GPG.\nBrowserPass : un projet scindé en deux :\nBrowserpass-native : une sorte de proxy pour communiquer entre le gestionnaire et l' extension pour les navigateurs web. Installable depuis les dépôts pour Debian/*Buntu, nommée webext-browserpass. Quant à OpenBSD, il faudra la compiler localement avec la cible make browserpass-openbsd64, après avoir téléchargé le dépôt. Browserpass-extension : une extension pour les navigateurs Chrome et Firefox.\nIl n\u0026rsquo;est pas recommandé d\u0026rsquo;activer l\u0026rsquo;option OTP pour des raisons de sécurité, pour la raison sus-mentionnée. passforios : pour iOS\ny\u0026rsquo;en a même une pour les addicts emacs….\nEt certainement bien d\u0026rsquo;autres…\nConfiguration Extensions Un fichier de configuration spécial ~/.password-store/.extensions/COMMAND.bash peut être créé afin d\u0026rsquo;activer les extensions installées.\nIl faut y ajouter :\nPASSWORD_STORE_ENABLE_EXTENSIONS=true pour ajouter le support des extensions VARIABLES ENVIRONNEMENT Quelques variables d\u0026rsquo;environnement utiles :\nPASSWORD_STORE_DIR définit le répertoire par défaut du gestionnaire\nPASSWORD_STORE_EXTENSIONS_DIR définit le répertoire des fichiers d\u0026rsquo;extension ; par défaut PASSWORD_STORE_DIR/.extensions.\nPASSWORD_STORE_CLIP_TIME est le nombre de secondes de rétention dans le presse-papier, par défaut de 45 secondes.\nPASSWORD_STORE_GENERATED_LENGTH est la longueur en nombre de caractères du mot de passe à utiliser par défaut pour l\u0026rsquo;option generate.\nPASSWORD_STORE_GPG_OPTS afin de passer des options à GPG.\nEDITOR sera l\u0026rsquo;éditeur texte utilisé par l\u0026rsquo;option edit.\nEt à coup sûr, d\u0026rsquo;autres…\ngpg-agent.conf Il peut être utile, surtout en rapport avec l\u0026rsquo;extension Browserpass, d\u0026rsquo;éditer le fichier ~/.gnupg/gpg-agent.conf pour ajouter la gestion de la saisie correcte des mots de passe par l\u0026rsquo;outil pinentry, tel que :\npinentry-program /usr/bin/pinentry-gtk-2 pour un bureau utilisant les bibliothèques Gtk2, tel Cinnamon, Gnome 2, Mate, Xfce, …\npinentry-program /usr/bin/pinentry-gnome3, pour Gnome 3, Xfce, …\npinentry-program /usr/bin/pinentry-x11 pour tout autre bureau sous environnement X11, tel Enlightenment, LXDE, LXQt, dwm, …\nvoire pinentry-program /usr/bin/pinentry ou son équivalent /usr/bin/pinentry-curses si vous ne fonctionnez qu\u0026rsquo;en environnement terminal.\nUtilisation Bien que le site soit descriptif quant à son installation et utilisation, ainsi que le man page, voyons ensemble quelques étapes intéressantes :\n⇒ L\u0026rsquo;usage de la commande pass sans aucune option affiche le contenu de l\u0026rsquo;arborescence tel que créé, par vos soins. Pour l\u0026rsquo;instant, il est vide.\nInitialisation L\u0026rsquo;initialisation du gestionnaire se fait localement et est liée à une clé GPG créée précédemment, tel que :\n$ pass init email@domain.tld mkdir: created directory ‘/home/your-user/.password-store’ Password store initialized for email@domain.tld. Il est important de comprendre que l\u0026rsquo;initialisation puis l\u0026rsquo;ouverture du gestionnaire demandera obligatoirement le mot de passe liée à la clé GPG.\nGestion du dépôt git En second, vient la phase du dépôt local git :\n$ pass git init Initialized empty Git repository in /home/your-user/.password-store/.git/ [master (root-commit) 998c8fd] Added current contents of password store. 1 file changed, 1 insertion(+) create mode 100644 .gpg-id Il crée localement le fichier .gpg-id qui renferme l\u0026rsquo;identifiant long de l\u0026rsquo;empreinte de la clé GPG.\n⇒ Ajout du dépôt extérieur\nEnsuite ajouter un dépôt Git extérieur — ceci sera utile pour la réplication des données au-travers des différents GUI disponibles, sur d\u0026rsquo;autres OS — :\n$ pass git remote add origin URL-depot-git ⇒ Ajout des signatures GPG\nDe plus, il est fortement recommandé d\u0026rsquo;ajouter le support des signatures GPG :\n$ pass git config --bool --add pass.signcommits true Chaque commit nécessitera ainsi l\u0026rsquo;usage d\u0026rsquo;une clé GPG pour confirmer que vous êtes bien l\u0026rsquo;auteur de la modification. La Clé GPG peut très bien être différente de celle liée au gestionnaire pass. Elle est liée à la configuration du dépôt extérieur.\n⇒ À-propos de Git :\nLes options de Git sont utilisables en argument de l\u0026rsquo;option git exactement à l\u0026rsquo;identique de l\u0026rsquo;outil Git.\nPour pousser un ou plusieurs commits vers le dépôt extérieur : pass git push, à minima. Pour récupérer depuis le dépôt extérieur : pass git pull… etc. Du fait d\u0026rsquo;avoir initié le dépôt local git, chaque création, la moindre modification, d\u0026rsquo;un fichier chiffré générera automatiquement un commit. Si vous utilisez la signature GPG de commit, il vous sera demandé le mot de passe lié à la clé GPG pour les commits… qui, pour rappel, peut très bien être différente de la clé GPG du gestionnaire pass.\nGestion des fichiers chiffrés InfoAprès un certain délai, relativement court : 45 sec., même la consultation d\u0026rsquo;un fichier chiffré provoquera un appel du mot de passe lié à la clé GPG relative au gestionnaire pass. Ne soyez pas étonné que cela vous soit régulièrement demandé.\nConventions d\u0026rsquo;écriture :\nLa première ligne d\u0026rsquo;un fichier chiffré est toujours le mot-de-passe ! La deuxième ligne peut servir à entrer l\u0026rsquo;identifiant lié au mot-de-passe, autrement dit le login La troisième ligne peut servir à entrer l\u0026rsquo;URL correspondante, s\u0026rsquo;il y a lieu… d\u0026rsquo;autres lignes… d\u0026rsquo;autres informations utiles, pertinentes, etc. C\u0026rsquo;est une convention utile à respecter… mais par défaut, étant donné que c\u0026rsquo;est un simple fichier texte chiffré, pass n\u0026rsquo;impose aucun schéma ou type d\u0026rsquo;organisation. Si ce n\u0026rsquo;est qu\u0026rsquo;il est préférable d\u0026rsquo;avoir en première ligne l\u0026rsquo;écriture du mot de passe, car c\u0026rsquo;est son mode opératoire, et là où toute extension, tout client cherchera cette information précise.\nMerci de lire le man page pour avoir d\u0026rsquo;autres notions de conventions.\n⇒ Création\nCréons notre premier fichier chiffré nommé test, à l\u0026rsquo;aide de l\u0026rsquo;option insert :\n$ pass insert test Enter password for test: Retype password for test: [master 53331b0] Add given password for test to store. 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test.gpg Lors de la création, il est demandé de taper un mot de passe, puis de le ré-écrire une deuxième fois, puis un commit est généré.\nCette option permet de définir par ses propres soins un mot-de-passe.\nL\u0026rsquo;utilisation de l\u0026rsquo;argument -m permet l\u0026rsquo;ajout d\u0026rsquo;autres informations, en mode multilignes. Il faudra presser la combinaison de touches CTRL+D pour sortir de ce mode d\u0026rsquo;édition.\nAttentionATTENTION : l\u0026rsquo;utilisation de cette option sur un fichier chiffré aura pour conséquence de vider toute information existante. Il sera demandé de confirmer avant ; en cas de refus de votre part, l\u0026rsquo;action cessera. ⇒ Édition\nL\u0026rsquo;édition de tout fichier chiffré se fait avec l\u0026rsquo;option edit, tel que :\n$ pass edit test Ce qui aura pour propos d\u0026rsquo;ouvrir l\u0026rsquo;éditeur de texte lié à votre environnement ou par défaut vi, si aucun n\u0026rsquo;est configuré. Là, encore pour les amoureux d\u0026rsquo;emacs, installez l\u0026rsquo;extension correspondante.\nIl est ainsi possible de modifier toute information dans le fichier chiffré, dont le mot de passe, lisible en clair.\n⇒ Génération d\u0026rsquo;un mot de passe\nAttentionATTENTION : À moins d\u0026rsquo;utiliser l\u0026rsquo;argument -i, l\u0026rsquo;utilisation de cette option sur un fichier chiffré aura pour conséquence de vider toute information existante. Il sera demandé de confirmer avant ; en cas de refus de votre part, l\u0026rsquo;action cessera. La génération d\u0026rsquo;un nouveau mot-de-passe pour un fichier chiffré se fait par le biais de l\u0026rsquo;option generate, suivi du nom de fichier chiffré et d\u0026rsquo;un chiffre représentant la longueur du mot de passe désiré :\n$ pass generate test 32 An entry already exists for test. Overwrite it? [y/N] y [master 5195534] Add generated password for test. 1 file changed, 0 insertions(+), 0 deletions(-) The generated password for test is: zJwz\\1E(RjL3Ps{\u0026amp;7|?QZAt{\u0026amp;ps_A_GU Pour générer un mot-de-passe avec juste des lettres et des chiffres, dit alphanumérique, c\u0026rsquo;est l\u0026rsquo;argument -n qu\u0026rsquo;il faut ajouter, tel que : $ pass generate -n test 64 An entry already exists for test. Overwrite it? [y/N] y [master 6dff2bd] Add generated password for test. 1 file changed, 0 insertions(+), 0 deletions(-) The generated password for test is: EWA0SlCkzcmlMgxMWJltGnHCMSxK4YXmPYg4X3BrNryJgoUREVVFaaOXSiKijbtm L\u0026rsquo;option generate utilise le périphérique spécial /dev/urandom pour générer le mot-de passe.\nL\u0026rsquo;argument -c copiera le mot de passe généré dans le presse-papier sans l\u0026rsquo;afficher.\nL\u0026rsquo;argument -i est pertinent pour ne pas détruire les informations contenues dans le fichier chiffré, tout en créant un nouveau mot de passe, tel que :\n$ pass generate -i test 32 [master 25f75ab] Replace generated password for test. 1 file changed, 0 insertions(+), 0 deletions(-) The generated password for test is: FrCL98OE9C9*7bJusLVbw$%\\@Y^[,|Lj ⇒ Voir le contenu\nPour voir le contenu d\u0026rsquo;un fichier chiffré, il suffit de l\u0026rsquo;appeler directement :\n$ pass test EWA0SlCkzcmlMgxMWJltGnHCMSxK4YXmPYg4X3BrNryJgoUREVVFaaOXSiKijbtm login: test@gmail.com URL: https://test-moi.tld comments: Ceci est un faux compte pour test du gestionnaire `pass` Merci de l\u0026#39;utiliser... PIN: 123789654 Les informations secondaires affichées dans cet exemple sont des ajouts par mes soins, grâce à l\u0026rsquo;option edit.\n⇒ Trouver un contenu\nPour (re)trouver un contenu, c\u0026rsquo;est l\u0026rsquo;option find qui est à utiliser.\n⇒ Copie et presse-papier\nPour copier dans le presse-papier, sachant qu\u0026rsquo;en suivant la convention de la première ligne comme étant le mot de passe :\n$ pass -c test Copied test to clipboard. Will clear in 45 seconds. Reste plus qu\u0026rsquo;à le coller où nécessaire.\nPour copier, selon la convention décrite ci-dessus, l\u0026rsquo;identifiant lié :\n$ pass -c2 test Copied test to clipboard. Will clear in 45 seconds. Etc.\n⇒ Suppression\nLa suppression d\u0026rsquo;un fichier chiffré est très simple :\n$ pass rm test rm: remove regular file ‘/home/your-user/.password-store/test.gpg’? y removed ‘/home/your-user/.password-store/test.gpg’ Il existe quelques autres options ; je vous laisse les découvrir dans le man page, telles cp, ls ou l\u0026rsquo;usage de grep, etc.\nOTP La fonction OTP fonctionne bien, à partir du moment où l\u0026rsquo;on importe des données depuis une autre source, grâce à l\u0026rsquo;extension pass-import.\nEn CLI, je ne suis pas arriver à utiliser pass-otp ; j\u0026rsquo;ai beau eu faire pass otp nom_fichier, impossible ; alors qu\u0026rsquo;avec qtpass et Password Store, cela fonctionne.\nqtpass Bien-sûr, tout cela se gère aussi au-travers de l\u0026rsquo;interface graphique qtpass.\nL\u0026rsquo;application graphique qtpass est intéressante car elle permet de définir dans son onglet \u0026ldquo;Paramètres\u0026rdquo; :\nle comportement du presse-papier la longueur par défaut du mot-de-passe d\u0026rsquo;utiliser pwgen pour générer le mot-de-passe, et exclure ou non les lettres en majuscule, les nombres, les autres symboles, tels les caractères accentués, de générer des mots de passe facile à mémoriser d\u0026rsquo;utiliser git pour pousser automatiquement les push, les pulls, ajouter la ou les clés GPG à gérer. ⇒ Dans son onglet \u0026ldquo;Programs\u0026rdquo;, d\u0026rsquo;utiliser soit l\u0026rsquo;outil pass, soit les outils natifs que sont Git et GPG…\n⇒ De créer des profils de gestionnaire différents depuis l\u0026rsquo;onglet \u0026ldquo;Profiles\u0026rdquo;.\n⇒ De créer des modèles d\u0026rsquo;affichage de l\u0026rsquo;information pour les fichiers chiffrés, depuis l\u0026rsquo;onglet \u0026ldquo;Templates\u0026rdquo;.\nPassword Store \u0026amp; OpenKeychain L\u0026rsquo;app Password Store nécessite l\u0026rsquo;app OpenKeychain, toutes deux installables depuis le store F-Droid.\nOpenKeychain sert à stocker une ou plusieurs clés GPG.\nPour utiliser votre clé GPG dans votre smartphone, il vaut mieux se prémunir de quelques précautions suivantes :\nGénération d\u0026rsquo;un mot de passe aléatoire fort avec GPG, sur la station :\ngpg --armor --gen-random 1 20 Chiffrement de la clé GPG dans la station, en utilisant le mot de passe généré par GPG :\ngpg --armor --export-secret-keys \u0026quot;GPG-Fingerprint-long\u0026quot; | gpg --armor --symmetric --output mykey.sec.asc Transfert vers le smartphone, connecté en USB, ou par le biais d\u0026rsquo;une carte SD. Import dans OpenKeychain depuis le menu \u0026lsquo;Importer ma clé\u0026rsquo; qui demandera à nouveau le mot de passe généré à l\u0026rsquo;étape 1, et créera un fichier nommé decrypted.key qu\u0026rsquo;il faudra importer lui aussi dans OpenKeychain. Browserpass L\u0026rsquo;extension Browserpass pour les navigateurs web Chrome et Firefox est simple à utiliser. Pour un site web donné, elle va chercher les occurrences dans le gestionnaire pass. Elle va automatiquement cibler le site web dont la page est ouverte.\nL\u0026rsquo;utilisation de la combinaison des touches CTRL+Shift+L permet de rechercher les occurrences nécessaires, en lieu et place d\u0026rsquo;un clic sur l\u0026rsquo;icône. La touche TAB permet de naviguer entre les différents occurrences trouvées. Appuyer sur la touche ENTRÉE aura pour conséquence de remplir automatiquement, valider la soumission d\u0026rsquo;un formulaire de connexion. Cas d\u0026rsquo;usage Création d\u0026rsquo;un nouveau fichier chiffré, et/ou modification, soit en CLI avec pass, soit avec la GUI qtpass. git push, avec des commits signés, en SSH vers le dépôt GIT extérieur. import dans Password Store, depuis le dépôt Git extérieur, par HTTPS utilisation des extensions Browserpass pour la connexion à différents sites web utilisation d\u0026rsquo;OTP, soit au-travers d\u0026rsquo;une application tierce, soit après import. Personnellement, je préfère l\u0026rsquo;app tierce. Voilà un gestionnaire de mot de passe, totalement chiffré, par clé GPG, dont les changements de chaque fichier .gpg sont versionnés par le biais de Git, encapsulés soit dans une connexion SSH ou TLS selon l\u0026rsquo;usage.\nChaque usage, que ce soit de la consultation ou de la modification, quelque soit l\u0026rsquo;outil utilisé, en CLI, par GUI, par une extension ou une autre, telle l\u0026rsquo;extension Browserpass, nécessite absolument l\u0026rsquo;authentification GPG.\nVoilà pour la découverte, assez complète, de ce gestionnaire de mot de passe, voire d\u0026rsquo;informations personnelles… pardon, que dis-je, de ce coffre fort numérique différent.\nDocumentation Interne GPG : Création de clé à Courbes Elliptiques Ed25519 GPG : Du bon usage sécurisé Wikipedia Philosophie_d'Unix WP ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003epass\u003c/code\u003e est un gestionnaire de mot-de-passe, respectant la philosophie Unix,\nqui se veut être simple. Et, pour d\u0026rsquo;aucuns, il est CLI… mais pas que !\u003cbr\u003e\u003c/p\u003e\n\u003cp\u003eDes gestionnaires de mot-de-passe, il en existe pléthore ; pour n\u0026rsquo;en citer\nquelques uns, tel KeePass \u003cem\u003e(et ses déclinaisons)\u003c/em\u003e, BitWarden, etc…\u003c/p\u003e\n\u003cp\u003eComme beaucoup, c\u0026rsquo;est plus un gestionnaire d\u0026rsquo;identités et d\u0026rsquo;informations\npersonnelles confidentielles qu\u0026rsquo;un basique gestionnaire de mots de passe.\u003cbr\u003e\nEn bref, c\u0026rsquo;est un coffre fort numérique, en CLI, à la sauce GPG !\u003c/p\u003e\n\u003cp\u003eQu\u0026rsquo;a donc de \u003cstrong\u003eSI\u003c/strong\u003e particulier \u003cstrong\u003epass\u003c/strong\u003e ?\u003cbr\u003e\nIl est :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCLI\u003c/li\u003e\n\u003cli\u003echiffré par GPG\u003c/li\u003e\n\u003cli\u003esimple à utiliser\u003c/li\u003e\n\u003cli\u003e\u003cem\u003e(peut)\u003c/em\u003e utilise(r) Git\u003c/li\u003e\n\u003cli\u003emettre très temporairement en copie les infos dans le presse-papier.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMais encore ?\u003cbr\u003e\nIl fait de la complétion pour les shells suivants : \u003cbr\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBash\u003c/li\u003e\n\u003cli\u003efish\u003c/li\u003e\n\u003cli\u003ezsh\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt pour finir, il a des extensions intéressantes, certaines pour\nnavigateurs web, et des clients GUI pour différentes plateformes.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLicence : GNU/GPL v2\u003c/li\u003e\n\u003cli\u003eSite web: \u003ca href=\"https://www.passwordstore.org\" rel=\"external\"\u003ehttps://www.passwordstore.org\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eInstallons le binaire et l\u0026rsquo;interface graphique \u003cem\u003e— cette dernière n\u0026rsquo;est pas\nnécessaire, mais utile —\u003c/em\u003e :\u003c/p\u003e\n\u003cp\u003e⇒ Debian/*Buntu \u003cem\u003e(et assimilés)\u003c/em\u003e : \u003ccode\u003eapt install pass qtpass\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ OpenBSD : \u003ccode\u003epkg_add password-store qtpass\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"extensions\"\u003eExtensions\u003c/h3\u003e\n\u003cp\u003eParmi les extensions utiles, il y a :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/roddhjav/pass-import\" rel=\"external\"\u003epass-import\u003c/a\u003e\u003c/strong\u003e pour importer\ndepuis de nombreux autres gestionnaires de mot-de passes ;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour Debian/*Buntu, il faut l\u0026rsquo;installer depuis le dépôt de\nl\u0026rsquo;auteur, \u003cem\u003equi fournit un paquet .deb.\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003equant à OpenBSD, installable depuis les ports,\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/palortoff/pass-extension-tail\" rel=\"external\"\u003epass-extension-tail\u003c/a\u003e\u003c/strong\u003e\npour afficher les informations secondaires, renfermées dans un des\nfichiers chiffrés.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour Debian/*Buntu, depuis les dépôts officiels\u003c/li\u003e\n\u003cli\u003epour OpenBSD, depuis le dépôt git, avec la cible \u003ccode\u003emake install\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/tadfisher/pass-otp#readme\" rel=\"external\"\u003epass-otp\u003c/a\u003e\u003c/strong\u003e qui ajoute\nle support des tokens OTP.\n\u003cem\u003eDans le contexte de sécurité multi-facteurs, il vaut mieux utiliser\nune autre application, qui sera elle seule responsable de cet aspect.\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour Debian/*Buntu : \u003cstrong\u003epass-extension-otp\u003c/strong\u003e, depuis les dépôts officiels\u003c/li\u003e\n\u003cli\u003epour OpenBSD : \u003cstrong\u003epass-otp\u003c/strong\u003e, depuis les ports\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl en existe quelques autres… \u003cem\u003edont \u003cstrong\u003e\u003ca href=\"https://github.com/roddhjav/pass-tomb#readme\" rel=\"external\"\u003epass-tomb\u003c/a\u003e\u003c/strong\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"clients-compatibles\"\u003eClients compatibles\u003c/h3\u003e\n\u003cp\u003eParmi les clients compatibles actifs, il existe principalement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eqtpass\u003c/strong\u003e : interface QT pour Linux, *BSD\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/android-password-store/Android-Password-Store\" rel=\"external\"\u003ePassword Store\u003c/a\u003e\u003c/strong\u003e :\npour Android, disponible, entre autres, sur F-Droid ; \u003cem\u003eà coupler avec\nl\u0026rsquo;app \u003cstrong\u003eOpenKeychain\u003c/strong\u003e pour gérer la clé GPG\u003c/em\u003e.\u003cbr\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBrowserPass\u003c/strong\u003e : un projet scindé en deux :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/browserpass/browserpass-native\" rel=\"external\"\u003eBrowserpass-native\u003c/a\u003e :\nune sorte de proxy pour communiquer entre le gestionnaire et l'\nextension pour les navigateurs web.\n\u003cul\u003e\n\u003cli\u003eInstallable depuis les dépôts pour Debian/*Buntu, nommée \u003cstrong\u003ewebext-browserpass\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eQuant à OpenBSD, il faudra la compiler localement avec la cible\n\u003cstrong\u003emake browserpass-openbsd64\u003c/strong\u003e, après avoir téléchargé le dépôt.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/browserpass/browserpass-extension\" rel=\"external\"\u003eBrowserpass-extension\u003c/a\u003e :\nune extension pour les navigateurs Chrome et Firefox.\u003cbr\u003e\n\u003cstrong\u003eIl n\u0026rsquo;est pas recommandé d\u0026rsquo;activer l\u0026rsquo;option OTP pour des raisons\nde sécurité, pour la raison sus-mentionnée\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://mssun.github.io/passforios/\" rel=\"external\"\u003epassforios\u003c/a\u003e\u003c/strong\u003e : pour iOS\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ey\u0026rsquo;en a même \u003ca href=\"https://git.zx2c4.com/password-store/tree/contrib/emacs\" rel=\"external\"\u003eune\u003c/a\u003e\npour les addicts emacs….\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt certainement bien d\u0026rsquo;autres…\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"extensions-1\"\u003eExtensions\u003c/h3\u003e\n\u003cp\u003eUn fichier de configuration spécial \u003ccode\u003e~/.password-store/.extensions/COMMAND.bash\u003c/code\u003e\npeut être créé afin d\u0026rsquo;activer les extensions installées.\u003c/p\u003e\n\u003cp\u003eIl faut y ajouter :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ePASSWORD_STORE_ENABLE_EXTENSIONS=true\u003c/code\u003e pour ajouter le support des extensions\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"variables-environnement\"\u003eVARIABLES ENVIRONNEMENT\u003c/h3\u003e\n\u003cp\u003eQuelques variables d\u0026rsquo;environnement utiles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ePASSWORD_STORE_DIR\u003c/code\u003e définit le répertoire par défaut du gestionnaire\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ePASSWORD_STORE_EXTENSIONS_DIR\u003c/code\u003e définit le répertoire des fichiers\nd\u0026rsquo;extension ; par défaut \u003ccode\u003ePASSWORD_STORE_DIR/.extensions\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ePASSWORD_STORE_CLIP_TIME\u003c/code\u003e est le nombre de secondes de rétention dans\nle presse-papier, par défaut de \u003cstrong\u003e45 secondes\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ePASSWORD_STORE_GENERATED_LENGTH\u003c/code\u003e est la longueur en nombre de caractères\ndu mot de passe à utiliser par défaut pour l\u0026rsquo;option \u003ccode\u003egenerate\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ePASSWORD_STORE_GPG_OPTS\u003c/code\u003e afin de passer des options à GPG.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eEDITOR\u003c/code\u003e sera l\u0026rsquo;éditeur texte utilisé par l\u0026rsquo;option \u003ccode\u003eedit\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt à coup sûr, d\u0026rsquo;autres…\u003c/p\u003e\n\u003ch3 id=\"gpg-agentconf\"\u003egpg-agent.conf\u003c/h3\u003e\n\u003cp\u003eIl peut être utile, surtout en rapport avec l\u0026rsquo;extension \u003cstrong\u003eBrowserpass\u003c/strong\u003e,\nd\u0026rsquo;éditer le fichier \u003ccode\u003e~/.gnupg/gpg-agent.conf\u003c/code\u003e pour ajouter la gestion de\nla saisie correcte des mots de passe par l\u0026rsquo;outil \u003cstrong\u003epinentry\u003c/strong\u003e, tel que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003epinentry-program /usr/bin/pinentry-gtk-2\u003c/code\u003e pour un bureau utilisant\nles bibliothèques Gtk2, tel Cinnamon, Gnome 2, Mate, Xfce, …\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003epinentry-program /usr/bin/pinentry-gnome3\u003c/code\u003e, pour Gnome 3, Xfce, …\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003epinentry-program /usr/bin/pinentry-x11\u003c/code\u003e pour tout autre bureau sous\nenvironnement X11, tel Enlightenment, LXDE, LXQt, dwm, …\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003evoire \u003ccode\u003epinentry-program /usr/bin/pinentry\u003c/code\u003e ou son équivalent \u003ccode\u003e/usr/bin/pinentry-curses\u003c/code\u003e\nsi vous ne fonctionnez qu\u0026rsquo;en environnement terminal.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eBien que le site soit descriptif quant à son installation et utilisation,\nainsi que le \u003ca href=\"https://git.zx2c4.com/password-store/about/\" rel=\"external\"\u003eman page\u003c/a\u003e,\nvoyons ensemble quelques étapes intéressantes :\u003c/p\u003e\n\u003cp\u003e⇒ L\u0026rsquo;usage de la commande \u003ccode\u003epass\u003c/code\u003e sans aucune option affiche le contenu\nde l\u0026rsquo;arborescence tel que créé, par vos soins. Pour l\u0026rsquo;instant, il est vide.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"initialisation\"\u003eInitialisation\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;initialisation du gestionnaire se fait localement et est liée à une clé\nGPG créée précédemment, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass init email@domain.tld\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir: created directory ‘/home/your-user/.password-store’\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePassword store initialized \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e email@domain.tld.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est important de comprendre que l\u0026rsquo;initialisation puis l\u0026rsquo;ouverture du\ngestionnaire demandera obligatoirement le mot de passe liée à la clé GPG.\u003c/p\u003e\n\u003ch3 id=\"gestion-du-dépôt-git\"\u003eGestion du dépôt git\u003c/h3\u003e\n\u003cp\u003eEn second, vient la phase du dépôt local git :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass git init\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eInitialized empty Git repository in /home/your-user/.password-store/.git/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003emaster \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eroot-commit\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 998c8fd\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e Added current contents of password store.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e file changed, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e insertion\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e+\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreate mode \u003cspan style=\"color:#f99b15\"\u003e100644\u003c/span\u003e .gpg-id\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl crée localement le fichier \u003ccode\u003e.gpg-id\u003c/code\u003e qui renferme l\u0026rsquo;identifiant long\nde l\u0026rsquo;empreinte de la clé GPG.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Ajout du dépôt extérieur\u003c/p\u003e\n\u003cp\u003eEnsuite ajouter un dépôt Git extérieur \u003cem\u003e— ceci sera utile pour la\nréplication des données au-travers des différents GUI disponibles,\nsur d\u0026rsquo;autres OS —\u003c/em\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass git remote add origin URL-depot-git\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e⇒ Ajout des signatures GPG\u003c/p\u003e\n\u003cp\u003eDe plus, il est fortement recommandé d\u0026rsquo;ajouter le support des signatures\nGPG :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass git config --bool --add pass.signcommits true\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eChaque commit nécessitera ainsi l\u0026rsquo;usage d\u0026rsquo;une clé GPG pour confirmer que\nvous êtes bien l\u0026rsquo;auteur de la modification. \u003cem\u003eLa Clé GPG peut très bien\nêtre différente de celle liée au gestionnaire pass. Elle est liée à la\nconfiguration du dépôt extérieur.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ À-propos de Git :\u003c/p\u003e\n\u003cp\u003eLes options de Git sont utilisables en argument de l\u0026rsquo;option \u003ccode\u003egit\u003c/code\u003e exactement\nà l\u0026rsquo;identique de l\u0026rsquo;outil Git.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour pousser un ou plusieurs commits vers le dépôt extérieur : \u003ccode\u003epass git push\u003c/code\u003e, à minima.\u003c/li\u003e\n\u003cli\u003ePour récupérer depuis le dépôt extérieur : \u003ccode\u003epass git pull\u003c/code\u003e…\u003c/li\u003e\n\u003cli\u003eetc.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDu fait d\u0026rsquo;avoir initié le dépôt local git, chaque création, la moindre\nmodification, d\u0026rsquo;un fichier chiffré générera automatiquement un commit. \u003cbr\u003e\nSi vous utilisez la signature GPG de commit, il vous sera demandé le mot\nde passe lié à la clé GPG pour les commits… \u003cem\u003equi, pour rappel, peut très\nbien être différente de la clé GPG du gestionnaire pass\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"gestion-des-fichiers-chiffrés\"\u003eGestion des fichiers chiffrés\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eAprès un certain délai, relativement court : 45 sec., même la consultation\nd\u0026rsquo;un fichier chiffré provoquera un appel du mot de passe lié à la clé GPG\nrelative au gestionnaire pass. Ne soyez pas étonné que cela vous soit\nrégulièrement demandé.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eConventions d\u0026rsquo;écriture :\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eLa première ligne\u003c/strong\u003e d\u0026rsquo;un fichier chiffré est \u003cstrong\u003etoujours le mot-de-passe\u003c/strong\u003e !\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLa deuxième ligne\u003c/strong\u003e peut servir à entrer l\u0026rsquo;identifiant lié au mot-de-passe, autrement\ndit le \u003cstrong\u003elogin\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLa troisième ligne\u003c/strong\u003e peut servir à entrer l\u0026rsquo;\u003cstrong\u003eURL\u003c/strong\u003e correspondante, s\u0026rsquo;il y a lieu…\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;autres lignes… d\u0026rsquo;autres informations utiles, pertinentes, etc.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eC\u0026rsquo;est une convention utile à respecter… mais par défaut, étant donné que c\u0026rsquo;est\nun simple fichier texte chiffré, pass n\u0026rsquo;impose aucun schéma ou type d\u0026rsquo;organisation.\nSi ce n\u0026rsquo;est qu\u0026rsquo;il est préférable d\u0026rsquo;avoir en première ligne l\u0026rsquo;écriture du\nmot de passe, car c\u0026rsquo;est son mode opératoire, et là où toute extension,\ntout client cherchera cette information précise.\u003c/p\u003e\n\u003cp\u003eMerci de lire le man page pour avoir d\u0026rsquo;autres notions de conventions.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003e⇒ Création\u003c/p\u003e\n\u003cp\u003eCréons notre premier fichier chiffré nommé \u003cstrong\u003etest\u003c/strong\u003e, à l\u0026rsquo;aide de\nl\u0026rsquo;option \u003ccode\u003einsert\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass insert test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRetype password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003emaster 53331b0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e Add given password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test to store.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e file changed, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e insertions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e+\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e deletions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e-\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e create mode \u003cspan style=\"color:#f99b15\"\u003e100644\u003c/span\u003e test.gpg\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLors de la création, il est demandé de taper un mot de passe, puis de le\nré-écrire une deuxième fois, puis un commit est généré.\u003c/p\u003e\n\u003cp\u003eCette option permet de définir par ses propres soins un mot-de-passe.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;utilisation de l\u0026rsquo;argument \u003ccode\u003e-m\u003c/code\u003e permet l\u0026rsquo;ajout d\u0026rsquo;autres informations, en\nmode multilignes. Il faudra presser la combinaison de touches \u003ckbd\u003eCTRL+D\u003c/kbd\u003e\npour sortir de ce mode d\u0026rsquo;édition.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION : l\u0026rsquo;utilisation de cette option sur un fichier chiffré aura pour\nconséquence de vider toute information existante. Il sera demandé de confirmer\navant ; en cas de refus de votre part, l\u0026rsquo;action cessera.\u003c/div\u003e\n\n\u003cp\u003e⇒ Édition\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;édition de tout fichier chiffré se fait avec l\u0026rsquo;option \u003ccode\u003eedit\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass edit test\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe qui aura pour propos d\u0026rsquo;ouvrir l\u0026rsquo;éditeur de texte lié à votre environnement\nou par défaut \u003ccode\u003evi\u003c/code\u003e, si aucun n\u0026rsquo;est configuré. \u003cem\u003eLà, encore pour les amoureux\nd\u0026rsquo;emacs, installez l\u0026rsquo;extension correspondante.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eIl est ainsi possible de modifier toute information dans le fichier chiffré,\ndont le mot de passe, lisible en clair.\u003c/p\u003e\n\u003cp\u003e⇒ Génération d\u0026rsquo;un mot de passe\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION : À moins d\u0026rsquo;utiliser l\u0026rsquo;argument \u003ccode\u003e-i\u003c/code\u003e, l\u0026rsquo;utilisation de cette option\nsur un fichier chiffré aura pour conséquence de vider toute information\nexistante. Il sera demandé de confirmer avant ; en cas de refus de votre\npart, l\u0026rsquo;action cessera.\u003c/div\u003e\n\n\u003cp\u003eLa génération d\u0026rsquo;un nouveau mot-de-passe pour un fichier chiffré se fait\npar le biais de l\u0026rsquo;option \u003ccode\u003egenerate\u003c/code\u003e, suivi du nom de fichier chiffré et\nd\u0026rsquo;un chiffre représentant la longueur du mot de passe désiré :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass generate test \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAn entry already exists \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test. Overwrite it? \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ey/N\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e y\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003emaster 5195534\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e Add generated password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e file changed, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e insertions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e+\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e deletions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e-\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThe generated password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test is:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ezJwz\u003cspan style=\"color:#f99b15\"\u003e\\1\u003c/span\u003eE\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRjL3Ps\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u0026amp;7|?QZAt\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u0026amp;ps_A_GU\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ePour générer un mot-de-passe avec juste des lettres et des chiffres, dit\nalphanumérique, c\u0026rsquo;est l\u0026rsquo;argument \u003ccode\u003e-n\u003c/code\u003e qu\u0026rsquo;il faut ajouter, tel que :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass generate -n test \u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAn entry already exists \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test. Overwrite it? \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ey/N\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e y\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003emaster 6dff2bd\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e Add generated password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e file changed, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e insertions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e+\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e deletions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e-\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThe generated password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test is:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEWA0SlCkzcmlMgxMWJltGnHCMSxK4YXmPYg4X3BrNryJgoUREVVFaaOXSiKijbtm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;option \u003ccode\u003egenerate\u003c/code\u003e utilise le périphérique spécial \u003ccode\u003e/dev/urandom\u003c/code\u003e pour\ngénérer le mot-de passe.\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;argument \u003ccode\u003e-c\u003c/code\u003e copiera le mot de passe généré dans le presse-papier sans\nl\u0026rsquo;afficher.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;argument \u003ccode\u003e-i\u003c/code\u003e est pertinent pour ne pas détruire les informations contenues\ndans le fichier chiffré, tout en créant un nouveau mot de passe, tel que :\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass generate -i test \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003emaster 25f75ab\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e Replace generated password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e file changed, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e insertions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e+\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e deletions\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e-\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThe generated password \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test is:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFrCL98OE9C9*7bJusLVbw$%\u003cspan style=\"color:#f99b15\"\u003e\\@\u003c/span\u003eY^\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e,|Lj\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Voir le contenu\u003c/p\u003e\n\u003cp\u003ePour voir le contenu d\u0026rsquo;un fichier chiffré, il suffit de l\u0026rsquo;appeler directement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEWA0SlCkzcmlMgxMWJltGnHCMSxK4YXmPYg4X3BrNryJgoUREVVFaaOXSiKijbtm\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elogin: test@gmail.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eURL: https://test-moi.tld\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecomments: Ceci est un faux compte pour test du gestionnaire \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003epass\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMerci de l\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003eutiliser...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePIN: \u003cspan style=\"color:#f99b15\"\u003e123789654\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eLes informations secondaires affichées dans cet exemple sont des ajouts\npar mes soins, grâce à l\u0026rsquo;option \u003ccode\u003eedit\u003c/code\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Trouver un contenu\u003c/p\u003e\n\u003cp\u003ePour (re)trouver un contenu, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003efind\u003c/code\u003e qui est à utiliser.\u003c/p\u003e\n\u003cp\u003e⇒ Copie et presse-papier\u003c/p\u003e\n\u003cp\u003ePour copier dans le presse-papier, sachant qu\u0026rsquo;en suivant la convention de\nla première ligne comme étant le mot de passe :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass -c test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopied test to clipboard. Will clear in \u003cspan style=\"color:#f99b15\"\u003e45\u003c/span\u003e seconds.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eReste plus qu\u0026rsquo;à le coller où nécessaire.\u003c/p\u003e\n\u003cp\u003ePour copier, selon la convention décrite ci-dessus, l\u0026rsquo;identifiant lié :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass -c2 test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopied test to clipboard. Will clear in \u003cspan style=\"color:#f99b15\"\u003e45\u003c/span\u003e seconds.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEtc.\u003c/p\u003e\n\u003cp\u003e⇒ Suppression\u003c/p\u003e\n\u003cp\u003eLa suppression d\u0026rsquo;un fichier chiffré est très simple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pass rm test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erm: remove regular file ‘/home/your-user/.password-store/test.gpg’? y\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eremoved ‘/home/your-user/.password-store/test.gpg’\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eIl existe quelques autres options ; je vous laisse les découvrir dans le\nman page, telles \u003ccode\u003ecp\u003c/code\u003e, \u003ccode\u003els\u003c/code\u003e ou l\u0026rsquo;usage de \u003ccode\u003egrep\u003c/code\u003e, etc.\u003c/p\u003e\n\u003ch3 id=\"otp\"\u003eOTP\u003c/h3\u003e\n\u003cp\u003eLa fonction OTP fonctionne bien, à partir du moment où l\u0026rsquo;on importe des\ndonnées depuis une autre source, grâce à l\u0026rsquo;extension \u003cstrong\u003epass-import\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eEn CLI, je ne suis pas arriver à utiliser \u003cstrong\u003epass-otp\u003c/strong\u003e ; j\u0026rsquo;ai beau\neu faire \u003ccode\u003epass otp nom_fichier\u003c/code\u003e, impossible ; alors qu\u0026rsquo;avec \u003cstrong\u003eqtpass\u003c/strong\u003e\net \u003cstrong\u003ePassword Store\u003c/strong\u003e, cela fonctionne.\u003c/p\u003e\n\u003ch3 id=\"qtpass\"\u003eqtpass\u003c/h3\u003e\n\u003cp\u003eBien-sûr, tout cela se gère aussi au-travers de l\u0026rsquo;interface graphique \u003cstrong\u003eqtpass\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;application graphique \u003cstrong\u003eqtpass\u003c/strong\u003e est intéressante car elle permet de\ndéfinir dans son onglet \u0026ldquo;Paramètres\u0026rdquo; :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele comportement du presse-papier\u003c/li\u003e\n\u003cli\u003ela longueur par défaut du mot-de-passe\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;utiliser \u003ccode\u003epwgen\u003c/code\u003e pour générer le mot-de-passe, et exclure ou non les\nlettres en majuscule, les nombres, les autres symboles, tels les caractères\naccentués, de générer des mots de passe facile à mémoriser\u003c/li\u003e\n\u003cli\u003ed\u0026rsquo;utiliser git pour pousser automatiquement les push, les pulls, ajouter\nla ou les clés GPG à gérer.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Dans son onglet \u0026ldquo;Programs\u0026rdquo;, d\u0026rsquo;utiliser soit l\u0026rsquo;outil pass, soit les outils\nnatifs que sont Git et GPG…\u003c/p\u003e\n\u003cp\u003e⇒ De créer des profils de gestionnaire différents depuis l\u0026rsquo;onglet \u0026ldquo;Profiles\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003e⇒ De créer des modèles d\u0026rsquo;affichage de l\u0026rsquo;information pour les fichiers\nchiffrés, depuis l\u0026rsquo;onglet \u0026ldquo;Templates\u0026rdquo;.\u003c/p\u003e\n\u003ch3 id=\"password-store--openkeychain\"\u003ePassword Store \u0026amp; OpenKeychain\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;app \u003cstrong\u003ePassword Store\u003c/strong\u003e nécessite l\u0026rsquo;app \u003cstrong\u003eOpenKeychain\u003c/strong\u003e, toutes deux\ninstallables depuis le store F-Droid.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOpenKeychain\u003c/strong\u003e sert à stocker une ou plusieurs clés GPG.\u003c/p\u003e\n\u003cp\u003ePour utiliser votre clé GPG dans votre smartphone, il vaut mieux se prémunir\nde quelques précautions suivantes :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eGénération d\u0026rsquo;un mot de passe aléatoire fort avec GPG, sur la station :\u003cbr\u003e\n\u003ccode\u003egpg --armor --gen-random 1 20\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eChiffrement de la clé GPG dans la station, en utilisant le mot de passe\ngénéré par GPG :\u003cbr\u003e\n\u003ccode\u003egpg --armor --export-secret-keys \u0026quot;GPG-Fingerprint-long\u0026quot; | gpg --armor --symmetric --output mykey.sec.asc\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eTransfert vers le smartphone, connecté en USB, ou par le biais d\u0026rsquo;une\ncarte SD.\u003c/li\u003e\n\u003cli\u003eImport dans OpenKeychain depuis le menu \u0026lsquo;Importer ma clé\u0026rsquo; qui demandera\nà nouveau le mot de passe généré à l\u0026rsquo;étape 1, et créera un fichier\nnommé \u003ccode\u003edecrypted.key\u003c/code\u003e qu\u0026rsquo;il faudra importer lui aussi dans OpenKeychain.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"browserpass\"\u003eBrowserpass\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;extension \u003cstrong\u003eBrowserpass\u003c/strong\u003e pour les navigateurs web Chrome et Firefox est\nsimple à utiliser. Pour un site web donné, elle va chercher les occurrences\ndans le gestionnaire \u003cstrong\u003epass\u003c/strong\u003e. Elle va automatiquement cibler le site web\ndont la page est ouverte.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;utilisation de la combinaison des touches \u003ckbd\u003eCTRL+Shift+L\u003c/kbd\u003e permet\nde rechercher les occurrences nécessaires, en lieu et place d\u0026rsquo;un clic\nsur l\u0026rsquo;icône.\u003c/li\u003e\n\u003cli\u003eLa touche \u003ckbd\u003eTAB\u003c/kbd\u003e permet de naviguer entre les différents occurrences\ntrouvées.\u003c/li\u003e\n\u003cli\u003eAppuyer sur la touche \u003ckbd\u003eENTRÉE\u003c/kbd\u003e aura pour conséquence de remplir\nautomatiquement, valider la soumission d\u0026rsquo;un formulaire de connexion.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch3 id=\"cas-dusage\"\u003eCas d\u0026rsquo;usage\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003eCréation d\u0026rsquo;un nouveau fichier chiffré, et/ou modification, soit en CLI\navec pass, soit avec la GUI qtpass.\u003c/li\u003e\n\u003cli\u003egit push, avec des commits signés, en SSH vers le dépôt GIT extérieur.\u003c/li\u003e\n\u003cli\u003eimport dans Password Store, depuis le dépôt Git extérieur, par HTTPS\u003c/li\u003e\n\u003cli\u003eutilisation des extensions Browserpass pour la connexion à différents\nsites web\u003c/li\u003e\n\u003cli\u003eutilisation d\u0026rsquo;OTP, soit au-travers d\u0026rsquo;une application tierce, soit après\nimport. \u003cem\u003ePersonnellement, je préfère l\u0026rsquo;app tierce\u003c/em\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eVoilà un gestionnaire de mot de passe, totalement chiffré, par clé GPG,\ndont les changements de chaque fichier .gpg sont versionnés par le biais\nde Git, encapsulés soit dans une connexion SSH ou TLS selon l\u0026rsquo;usage.\u003c/p\u003e\n\u003cp\u003eChaque usage, que ce soit de la consultation ou de la modification, quelque\nsoit l\u0026rsquo;outil utilisé, en CLI, par GUI, par une extension ou une autre,\ntelle l\u0026rsquo;extension Browserpass, nécessite absolument l\u0026rsquo;authentification GPG.\u003c/p\u003e\n\u003cp\u003eVoilà pour la découverte, assez complète, de ce gestionnaire de mot de passe,\nvoire d\u0026rsquo;informations personnelles… pardon, que dis-je, de ce coffre fort\nnumérique différent.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"interne\"\u003eInterne\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-ed25519/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Création de clé à Courbes Elliptiques Ed25519'\"\u003eGPG : Création de clé à Courbes Elliptiques Ed25519\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sec/gpg/gpg-usage-securise/\" title=\"Lien interne vers l\u0026#39;article : 'GPG : Du bon usage sécurisé'\"\u003eGPG : Du bon usage sécurisé\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"wikipedia\"\u003eWikipedia\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Philosophie_d%27Unix\" title=\"Article Wikipédia : Philosophie_d\u0026#39;Unix\"\u003ePhilosophie_d'Unix \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Découverte du coffre fort numérique, gestionnaire de mot-de-passe unix, d'informations personnelles, qu'est 'pass'.",
            "tags": ["pass", "password", "store"],
            "date_published": "2022-10-25T17:05:45+02:00",
            "date_modified": "2025-08-31T16:29:58+02:00"
        },{
            "id": "urn:uuid:bc29d0c6-cdf6-d8ed-b560-2a833ed0a91f",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/wifi-schedule/",
            "title": "OpenWRT : Wifi Schedule - une méthode d'économie d'énergie",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Comment faire de petites économies d\u0026rsquo;énergie sous OpenWRT : éteindre et activer les puces Wifi à heures programmées !\nInstallation Très simplement, dans un premier temps, il faut installer les deux modules suivants wifischedule et luci-app-wifischedule.\nEn mode CLI: opkg install wifischedule luci-app-wifischedule\nAvec l\u0026rsquo;interface web LuCI, allez dans la section \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Software\u0026rsquo;.\nConfiguration Une fois installés, un nouveau menu est disponible depuis l\u0026rsquo;interface LuCI, dans \u0026lsquo;Services\u0026rsquo; \u0026gt; \u0026lsquo;Wifi Schedule\u0026rsquo;.\nCette section propose 3 onglets, positionné par défaut sur \u0026lsquo;Schedule\u0026rsquo;.\nl\u0026rsquo;onglet \u0026lsquo;View Logfile\u0026rsquo; permettra de voir le journal lié au fonctionnement du service l\u0026rsquo;onglet \u0026lsquo;View Cron Jobs\u0026rsquo; affichera la table des tâches cron liés aux événements programmés. Manual control Vous y trouverez tout particulièrement trois boutons :\nle premier [ ACTIVATE WIFI ] pour (ré?)activer le wifi, si besoin le second [ DISABLE WIFI GRACEFULLY ] qui permet de désactiver le Wifi de manière dite \u0026ldquo;gracieuse\u0026rdquo;, permettant aux périphériques connectés d\u0026rsquo;être déconnnecté une fois la session Wifi terminée. le troisième [ DISABLE WIFI FORCE ] qui coupera le wifi immédiatement, \u0026ldquo;brutalement\u0026rdquo;. Global Settings Pour activer le programmateur, cliquez sur la case à cocher : \u0026lsquo;Enable Wifi Schedule\u0026rsquo;, dans la section \u0026lsquo;Global Settings\u0026rsquo;.\nIl est possible d\u0026rsquo;utiliser la commande uci, tel que :\nuci set wifi_schedule.@global[0].enabled=\u0026#39;1\u0026#39; Vous trouverez aussi une option pour journaliser l\u0026rsquo;activité Enable logging.\nuci set wifi_schedule.@global[0].logging=\u0026#39;1\u0026#39; Schedule events Dans la section \u0026lsquo;Schedule events\u0026rsquo;, par défaut, deux programmations sont déjà paramétrées :\nune première pour les journées de la semaine, une autre pour celles du week-end. Une case à cocher \u0026lsquo;Enable\u0026rsquo; à activer ou non pour chacun des paramétrages, avec les jours prédéfinis, ainsi que des horaires. Bin-sûr, tous ces paramétrages par défaut peuvent être changés.\nIl est même possible de forcer l\u0026rsquo;extinction de la connexion des périphériques en cochant la case \u0026lsquo;Force disabling wifi even if stations associated\u0026rsquo;.\nEn fin de section, un champ vide avec un bouton [ ADD ] pour ajouter de nouveaux paramétrages.\nUne fois les paramètres choisis, reste plus qu\u0026rsquo;à cliquer sur le bouton [ SAVE \u0026amp; APPLY ].\nVoici pour exemple la configuration par défaut par le biais de la commande uci :\n:# uci show wifi_schedule wifi_schedule.@global[0]=global wifi_schedule.@global[0].logging=\u0026#39;0\u0026#39; wifi_schedule.@global[0].enabled=\u0026#39;1\u0026#39; wifi_schedule.@global[0].recheck_interval=\u0026#39;10\u0026#39; wifi_schedule.@global[0].modules_retries=\u0026#39;10\u0026#39; wifi_schedule.@global[0].unload_modules=\u0026#39;0\u0026#39; wifi_schedule.Businesshours=entry wifi_schedule.Businesshours.enabled=\u0026#39;0\u0026#39; wifi_schedule.Businesshours.daysofweek=\u0026#39;Monday Tuesday Wednesday Thursday Friday\u0026#39; wifi_schedule.Businesshours.starttime=\u0026#39;06:00\u0026#39; wifi_schedule.Businesshours.stoptime=\u0026#39;22:00\u0026#39; wifi_schedule.Businesshours.forcewifidown=\u0026#39;0\u0026#39; wifi_schedule.Weekend=entry wifi_schedule.Weekend.enabled=\u0026#39;0\u0026#39; wifi_schedule.Weekend.daysofweek=\u0026#39;Saturday Sunday\u0026#39; wifi_schedule.Weekend.starttime=\u0026#39;09:00\u0026#39; wifi_schedule.Weekend.stoptime=\u0026#39;23:30\u0026#39; wifi_schedule.Weekend.forcewifidown=0\u0026#39; Pour ajouter une entrée avec uci, par exemple :\nuci set wifi_schedule.Vacances=entry uci set wifi_schedule.Vacances.enabled=\u0026#39;1\u0026#39; uci set wifi_schedule.Vacances.daysofweek=\u0026#39;Monday Tuesday Wednesday Thursday Friday Saturday Sunday\u0026#39; uci set wifi_schedule.Vacances.starttime=\u0026#39;09:00\u0026#39; uci set wifi_schedule.Vacances.stoptime=\u0026#39;23:30\u0026#39; uci set wifi_schedule.Vacances.forcewifidown=\u0026#39;1\u0026#39; uci commit Cet exemple crée une nouvelle entrée nommée \u0026lsquo;Vacances\u0026rsquo;, qui est activé, qui a lieu tous les jours de la semaine, démarrant à 9h00 du matin, se coupant à 23h30, et qui a pour commande de forcer l\u0026rsquo;arrêt des connexions wifi à l\u0026rsquo;heure d\u0026rsquo;arrêt !\nWireless Maintenant la consultation du menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;Wireless\u0026rsquo; aura pour propos de montrer le wifi actif aux périodes d\u0026rsquo;activité programmés, ou d\u0026rsquo;être pleinement désactivés lors des périodes d\u0026rsquo;extinction programmés, tel que la capture d\u0026rsquo;écran ci-dessous :\nAperçu de la fonction Wireless désactivée EOD Voilà, comment vous pouvez éteindre la ou les puce(s) Wifi de votre routeur OpenWRT.\nIl est possible de le faire en mode CLI de manière plus basique, sans cet outil… mais avouez qu\u0026rsquo;il est bien pratique.\nEOD - Fin de Documentation\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eComment faire de petites économies d\u0026rsquo;énergie sous OpenWRT : éteindre et\nactiver les puces Wifi à heures programmées !\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eTrès simplement, dans un premier temps, il faut installer les deux modules\nsuivants \u003cstrong\u003ewifischedule\u003c/strong\u003e et \u003cstrong\u003eluci-app-wifischedule\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eEn mode CLI: \u003cbr\u003e\n\u003ccode\u003eopkg install wifischedule luci-app-wifischedule\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAvec l\u0026rsquo;interface web LuCI, allez dans la section \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Software\u0026rsquo;.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eUne fois installés, un nouveau menu est disponible depuis l\u0026rsquo;interface LuCI,\ndans \u0026lsquo;Services\u0026rsquo; \u0026gt; \u0026lsquo;Wifi Schedule\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003eCette section propose 3 onglets, positionné par défaut sur \u0026lsquo;Schedule\u0026rsquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;onglet \u0026lsquo;View Logfile\u0026rsquo; permettra de voir le journal lié au fonctionnement\ndu service\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;onglet \u0026lsquo;View Cron Jobs\u0026rsquo; affichera la table des tâches cron liés aux\névénements programmés.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manual-control\"\u003eManual control\u003c/h3\u003e\n\u003cp\u003eVous y trouverez tout particulièrement trois boutons :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele premier [ ACTIVATE WIFI ] pour (ré?)activer le wifi, si besoin\u003c/li\u003e\n\u003cli\u003ele second [ DISABLE WIFI GRACEFULLY ] qui permet de désactiver le Wifi\nde manière dite \u0026ldquo;gracieuse\u0026rdquo;, permettant aux périphériques connectés\nd\u0026rsquo;être déconnnecté une fois la session Wifi terminée.\u003c/li\u003e\n\u003cli\u003ele troisième [ DISABLE WIFI FORCE ] qui coupera le wifi immédiatement,\n\u0026ldquo;brutalement\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"global-settings\"\u003eGlobal Settings\u003c/h3\u003e\n\u003cp\u003ePour activer le programmateur, cliquez sur la case à cocher : \u0026lsquo;Enable Wifi Schedule\u0026rsquo;,\ndans la section \u0026lsquo;Global Settings\u0026rsquo;.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;utiliser la commande \u003ccode\u003euci\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci set wifi_schedule.@global[0].enabled=\u0026#39;1\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003eVous trouverez aussi une option pour journaliser l\u0026rsquo;activité \u003ccode\u003eEnable logging\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci set wifi_schedule.@global[0].logging=\u0026#39;1\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"schedule-events\"\u003eSchedule events\u003c/h3\u003e\n\u003cp\u003eDans la section \u0026lsquo;Schedule events\u0026rsquo;, par défaut, deux programmations sont\ndéjà paramétrées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eune première pour les journées de la semaine,\u003c/li\u003e\n\u003cli\u003eune autre pour celles du week-end.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne case à cocher \u0026lsquo;Enable\u0026rsquo; à activer ou non pour chacun des paramétrages,\navec les jours prédéfinis, ainsi que des horaires. Bin-sûr, tous ces paramétrages\npar défaut peuvent être changés.\u003c/p\u003e\n\u003cp\u003eIl est même possible de forcer l\u0026rsquo;extinction de la connexion des périphériques\nen cochant la case \u0026lsquo;Force disabling wifi even if stations associated\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003eEn fin de section, un champ vide avec un bouton [ ADD ] pour ajouter de\nnouveaux paramétrages.\u003c/p\u003e\n\u003cp\u003eUne fois les paramètres choisis, reste plus qu\u0026rsquo;à cliquer sur le bouton\n[ SAVE \u0026amp; APPLY ].\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoici pour exemple la configuration par défaut par le biais de la commande \u003ccode\u003euci\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# uci show wifi_schedule\nwifi_schedule.@global[0]=global\nwifi_schedule.@global[0].logging=\u0026#39;0\u0026#39;\nwifi_schedule.@global[0].enabled=\u0026#39;1\u0026#39;\nwifi_schedule.@global[0].recheck_interval=\u0026#39;10\u0026#39;\nwifi_schedule.@global[0].modules_retries=\u0026#39;10\u0026#39;\nwifi_schedule.@global[0].unload_modules=\u0026#39;0\u0026#39;\nwifi_schedule.Businesshours=entry\nwifi_schedule.Businesshours.enabled=\u0026#39;0\u0026#39;\nwifi_schedule.Businesshours.daysofweek=\u0026#39;Monday Tuesday Wednesday Thursday Friday\u0026#39;\nwifi_schedule.Businesshours.starttime=\u0026#39;06:00\u0026#39;\nwifi_schedule.Businesshours.stoptime=\u0026#39;22:00\u0026#39;\nwifi_schedule.Businesshours.forcewifidown=\u0026#39;0\u0026#39;\nwifi_schedule.Weekend=entry\nwifi_schedule.Weekend.enabled=\u0026#39;0\u0026#39;\nwifi_schedule.Weekend.daysofweek=\u0026#39;Saturday Sunday\u0026#39;\nwifi_schedule.Weekend.starttime=\u0026#39;09:00\u0026#39;\nwifi_schedule.Weekend.stoptime=\u0026#39;23:30\u0026#39;\nwifi_schedule.Weekend.forcewifidown=0\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePour ajouter une entrée avec \u003ccode\u003euci\u003c/code\u003e, par exemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003euci set wifi_schedule.Vacances=entry\nuci set wifi_schedule.Vacances.enabled=\u0026#39;1\u0026#39;\nuci set wifi_schedule.Vacances.daysofweek=\u0026#39;Monday Tuesday Wednesday Thursday Friday Saturday Sunday\u0026#39;\nuci set wifi_schedule.Vacances.starttime=\u0026#39;09:00\u0026#39;\nuci set wifi_schedule.Vacances.stoptime=\u0026#39;23:30\u0026#39;\nuci set wifi_schedule.Vacances.forcewifidown=\u0026#39;1\u0026#39;\nuci commit\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003eCet exemple crée une nouvelle entrée nommée \u0026lsquo;Vacances\u0026rsquo;, qui est activé, qui\na lieu tous les jours de la semaine, démarrant à 9h00 du matin, se coupant à\n23h30, et qui a pour commande de forcer l\u0026rsquo;arrêt des connexions wifi à l\u0026rsquo;heure\nd\u0026rsquo;arrêt !\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"wireless\"\u003eWireless\u003c/h2\u003e\n\u003cp\u003eMaintenant la consultation du menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;Wireless\u0026rsquo; aura pour propos\nde montrer le wifi actif aux périodes d\u0026rsquo;activité programmés, ou d\u0026rsquo;être\npleinement désactivés lors des périodes d\u0026rsquo;extinction programmés, tel que\nla capture d\u0026rsquo;écran ci-dessous :\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openwrt/Network-Wireless-disabled.png\" title=\"Aperçu de la fonction Wireless désactivée\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openwrt/Network-Wireless-disabled_hu_7ebc192fff8bf945.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Aperçu de la fonction Wireless désactivée\" height=\"88\" loading=\"lazy\" src=\"/images/openwrt/Network-Wireless-disabled_hu_97737d54ccf1e84b.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eAperçu de la fonction Wireless désactivée\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"eod\"\u003eEOD\u003c/h2\u003e\n\u003cp\u003eVoilà, comment vous pouvez éteindre la ou les puce(s) Wifi de votre routeur\nOpenWRT.\u003c/p\u003e\n\u003cp\u003eIl est possible de le faire en mode CLI de manière plus basique, sans cet\noutil… mais avouez qu\u0026rsquo;il est bien pratique.\u003c/p\u003e\n\u003cp\u003eEOD - Fin de Documentation\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "OpenWRT : programmer l'arrêt et le redémarrage du Wifi",
            "tags": ["OpenWRT", "Wifi"],
            "date_published": "2022-10-22T09:28:23+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:4216ab91-3d59-ce89-faf7-39338aa1ff88",
            "url": "http://doc.huc.fr.eu.org/fr/post/openbsd-nsd-dnssec-tlsa/",
            "title": "OpenBSD : Gérer DNS, DNSSEC (puis automatiser ses enregistrements TLSA)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description En 2018, je me suis posé la question de la gestion des enregistrements TLSA, selon le protocole DANE, lié au protocole de sécurité DNSSEC, dans mes zones DNS. (cf: DNS: Générer un enregistrement TLSA) - je vous invite à le lire…\nCertains vont utiliser l\u0026rsquo;outil knot, fourni en tant que paquet sous OpenBSD, car ils trouvent complexe à gérer. Mais nous verrons avec un peu d\u0026rsquo;astuces comment gérer cela de manière automatisé en shell, sous OpenBSD.\nPour rappel, mon service DNS fonctionne depuis plus de 4 ans, sous OpenBSD grâce au logiciel natif nsd. La gestion des enregistrements DNSSEC se fait grâce aux outils ldns à installer en tant que paquet tiers. J\u0026rsquo;utilise dans les faits l\u0026rsquo;outil ldnscript qui permet de gérer la création des clés nécessaires puis s\u0026rsquo;occupe de gérer les enregistrements DNSSEC adéquats.\n⇒ En Juin 2022, j\u0026rsquo;ai décidé de basculer du chiffrement RSA par l\u0026rsquo;utilisation de l\u0026rsquo;algorithme à courbes elliptiques nommés ECDSA.\nAvant d\u0026rsquo;aller plus loin en ce sens, passons à l\u0026rsquo;installation des prérequis nécessaires :\nInstallation ldnscript Pour me rappeler comment faire, je me suis fait le petit mémo suivant :\ninstaller les binaires nécessaires : $ doas pkg_add ldns-utils git télécharger et installer ldnscripts\n$ cd /usr/local/src/ $ doas mkdir ldnscripts $ doas chown $USER ldnscripts $ git clone https://framagit.org/22decembre/ldnscripts.git $ cd ldnscripts $ doas make install configurer le fichier /etc/ns/ldnscript.conf ; SHA256 est largement suffisant et sécuritaire ALG=ECDSAP256SHA256 NSEC3_ALG=SHA-256 initialisation du domaine $ doas ldnscript init domain.tld\nnécessité de créer un lien symbolique /usr/bin/dig vers /usr/sbin/dig :\n$ doas ln -sf /usr/bin/dig /usr/sbin/dig (sans ce dernier point, l\u0026rsquo;outil ldnscript ne pourra trouver le binaire dig et donc refusera de fonctionner en se mettant en erreur).\nConfiguration /etc/monthly.local Tous les mois, je crée le rollover nécessaire des clés en intégrant dans le script /etc/monthly.local, le code shell suivant :\n### ldnscript printf \u0026#39;%s\\n\u0026#39; \u0026#34;=\u0026gt; ldnscript rollover\u0026#34; /usr/local/sbin/ldnscript rollover all Let\u0026rsquo;s Encrypt Dans la foulée, du rollover des clés DNSSEC, mon script interroge les services Let\u0026rsquo;s Encrypt pour savoir s\u0026rsquo;il faut un renouvellement des certificats pour les noms de domaines que j\u0026rsquo;utilise.\nNormalement, on utiliserait le client acme natif sous OpenBSD, mais ayant eu certains déboires, j\u0026rsquo;ai décidé de basculer sur l\u0026rsquo;usage de certbot.\nUne simple écriture shell suffit pour le renouvellement : /usr/local/bin/certbot renew --pre-hook \u0026quot;rcctl stop nginx\u0026quot; --post-hook \u0026quot;rcctl start nginx\u0026quot;\n(en effet, j\u0026rsquo;utilise aussi le serveur nginx, en lieu et place du serveur web natif httpd - mais il suffit de remplacer le nom du service, si jamais c\u0026rsquo;est votre cas).\nBien-sûr, cette partie n\u0026rsquo;entre pas directement en ligne de compte de la gestion DNS. Néanmoins, c\u0026rsquo;est important à prendre en compte car lors du renouvellement de certificat, il est nécessaire de regénérer les enregistrements TLSA - nous verrons ce point plus tard.\nExemple zone DNS Voici pour l\u0026rsquo;exemple une zone DNS minimaliste, gérée par le serveur ns :\n$TTL 1H $ORIGIN domain.tld. @ IN SOA domain.tld. dns.domain.tld. ( 2022090101 ; 3H ; refresh 1H ; retry 2W ; expire 1H ; negative ) @ IN NS ns1.domain.tld. @ IN NS ns2.domain.tld. @ IN A 46.23.90.29 IN AAAA 2a03:6000:6e65:619::29 ; enregistrement CAA @ IN CAA 0 iodef \u0026#34;mailto:mail@domain.tld\u0026#34; @ IN CAA 0 issue \u0026#34;letsencrypt.org\u0026#34; @ IN CAA 0 issuewild \u0026#34;letsencrypt.org\u0026#34; www IN A 46.23.90.29 IN AAAA 2a03:6000:6e65:619::29 ; TLSA _443._tcp.domain.tld. IN TLSA 3 1 2 5c8fdd68178ce4cd8d88bd90b82a96df41674d555340b88283c24a0b3416aa375144cd6c16a58160ba3b168e59f5003bff656ce67cb24931b462fe4910bd62f5 shell Générer un Enregistrement TLSA En shell, générer un enregistrement TLSA n\u0026rsquo;est pas compliqué :\nopenssl x509 -noout -pubkey -in \u0026quot;${cert}\u0026quot; | openssl \u0026quot;${command}\u0026quot; -pubin -outform der 2\u0026gt;/dev/null | \u0026quot;${algo}\u0026quot; | tr \u0026quot;a-z\u0026quot; \u0026quot;A-Z\u0026quot;\nExplications :\n⇒ La commande ci-dessus nous permet de générer une variable intermédiaire nommée tlsa_cert_associated où :\nla variable $cert est le nom du chemin absolu du certificat TLS serveur, dans le système de fichier du serveur, lié au domaine cible. la variable $command est le nom de la commande utilisée par OpenSSL, soit rsa ou ec (réciproquement pour les enregistrements selon le chiffrement RSA ou ECDSA). et, où la variable $algo est le nom de l\u0026rsquo;utilitaire sha256, ou sha512, au choix personnel et restituera un condensé de message lié à l\u0026rsquo;algorithme choisi. ⇒ l\u0026rsquo;écriture relative à l\u0026rsquo;enregistrement TLSA est aussi simple :\ntlsa_record=\u0026quot;_${tls_port}._${tls_proto}.${domain}. IN TLSA ${tlsa_usage} ${tlsa_selector} ${tlsa_method} ${tlsa_cert_associated}\u0026quot;\noù :\n${tls_port} est le numéro de port du serveur web utilisé, ici 443 ${tls_proto} est le nom du protocole utilisé, ici tls ${domain} est le nom de domaine cible ${tlsa_usage} est le chiffre correspondant à la contrainte utilisée, ici 3, correspondant à la contrainte DANE-EE, et recommandée par Let\u0026rsquo;s Encrypt. ${tlsa_selector} est le chiffre correspondant au nom de sélecteur utilisé, ici 1, correspondant au sélecteur SPKI, là aussi recommandé par Let\u0026rsquo;s Encrypt. ${tlsa_method} étant la méthode utilisant l\u0026rsquo;algorithme de chiffrement choisi ; ici SHA256, qui offre un niveau actuel de chiffrement dit sécurisé et tout autant recommandé par Let\u0026rsquo;s Encrypt. et pour finir la variable tlsa_cert_associated précédemment créée. Vérifier un Enregistrement TLSA Vérifier un enregistrement TLSA est un poil plus compliqué ; il faut :\n1/ interroger le serveur DNS pour connaître l\u0026rsquo;enregistrement TLSA actuel par le biais de l\u0026rsquo;outil dig, pour l\u0026rsquo;exemple. 2/ le comparer avec la sortie fournie par l\u0026rsquo;outil openssl qui va interroger le certificat installé sur le serveur web utilisé, lié au nom de domaine en question. interroger le serveur DNS se fait ainsi : tlsa=\u0026#34;$(dig TLSA _443._tcp.\u0026#34;${domain}\u0026#34; +short)\u0026#34; d_tlsa=\u0026#34;$(echo \u0026#34;${tlsa}\u0026#34; | awk \u0026#39;{ for(i=4;i\u0026lt;=NF;++i) printf \u0026#34;%s\u0026#34;, tolower($i); print \u0026#34;\u0026#34; }\u0026#39;)\u0026#34; utiliser openssl pour interroger le certificat TLS utilisé sur le serveur web : tlsa=\u0026#34;$(echo | openssl s_client -servername \u0026#34;${domain}\u0026#34; -showcerts -connect \u0026#34;${domain}\u0026#34;:443 2\u0026gt;/dev/null | openssl x509 -noout -pubkey | openssl pkey -outform der -pubin 2\u0026gt;/dev/null | openssl dgst -\u0026#34;${algo}\u0026#34; 2\u0026gt;/dev/null )\u0026#34; o_tlsa=\u0026#34;$(echo \u0026#34;${tlsa}\u0026#34; | awk -F\u0026#39;=\u0026#39; \u0026#39;{ print $2 }\u0026#39; | tr -d \u0026#39; \u0026#39;)\u0026#34; Pour finir, il suffit vraiment de comparer les deux variables shell d_tlsa et o_tlsa pour savoir si elles correspondent, ce qui en temps normal doit être le cas. Sauf en cas, de renouvellement de certificat TLS, qui nécessitera donc de renouveller l\u0026rsquo;enregistrement TLSA, dans la zone du nom de domaine en question, sur le serveur DNS.\nPour rappel, si cela n\u0026rsquo;est pas fait, une interrogation du serveur DNS sur le protocole DNSSEC générera une erreur puisque l\u0026rsquo;enregistrement TLSA ne correspondra pas un certificat web fraîchement utilisé, ou renouvellé, ce qui va entraîner cette conséquence : l\u0026rsquo;accès au serveur, lié au nom de domaine cible, sera impossible.\nIl faudra donc générer un nouvel enregistrement TLSA correspondant au renouvellement du certificat TLS, puis régénerer la signature des enregistrements DNSSEC liés à la zone DNS du domaine cible.\nScripts Shell Pour info, les scripts shell tlsa.sh, dns.conf, dns.ksh sont écrits dans un répertoire nommé dns-tools dans le répertoire personnel. À vous de voir où vous désirez les mettre, et modifier le script mensuel.\nmonthly.local Voici la teneur de mon script shell monthly.local :\n#!/bin/sh ### ldnscript printf \u0026#39;%s\\n\u0026#39; \u0026#34;=\u0026gt; ldnscript rollover\u0026#34; /usr/local/sbin/ldnscript rollover all ### renew ssl by certbot printf \u0026#39;%s\\n\u0026#39; \u0026#34;=\u0026gt; renew letsencrypt certs\u0026#34; /usr/local/bin/certbot renew --pre-hook \u0026#34;rcctl stop nginx\u0026#34; --post-hook \u0026#34;rcctl start nginx\u0026#34; ### check tlsa records for domain; only for tcp:443 for domain in \u0026#34;sub.domain.tld\u0026#34; \u0026#34;domain.tld\u0026#34; \u0026#34;www.domain.tld\u0026#34; \u0026#34;sub.domain2.tld\u0026#34; \u0026#34;domain2.tld\u0026#34; \u0026#34;www.domain2.tld\u0026#34;; do printf \u0026#39;%s\\n\u0026#39; \u0026#34;=\u0026gt; Test TLSA for ${domain}\u0026#34; /home/-your-user-/dns-tools/tlsa.sh \u0026#34;${domain}\u0026#34; done (…) tlsa.sh Voici mon script shell nommé tlsa.sh :\n#!/bin/sh set -e #set -x ######################################################################## # # Author: Stéphane HUC # mail: devs@stephane-huc.net # gpg:fingerprint: CE2C CF7C AB68 0329 0D20 5F49 6135 D440 4D44 BD58 # # License: BSD Simplified # # Github: # # Date: 2022/07/01 06:45 # ######################################################################## # # Purpose: tool to test TLSA record # - for the geek: DANE-TLSA... # # Needed tools: dig, openssl # # OS: Tested on OpenBSD, Devuan # ######################################################################## ### ## # see: https://www.bortzmeyer.org/monitor-dane.html ## ### ######################################################################## ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34; . \u0026#34;${ROOT}/dns.conf\u0026#34; dir_admin=\u0026#34;/home/-your-user-/dns-tools\u0026#34; domain=\u0026#34;$1\u0026#34; ### DO NOT TOUCH! d_tlsa=\u0026#39;\u0026#39;\t# TLSA record by dig o_tlsa=\u0026#39;\u0026#39;\t# TLSA record by openssl tlsa_record=\u0026#39;\u0026#39;\t# TLSA record tlsa_method=2 ######################################################################## #### ## # All needed functions! DO NOT TOUCH-IT! ## ### ######################################################################## byebye() { mssg \u0026#34;KO\u0026#34; \u0026#34;Script stop here!\u0026#34; mssg \u0026#34;KO\u0026#34; \u0026#34;Please, search to understand reasons.\u0026#34; exit 1 } check_uid() { if [ \u0026#34;$(id -u)\u0026#34; -ne 0 ]; then mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: Script not launch with rights admin!\u0026#34; byebye fi } _dig() { tlsa=\u0026#34;$(dig TLSA _443._tcp.\u0026#34;${domain}\u0026#34; +short)\u0026#34; d_tlsa=\u0026#34;$(echo $tlsa | awk \u0026#39;{ for(i=4;i\u0026lt;=NF;++i) printf \u0026#34;%s\u0026#34;, tolower($i); print \u0026#34;\u0026#34; }\u0026#39;)\u0026#34; } _openssl() { tlsa=\u0026#34;$(echo | openssl s_client -servername \u0026#34;${domain}\u0026#34; -showcerts -connect \u0026#34;${domain}\u0026#34;:443 2\u0026gt;/dev/null | openssl x509 -noout -pubkey | openssl pkey -outform der -pubin 2\u0026gt;/dev/null | openssl dgst -\u0026#34;${algo}\u0026#34; 2\u0026gt;/dev/null )\u0026#34; o_tlsa=\u0026#34;$(echo $tlsa | awk -F\u0026#39;=\u0026#39; \u0026#39;{ print $2 }\u0026#39; | tr -d \u0026#39; \u0026#39;)\u0026#34; } mssg() { typeset statut info text statut=\u0026#34;$1\u0026#34; info=\u0026#34;$2\u0026#34; case \u0026#34;${statut}\u0026#34; in \u0026#34;KO\u0026#34;) text=\u0026#34;[ ${red}${statut}${neutral} ] ${info}\u0026#34; ;; \u0026#34;OK\u0026#34;) text=\u0026#34;[ ${green}${statut}${neutral} ] ${info}\u0026#34; ;; #*) mssg=\u0026#34;${text}\u0026#34; ;; esac printf \u0026#34;%s \\n\u0026#34; \u0026#34;${text}\u0026#34; unset info statut text } new_tlsa() { cert=\u0026#34;/etc/letsencrypt/live/${domain}/cert.pem\u0026#34; case \u0026#34;${le_key_type}\u0026#34; in \u0026#34;ecdsa\u0026#34;) tlsa_cert_associated=\u0026#34;$(openssl x509 -noout -pubkey -in \u0026#34;${cert}\u0026#34; | openssl ec -pubin -outform der 2\u0026gt;/dev/null | \u0026#34;${algo}\u0026#34;)\u0026#34; ;; \u0026#34;rsa\u0026#34;) tlsa_cert_associated=\u0026#34;$(openssl x509 -noout -pubkey -in \u0026#34;${cert}\u0026#34; | openssl rsa -pubin -outform der 2\u0026gt;/dev/null | \u0026#34;${algo}\u0026#34;)\u0026#34; ;; esac tlsa_record=\u0026#34;_${tls_port}._${tls_proto}.${domain}. IN TLSA ${tlsa_usage} ${tlsa_selector} ${tlsa_method} ${tlsa_cert_associated}\u0026#34; unset tlsa_cert_associated } ######################################################################## #### ## # Execution ## ### ######################################################################## if [ -z \u0026#34;${domain}\u0026#34; ]; then printf \u0026#39;%s\\n\u0026#39; \u0026#34;[ KO ] Script stops here; no domain!\u0026#34;; exit; fi _dig _openssl if [ \u0026#34;${d_tlsa}\u0026#34; = \u0026#34;${o_tlsa}\u0026#34; ]; then mssg \u0026#34;OK\u0026#34; \u0026#34;Similar TLSA records! :D\u0026#34; else mssg \u0026#34;KO\u0026#34; \u0026#34;There seems to be a problem with the TLSA records of the domain: ${domain}!\u0026#34; printf \u0026#39;%s\\n\u0026#39; \u0026#34;Have you renew recently the TLS certs for the domain? If yes, change the TLSA record into the DNS zone relevent!\u0026#34; printf \u0026#39;%s\\n%s\\n\u0026#39; \u0026#34;⇒ Perhaps, the dns.sh script shell can help you. ;-)\u0026#34; check_uid printf \u0026#39;%s\\n\u0026#39; \u0026#34;⇒ Display new TLSA record:\u0026#34; new_tlsa printf \u0026#39;%s\\n%s\\n\u0026#39; \u0026#34;Add/modify tlsa into your DNS zone for ${domain}: \u0026#34; \u0026#34;${tlsa_record}\u0026#34; printf \u0026#39;%s\\n\u0026#39; \u0026#34;⇒ Modify TLSA record into the domain zone for ${domain}\u0026#34; \u0026#34;${dir_admin}\u0026#34;/dns.ksh tlsa \u0026#34;${domain}\u0026#34; fi Modifiez la valeur de la variable dir_admin !\nComme vous pouvez le remarquer :\nil fait appel au fichier de configuration dns.conf, publié ci-dessous et si la correspondance des enregistrements TLSA ne se fait pas, il appelle le script pdksh dns.ksh avec l\u0026rsquo;argument tlsa suivi du nom de domaine à cibler dns.conf Voici le fichier de configuration qui sert à la fois pour le script shell tlsa.sh et le script pdksh dns.ksh.\n######################################################################## # # Author: Stéphane HUC # mail: devs@stephane-huc.net # gpg:fingerprint: CE2C CF7C AB68 0329 0D20 5F49 6135 D440 4D44 BD58 # # License: BSD Simplified # # Github: https://framagit.org/hucste/AH.git # # Date: 2022/06/01 07:20 # ######################################################################## ### ## # Config file to dns.ksh script ## ### ######################################################################## ### Algorithm ## values: sha256, sha512; choose-it segun TLSA Method algo=\u0026#34;sha256\u0026#34; ### SOA Serial type ## values: date, timestamp ## DNS recommandation: prefer date SOA_serial_type=\u0026#34;date\u0026#34; ### Port number tls_port=443 ### Protocols ## values: stcp, tcp, udp tls_proto=\u0026#34;tcp\u0026#34; ### TLSA ## Lets Encrypt Recommandation; ## see: https://community.letsencrypt.org/t/please-avoid-3-0-1-and-3-0-2-dane-tlsa-records-with-le-certificates/7022 ## usage: Lets Encrypt recommands 3, at least 2 ## values: 0 =\u0026gt; 3; or (PKIX-TA, PKIX-EE, DANE-TA, DANE-EE; respectivly: 0 -\u0026gt; 3) tlsa_usage=3 ## selector: Lets Encrypt recommands 1 ## values: 0 or 1; or (CERT, SPKI; respectively: O or 1) tlsa_selector=1 ## method: Lets Encrypt recommands 1 ## values: 0 =\u0026gt; 2; or (FULL, SHA256, SHA512; respectively: 0 -\u0026gt; 2) # this change segun algo tlsa_method=1 ### Key Type Letsencrypt ## rsa or ecdsa ## if ecdsa, specify elliptic curve: secp256r1, secp384r1, secp512r1 (256 is enough) le_key_type=ecdsa le_curve=secp256r1 Personnellement, je fais le choix d\u0026rsquo;utiliser :\nl\u0026rsquo;algorithme sha512. le type de clé ecdsa qui déclenche l\u0026rsquo;utilisation de la commande ec lors de l\u0026rsquo;utilisation d\u0026rsquo;openssl, par les scripts dns.ksh ou tlsa.sh. Il est bien sûr possible d\u0026rsquo;utiliser rsa ; dans ce cas, les scripts shell n\u0026rsquo;utiliseront pas la variable le_curve. dns.ksh Ce script long et complexe est capable de :\ngénérer les signatures DNSSEC pour la zone DNS d\u0026rsquo;un domaine cible. modifier l\u0026rsquo;enregistrement TLSA puis regénérer les signatures DNSSEC ; dans ce cas : récupèrer l\u0026rsquo;enregistrement de numéro de série SOA en cours dans la zone DNS du domaine cible créer un nouveau fichier de zone DNS et sauvegarder l\u0026rsquo;actuel si le nouveau fichier de zone DNS est accessible, le script écrit : un nouveau numéro de série SOA remplace l\u0026rsquo;ancien enregistrement TLSA par le nouveau essaye de signer à nouveau la zone DNS à l\u0026rsquo;aide du protocole DNSSEC s\u0026rsquo;il réussit, il supprime l\u0026rsquo;ancien fichier de zone DNS s\u0026rsquo;il échoue, il avertit, arrête son exécution et dans ce cas, il faudra renommer à la main la sauvegarde de la zone DNS pour en faire à nouveau l\u0026rsquo;actuelle, puis chercher à comprendre pourquoi le script à échouer - dans ce cas-là, il est intéressant de positionner la variable debug à 1, ce qui activera la journalisation des différentes étapes, et pourra aider à l\u0026rsquo;analyse, lors d\u0026rsquo;une exécution manuelle. Un petit coup de ./dns.ksh help vous en dira peut-être plus sur son utilisation. ;)\n#!/bin/ksh set -e #set -x ################################################################################ # # Author: Stéphane HUC # mail: devs@stephane-huc.net # gpg:fingerprint: CE2C CF7C AB68 0329 0D20 5F49 6135 D440 4D44 BD58 # # License: BSD Simplified # # Github: # # Date: 2022/06/01 07:25 # ################################################################################ # # Purpose: to add a TLSA Record into DNS zone, segun your cert TLS (LE) # - for the geek: DANE-TLSA... #### IMPORTANT: recreate your TLSA Record after (re?)new cert... # # Needed tools: nsd* and ldnscript ## ldnscript is a tool to sign dns zone. (DNSSEC) ## https://framagit.org/22decembre/ldnscripts.git # # OS: Tested on OpenBSD # ################################################################################ ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34; . \u0026#34;${ROOT}/dns.conf\u0026#34; ################################################################################ ### ## # DONT TOUCH THOSES VARIABLES! ## ### ################################################################################ debug=0 dir_le=\u0026#34;/etc/letsencrypt/live\u0026#34; dir_ns_cfg=\u0026#34;/etc/ns\u0026#34; # folder config ns dir_sbin=\u0026#34;/usr/local/sbin\u0026#34; log=\u0026#34;${ROOT}/dns-script.log\u0026#34; nsd_cfg=\u0026#34;/var/nsd/etc/nsd.conf\u0026#34; timestamp=\u0026#34;$(date +%s)\u0026#34; today=\u0026#34;$(date +\u0026#34;%Y%m%d\u0026#34;)\u0026#34; server=\u0026#34;nsd\u0026#34; SOA_ns=\u0026#34;\u0026#34; tlsa_record=\u0026#34;\u0026#34; set -A tlsa_records\t# if X509 DNS Alternative Names \u0026gt; 1 set -A tlsa_method_names -- \u0026#34;FULL\u0026#34; \u0026#34;SHA256\u0026#34; \u0026#34;SHA512\u0026#34; set -A tlsa_selector_names -- \u0026#34;CERT\u0026#34; \u0026#34;SPKI\u0026#34; set -A tlsa_usage_names -- \u0026#34;PKIX-TA\u0026#34; \u0026#34;PKIX-EE\u0026#34; \u0026#34;DANE-TA\u0026#34; \u0026#34;DANE-EE\u0026#34; NB_PARAMS=\u0026#34;$#\u0026#34; set -A PARAMS -- \u0026#34;$@\u0026#34; ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34; if [ -z \u0026#34;${PARAMS[0]}\u0026#34; ]; then MENU_CHOICE=\u0026#34;help\u0026#34; else PARAMS[0]=\u0026#34;$(printf \u0026#39;%s\u0026#39; \u0026#34;${PARAMS[0]}\u0026#34; | tr -s \u0026#34;[:upper:]\u0026#34; \u0026#34;[:lower:]\u0026#34;)\u0026#34; MENU_CHOICE=${PARAMS[0]} fi [ -n \u0026#34;${PARAMS[1]}\u0026#34; ] \u0026amp;\u0026amp; domain=\u0026#34;$(printf \u0026#39;%s\u0026#39; \u0026#34;${PARAMS[1]}\u0026#34; | tr -s \u0026#34;[:upper:]\u0026#34; \u0026#34;[:lower:]\u0026#34;)\u0026#34; ################################################################################ #### ## # All needed functions! DO NOT TOUCH-IT! ## ### ################################################################################ _add_tlsa() { check_var_algo check_var_soa_serial_type check_var_tls_port check_var_tls_proto check_tlsa_methods check_tlsa_selectors check_tlsa_usages get_soa_ns danefile=\u0026#34;${zonefile}.dane\u0026#34; newzonefile=\u0026#34;${zonefile}.${today}\u0026#34; oldzonefile=\u0026#34;${zonefile}.${OLD_SOA_sn}\u0026#34; create_new_filezone if [ -f \u0026#34;${newzonefile}\u0026#34; ]; then write_soa_serial_number build_tlsa_record write_tlsa_record mv_new_file_zone if _resign; then del_old_zonefile; fi fi unset danefile newzonefile oldzonefile } build_needed_variables() { check_var_domain printf \u0026#39;%s\\n\u0026#39; \u0026#34;*** Build needed variables:\u0026#34; # build cert variable if menu \u0026#39;tlsa\u0026#39; if [ \u0026#34;${MENU_CHOICE}\u0026#34; = \u0026#34;tlsa\u0026#34; ]; then cert=\u0026#34;${dir_le}/${domain}/cert.pem\u0026#34; if [ ! -f \u0026#34;${cert}\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;*** It seems cert file not exists!\u0026#34; byebye else printf \u0026#39;%s\\n\u0026#39; \u0026#34;cert: ${cert}\u0026#34; fi fi # build zonedir and zonefile variables zonedir=\u0026#34;$(awk -F \u0026#39;\u0026#34;\u0026#39; \u0026#39;/zonesdir/ { print substr($2,-1) }\u0026#39; \u0026#34;${nsd_cfg}\u0026#34;)\u0026#34; if [ -z \u0026#34;${zonedir}\u0026#34; ]; then zonedir=\u0026#34;/var/nsd/zones/\u0026#34;; fi printf \u0026#39;%s\\n\u0026#39; \u0026#34;zonedir: ${zonedir}\u0026#34; #zonefile=\u0026#34;$(awk -F \u0026#39;\u0026#34;\u0026#39; \u0026#39;/zonefile: \u0026#34;[a-z]*\\/\u0026#39;\u0026#34;${domain}\u0026#34;\u0026#39;\u0026#34;/ { print substr($2, -1) }\u0026#39; \u0026#34;${nsd_cfg}\u0026#34;)\u0026#34; #if [ \u0026#34;$(printf \u0026#39;%s\u0026#39; \u0026#34;${zonefile}\u0026#34; | awk -F\u0026#39;/\u0026#39; \u0026#39;{ print $1}\u0026#39;)\u0026#34; == \u0026#34;signed\u0026#34; ]; then ##zonefilesigned=$zonefile #zonefile=\u0026#34;$(find \u0026#34;${dir_ns_cfg}\u0026#34; -name \u0026#34;${domain}\u0026#34;)\u0026#34; #if [ -z \u0026#34;${zonefile}\u0026#34; ]; then zonefile=\u0026#34;$(find \u0026#34;${zonedir}\u0026#34; -name \u0026#34;${domain}\u0026#34;)\u0026#34;; fi #if [ -z \u0026#34;${zonefile}\u0026#34; ]; then #display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: It seems zonefile for domain: \u0026#39;${domain}\u0026#39; not exists!\u0026#34; #byebye #fi #else #zonefile=\u0026#34;${zonedir}${zonefile}\u0026#34; #fi zonefile=\u0026#34;${dir_ns_cfg}/${domain}\u0026#34; printf \u0026#39;%s\\n\u0026#39; \u0026#34;zonefile: ${zonefile}\u0026#34; } build_tlsa_record() { # get TLSA by reading cert pem case \u0026#34;${le_key_type}\u0026#34; in \u0026#34;ecdsa\u0026#34;) command=\u0026#34;ec\u0026#34; ;; \u0026#34;rsa\u0026#34;) command=\u0026#34;rsa\u0026#34; ;; esac tlsa_cert_associated=\u0026#34;$(openssl x509 -noout -pubkey -in \u0026#34;${cert}\u0026#34; | openssl \u0026#34;${command}\u0026#34; -pubin -outform der 2\u0026gt;/dev/null | \u0026#34;${algo}\u0026#34;)\u0026#34; _log \u0026#34;TLSA Cert Associated: ${tlsa_cert_associated}\u0026#34; unset command if [ -z \u0026#34;${tlsa_cert_associated}\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: TLSA Cert Associated could not generated!\u0026#34; byebye else # rebuild tlsa method segun algo choosed; possible: 0 (no match), 1 (sha256), 2 (sha512) case \u0026#34;${algo}\u0026#34; in \u0026#34;sha256\u0026#34;) tlsa_method=1 ;; \u0026#34;sha512\u0026#34;) tlsa_method=2 ;; *) tlsa_method=0 ;; esac if [ \u0026#34;${tls_port}\u0026#34; = \u0026#34;443\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;${tls_proto}\u0026#34; = \u0026#34;tcp\u0026#34; ]; then get_dns_alternative_names count=\u0026#34;${#domains[@]}\u0026#34; if [ \u0026#34;${count}\u0026#34; -eq 1 ]; then set_tlsa_record\telse set_tlsa_records fi fi fi unset tlsa_cert_associated } byebye() { display_mssg \u0026#34;KO\u0026#34; \u0026#34;Script stop here!\u0026#34; display_mssg \u0026#34;KO\u0026#34; \u0026#34;Please, search to understand reasons.\u0026#34; exit 1 } check_domain_name() { pattern=\u0026#34;^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])$\u0026#34; # like RFC 1123 if [ ${#domain} -gt 67 ]; then # Larg domain name \u0026lt;= 67 display_mssg \u0026#34;KO\u0026#34; \u0026#34;Error: Domain Length: ${domain}; \u0026gt;= 67 carachters!\u0026#34; byebye fi if printf \u0026#39;%s\\n\u0026#39; \u0026#34;${domain}\u0026#34; | grep -Eio \u0026#34;${pattern}\u0026#34;; then display_mssg \u0026#34;OK\u0026#34; \u0026#34;Domain Name: ${domain} is valid!\u0026#34; sleep 1 else display_mssg \u0026#34;KO\u0026#34; \u0026#34;Error: Bad Domain Name: ${domain}\u0026#34; byebye fi unset pattern } check_tlsa_methods() { case \u0026#34;${tlsa_method}\u0026#34; in 0|\u0026#34;FULL\u0026#34;) tlsa_method=0 ;; 1|\u0026#34;SHA256\u0026#34;) tlsa_method=1 ;; 2|\u0026#34;SHA512\u0026#34;)\ttlsa_method=2 ;; *) display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ The TLSA Method: not correctly configurated!\u0026#34; byebye :: esac _log \u0026#34;TLSA Method: ${tlsa_method}\u0026#34; } check_tlsa_selectors() { case \u0026#34;${tlsa_selector}\u0026#34; in 0|\u0026#34;CERT\u0026#34;) tlsa_selector=0 ;; 1|\u0026#34;SPKI\u0026#34;) tlsa_selector=1 ;; *) display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ The TLSA Selector: not correctly configurated!\u0026#34; byebye ;; esac _log \u0026#34;TLSA Selector: ${tlsa_selector}\u0026#34; } check_tlsa_usages() { case \u0026#34;${tlsa_usage}\u0026#34; in 0|\u0026#34;PKIX-TA\u0026#34;) tlsa_usage=0 ;; 1|\u0026#34;PKIX-EE\u0026#34;) tlsa_usage=1 ;; 2|\u0026#34;DANE-TA\u0026#34;)\ttlsa_usage=2 ;; 3|\u0026#34;DANE-EE\u0026#34;)\ttlsa_usage=3 ;; *) display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ The TLSA Usage: not correctly configurated!\u0026#34; byebye ;; esac _log \u0026#34;TLSA Usage: ${tlsa_usage}\u0026#34; } check_uid() { if [ \u0026#34;$(id -u)\u0026#34; -ne 0 ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: Script not launch with rights admin!\u0026#34; byebye fi } check_var_algo () { if [ \u0026#34;${algo}\u0026#34; != \u0026#34;sha256\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;${algo}\u0026#34; != \u0026#34;sha512\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ Algorythm: not correctly configurated!\u0026#34; byebye fi _log \u0026#34;Algo: ${algo}\u0026#34; } check_var_domain() { if [ -z \u0026#34;${domain}\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;*** It seems fault informations!\u0026#34; help byebye fi _log \u0026#34;Domain: ${domain}\u0026#34; } check_var_soa_serial_type() { if [ \u0026#34;${SOA_serial_type}\u0026#34; != \u0026#34;date\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;${SOA_serial_type}\u0026#34; != \u0026#34;timestamp\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ SOA Serial Type: not correctly configurated!\u0026#34; byebye fi _log \u0026#34;SOA Serial Type: ${SOA_serial_type}\u0026#34; } check_var_tls_port(){ if [ \u0026#34;${tls_port}\u0026#34; -lt 0 ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ TLS port: not correctly configurated!\u0026#34; byebye fi _log \u0026#34;TLS port: ${tls_port}\u0026#34; } check_var_tls_proto() { if [ \u0026#34;${tls_proto}\u0026#34; != \u0026#34;sctp\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;${tls_proto}\u0026#34; != \u0026#34;tcp\u0026#34; ] \u0026amp;\u0026amp; [ \u0026#34;${tls_proto}\u0026#34; != \u0026#34;tcp\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ TLS proto: not correctly configurated!\u0026#34; byebye fi _log \u0026#34;TLS proto: ${tls_proto}\u0026#34; } checkconf() { nsd-checkconf \u0026#34;${nsd_cfg}\u0026#34; } checkzone() { nsd-checkzone \u0026#34;${domain}\u0026#34; \u0026#34;${zonefile}\u0026#34; } confirm () { read -r response?\u0026#34;${1} [y|n] \u0026#34; case \u0026#34;${response}\u0026#34; in # \u0026#39;o\u0026#39;, \u0026#39;O\u0026#39;: Oui and not 0! y|Y|o|O|1) true ;; *) false ;; esac unset response } create_new_filezone() { cp \u0026#34;${zonefile}\u0026#34; \u0026#34;${newzonefile}\u0026#34; } del_old_zonefile() { if [ -f \u0026#34;${oldzonefile}\u0026#34; ]; then rm -fP \u0026#34;${oldzonefile}\u0026#34; fi } display_mssg() { typeset statut info text statut=\u0026#34;$1\u0026#34; info=\u0026#34;$2\u0026#34; case \u0026#34;${statut}\u0026#34; in \u0026#34;KO\u0026#34;) text=\u0026#34;[ ${red}${statut}${neutral} ] ${info}\u0026#34; ;; \u0026#34;OK\u0026#34;) text=\u0026#34;[ ${green}${statut}${neutral} ] ${info}\u0026#34; ;; #*) mssg=\u0026#34;${text}\u0026#34; ;; esac printf \u0026#34;%s \\n\u0026#34; \u0026#34;${text}\u0026#34; unset info statut text } get_dns_alternative_names() { # get \u0026#34;X509 DNS Alternative Names\u0026#34; characters domains=\u0026#34;$(echo | openssl x509 -text -noout -in \u0026#34;${cert}\u0026#34; | awk -F \u0026#39;,\u0026#39; \u0026#39;/DNS:/ { for(i=1;i\u0026lt;NF;i++) { p=match($i,\u0026#34;:\u0026#34;); print substr($i,p+1) }}\u0026#39;)\u0026#34; # convert into array; no double-quotes, else not run! set -A domains -- ${domains[@]} printf \u0026#39;%s\\n\u0026#39; \u0026#34;domains: ${domains[*]}\u0026#34; _log \u0026#34;domains: ${domains[*]}\u0026#34; } get_soa_ns() { OLD_SOA_sn=\u0026#34;$(grep -A1 \u0026#34;SOA\u0026#34; \u0026#34;${zonefile}\u0026#34; | tail -n1 | awk -F \u0026#39; \u0026#39; \u0026#39;{ print $1 }\u0026#39;)\u0026#34; _log \u0026#34;Old SOA Serial Number: ${OLD_SOA_sn}!\u0026#34; } get_soa_serial_number() { OLD_SOA_sn=\u0026#34;$(printf \u0026#39;%s\\n\u0026#39; \u0026#34;${line}\u0026#34; | awk -F \u0026#39; \u0026#39; \u0026#39;{ print $1 }\u0026#39;)\u0026#34; _log \u0026#34;OLD SOA Serial Number: ${OLD_SOA_sn}\u0026#34; } help() { printf \u0026#39;%s\\n\u0026#39; \u0026#34; $0 sign domain # to sign a domain $0 tlsa domain # to add a tlsa record into domain zone ---- when use tlsa, this script will resign the domain zone... \u0026#34; } init_zone() { \u0026#34;${dir_sbin}\u0026#34;/ldnscript init \u0026#34;${domain}\u0026#34; } in_array() { local i=0 need=\u0026#34;$1\u0026#34; IFS=\u0026#34; \u0026#34;; shift; set -A array -- $* count=\u0026#34;${#array[@]}\u0026#34; while [ $i -le $count ]; do if [ \u0026#34;${array[$i]}\u0026#34; = \u0026#34;${need}\u0026#34; ]; then return 0; fi # true #let \u0026#34;i=$i+1\u0026#34; (( i=i+1 )) done return 1 unset i need IFS array } _log() { if [ \u0026#34;${debug}\u0026#34; -eq 1 ]; then printf \u0026#39;%s\\n\u0026#39; \u0026#34;$1\u0026#34; \u0026gt;\u0026gt; \u0026#34;${log}\u0026#34;; fi } main() { check_uid verify_need_softs build_needed_variables check_domain_name case \u0026#34;${MENU_CHOICE}\u0026#34; in \u0026#34;help\u0026#34;) help ;; \u0026#34;sign\u0026#34;) _resign ;; \u0026#34;tlsa\u0026#34;) _add_tlsa ;; *) display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: this option ${MENU_CHOICE} is not exists!\u0026#34; help byebye ;; esac } mv_new_file_zone() { if [ -f \u0026#34;${newzonefile}\u0026#34; ]; then mv \u0026#34;${zonefile}\u0026#34; \u0026#34;${oldzonefile}\u0026#34; mv \u0026#34;${newzonefile}\u0026#34; \u0026#34;${zonefile}\u0026#34; fi } _resign() { if checkzone \u0026amp;\u0026amp; checkconf; then display_mssg \u0026#34;OK\u0026#34; \u0026#34;file config nsd and zone ${domain} are good! :D\u0026#34; sign_zone else display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: it exists a problem with file config nsd or zone ${domain}\u0026#34; byebye fi } restart_server() { printf \u0026#39;%s\\n\u0026#39; \u0026#34;=\u0026gt; Restart Server: \u0026#34; stop_server start_server status_server } set_soa_serial_number() { case \u0026#34;${SOA_serial_type}\u0026#34; in \u0026#34;date\u0026#34;) SOA_date=\u0026#34;$(printf \u0026#39;%s\u0026#39; \u0026#34;${OLD_SOA_sn}\u0026#34; | awk \u0026#39;{print substr($0, 0, 8)}\u0026#39;)\u0026#34;; SOA_number=\u0026#34;$(printf \u0026#39;%s\u0026#39; \u0026#34;${OLD_SOA_sn}\u0026#34; | awk \u0026#39;{print substr($0, 9)}\u0026#39;)\u0026#34;; if [ \u0026#34;${SOA_date}\u0026#34; == \u0026#34;${today}\u0026#34; ]; then #let SOA_number=$SOA_number+1 (( SOA_number=${SOA_number}+1 )) || true if [ \u0026#34;${SOA_number}\u0026#34; -lt 10 ]; then SOA_number=\u0026#34;0${SOA_number}\u0026#34;; fi SOA_sn=\u0026#34;${SOA_date}${SOA_number}\u0026#34; else SOA_sn=\u0026#34;${today}01\u0026#34; fi ;; \u0026#34;timestamp\u0026#34;) SOA_sn=\u0026#34;${timestamp}\u0026#34; ;; *) display_mssg \u0026#34;KO\u0026#34; \u0026#34;Invalid SOA Serial Type!\u0026#34; byebye ;; esac _log \u0026#34;New SOA Serial Number: ${SOA_sn}!\u0026#34; } set_tlsa_record() { # build tlsa record tlsa_records[0]=\u0026#34;_${tls_port}._${tls_proto}.${domains[0]}. IN TLSA ${tlsa_usage} ${tlsa_selector} ${tlsa_method} ${tlsa_cert_associated}\u0026#34; _log \u0026#34;TLSA Record: ${tlsa_records[0]}\u0026#34; } set_tlsa_records() { # do not use domain variable here i=0 for dom in \u0026#34;${domains[@]}\u0026#34;; do tlsa_records[$i]=\u0026#34;_${tls_port}._${tls_proto}.${dom}. IN TLSA ${tlsa_usage} ${tlsa_selector} ${tlsa_method} ${tlsa_cert_associated}\u0026#34; (( i=i+1 )) done unset i dom _log \u0026#34;TLSA Records: ${tlsa_records[*]}\u0026#34; } sign_zone() { \u0026#34;${dir_sbin}\u0026#34;/ldnscript signing \u0026#34;${domain}\u0026#34; } start_server() { printf \u0026#39;%s\\n\u0026#39; \u0026#34;Start serveur: ${server}\u0026#34; rcctl start \u0026#34;${server}\u0026#34; sleep 1s } status_server() { printf \u0026#39;%s\\n\u0026#39; \u0026#34;Check serveur: ${server}\u0026#34; rcctl check \u0026#34;${server}\u0026#34; } stop_server() { printf \u0026#39;%s\\n\u0026#39; \u0026#34;Stop serveur: ${server}\u0026#34; rcctl stop \u0026#34;${server}\u0026#34; sleep 1s } verify_need_softs() { if [ ! -f \u0026#34;${dir_sbin}/ldnscript\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: ldnscript seems not install!\u0026#34; byebye elif [ ! -x \u0026#34;${dir_sbin}/ldnscript\u0026#34; ]; then display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: ldnscript is not executable!\u0026#34; byebye fi } write_soa_serial_number() { set_soa_serial_number if sed -i -e \u0026#34;s#\\(.*\\)${OLD_SOA_sn} \\;#\\1${SOA_sn} \\;#\u0026#34; \u0026#34;${newzonefile}\u0026#34;; then _log \u0026#34;SOA serial number changed!\u0026#34; else display_mssg \u0026#34;KO\u0026#34; \u0026#34;/!\\ Script cant change SOA serial number!\u0026#34; fi } write_tlsa_record() { if [ ! -f \u0026#34;${danefile}\u0026#34; ]; then touch \u0026#34;${danefile}\u0026#34;; fi i=0 # add tlsa records into dns zone for tlsa_record in \u0026#34;${tlsa_records[@]}\u0026#34;; do dom=\u0026#34;${domains[$i]}\u0026#34; _log \u0026#34;domain: $dom\u0026#34; ### /!\\ ERROR with $domain /!\\ if sed -i -e \u0026#34;s#_${tls_port}._${tls_proto}.${dom}. IN TLSA\\(.*\\)#${tlsa_record}#\u0026#34; \u0026#34;${newzonefile}\u0026#34;; then _log \u0026#34;TLSA Record rewrited!\u0026#34; else printf \u0026#39;%s\\n\u0026#39; \u0026#34;${tlsa_record}\u0026#34; \u0026gt;\u0026gt; \u0026#34;${newzonefile}\u0026#34; _log \u0026#34;TLSA Record added!\u0026#34; fi (( i=i+1 )) # add record in first line into dane file printf \u0026#39;%s\\n\u0026#39; \u0026#34;${timestamp}:${tlsa_record}\u0026#34; \u0026gt;\u0026gt; \u0026#34;${danefile}\u0026#34; _log \u0026#34;${timestamp}:${tlsa_record}\u0026#34; unset dom done unset i tlsa_record } ################################################################################ main EOD End Of Documentation\nVoilà mon processus de gestion de mes zones DNS, avec le protocole DNSSEC et les enregistrements TLSA pour le service web.\nD\u0026rsquo;un processus long et complexe, je peux ainsi gérer simplement à l\u0026rsquo;aide de deux commandes bien utiles :\nsigner par DNNSEC mes zones DNS : ./dns.ksh sign domain tester les enregistrements TLSA à tout moment, et si besoin les regénérer : ./tlsa.sh domain Mais si vous avez bien compris, c\u0026rsquo;est le cron mensuel qui s\u0026rsquo;en occupe tout seul et qui me fait le rapport adéquat, ainsi je sais comment cela s\u0026rsquo;est exécuté.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eEn 2018, je me suis posé la question de la gestion des enregistrements\nTLSA, selon le protocole DANE, lié au protocole de sécurité DNSSEC,\ndans mes zones DNS. \u003cem\u003e(cf: \u003ca class=\"inside\" href=\"/fr/post/generer-enregistrement-tlsa/\" title=\"Lien interne vers l\u0026#39;article : 'DNS: Générer un enregistrement TLSA'\"\u003eDNS: Générer un enregistrement TLSA\u003c/a\u003e) - je vous invite à le lire…\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCertains vont utiliser l\u0026rsquo;outil \u003cstrong\u003eknot\u003c/strong\u003e, fourni en tant que paquet sous\nOpenBSD, car ils trouvent complexe à gérer. Mais nous verrons avec un\npeu d\u0026rsquo;astuces comment gérer cela de manière automatisé en shell,\nsous OpenBSD\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePour rappel, mon service DNS fonctionne depuis plus de 4 ans, sous OpenBSD\ngrâce au logiciel natif \u003cstrong\u003ensd\u003c/strong\u003e. La gestion des enregistrements\nDNSSEC se fait grâce aux outils \u003cstrong\u003e\u003ca href=\"https://openports.pl/path/net/ldns,-utils\" rel=\"external\"\u003eldns\u003c/a\u003e\u003c/strong\u003e\nà installer en tant que paquet tiers.\nJ\u0026rsquo;utilise dans les faits l\u0026rsquo;outil \u003cstrong\u003e\u003ca href=\"https://www.22decembre.eu/fr/2017/11/01/ldnscripts/\" rel=\"external\"\u003eldnscript\u003c/a\u003e\u003c/strong\u003e\nqui permet de gérer la création des clés nécessaires puis s\u0026rsquo;occupe de gérer\nles enregistrements DNSSEC adéquats.\u003c/p\u003e\n\u003cp\u003e⇒ En Juin 2022, j\u0026rsquo;ai décidé de basculer du chiffrement RSA par l\u0026rsquo;utilisation\nde l\u0026rsquo;algorithme à courbes elliptiques nommés ECDSA.\u003c/p\u003e\n\u003cp\u003eAvant d\u0026rsquo;aller plus loin en ce sens, passons à l\u0026rsquo;installation des prérequis\nnécessaires :\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003ch3 id=\"ldnscript\"\u003eldnscript\u003c/h3\u003e\n\u003cp\u003ePour me rappeler comment faire, je me suis fait le petit mémo suivant :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003einstaller les binaires nécessaires : \u003cbr\u003e\n\u003ccode\u003e$ doas pkg_add ldns-utils git\u003c/code\u003e \u003cbr\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003etélécharger et installer ldnscripts\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd /usr/local/src/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas mkdir ldnscripts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas chown \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e ldnscripts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git clone https://framagit.org/22decembre/ldnscripts.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd ldnscripts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas make install\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003econfigurer le fichier /etc/ns/ldnscript.conf\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e; SHA256 est largement suffisant et sécuritaire\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eALG\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eECDSAP256SHA256 \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eNSEC3_ALG\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eSHA-256\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"4\"\u003e\n\u003cli\u003e\n\u003cp\u003einitialisation du domaine \u003cbr\u003e\n\u003ccode\u003e$ doas ldnscript init domain.tld\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003enécessité de créer un lien symbolique /usr/bin/dig vers /usr/sbin/dig :\u003cbr\u003e\n\u003ccode\u003e$ doas ln -sf /usr/bin/dig /usr/sbin/dig\u003c/code\u003e \u003cbr\u003e\n\u003cem\u003e(sans ce dernier point, l\u0026rsquo;outil \u003ccode\u003eldnscript\u003c/code\u003e ne pourra trouver le binaire\n\u003ccode\u003edig\u003c/code\u003e et donc refusera de fonctionner en se mettant en erreur)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"etcmonthlylocal\"\u003e/etc/monthly.local\u003c/h3\u003e\n\u003cp\u003eTous les mois, je crée le rollover nécessaire des clés en intégrant dans\nle script \u003ccode\u003e/etc/monthly.local\u003c/code\u003e, le code shell suivant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### ldnscript\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; ldnscript rollover\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/usr/local/sbin/ldnscript rollover all\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"lets-encrypt\"\u003eLet\u0026rsquo;s Encrypt\u003c/h4\u003e\n\u003cp\u003eDans la foulée, du rollover des clés DNSSEC, mon script interroge les\nservices Let\u0026rsquo;s Encrypt pour savoir s\u0026rsquo;il faut un renouvellement des certificats\npour les noms de domaines que j\u0026rsquo;utilise.\u003c/p\u003e\n\u003cp\u003eNormalement, on utiliserait le client \u003ccode\u003eacme\u003c/code\u003e natif sous OpenBSD, mais ayant\neu certains déboires, j\u0026rsquo;ai décidé de basculer sur l\u0026rsquo;usage de \u003ccode\u003ecertbot\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eUne simple écriture shell suffit pour le renouvellement : \u003cbr\u003e\n\u003ccode\u003e/usr/local/bin/certbot renew --pre-hook \u0026quot;rcctl stop nginx\u0026quot; --post-hook \u0026quot;rcctl start nginx\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(en effet, j\u0026rsquo;utilise aussi le serveur nginx, en lieu et place du serveur\nweb natif \u003cstrong\u003ehttpd\u003c/strong\u003e - mais il suffit de remplacer le nom du service, si\njamais c\u0026rsquo;est votre cas)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eBien-sûr, cette partie n\u0026rsquo;entre pas directement en ligne de compte de la\ngestion DNS. Néanmoins, c\u0026rsquo;est important à prendre en compte car lors du\nrenouvellement de certificat, il est nécessaire de regénérer les enregistrements\nTLSA - \u003cem\u003enous verrons ce point plus tard\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"exemple-zone-dns\"\u003eExemple zone DNS\u003c/h3\u003e\n\u003cp\u003eVoici pour l\u0026rsquo;exemple une zone DNS minimaliste, gérée par le serveur \u003cstrong\u003ens\u003c/strong\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e$TTL 1H\n$ORIGIN domain.tld.\n@   IN  SOA domain.tld. dns.domain.tld. (\n    2022090101 ;\n    3H ; refresh\n    1H ; retry\n    2W ; expire\n    1H ; negative\n)\n                    \n@   IN NS   ns1.domain.tld.\n@   IN NS   ns2.domain.tld.\n\n@   IN A    46.23.90.29\n    IN AAAA 2a03:6000:6e65:619::29\n\n; enregistrement CAA\n@    IN CAA  0 iodef \u0026#34;mailto:mail@domain.tld\u0026#34;\n@    IN CAA  0 issue \u0026#34;letsencrypt.org\u0026#34;\n@    IN CAA  0 issuewild \u0026#34;letsencrypt.org\u0026#34;\n\nwww IN A    46.23.90.29\n    IN AAAA 2a03:6000:6e65:619::29\n\n; TLSA\n_443._tcp.domain.tld. IN TLSA 3 1 2 5c8fdd68178ce4cd8d88bd90b82a96df41674d555340b88283c24a0b3416aa375144cd6c16a58160ba3b168e59f5003bff656ce67cb24931b462fe4910bd62f5\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"shell\"\u003eshell\u003c/h2\u003e\n\u003ch3 id=\"générer-un-enregistrement-tlsa\"\u003eGénérer un Enregistrement TLSA\u003c/h3\u003e\n\u003cp\u003eEn shell, générer un enregistrement TLSA n\u0026rsquo;est pas compliqué :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eopenssl x509 -noout -pubkey -in \u0026quot;${cert}\u0026quot; | openssl \u0026quot;${command}\u0026quot; -pubin -outform der 2\u0026gt;/dev/null | \u0026quot;${algo}\u0026quot; | tr \u0026quot;a-z\u0026quot; \u0026quot;A-Z\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e⇒ La commande ci-dessus nous permet de générer une variable intermédiaire\nnommée \u003ccode\u003etlsa_cert_associated\u003c/code\u003e où :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela variable \u003ccode\u003e$cert\u003c/code\u003e est le nom du chemin absolu du certificat TLS serveur,\ndans le système de fichier du serveur, lié au domaine cible.\u003c/li\u003e\n\u003cli\u003ela variable \u003ccode\u003e$command\u003c/code\u003e est le nom de la commande utilisée par OpenSSL, soit\n\u003ccode\u003ersa\u003c/code\u003e ou \u003ccode\u003eec\u003c/code\u003e \u003cem\u003e(réciproquement pour les enregistrements selon le chiffrement\nRSA ou ECDSA)\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eet, où la variable \u003ccode\u003e$algo\u003c/code\u003e est le nom de l\u0026rsquo;utilitaire \u003ccode\u003esha256\u003c/code\u003e, ou \u003ccode\u003esha512\u003c/code\u003e,\n\u003cem\u003eau choix personnel et\u003c/em\u003e restituera un condensé de message lié à\nl\u0026rsquo;algorithme choisi.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ l\u0026rsquo;écriture relative à l\u0026rsquo;enregistrement TLSA est aussi simple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003etlsa_record=\u0026quot;_${tls_port}._${tls_proto}.${domain}. IN TLSA ${tlsa_usage} ${tlsa_selector} ${tlsa_method} ${tlsa_cert_associated}\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eoù :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e${tls_port}\u003c/code\u003e est le numéro de port du serveur web utilisé, ici \u003cstrong\u003e443\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e${tls_proto}\u003c/code\u003e est le nom du protocole utilisé, ici \u003cstrong\u003etls\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e${domain}\u003c/code\u003e est le nom de domaine cible\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e${tlsa_usage}\u003c/code\u003e est le chiffre correspondant à la contrainte utilisée,\nici \u003cstrong\u003e3\u003c/strong\u003e, correspondant à la contrainte \u003cstrong\u003eDANE-EE\u003c/strong\u003e, et recommandée\npar Let\u0026rsquo;s Encrypt.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e${tlsa_selector}\u003c/code\u003e est le chiffre correspondant au nom de sélecteur\nutilisé, ici \u003cstrong\u003e1\u003c/strong\u003e, correspondant au sélecteur \u003cstrong\u003eSPKI\u003c/strong\u003e, là aussi\nrecommandé par Let\u0026rsquo;s Encrypt.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e${tlsa_method}\u003c/code\u003e étant la méthode utilisant l\u0026rsquo;algorithme de chiffrement\nchoisi ; ici \u003cstrong\u003eSHA256\u003c/strong\u003e, qui offre un niveau \u003cem\u003eactuel\u003c/em\u003e de chiffrement\ndit sécurisé et tout autant recommandé par Let\u0026rsquo;s Encrypt.\u003c/li\u003e\n\u003cli\u003eet pour finir la variable \u003ccode\u003etlsa_cert_associated\u003c/code\u003e précédemment créée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"vérifier-un-enregistrement-tlsa\"\u003eVérifier un Enregistrement TLSA\u003c/h3\u003e\n\u003cp\u003eVérifier un enregistrement TLSA est un poil plus compliqué ; il faut :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e1/ interroger le serveur DNS pour connaître l\u0026rsquo;enregistrement TLSA actuel\npar le biais de l\u0026rsquo;outil \u003ccode\u003edig\u003c/code\u003e, pour l\u0026rsquo;exemple.\u003c/li\u003e\n\u003cli\u003e2/ le comparer avec la sortie fournie par l\u0026rsquo;outil \u003ccode\u003eopenssl\u003c/code\u003e qui va interroger\nle certificat installé sur le serveur web utilisé, lié au nom de domaine\nen question.\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003einterroger le serveur DNS se fait ainsi :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edig TLSA _443._tcp.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e +short\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ed_tlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eecho \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{ for(i=4;i\u0026lt;=NF;++i) printf \u0026#34;%s\u0026#34;, tolower($i); print \u0026#34;\u0026#34; }\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eutiliser openssl pour interroger le certificat TLS utilisé sur le\nserveur web :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eecho | openssl s_client -servername \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -showcerts -connect \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:443 2\u0026gt;/dev/null | openssl x509 -noout -pubkey | openssl pkey -outform der -pubin 2\u0026gt;/dev/null | openssl dgst -\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e 2\u0026gt;/dev/null \u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eo_tlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eecho \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | awk -F\u003cspan style=\"color:#48b685\"\u003e\u0026#39;=\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{ print $2 }\u0026#39;\u003c/span\u003e | tr -d \u003cspan style=\"color:#48b685\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour finir, il suffit vraiment de comparer les deux variables shell\n\u003ccode\u003ed_tlsa\u003c/code\u003e et \u003ccode\u003eo_tlsa\u003c/code\u003e pour savoir si elles correspondent, ce qui en temps\nnormal doit être le cas. \u003cstrong\u003eSauf en cas, de renouvellement de certificat\nTLS, qui nécessitera donc de renouveller l\u0026rsquo;enregistrement TLSA, dans la\nzone du nom de domaine en question, sur le serveur DNS\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003ePour rappel, si cela n\u0026rsquo;est pas fait, une interrogation du serveur DNS sur\nle protocole DNSSEC générera une erreur puisque l\u0026rsquo;enregistrement TLSA ne\ncorrespondra pas un certificat web fraîchement utilisé, ou renouvellé, ce\nqui va entraîner cette conséquence : l\u0026rsquo;accès au serveur, lié au nom de\ndomaine cible, sera impossible.\u003c/p\u003e\n\u003cp\u003eIl faudra donc générer un nouvel enregistrement TLSA correspondant au\nrenouvellement du certificat TLS, puis régénerer la signature des enregistrements\nDNSSEC liés à la zone DNS du domaine cible.\u003c/p\u003e\n\u003ch2 id=\"scripts-shell\"\u003eScripts Shell\u003c/h2\u003e\n\u003cp\u003ePour info, les scripts shell \u003cstrong\u003etlsa.sh\u003c/strong\u003e, \u003cstrong\u003edns.conf\u003c/strong\u003e, \u003cstrong\u003edns.ksh\u003c/strong\u003e sont\nécrits dans un répertoire nommé \u003cstrong\u003edns-tools\u003c/strong\u003e dans le répertoire personnel.\n\u003cem\u003eÀ vous de voir où vous désirez les mettre, et modifier le script mensuel\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"monthlylocal\"\u003emonthly.local\u003c/h3\u003e\n\u003cp\u003eVoici la teneur de mon script shell \u003cstrong\u003emonthly.local\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### ldnscript\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; ldnscript rollover\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/usr/local/sbin/ldnscript rollover all\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### renew ssl by certbot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; renew letsencrypt certs\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/usr/local/bin/certbot renew --pre-hook \u003cspan style=\"color:#48b685\"\u003e\u0026#34;rcctl stop nginx\u0026#34;\u003c/span\u003e --post-hook \u003cspan style=\"color:#48b685\"\u003e\u0026#34;rcctl start nginx\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### check tlsa records for domain; only for tcp:443\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e domain in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sub.domain.tld\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;domain.tld\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;www.domain.tld\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sub.domain2.tld\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;domain2.tld\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;www.domain2.tld\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; Test TLSA for \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t/home/-your-user-/dns-tools/tlsa.sh \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"tlsash\"\u003etlsa.sh\u003c/h3\u003e\n\u003cp\u003eVoici mon script shell nommé \u003cstrong\u003etlsa.sh\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#set -x\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Author: Stéphane HUC\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# mail: devs@stephane-huc.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# gpg:fingerprint: CE2C CF7C AB68 0329 0D20  5F49 6135 D440 4D44 BD58\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# License: BSD Simplified\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Github: \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Date: 2022/07/01 06:45\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Purpose: tool  to test TLSA record\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  - for the geek: DANE-TLSA...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Needed tools: dig, openssl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# OS: Tested on OpenBSD, Devuan\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# see: https://www.bortzmeyer.org/monitor-dane.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edirname \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ereadlink -f -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e. \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/dns.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_admin\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/home/-your-user-/dns-tools\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### DO NOT TOUCH!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ed_tlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\t\u003cspan style=\"color:#776e71\"\u003e# TLSA record by dig\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eo_tlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\t\u003cspan style=\"color:#776e71\"\u003e# TLSA record by openssl\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#39;\u003c/span\u003e\t\u003cspan style=\"color:#776e71\"\u003e# TLSA record \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e####\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   All needed functions! DO NOT TOUCH-IT!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebyebye\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Script stop here!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Please, search to understand reasons.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    exit \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_uid\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -u\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -ne \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ERROR: Script not launch with rights admin!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_dig\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003etlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edig TLSA _443._tcp.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e +short\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003ed_tlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eecho \u003cspan style=\"color:#ef6155\"\u003e$tlsa\u003c/span\u003e | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{ for(i=4;i\u0026lt;=NF;++i) printf \u0026#34;%s\u0026#34;, tolower($i); print \u0026#34;\u0026#34; }\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_openssl\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003etlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eecho | openssl s_client -servername \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -showcerts -connect \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:443 2\u0026gt;/dev/null | openssl x509 -noout -pubkey | openssl pkey -outform der -pubin 2\u0026gt;/dev/null | openssl dgst -\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e 2\u0026gt;/dev/null \u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003eo_tlsa\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eecho \u003cspan style=\"color:#ef6155\"\u003e$tlsa\u003c/span\u003e | awk -F\u003cspan style=\"color:#48b685\"\u003e\u0026#39;=\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{ print $2 }\u0026#39;\u003c/span\u003e | tr -d \u003cspan style=\"color:#48b685\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emssg\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    typeset statut info text\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etext\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;[ \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ered\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eneutral\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e ]    \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OK\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etext\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;[ \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003egreen\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eneutral\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e ]   \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#*) mssg=\u0026#34;${text}\u0026#34; ;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#34;%s \\n\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etext\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset info statut text\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enew_tlsa\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/letsencrypt/live/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/cert.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ele_key_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ecdsa\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eopenssl x509 -noout -pubkey -in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | openssl ec -pubin -outform der 2\u0026gt;/dev/null | \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#48b685\"\u003e\u0026#34;rsa\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eopenssl x509 -noout -pubkey -in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | openssl rsa -pubin -outform der 2\u0026gt;/dev/null | \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e._\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e. IN TLSA \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_selector\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tunset tlsa_cert_associated\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e####\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   Execution\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -z \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;[ KO ] Script stops here; no domain!\u0026#34;\u003c/span\u003e; exit; \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_dig\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_openssl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ed_tlsa\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eo_tlsa\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tmssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OK\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Similar TLSA records! :D\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tmssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;There seems to be a problem with the TLSA records of the domain: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Have you renew recently the TLS certs for the domain? If yes, change the TLSA record into the DNS zone relevent!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;⇒ Perhaps, the dns.sh script shell can help you. ;-)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_uid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;⇒ Display new TLSA record:\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tnew_tlsa\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Add/modify tlsa into your DNS zone for \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e: \u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;⇒ Modify TLSA record into the domain zone for \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_admin\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e/dns.ksh tlsa \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eModifiez la valeur de la variable \u003ccode\u003edir_admin\u003c/code\u003e !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eComme vous pouvez le remarquer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eil fait appel au fichier de configuration \u003cstrong\u003edns.conf\u003c/strong\u003e, \u003cem\u003epublié ci-dessous\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eet si la correspondance des enregistrements TLSA ne se fait pas, il\nappelle le script pdksh \u003cstrong\u003edns.ksh\u003c/strong\u003e avec l\u0026rsquo;argument \u003ccode\u003etlsa\u003c/code\u003e suivi du\nnom de domaine à cibler\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dnsconf\"\u003edns.conf\u003c/h3\u003e\n\u003cp\u003eVoici le fichier de configuration qui sert à la fois pour le script shell\n\u003cstrong\u003etlsa.sh\u003c/strong\u003e et le script pdksh \u003cstrong\u003edns.ksh\u003c/strong\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e########################################################################\n#\n# Author: Stéphane HUC\n# mail: devs@stephane-huc.net\n# gpg:fingerprint: CE2C CF7C AB68 0329 0D20  5F49 6135 D440 4D44 BD58\n#\n# License: BSD Simplified\n#\n# Github: https://framagit.org/hucste/AH.git\n#\n# Date: 2022/06/01 07:20\n#\n########################################################################\n###\n##\n# Config file to dns.ksh script\n##\n###\n########################################################################\n\n### Algorithm\n## values: sha256, sha512; choose-it segun TLSA Method\nalgo=\u0026#34;sha256\u0026#34;\n### SOA Serial type\n## values: date, timestamp\n## DNS recommandation: prefer date\nSOA_serial_type=\u0026#34;date\u0026#34;\n### Port number\ntls_port=443\n### Protocols\n## values: stcp, tcp, udp\ntls_proto=\u0026#34;tcp\u0026#34;\n\n### TLSA \n## Lets Encrypt Recommandation; \n## \tsee: https://community.letsencrypt.org/t/please-avoid-3-0-1-and-3-0-2-dane-tlsa-records-with-le-certificates/7022\n## usage: Lets Encrypt recommands 3, at least 2\n## values: 0 =\u0026gt; 3; or (PKIX-TA, PKIX-EE, DANE-TA, DANE-EE; respectivly: 0 -\u0026gt; 3)\ntlsa_usage=3\n## selector: Lets Encrypt recommands 1\n## values: 0 or 1; or (CERT, SPKI; respectively: O or 1)\ntlsa_selector=1\n## method: Lets Encrypt recommands 1\n## values: 0 =\u0026gt; 2; or (FULL, SHA256, SHA512; respectively: 0 -\u0026gt; 2)\n# this change segun algo\ntlsa_method=1\n\n### Key Type Letsencrypt\n## rsa or ecdsa\n## if ecdsa, specify elliptic curve: secp256r1, secp384r1, secp512r1 (256 is enough)\nle_key_type=ecdsa\nle_curve=secp256r1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePersonnellement, je fais le choix d\u0026rsquo;utiliser :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;algorithme \u003cstrong\u003esha512\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003ele type de clé \u003cstrong\u003eecdsa\u003c/strong\u003e qui déclenche l\u0026rsquo;utilisation de la commande \u003cstrong\u003eec\u003c/strong\u003e\nlors de l\u0026rsquo;utilisation d\u0026rsquo;openssl, par les scripts \u003cstrong\u003edns.ksh\u003c/strong\u003e ou \u003cstrong\u003etlsa.sh\u003c/strong\u003e.\nIl est bien sûr possible d\u0026rsquo;utiliser \u003cstrong\u003ersa\u003c/strong\u003e ; dans ce cas, les scripts\nshell n\u0026rsquo;utiliseront pas la variable \u003ccode\u003ele_curve\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dnsksh\"\u003edns.ksh\u003c/h3\u003e\n\u003cp\u003eCe script long et complexe est capable de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003egénérer les signatures DNSSEC pour la zone DNS d\u0026rsquo;un domaine cible.\u003c/li\u003e\n\u003cli\u003emodifier l\u0026rsquo;enregistrement TLSA puis regénérer les signatures DNSSEC ;\ndans ce cas :\n\u003cul\u003e\n\u003cli\u003erécupèrer l\u0026rsquo;enregistrement de numéro de série SOA en cours dans la\nzone DNS du domaine cible\u003c/li\u003e\n\u003cli\u003ecréer un nouveau fichier de zone DNS et sauvegarder l\u0026rsquo;actuel\u003c/li\u003e\n\u003cli\u003esi le nouveau fichier de zone DNS est accessible, le script écrit :\n\u003cul\u003e\n\u003cli\u003eun nouveau numéro de série SOA\u003c/li\u003e\n\u003cli\u003eremplace l\u0026rsquo;ancien enregistrement TLSA par le nouveau\u003c/li\u003e\n\u003cli\u003eessaye de signer à nouveau la zone DNS à l\u0026rsquo;aide du protocole DNSSEC\n\u003cul\u003e\n\u003cli\u003es\u0026rsquo;il réussit, il supprime l\u0026rsquo;ancien fichier de zone DNS\u003c/li\u003e\n\u003cli\u003es\u0026rsquo;il échoue, il avertit, arrête son exécution \u003cstrong\u003eet\u003c/strong\u003e dans ce cas,\nil faudra renommer à la main la sauvegarde de la zone DNS\npour en faire à nouveau l\u0026rsquo;actuelle, puis chercher à comprendre\npourquoi le script à échouer - dans ce cas-là, il est intéressant\nde positionner la variable \u003ccode\u003edebug\u003c/code\u003e à \u003ccode\u003e1\u003c/code\u003e, ce qui activera la\njournalisation des différentes étapes, et pourra aider à l\u0026rsquo;analyse,\nlors d\u0026rsquo;une exécution manuelle.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUn petit coup de \u003ccode\u003e./dns.ksh help\u003c/code\u003e vous en dira peut-être plus sur son utilisation. ;)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/ksh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#set -x\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Author: Stéphane HUC\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# mail: devs@stephane-huc.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# gpg:fingerprint: CE2C CF7C AB68 0329 0D20  5F49 6135 D440 4D44 BD58\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# License: BSD Simplified\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Github: \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Date: 2022/06/01 07:25\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Purpose: to add a TLSA Record into DNS zone, segun your cert TLS (LE)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#  - for the geek: DANE-TLSA...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#### IMPORTANT: recreate your TLSA Record after (re?)new cert...\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Needed tools: nsd* and ldnscript\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## ldnscript is a tool to sign dns zone. (DNSSEC)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## https://framagit.org/22decembre/ldnscripts.git\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# OS: Tested on OpenBSD\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edirname \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ereadlink -f -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e. \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/dns.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   DONT TOUCH THOSES VARIABLES!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edebug\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_le\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/letsencrypt/live\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_ns_cfg\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/ns\u0026#34;\u003c/span\u003e    \u003cspan style=\"color:#776e71\"\u003e# folder config ns\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_sbin\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/local/sbin\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003elog\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/dns-script.log\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ensd_cfg\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/nsd/etc/nsd.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etimestamp\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edate +%s\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etoday\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edate +\u003cspan style=\"color:#48b685\"\u003e\u0026#34;%Y%m%d\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eserver\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nsd\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_ns\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -A tlsa_records\t\u003cspan style=\"color:#776e71\"\u003e# if X509 DNS Alternative Names \u0026gt; 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -A tlsa_method_names -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;FULL\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SHA256\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SHA512\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -A tlsa_selector_names -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;CERT\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SPKI\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -A tlsa_usage_names -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;PKIX-TA\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;PKIX-EE\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;DANE-TA\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;DANE-EE\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eNB_PARAMS\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$#\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset -A PARAMS -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$@\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edirname \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ereadlink -f -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -z \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ePARAMS\u003c/span\u003e[0]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eMENU_CHOICE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;help\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    PARAMS\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ePARAMS\u003c/span\u003e[0]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | tr -s \u003cspan style=\"color:#48b685\"\u003e\u0026#34;[:upper:]\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;[:lower:]\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eMENU_CHOICE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ePARAMS\u003c/span\u003e[0]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -n \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ePARAMS\u003c/span\u003e[1]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ePARAMS\u003c/span\u003e[1]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | tr -s \u003cspan style=\"color:#48b685\"\u003e\u0026#34;[:upper:]\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;[:lower:]\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e####\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   All needed functions! DO NOT TOUCH-IT!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_add_tlsa\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_var_algo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_var_soa_serial_type\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_var_tls_port\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_var_tls_proto\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_tlsa_methods\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_tlsa_selectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_tlsa_usages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tget_soa_ns\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003edanefile\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.dane\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etoday\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003eoldzonefile\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    create_new_filezone\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\twrite_soa_serial_number\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tbuild_tlsa_record\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\twrite_tlsa_record\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tmv_new_file_zone\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e _resign; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e del_old_zonefile; \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tunset danefile newzonefile oldzonefile\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebuild_needed_variables\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    check_var_domain\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** Build needed variables:\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# build cert variable if menu \u0026#39;tlsa\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eMENU_CHOICE\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;tlsa\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_le\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/cert.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** It seems cert file not exists!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;cert: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# build zonedir and zonefile variables\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003ezonedir\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eawk -F \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/zonesdir/ { print substr($2,-1) }\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ensd_cfg\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -z \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonedir\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ezonedir\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/nsd/zones/\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;zonedir: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonedir\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#zonefile=\u0026#34;$(awk -F \u0026#39;\u0026#34;\u0026#39; \u0026#39;/zonefile: \u0026#34;[a-z]*\\/\u0026#39;\u0026#34;${domain}\u0026#34;\u0026#39;\u0026#34;/ { print substr($2, -1) }\u0026#39; \u0026#34;${nsd_cfg}\u0026#34;)\u0026#34;    \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#if [ \u0026#34;$(printf \u0026#39;%s\u0026#39; \u0026#34;${zonefile}\u0026#34; | awk -F\u0026#39;/\u0026#39; \u0026#39;{ print $1}\u0026#39;)\u0026#34; == \u0026#34;signed\u0026#34; ]; then\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e##zonefilesigned=$zonefile        \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#zonefile=\u0026#34;$(find \u0026#34;${dir_ns_cfg}\u0026#34; -name \u0026#34;${domain}\u0026#34;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#if [ -z \u0026#34;${zonefile}\u0026#34; ]; then zonefile=\u0026#34;$(find \u0026#34;${zonedir}\u0026#34; -name \u0026#34;${domain}\u0026#34;)\u0026#34;; fi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#if [ -z \u0026#34;${zonefile}\u0026#34; ]; then\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#776e71\"\u003e#display_mssg \u0026#34;KO\u0026#34; \u0026#34;ERROR: It seems zonefile for domain: \u0026#39;${domain}\u0026#39; not exists!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#776e71\"\u003e#byebye\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#fi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#else\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#zonefile=\u0026#34;${zonedir}${zonefile}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e#fi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_ns_cfg\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;zonefile: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebuild_tlsa_record\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#776e71\"\u003e# get TLSA by reading cert pem\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ele_key_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ecdsa\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#ef6155\"\u003ecommand\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ec\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#48b685\"\u003e\u0026#34;rsa\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#ef6155\"\u003ecommand\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;rsa\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eopenssl x509 -noout -pubkey -in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | openssl \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecommand\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -pubin -outform der 2\u0026gt;/dev/null | \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    _log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Cert Associated: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset command\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -z \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ERROR: TLSA Cert Associated could not generated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e# rebuild tlsa method segun algo choosed; possible: 0 (no match), 1 (sha256), 2 (sha512)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sha256\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sha512\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            *\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;443\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;tcp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tget_dns_alternative_names\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#ef6155\"\u003ecount\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${#\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e[@]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -eq \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tset_tlsa_record\t\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\tset_tlsa_records\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset tlsa_cert_associated\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebyebye\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Script stop here!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Please, search to understand reasons.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    exit \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_domain_name\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003epattern\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\-]*[a-zA-Z0-9])\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\-]*[A-Za-z0-9])\u003c/span\u003e$\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# like RFC 1123\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e${#\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e -gt \u003cspan style=\"color:#f99b15\"\u003e67\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e    \u003cspan style=\"color:#776e71\"\u003e# Larg domain name \u0026lt;= 67\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Error: Domain Length: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e; \u0026gt;= 67 carachters!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | grep -Eio \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003epattern\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OK\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Domain Name: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e is valid!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        sleep \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Error: Bad Domain Name: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset pattern\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_tlsa_methods\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t0|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;FULL\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \t\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ;; \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t1|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;SHA256\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t2|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;SHA512\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\t\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t*\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\  The TLSA Method: not correctly configurated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t::\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Method: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_tlsa_selectors\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_selector\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t0|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;CERT\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \t\u003cspan style=\"color:#ef6155\"\u003etlsa_selector\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ;; \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t1|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;SPKI\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \t\u003cspan style=\"color:#ef6155\"\u003etlsa_selector\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t*\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\  The TLSA Selector: not correctly configurated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Selector: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_selector\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_tlsa_usages\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t0|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;PKIX-TA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \t\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ;; \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t1|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;PKIX-EE\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \t\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t2|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;DANE-TA\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\t\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t3|\u003cspan style=\"color:#48b685\"\u003e\u0026#34;DANE-EE\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\t\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t*\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\  The TLSA Usage: not correctly configurated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Usage: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_uid\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -u\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -ne \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ERROR: Script not launch with rights admin!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_var_algo \u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sha256\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sha512\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\ Algorythm: not correctly configurated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Algo: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_var_domain\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -z \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*** It seems fault informations!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        help\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    _log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Domain: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_var_soa_serial_type\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_serial_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_serial_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;timestamp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\ SOA Serial Type: not correctly configurated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SOA Serial Type: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_serial_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_var_tls_port\u003cspan style=\"color:#5bc4bf\"\u003e(){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -lt \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\ TLS port: not correctly configurated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLS port: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeck_var_tls_proto\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sctp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;tcp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e !\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;tcp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\ TLS proto: not correctly configurated!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLS proto: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeckconf\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    nsd-checkconf \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ensd_cfg\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echeckzone\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    nsd-checkzone \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfirm \u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    read -r response?\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e [y|n] \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eresponse\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e# \u0026#39;o\u0026#39;, \u0026#39;O\u0026#39;: Oui and not 0!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        y|Y|o|O|1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  true ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        *\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e          false ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset response\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreate_new_filezone\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcp \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edel_old_zonefile\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        rm -fP \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edisplay_mssg\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    typeset statut info text\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$2\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etext\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;[ \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ered\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eneutral\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e ]    \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OK\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003etext\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;[ \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003egreen\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatut\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eneutral\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e ]   \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003einfo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#*) mssg=\u0026#34;${text}\u0026#34; ;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#34;%s \\n\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etext\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset info statut text\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eget_dns_alternative_names\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#776e71\"\u003e# get \u0026#34;X509 DNS Alternative Names\u0026#34; characters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eecho | openssl x509 -text -noout -in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ecert\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | awk -F \u003cspan style=\"color:#48b685\"\u003e\u0026#39;,\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/DNS:/ { for(i=1;i\u0026lt;NF;i++) { p=match($i,\u0026#34;:\u0026#34;); print substr($i,p+1) }}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#776e71\"\u003e# convert into array; no double-quotes, else not run!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tset -A domains -- \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e[@]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;domains: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e[*]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;domains: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e[*]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eget_soa_ns\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003egrep -A1 \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SOA\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | tail -n1 | awk -F \u003cspan style=\"color:#48b685\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{ print $1 }\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Old SOA Serial Number: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eget_soa_serial_number\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eline\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | awk -F \u003cspan style=\"color:#48b685\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{ print $1 }\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OLD SOA Serial Number: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehelp\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e sign domain      # to sign a domain\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e tlsa domain      # to add a tlsa record into domain zone\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    ----\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    when use tlsa, this script will resign the domain zone...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einit_zone\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_sbin\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e/ldnscript init \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ein_array\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    local \u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eneed\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eIFS\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e; shift; set -A array -- \u003cspan style=\"color:#ef6155\"\u003e$*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003ecount\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${#\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003earray\u003c/span\u003e[@]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ewhile\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$i\u003c/span\u003e -le \u003cspan style=\"color:#ef6155\"\u003e$count\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003earray\u003c/span\u003e[\u003cspan style=\"color:#ef6155\"\u003e$i\u003c/span\u003e]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eneed\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e 0; \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e#let \u0026#34;i=$i+1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ei+1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset i need IFS array\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_log\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edebug\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -eq \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003elog\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emain\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tcheck_uid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tverify_need_softs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tbuild_needed_variables\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    check_domain_name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eMENU_CHOICE\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;help\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e help ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sign\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e _resign ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;tlsa\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e _add_tlsa ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        *\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ERROR: this option \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eMENU_CHOICE\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e is not exists!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            help\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emv_new_file_zone\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mv \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        mv \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ezonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_resign\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e checkzone \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e checkconf; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OK\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;file config nsd and zone \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e are good! :D\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        sign_zone\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ERROR: it exists a problem with file config nsd or zone \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erestart_server\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; Restart Server: \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    stop_server\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    start_server\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    status_server\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset_soa_serial_number\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_serial_type\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;date\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#ef6155\"\u003eSOA_date\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{print substr($0, 0, 8)}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#ef6155\"\u003eSOA_number\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{print substr($0, 9)}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_date\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etoday\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#776e71\"\u003e#let SOA_number=$SOA_number+1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eSOA_number\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_number\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e+1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e true\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_number\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -lt \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eSOA_number\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;0\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_number\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#ef6155\"\u003eSOA_sn\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_date\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_number\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#ef6155\"\u003eSOA_sn\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etoday\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e01\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#34;timestamp\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#ef6155\"\u003eSOA_sn\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etimestamp\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        *\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Invalid SOA Serial Type!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tbyebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    _log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;New SOA Serial Number: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset_tlsa_record\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#776e71\"\u003e# build tlsa record\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\ttlsa_records\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e._\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e[0]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e. IN TLSA \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_selector\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Record: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_records\u003c/span\u003e[0]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset_tlsa_records\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#776e71\"\u003e# do not use domain variable here\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e dom in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e[@]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\ttlsa_records\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$i\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;_\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e._\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edom\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e. IN TLSA \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_usage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_selector\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_method\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_cert_associated\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ei+1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tunset i dom\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Records: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_records\u003c/span\u003e[*]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esign_zone\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_sbin\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e/ldnscript signing \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estart_server\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Start serveur: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eserver\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rcctl start \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eserver\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    sleep 1s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estatus_server\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Check serveur: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eserver\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rcctl check \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eserver\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estop_server\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Stop serveur: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eserver\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rcctl stop \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eserver\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    sleep 1s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003everify_need_softs\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_sbin\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/ldnscript\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ERROR: ldnscript seems not install!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -x \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_sbin\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/ldnscript\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        display_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ERROR: ldnscript is not executable!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        byebye\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewrite_soa_serial_number\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tset_soa_serial_number\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e sed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;s#\\(.*\\)\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eOLD_SOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \\;#\\1\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eSOA_sn\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \\;#\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SOA serial number changed!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tdisplay_mssg \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/!\\  Script cant change SOA serial number!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewrite_tlsa_record\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edanefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e touch \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edanefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# add tlsa records into dns zone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e tlsa_record in \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_records\u003c/span\u003e[@]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#ef6155\"\u003edom\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomains\u003c/span\u003e[\u003cspan style=\"color:#ef6155\"\u003e$i\u003c/span\u003e]\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;domain: \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$dom\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#776e71\"\u003e### /!\\ ERROR with $domain /!\\ \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e sed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;s#_\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_port\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e._\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etls_proto\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edom\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e. IN TLSA\\(.*\\)#\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e#\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Record rewrited!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t\t\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003enewzonefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;TLSA Record added!\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#5bc4bf\"\u003e((\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ei+1 \u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#776e71\"\u003e# add record in first line into dane file\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etimestamp\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u0026gt;\u0026gt; \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edanefile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t_log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etimestamp\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003etlsa_record\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\tunset dom\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    unset i tlsa_record\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emain\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"eod\"\u003eEOD\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eEnd Of Documentation\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eVoilà mon processus de gestion de mes zones DNS, avec le protocole DNSSEC\net les enregistrements TLSA pour le service web.\u003c/p\u003e\n\u003cp\u003eD\u0026rsquo;un processus long et complexe, je peux ainsi gérer simplement à l\u0026rsquo;aide\nde deux commandes bien utiles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esigner par DNNSEC mes zones DNS :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./dns.ksh sign domain\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003etester les enregistrements TLSA à tout moment, et si besoin les regénérer :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e./tlsa.sh domain\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMais si vous avez bien compris, c\u0026rsquo;est le cron mensuel qui s\u0026rsquo;en occupe tout\nseul et qui me fait le rapport adéquat, ainsi je sais comment cela s\u0026rsquo;est\nexécuté.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment gérer DNSSEC, les enregistrements TLSA, pour valider les certificats TLS sous OpenBSD avec nsd, ldns et consorts…",
            "tags": ["DNS", "DANE", "DNSSEC", "OpenBSD", "TLSA"],
            "date_published": "2022-09-01T00:32:16+02:00",
            "date_modified": "2022-09-01T14:23:14+02:00"
        },{
            "id": "urn:uuid:e5e45f37-9a98-c2a6-0b56-5c6b1df3b937",
            "url": "http://doc.huc.fr.eu.org/fr/sys/debian/mfp-scanner-epson/",
            "title": "MFP Scanner Epson sous Debian/Devuan",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Cet article devrait vous permettre d\u0026rsquo;utiliser la partie des scanners, pour votre imprimante multi-fonctions, appelée MFP .\nLe logiciel suivant est disponible depuis le site web officiel de téléchargement d\u0026rsquo;Epson http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX :\nEpson Scan Une fois installé, vous le retrouverez à-partir du menu \u0026ldquo;Applications\u0026rdquo; \u0026gt; \u0026ldquo;Graphisme\u0026rdquo;.\nInfoPour info, le logiciel XSane devrait fonctionner avec votre MFP, à partir du moment où le fichier de configuration est correctement rempli ! Celui-ci est disponible depuis les dépôts officiels de la distribution… Deux pilotes seront utilisés, selon votre imprimante MFP :\nEpkowa Utsushi Pilote Epkowa Ce pilote concerne principalement les imprimantes MFP suivantes :\nStylus, Stylus Photo, Stylus Office certaines Workforce, diverses XP, et bien d\u0026rsquo;autres… Plus d\u0026rsquo;infos…\nPilote Utsushi Le pilote Utsushi est un nouveau pilote en cours d\u0026rsquo;écriture.\nLe dépôt officiel : https://gitlab.com/utsushi/utsushi\nIl est prévu à certain terme l\u0026rsquo;intégration dans le projet Sane, mais il est actuellement considéré en tant que \u0026ldquo;External Backend\u0026rdquo;. http://www.sane-project.org/lists/sane-backends-external.html#S-UTSUSHI\nCe pilote concerne principalement les imprimantes MFP suivantes :\ncertaines séries DS, EC, EP, ES la série des EcoTank ET beaucoup des séries WF, et XP et bien d\u0026rsquo;autres encore… AstuceNe pas hésitez à chercher avec une version supérieure, ainsi :\nla série ET-27xx semble être gérée par le pilote pour l\u0026rsquo;ET-2750 idem pour les série ET-37xx, ET-47xx. La capture ci-dessus montre un test depuis l\u0026rsquo;EcoTank ET-3700 ! Mettre un tiret entre les deux, tel que ET-3700. Faire une recherche avec un espace échouera !\nEtc.\nInstallation Maintenant, passons à l\u0026rsquo;installation :\nd\u0026rsquo;**Epson Scan Epson Scan v2 ![Epson Scan2 v6.6.2](/images/debian/Epson-Scan2-v6.6.2.x.png?w=250 \"Écran du logiciel 'Epson Scan 2 v6.6.2.x'\") Actuellement à la version 6.7.80, ce logiciel est très simple d\u0026rsquo;utilisation.\nLa version 6 est disponible à partir de cette URL : http://support.epson.net/linux/en/epsonscan2.php\nUne fois téléchargée, décompressez-la ; dirigez-vous dans le répertoire nommé \u0026ldquo;epsonscan2-bundle-6.7.80.0.x86_64.deb\u0026rdquo; puis exécutez le script install.sh, avec les droits administrateurs.\n:$ epsonscan2-bundle-6.7.80.0.x86_64.deb :# ./install.sh Lors de la première fois, une première fenêtre \u0026ldquo;Ajouter un scanner réseau\u0026rdquo; s\u0026rsquo;ouvre et demande de restituer l\u0026rsquo;adresse IP de votre MFP.\nEpscon Scan2 v6.6.2 Puis cliquez sur le bouton [ Ajouter ] qui se sera activé, suivi d\u0026rsquo;un clic sur le bouton [ OK ].\nIl n\u0026rsquo;y a plus qu\u0026rsquo;à l\u0026rsquo;utiliser, voire à modifier quelques paramètrages, à vos besoins. Les boutons [ Aperçu ] et [ Numériser ] sont en bas.\nDocumentation Epson fournit de la documentation, en anglais, pour aider à configurer le logiciel Epson Scan :\nformat html ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCet article devrait vous permettre d\u0026rsquo;utiliser la partie des scanners,\npour votre imprimante multi-fonctions, appelée \u003cabbr title=\"Multi Function Printer\"\u003eMFP\u003c/abbr\u003e\n.\u003c/p\u003e\n\u003cp\u003eLe logiciel suivant est disponible depuis le site web officiel de\ntéléchargement d\u0026rsquo;Epson \u003cbr\u003e\n\u003ca href=\"http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX\" rel=\"external\"\u003ehttp://download.ebz.epson.net/dsc/search/01/search/?OSC=LX\u003c/a\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/debian/mfp-scanner-epson/#epson-scan-v2\"\u003eEpson Scan\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois installé, vous le retrouverez à-partir du menu \u0026ldquo;Applications\u0026rdquo; \u0026gt;\n\u0026ldquo;Graphisme\u0026rdquo;.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePour info, le logiciel \u003cstrong\u003eXSane\u003c/strong\u003e devrait fonctionner avec votre MFP, à partir\ndu moment où le fichier de configuration est correctement rempli ! \u003cbr\u003e\nCelui-ci est disponible depuis les dépôts officiels de la distribution…\u003c/div\u003e\n\n\u003cp\u003eDeux pilotes seront utilisés, selon votre imprimante MFP :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/debian/mfp-scanner-epson/#pilote-epkowa\"\u003eEpkowa\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/debian/mfp-scanner-epson/#pilote-utsushi\"\u003eUtsushi\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pilote-epkowa\"\u003ePilote Epkowa\u003c/h3\u003e\n\u003cp\u003eCe pilote concerne principalement les imprimantes MFP suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStylus, Stylus Photo, Stylus Office\u003c/li\u003e\n\u003cli\u003ecertaines Workforce,\u003c/li\u003e\n\u003cli\u003ediverses XP,\u003c/li\u003e\n\u003cli\u003eet bien d\u0026rsquo;autres…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"http://download.ebz.epson.net/dsc/du/02/DriverDownloadInfo.do?LG2=EN\u0026amp;CN2=\u0026amp;DSCMI=97917\u0026amp;DSCCHK=21fecde1d2b0b001f990e149dd9a9d5a8b5b04ea\" rel=\"external\"\u003ePlus d\u0026rsquo;infos\u003c/a\u003e…\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"pilote-utsushi\"\u003ePilote Utsushi\u003c/h3\u003e\n\u003cp\u003eLe pilote \u003cstrong\u003eUtsushi\u003c/strong\u003e est un nouveau pilote en cours d\u0026rsquo;écriture.\u003c/p\u003e\n\u003cp\u003eLe dépôt officiel : \u003ca href=\"https://gitlab.com/utsushi/utsushi\" rel=\"external\"\u003ehttps://gitlab.com/utsushi/utsushi\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eIl est prévu à certain terme l\u0026rsquo;intégration dans le projet Sane, mais il est\nactuellement considéré en tant que \u0026ldquo;External Backend\u0026rdquo;. \u003cbr\u003e\n\u003ca href=\"http://www.sane-project.org/lists/sane-backends-external.html#S-UTSUSHI\" rel=\"external\"\u003ehttp://www.sane-project.org/lists/sane-backends-external.html#S-UTSUSHI\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eCe pilote concerne principalement les imprimantes MFP suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecertaines séries DS, EC, EP, ES\u003c/li\u003e\n\u003cli\u003ela série des EcoTank ET\u003c/li\u003e\n\u003cli\u003ebeaucoup des séries WF, et XP\u003c/li\u003e\n\u003cli\u003eet bien d\u0026rsquo;autres encore…\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eNe pas hésitez à chercher avec une version supérieure, ainsi :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela série ET-27xx semble être gérée par le pilote pour l\u0026rsquo;ET-2750\u003c/li\u003e\n\u003cli\u003eidem pour les série ET-37xx, ET-47xx. \u003cbr\u003e\n\u003cem\u003eLa capture ci-dessus montre un test depuis l\u0026rsquo;EcoTank ET-3700 !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMettre un tiret entre les deux, tel que \u003cstrong\u003eET-3700\u003c/strong\u003e. Faire une recherche\navec un espace échouera !\u003c/p\u003e\n\u003cp\u003eEtc.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eMaintenant, passons à l\u0026rsquo;installation :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ed\u0026rsquo;**\u003ca href=\"/fr/sys/debian/mfp-scanner-epson/#epson-scan-v2\"\u003eEpson Scan\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"epson-scan-v2\"\u003eEpson Scan v2\u003c/h3\u003e\n\u003cdiv class=\"float-right\"\u003e\n![Epson Scan2 v6.6.2](/images/debian/Epson-Scan2-v6.6.2.x.png?w=250 \"Écran du logiciel 'Epson Scan 2 v6.6.2.x'\")\n\u003c/div\u003e\n\u003cp\u003eActuellement à la version \u003cstrong\u003e6.7.80\u003c/strong\u003e, ce logiciel est très simple d\u0026rsquo;utilisation.\u003c/p\u003e\n\u003cp\u003eLa version 6 est disponible à partir de cette URL : \u003cbr\u003e\n\u003ca href=\"http://support.epson.net/linux/en/epsonscan2.php\" rel=\"external\"\u003ehttp://support.epson.net/linux/en/epsonscan2.php\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eUne fois téléchargée, décompressez-la ; dirigez-vous dans le répertoire nommé\n\u0026ldquo;epsonscan2-bundle-6.7.80.0.x86_64.deb\u0026rdquo; puis exécutez le script \u003ccode\u003einstall.sh\u003c/code\u003e,\navec les droits administrateurs.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ epsonscan2-bundle-6.7.80.0.x86_64.deb\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# ./install.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eLors de la première fois, une première fenêtre \u0026ldquo;Ajouter un scanner réseau\u0026rdquo;\ns\u0026rsquo;ouvre et demande de restituer l\u0026rsquo;adresse IP de votre MFP.\u003c/p\u003e\n\u003cp\u003e\n    \n                \u003cfigure role=\"figure\" aria-label=\"Epscon Scan2 v6.6.2\"\u003e\n    \u003ca href=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner.png\" title=\"Epscon Scan2 v6.6.2\"\u003e\n        \u003cpicture\u003e\n            \u003csource srcset=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner.png.avif\" type=\"image/avif\"\u003e\u003csource srcset=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner_hu_d3f62fde2fcad54d.webp\" type=\"image/webp\"\u003e\n            \u003cimg alt=\"Epscon Scan2 v6.6.2\" height=\"159\" id=\"img_images_debian_Epson-Scan2-v6.6.2.x-add-scanner.png_0\" loading=\"lazy\" src=\"/images/debian/Epson-Scan2-v6.6.2.x-add-scanner.png\" type=\"image/png\" width=\"250\"\u003e\n        \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eEpscon Scan2 v6.6.2\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003cp\u003ePuis cliquez sur le bouton [ Ajouter ] qui se sera activé, suivi d\u0026rsquo;un clic\nsur le bouton [ OK ].\u003c/p\u003e\n\u003cp\u003eIl n\u0026rsquo;y a plus qu\u0026rsquo;à l\u0026rsquo;utiliser, voire à modifier quelques paramètrages, à\nvos besoins. Les boutons [ Aperçu ] et [ Numériser ] sont en bas.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eEpson fournit de la documentation, en anglais, pour aider à configurer le\nlogiciel \u003cstrong\u003eEpson Scan\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eformat \u003ca href=\"https://download.ebz.epson.net/man/linux/epsonscan2_e.html\" rel=\"external\"\u003ehtml\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Tutoriel pour faire fonctionner le scanner des imprimantes multifonctions de la marque Epson",
            "tags": ["Epson", "MFP", "scanner", "Debian", "Devuan"],
            "date_published": "2022-05-03T08:52:24+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:324120b1-fad5-e2d6-5b70-1f47752b7938",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/vger-voyager-gemini/",
            "title": "V'Ger Voyager / Gemini (OpenBSD)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description V\u0026rsquo;Ger est le projet de serveur de publication sur le protocol Gemini, écrit en C. Écrit pour OpenBSD, il bénéficie des mesures de protections, liées à pledge(4) et unveil(4).\nDans cet article, nous aborderons l\u0026rsquo;installation et la configuration de ce service. Puis nous verrons comment configurer relayd ou nginx en tant que proxy relais ; et nous finirons par quelques règles pour Packet-Filter.\nOpenBSD : 6.9 → 7.4\nAuteure du projet V\u0026rsquo;Ger : Solène Rapenne Disponible en tant que paquet : https://openports.pl/path/net/vger URL du dépôt Git : https://tildegit.org/solene/vger Installation Puisque V\u0026rsquo;Ger est disponible dans les ports, installez le paquet vger.\nAutrement vous pouvez toujours l\u0026rsquo;installer depuis le dépôt Git… mais là, je vous renvoie à la documention du dépôt.\nConfiguration Pré-requis :\nchangez les termes \u0026lsquo;addresse_ipv4\u0026rsquo;, \u0026lsquo;addresse_ipv6\u0026rsquo; et \u0026rsquo;nom_domaine\u0026rsquo;, par ce qui correspond à votre contexte de serveur ! Utilisateur dédié _vger Créons en tout premier un utilisateur dédié, nommé _vger :\n$ doas useradd -d /var/gemini -s /sbin/nologin _vger\n(dans la documentation officielle, le nom de l\u0026rsquo;utilisateur est _gemini).\nSystème Il nous faut créer le répertoire /var/gemini puis appliquer les droits à l\u0026rsquo;utilisateur dédié :\n$ doas mkdir -p /var/gemini/nom_domaine $ doas chown -R _vger /var/gemini inetd Fichier de configuraton : /etc/inetd.conf Le service inetd est chargé de l\u0026rsquo;écoute active sur l\u0026rsquo;interface localhost puis appelle le binaire vger pour délivrer le contenu.\nConfigurons maintenant le service inetd :\n1965 stream tcp nowait _vger /usr/local/bin/vger vger -d /var/gemini -v 1965 stream tcp6 nowait _vger /usr/local/bin/vger vger -d /var/gemini -v le port d\u0026rsquo;écoute est le 1965 - (dans la documentation officielle, le port par défaut est 11965). géré par l\u0026rsquo;utilisateur _vger, appelant le binaire vger. ⇒ activons et démarrons le service :\n$ doas rcctl enable inetd \u0026amp;\u0026amp; doas rcctl start inetd certificats SSL Cet article ne présente pas comment obtenir les certificats SSL, mais vous pouvez les obtenir, soit depuis le client acme secure, natif sous OpenBSD, soit à partir du paquet certbot.\nEn premier, il semble nécessaire de créer le répertoire private dans /etc/ssl.\n$ doas mkdir -p /etc/ssl/private acme La documentation officielle informe de lier les certificats SSL, générés par le client sécurisé acme sous OpenBSD.\nSi c\u0026rsquo;est votre cas :\n$ doas ln -s /etc/ssl/acme/cert.pem /etc/ssl/nom_domaine.crt $ doas ln -s /etc/ssl/acme/private/privkey.pem /etc/ssl/private/nom_domaine.key certbot Dans mon contexte de serveur, les certificats sont générés par le client certbot, disponible officiellement dans les ports. Une fois les certificats générés par certbot, les liens symboliques à créer sont de cette forme :\n$ doas ln -s /etc/letsencrypt/live/nom_domaine/cert.pem /etc/ssl/nom_domaine.crt $ doas ln -s /etc/letsencrypt/live/nom_domaine/privkey.pem /etc/ssl/private/nom_domaine.key relayd Fichier de configuration : /etc/relayd.conf - chmod 0600 ! relayd est le service de relais-proxy natif sous OpenBSD.\nLa configuration du service relayd peut se faire ainsi - dans cet exemple, à la fois pour Ipv4|6 - :\nlog connection table \u0026lt;localhost\u0026gt; { 127.0.0.1, ::1 } tcp protocol \u0026#34;gemini\u0026#34; { tls keypair nom_domaine } relay \u0026#34;gemini\u0026#34; { listen on nom_domaine port 1965 tls protocol \u0026#34;gemini\u0026#34; forward to \u0026lt;localhost\u0026gt; port 1965 } ⇒ Vérification de la configuration :\n$ doas relayd -n host_dns: nom_domaine resolves to more than 1 hosts configuration OK ⇒ activons et démarrons le service :\n$ doas rcctl enable relayd \u0026amp;\u0026amp; doas rcctl start relayd nginx Fichier de configuration : /etc/nginx.conf nginx peut lui aussi servir de proxy relais, en lieu et place de relayd ; mais il est nécessaire d\u0026rsquo;installer en plus le paquet nginx-stream.\nPuis il faut modifier la configuration pour y ajouter, en début de fichier, avant la directive http :\nload_module \u0026quot;modules/ngx_stream_module.so\u0026quot;;\nEnsuite, il est nécessaire de rajouter les déclarations suivantes en utilisant la directive stream :\nstream { log_format basic \u0026#39;$remote_addr $upstream_addr [$time_local] \u0026#39; \u0026#39;$protocol $status $bytes_sent $bytes_received \u0026#39; \u0026#39;$session_time\u0026#39;; access_log logs/nom_domaine/access.gemini.log basic; upstream backend_ipv4 { hash $remote_addr consistent; server 127.0.0.1:1965; } upstream backend_ipv6 { hash $remote_addr consistent; server [::1]:1965; } map $server_addr $backend { addresse_ipv4 backend_ipv4; addresse_ipv6 backend_ipv6; } server { listen addresse_ipv4:1965 ssl; listen [addresse_ipv6]:1965 ssl; ssl_certificate /etc/letsencrypt/live/nom_domaine/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/nom_domaine/privkey.pem; ssl_ciphers TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_ecdh_curve X25519:P-521:P-384:P-256; ssl_prefer_server_ciphers on; ssl_protocols TLSv1.3 TLSv1.2; proxy_pass $backend; } } Quelques petites explications :\nen rapport avec les directives listen, si vous ne déclarez pas l\u0026rsquo;adresse IP correspondante, tel que listen 1965 ssl;, il faudra impérativement rediriger le port sur un autre numéro de port puis reconfigurer inetd.conf pour qu\u0026rsquo;il écoute sur ce même autre numéro de port. En effet, si l\u0026rsquo;adresse IP d\u0026rsquo;écoute n\u0026rsquo;est pas spécifiée dans la directive listen, nginx cherchera à écouter sur toutes les interfaces réseaux configurées et ne pourra redémarrer car inetd écoute déjà sur l\u0026rsquo;interface localhost.\ndeux directives upstream sont déclarées, chacune pour gérer correctement le protocole IPv4 ou IPv6, et sont mappées pour n\u0026rsquo;avoir qu\u0026rsquo;un seul proxy à appeler.\nun dernier mot, concernant les directives ssl_ciphers, ssl_ecdh_curve, ssl_prefer_server_ciphers, et ssl_protocols, elles ne sont pas strictement nécessaires mais utiles pour renforcer les préférences d\u0026rsquo;utilisation. ssl_protocols permet de prioriser la version de TLS, sachant que :\nServers MUST use TLS version 1.2 or higher and SHOULD use TLS version 1.3 or higher.\nPF Voici un exemple de règles minimalistes à ajouter à PF :\nhost = adresse_ipv4 host6 = adresse_ipv6 pass in quick on egress proto tcp from any to { $host $host6 } port 1965 Pensez à recharger le jeu de règles par PF :\n$ doas pfctl -f /etc/pf.conf\nVoilà !\nIl ne vous reste plus qu\u0026rsquo;à créer votre premier fichier index.gmi et les suivants et les déposer dans le répertoire correspondant à votre répertoire de publication… en n\u0026rsquo;oubliant pas de poser les droits de l\u0026rsquo;utilisateur dédié dessus.\nSurveillance Mais qui surveille ?\n⇒ L\u0026rsquo;activité est enregistrée dans les deux logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;.\n$ grep vger /var/log/messages May 1 10:54:28 sh1 useradd[86659]: new group added: name=_vger, gid=1011 May 1 10:54:28 sh1 useradd[86659]: new user added: name=_vger, uid=1011, gid=1011, home=/var/gemini, shell=/sbin/nologin May 1 12:09:53 sh1 vger: request gemini://huc.fr.eu.org/ May 1 13:00:59 sh1 vger: request gemini://huc.fr.eu.org/ ⇒ Il est possible de surveiller l\u0026rsquo;activité de l\u0026rsquo;utilisateur _vger avec - mais dans ce cas, franchement peu utile :\ntop -U _vger fstat -u _vger -n ps aux -U _vger Dépannage ⇒ Pour vérifier que le service inetd écoute en local, il est possible de lui envoyer la requête suivante :\n$ printf \u0026#39;%s\\r\\n\u0026#39; \u0026#34;gemini://huc.fr.eu.org\u0026#34; | vger -v -d /var/gemini 20 text/gemini; # huc.fr.eu.org|gemini (…) Si la réponse est similaire, c\u0026rsquo;est que vger écoute bien en local ! Si vous avez pour réponse telnet: Unable to connect to remote host: Connection refused, c\u0026rsquo;est certainement soit que le service inetd ne peut répondre - est-il actif ? ou qu\u0026rsquo;il y a un problème dans sa configuration. Vérifiez ! ⇒ Vérifier que le port 1965 soit ouvert en écoute sur vos adresses IP :\n$ netstat -an | grep 1965 tcp 0 0 *.1965 *.* LISTEN tcp 0 0 46.23.90.29.1965 *.* LISTEN tcp6 0 0 2a03:6000:6e65:6.1965 *.* LISTEN tcp6 0 0 *.1965 *.* LISTEN ⇒ Pour finir, vous pouvez vérifier avec l\u0026rsquo;outil telnet sur le port 1965, en local et depuis une autre machine que le service écoute.\nDocumentations l\u0026rsquo;article de Solène à-propos de Nginx as a TCP/UDP relay - en anglais la documentation du protocol Gemini : https://gemini.circumlunar.space/docs/ - en anglais Readme du paquet certbot Manpages pledge(4) , unveil(4) une fois installé le manpage : man 8 vger le fichier pkg-readme dans /usr/local/share/doc/pkg-readmes/vger ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eV\u0026rsquo;Ger\u003c/strong\u003e est le projet de serveur de publication sur le protocol Gemini,\nécrit en C. Écrit pour OpenBSD, il bénéficie des mesures de protections,\nliées à pledge(4) et unveil(4).\u003c/p\u003e\n\u003cp\u003eDans cet article, nous aborderons l\u0026rsquo;installation et la configuration de\nce service. Puis nous verrons comment configurer \u003cstrong\u003erelayd\u003c/strong\u003e ou \u003cstrong\u003enginx\u003c/strong\u003e\nen tant que proxy relais ; et nous finirons par quelques règles pour\nPacket-Filter.\u003c/p\u003e\n\u003cp\u003eOpenBSD : \u003cdel\u003e6.9\u003c/del\u003e → 7.4\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eAuteure du projet \u003cstrong\u003eV\u0026rsquo;Ger\u003c/strong\u003e : Solène Rapenne\u003c/li\u003e\n\u003cli\u003eDisponible en tant que paquet : \u003ca href=\"https://openports.pl/path/net/vger\" rel=\"external\"\u003ehttps://openports.pl/path/net/vger\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eURL du dépôt Git : \u003ca href=\"https://tildegit.org/solene/vger\" rel=\"external\"\u003ehttps://tildegit.org/solene/vger\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003ePuisque V\u0026rsquo;Ger est disponible dans les ports,\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le paquet \u003cstrong\u003evger\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eAutrement vous pouvez toujours l\u0026rsquo;installer depuis le dépôt Git… mais là,\nje vous renvoie à la documention du dépôt\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePré-requis :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echangez les termes \u0026lsquo;addresse_ipv4\u0026rsquo;, \u0026lsquo;addresse_ipv6\u0026rsquo; et \u0026rsquo;nom_domaine\u0026rsquo;,\npar ce qui correspond à votre contexte de serveur !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"utilisateur-dédié-_vger\"\u003eUtilisateur dédié _vger\u003c/h3\u003e\n\u003cp\u003eCréons en tout premier un utilisateur dédié, nommé \u003cstrong\u003e_vger\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ doas useradd -d /var/gemini -s /sbin/nologin _vger\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(dans la documentation officielle, le nom de l\u0026rsquo;utilisateur est \u003cstrong\u003e_gemini\u003c/strong\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"système\"\u003eSystème\u003c/h3\u003e\n\u003cp\u003eIl nous faut créer le répertoire \u003ccode\u003e/var/gemini\u003c/code\u003e puis appliquer les droits\nà l\u0026rsquo;utilisateur dédié :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas mkdir -p /var/gemini/nom_domaine\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas chown -R _vger /var/gemini\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"inetd\"\u003einetd\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuraton : \u003ccode\u003e/etc/inetd.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe service inetd est chargé de l\u0026rsquo;écoute active sur l\u0026rsquo;interface localhost\npuis appelle le binaire vger pour délivrer le contenu.\u003c/p\u003e\n\u003cp\u003eConfigurons maintenant le service \u003cstrong\u003einetd\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e1965 stream tcp nowait _vger /usr/local/bin/vger vger -d /var/gemini -v \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e1965 stream tcp6 nowait _vger /usr/local/bin/vger vger -d /var/gemini -v\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ele port d\u0026rsquo;écoute est le \u003cstrong\u003e1965\u003c/strong\u003e - \u003cem\u003e(dans la documentation officielle,\nle port par défaut est \u003cstrong\u003e11965\u003c/strong\u003e)\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003egéré par l\u0026rsquo;utilisateur \u003cstrong\u003e_vger\u003c/strong\u003e, appelant le binaire \u003ccode\u003evger\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ activons et démarrons le service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl enable inetd \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl start inetd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"certificats-ssl\"\u003ecertificats SSL\u003c/h3\u003e\n\u003cp\u003eCet article ne présente pas comment obtenir les certificats SSL, mais vous\npouvez les obtenir, soit depuis le client acme secure, natif sous OpenBSD,\nsoit à partir du paquet certbot.\u003c/p\u003e\n\u003cp\u003eEn premier, il semble \u003cstrong\u003enécessaire de créer le répertoire \u003ccode\u003eprivate\u003c/code\u003e dans \u003ccode\u003e/etc/ssl\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas mkdir -p /etc/ssl/private\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"acme\"\u003eacme\u003c/h4\u003e\n\u003cp\u003eLa documentation officielle informe de lier les certificats SSL, générés\npar le client sécurisé acme sous OpenBSD.\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est votre cas :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas ln -s /etc/ssl/acme/cert.pem /etc/ssl/nom_domaine.crt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas ln -s /etc/ssl/acme/private/privkey.pem /etc/ssl/private/nom_domaine.key\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"certbot\"\u003ecertbot\u003c/h4\u003e\n\u003cp\u003eDans mon contexte de serveur, les certificats sont générés par le client\ncertbot, disponible officiellement dans les ports. Une fois les certificats\ngénérés par certbot, les liens symboliques à créer sont de cette forme :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas ln -s /etc/letsencrypt/live/nom_domaine/cert.pem /etc/ssl/nom_domaine.crt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas ln -s /etc/letsencrypt/live/nom_domaine/privkey.pem /etc/ssl/private/nom_domaine.key\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/etc/relayd.conf\u003c/code\u003e - chmod \u003cstrong\u003e0600\u003c/strong\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003erelayd\u003c/strong\u003e est le service de relais-proxy natif sous OpenBSD.\u003c/p\u003e\n\u003cp\u003eLa configuration du service relayd peut se faire ainsi - \u003cem\u003edans cet exemple,\nà la fois pour Ipv4|6\u003c/em\u003e - :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elog connection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;localhost\u0026gt; { 127.0.0.1, ::1 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etcp protocol \u0026#34;gemini\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls keypair nom_domaine\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003erelay \u0026#34;gemini\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elisten on nom_domaine port 1965 tls\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprotocol \u0026#34;gemini\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eforward to \u0026lt;localhost\u0026gt; port 1965\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Vérification de la configuration :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas relayd -n              \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehost_dns: nom_domaine resolves to more than \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e hosts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econfiguration OK\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ activons et démarrons le service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl enable relayd \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl start relayd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"nginx\"\u003enginx\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/etc/nginx.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003enginx\u003c/strong\u003e peut lui aussi servir de proxy relais, en lieu et place de \u003cstrong\u003erelayd\u003c/strong\u003e ;\nmais il est nécessaire d\u0026rsquo;installer en plus le paquet \u003cstrong\u003enginx-stream\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003ePuis il faut modifier la configuration pour y ajouter, en début de fichier,\navant la directive \u003ccode\u003ehttp\u003c/code\u003e :\u003cbr\u003e\n\u003ccode\u003eload_module \u0026quot;modules/ngx_stream_module.so\u0026quot;;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite, il est nécessaire de rajouter les déclarations suivantes en utilisant\nla directive \u003ccode\u003estream\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003estream {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elog_format basic \u0026#39;$remote_addr $upstream_addr [$time_local] \u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     \u003cspan style=\"color:#06b6ef\"\u003e\u0026#39;$protocol $status $bytes_sent $bytes_received \u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                     \u003cspan style=\"color:#06b6ef\"\u003e\u0026#39;$session_time\u0026#39;;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaccess_log logs/nom_domaine/access.gemini.log basic;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eupstream backend_ipv4 {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ehash $remote_addr consistent;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eserver 127.0.0.1:1965;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eupstream backend_ipv6 {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003ehash $remote_addr consistent;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eserver [::1]:1965;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emap $server_addr $backend {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003eaddresse_ipv4 backend_ipv4;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003eaddresse_ipv6 backend_ipv6;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eserver {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003elisten addresse_ipv4:1965 ssl;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003elisten [addresse_ipv6]:1965 ssl;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003essl_certificate /etc/letsencrypt/live/nom_domaine/fullchain.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003essl_certificate_key /etc/letsencrypt/live/nom_domaine/privkey.pem;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003essl_ciphers TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:TLS-AES-128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003essl_ecdh_curve X25519:P-521:P-384:P-256;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003essl_prefer_server_ciphers on;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\t\u003cspan style=\"color:#06b6ef\"\u003essl_protocols TLSv1.3 TLSv1.2;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eproxy_pass $backend;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuelques petites explications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003een rapport avec les directives \u003ccode\u003elisten\u003c/code\u003e, si vous ne déclarez pas l\u0026rsquo;adresse\nIP correspondante, tel que \u003ccode\u003elisten 1965 ssl;\u003c/code\u003e, il faudra impérativement\nrediriger le port sur un autre numéro de port puis reconfigurer \u003ccode\u003einetd.conf\u003c/code\u003e\npour qu\u0026rsquo;il écoute sur ce même autre numéro de port. En effet, si l\u0026rsquo;adresse\nIP d\u0026rsquo;écoute n\u0026rsquo;est pas spécifiée dans la directive \u003ccode\u003elisten\u003c/code\u003e, nginx cherchera\nà écouter sur toutes les interfaces réseaux configurées et ne pourra redémarrer\ncar inetd écoute déjà sur l\u0026rsquo;interface localhost.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003edeux directives \u003ccode\u003eupstream\u003c/code\u003e sont déclarées, chacune pour gérer correctement\nle protocole IPv4 ou IPv6, et sont mappées pour n\u0026rsquo;avoir qu\u0026rsquo;un seul proxy\nà appeler.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eun dernier mot, concernant les directives \u003ccode\u003essl_ciphers\u003c/code\u003e, \u003ccode\u003essl_ecdh_curve\u003c/code\u003e,\n\u003ccode\u003essl_prefer_server_ciphers\u003c/code\u003e, et \u003ccode\u003essl_protocols\u003c/code\u003e, elles ne sont pas strictement\nnécessaires mais utiles pour renforcer les préférences d\u0026rsquo;utilisation.\n\u003ccode\u003essl_protocols\u003c/code\u003e permet de prioriser la version de TLS, sachant que :\u003cbr\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cblockquote\u003e\n\u003cp\u003eServers MUST use TLS version 1.2 or higher and SHOULD use TLS version 1.3 or higher.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eVoici un exemple de règles minimalistes à ajouter à PF :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ehost\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eadresse_ipv4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ehost6\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eadresse_ipv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress proto tcp from any to { $host $host6 } port 1965\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePensez à recharger le jeu de règles par PF :\u003cbr\u003e\n\u003ccode\u003e$ doas pfctl -f /etc/pf.conf\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003eIl ne vous reste plus qu\u0026rsquo;à créer votre premier fichier \u003ccode\u003eindex.gmi\u003c/code\u003e et les\nsuivants et les déposer dans le répertoire correspondant à votre répertoire\nde publication… en n\u0026rsquo;oubliant pas de poser les droits de l\u0026rsquo;utilisateur\ndédié dessus.\u003c/p\u003e\n\u003ch2 id=\"surveillance\"\u003eSurveillance\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMais qui surveille ?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e⇒ L\u0026rsquo;activité est enregistrée dans les deux logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ grep vger /var/log/messages                                                                                                              \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e 10:54:28 sh1 useradd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e86659\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: new group added: \u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e_vger, \u003cspan style=\"color:#ef6155\"\u003egid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1011\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e 10:54:28 sh1 useradd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e86659\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: new user added: \u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e_vger, \u003cspan style=\"color:#ef6155\"\u003euid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1011, \u003cspan style=\"color:#ef6155\"\u003egid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1011, \u003cspan style=\"color:#ef6155\"\u003ehome\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/var/gemini, \u003cspan style=\"color:#ef6155\"\u003eshell\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/sbin/nologin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e 12:09:53 sh1 vger: request gemini://huc.fr.eu.org/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e 13:00:59 sh1 vger: request gemini://huc.fr.eu.org/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Il est possible de surveiller l\u0026rsquo;activité de l\u0026rsquo;utilisateur \u003cstrong\u003e_vger\u003c/strong\u003e\navec - \u003cem\u003emais dans ce cas, franchement peu utile\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etop -U _vger\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efstat -u _vger -n\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eps aux -U _vger\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003e⇒ Pour vérifier que le service inetd écoute en local, il est possible de\nlui envoyer la requête suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\r\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini://huc.fr.eu.org\u0026#34;\u003c/span\u003e | vger -v -d /var/gemini \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e text/gemini; \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# huc.fr.eu.org|gemini\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eSi la réponse est similaire, c\u0026rsquo;est que vger écoute bien en local !\u003c/li\u003e\n\u003cli\u003eSi vous avez pour réponse \u003ccode\u003etelnet: Unable to connect to remote host: Connection refused\u003c/code\u003e,\nc\u0026rsquo;est certainement soit que le service \u003ccode\u003einetd\u003c/code\u003e ne peut répondre - est-il\nactif ? ou qu\u0026rsquo;il y a un problème dans sa configuration. Vérifiez !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Vérifier que le port 1965 soit ouvert en écoute sur vos adresses IP :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ netstat -an | grep \u003cspan style=\"color:#f99b15\"\u003e1965\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etcp          \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  *.1965                 *.*                    LISTEN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etcp          \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  46.23.90.29.1965       *.*                    LISTEN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etcp6         \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  2a03:6000:6e65:6.1965  *.*                    LISTEN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etcp6         \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  *.1965                 *.*                    LISTEN\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e⇒ Pour finir, vous pouvez vérifier avec l\u0026rsquo;outil \u003ccode\u003etelnet\u003c/code\u003e sur le port 1965,\nen local et depuis une autre machine que le service écoute.\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;article de Solène à-propos de \u003ca href=\"https://dataswamp.org/~solene/2021-02-24-nginx-stream.html\" rel=\"external\"\u003e\nNginx as a TCP/UDP relay\u003c/a\u003e \u003cem\u003e- en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ela documentation du protocol Gemini : \u003ca href=\"https://gemini.circumlunar.space/docs/\" rel=\"external\"\u003ehttps://gemini.circumlunar.space/docs/\u003c/a\u003e \u003cem\u003e- en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openports.pl/path/security/letsencrypt/client\" rel=\"external\"\u003eReadme du paquet certbot\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/pledge.4\" title=\"Page du Manuel OpenBSD pour : pledge\"\u003epledge(4)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unveil.4\" title=\"Page du Manuel OpenBSD pour : unveil\"\u003eunveil(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eune fois installé le manpage : \u003ccode\u003eman 8 vger\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ele fichier pkg-readme dans \u003ccode\u003e/usr/local/share/doc/pkg-readmes/vger\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Installer le serveur V'Ger, pour voyager sur le protocol Gemini",
            "tags": ["Gemini", "VGer", "OpenBSD", "PF", "nginx", "relayd"],
            "date_published": "2022-05-01T12:12:22+02:00",
            "date_modified": "2023-12-18T19:20:06+01:00"
        },{
            "id": "urn:uuid:c10ec14e-2e36-c3d8-9b34-c9ae7c3e327d",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/iblock-openbsd/",
            "title": "iblock : bloqueur de connexions TCP indésirables, sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description iblock est un logiciel dont le but est de détecter des connexions TCP, sur des ports précis, afin de bloquer les adresses IP correspondantes par le biais du parefeu Packet Filter, sous OpenBSD.\nLe service inetd est chargé de l\u0026rsquo;écoute active.\nAuteure du projet : Solène Rapenne URL du dépôt Git : https://tildegit.org/solene/iblock.git liste d\u0026rsquo;URL bannies : http://perso.pw/blocklist.txt Installation Commençons par la copie du dépôt Git :\n:$ git clone https://tildegit.org/solene/iblock.git :$ cd iblock Compilons le binaire - OpenBSD renferme nativement les outils adéquats - :\n:$ doas make cc -o iblock main.c ; vérifions la présence du binaire $ ls -al iblock -rwxr-xr-x 1 root moi 8496 Apr 10 12:23 iblock* Si la phase de compilation s\u0026rsquo;exécute mal, contactez Solène !\nSolène n\u0026rsquo;a pas créé la cible \u0026ldquo;install\u0026rdquo;, donc copions le binaire dans le répertoire cible :\n:$ doas cp iblock /usr/local/bin/ $ ls -al /usr/local/bin/iblock -rwxr-xr-x 1 root wheel 8496 Apr 10 12:26 /usr/local/bin/iblock* Passons maintenant à la phase de configuration !\nConfiguration Utilisateur dédié _iblock Créons en tout premier un utilisateur dédié, nommé _iblock :\n:$ doas useradd -s /sbin/nologin _iblock\ndoas Fichier de configuration : /etc/doas.conf Ajoutons la règle suivante dans le fichier de configuration de doas pour autoriser l\u0026rsquo;utilisateur dédié à utiliser l\u0026rsquo;outil pfctl :\npermit nopass _iblock cmd /sbin/pfctl\ninetd Fichier de configuraton : /etc/inetd.conf Configurons maintenant le service inetd :\n666 stream tcp nowait _iblock /usr/local/bin/iblock iblock blocked_tcp 666 stream tcp6 nowait _iblock /usr/local/bin/iblock iblock blocked_tcp le port 666 est utilisé - bien sûr, vous pouvez le changer. géré par l\u0026rsquo;utilisateur _iblock, appelant le binaire iblock. le dernier argument est le nom du paramètre qui est ajouté aux adresses IP qui sont enregistrées dans la table gérée par PF. Et activons et démarrons le service :\n:$ doas rcctl enable inetd \u0026amp;\u0026amp; doas rcctl start inetd shutdown En premier, créons un fichier de \u0026ldquo;secours\u0026rdquo; pour rendre la future table dans PF persistante à l\u0026rsquo;extinction et au redémarrage du serveur :\n:# touch /etc/pf-blocked_tcp.txt Puis créons/modifions le fichier /etc/rc.shutdown pour y ajouter :\npfctl -t blocked_tcp -T show \u0026gt; /etc/pf-blocked_tcp.txt PF Voici un exemple de règles à ajouter à PF :\ndéclaration d\u0026rsquo;une variable, ici nommée block_tcp_ports, soit un ensemble de ports à surveiller\ncréation d\u0026rsquo;une table persistante, ici nommée blocked_tcp\nrègle bloquante, portant le label iblock\nles deux dernières règles analysent le flux TCP, sur les protocoles IPv4 et IPv6, en \u0026ldquo;écoutant\u0026rdquo; les ports enregistrés dans la variable block_tcp_ports, puis redirigent sur l\u0026rsquo;interface locale, à destination du port 666.\nblock_tcp_ports = \u0026#34;{ 21 23 111 135 137:139 445 1433 3306 3389 5432 6000:6010 7890 9999 25565 27019 }\u0026#34; table \u0026lt;blocked_tcp\u0026gt; persist file \u0026#34;/etc/pf-blocked_tcp.txt\u0026#34; ### iblock: block all in table block in quick from \u0026lt;blocked_tcp\u0026gt; label iblock ### iblock: redirect to inetd service on localhost pass in quick on egress inet proto tcp to port $block_tcp_ports rdr-to 127.0.0.1 port 666 pass in quick on egress inet6 proto tcp to port $block_tcp_ports rdr-to ::1 port 666 InfoLes ports analysés, par défaut, sont FTP, telnet, DNS, RPC, SMB, MSSQL, MySQL, RDP, PostgreSQL, Minecraft, Steam. J\u0026rsquo;ai rajouté : X11, Goaccess, pfstat ; à vous de rajouter… AttentionSi vous hébergez un service, tel que DNS, vous allez bloquer toutes les connexions, car par défaut, le port 53 adéquat est analysé pour être bloqué. (cette remarque vaut pour tout service que vous hébergez !) Pensez à faire recharger le jeu de règles par PF : $ doas pfctl -f /etc/pf.conf\nSurveillance Mais qui surveille ?\n⇒ L\u0026rsquo;activité est enregistrée dans les deux logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;.\n:$ grep iblock /var/log/messages Apr 10 12:26:38 sh1 iblock: blocking 46.23.148.71 Apr 10 12:30:28 sh1 iblock: blocking 180.225.98.236 Apr 10 12:31:48 sh1 iblock: blocking 46.23.157.246 Apr 10 12:32:43 sh1 iblock: blocking 95.57.218.103 Apr 10 12:36:00 sh1 iblock: blocking 103.89.91.158 Apr 10 12:38:41 sh1 iblock: blocking 23.128.248.41 ⇒ De même, l\u0026rsquo;outil pfctl peut nous montrer les différentes adresses IP enregistrées dans la table, gérée par PF :\n:$ doas pfctl -t blocked_tcp -T show 23.128.248.41 46.23.148.71 46.23.157.246 95.57.218.103 103.89.91.158 180.225.98.236 voire de l\u0026rsquo;utiliser pour connaître les statistiques liées - pour comprendre ces informations, merci de lire le manpage de l\u0026rsquo;outil pour connaître la signification du colonnage :\n:$ doas pfctl -sl | grep iblock iblock 44666 1188 58504 1188 58504 0 0 0 ⇒ Il est possible de surveiller l\u0026rsquo;activité de l\u0026rsquo;utilisateur _iblock avec - mais dans ce cas, franchement peu utile :\ntop -U _iblock fstat -u _iblock -n ps aux -U _iblock munin Si vous souhaitez obtenir des statistiques avec munin , Solène m\u0026rsquo;a fournit un script, à exécuter avec les droits de l\u0026rsquo;utilisateur _munin, tel que :\n#!/bin/sh if [ \u0026#34;$1\u0026#34; = \u0026#34;config\u0026#34; ]; then echo \u0026#34;graph_title Banned IP absolute number\u0026#34; echo \u0026#34;graph_vlabel gauge\u0026#34; echo \u0026#34;a1.label value\u0026#34; exit 0 fi printf \u0026#34;a1.value \u0026#34; doas /sbin/pfctl -t blocked_tcp -T show | sort -n -u | awk \u0026#39;END { print NR }\u0026#39; Ce qui nécessite de modifier la configuration de doas pour autoriser l\u0026rsquo;utilisateur _munin à utiliser l\u0026rsquo;outil pfctl, tel que :\n:# iblock: auth _munin-plugin to use pfctl permit nopass _munin-plugin cmd /sbin/pfctl args -t blocked_tcp -T show Ci-dessous, voici une image de statistiques d\u0026rsquo;adresses IP bloquées, restituée par Solène, en date du 10/04/2022 :\nStatistiques d'adresses IP bloquées grâce à iblock Dépannage Dans les logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;, vous retrouvez le message suivant :\ninetd[69849]: execv /usr/local/bin/iblock: No such file or directory\nAssurez-vous d\u0026rsquo;avoir compiler puis copier le binaire iblock dans le répertoire en question !\nVoilà !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eiblock\u003c/strong\u003e est un logiciel dont le but est de détecter\ndes connexions TCP, sur des ports précis, afin de bloquer les adresses IP\ncorrespondantes par le biais du parefeu Packet Filter, sous OpenBSD.\u003c/p\u003e\n\u003cp\u003eLe service inetd est chargé de l\u0026rsquo;écoute active.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAuteure du projet : Solène Rapenne\u003c/li\u003e\n\u003cli\u003eURL du dépôt Git : \u003ca href=\"https://tildegit.org/solene/iblock.git\" rel=\"external\"\u003ehttps://tildegit.org/solene/iblock.git\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eliste d\u0026rsquo;URL bannies : \u003ca href=\"http://perso.pw/blocklist.txt\" rel=\"external\"\u003ehttp://perso.pw/blocklist.txt\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eCommençons par la copie du dépôt Git :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ git clone https://tildegit.org/solene/iblock.git\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ cd iblock\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCompilons le binaire - \u003cem\u003eOpenBSD renferme nativement les outils adéquats\u003c/em\u003e - :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas make\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecc -o iblock main.c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e; vérifions la présence du binaire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ls -al iblock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  moi  \u003cspan style=\"color:#f99b15\"\u003e8496\u003c/span\u003e Apr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:23 iblock*\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eSi la phase de compilation s\u0026rsquo;exécute mal, contactez Solène !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSolène n\u0026rsquo;a pas créé la cible \u0026ldquo;install\u0026rdquo;, donc copions le binaire dans le\nrépertoire cible :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas cp iblock /usr/local/bin/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ls -al /usr/local/bin/iblock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel  \u003cspan style=\"color:#f99b15\"\u003e8496\u003c/span\u003e Apr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:26 /usr/local/bin/iblock*\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePassons maintenant à la phase de configuration !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"utilisateur-dédié-_iblock\"\u003eUtilisateur dédié _iblock\u003c/h3\u003e\n\u003cp\u003eCréons en tout premier un utilisateur dédié, nommé \u003cstrong\u003e_iblock\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ doas useradd -s /sbin/nologin _iblock\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"doas\"\u003edoas\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/etc/doas.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAjoutons la règle suivante dans le fichier de configuration de \u003ccode\u003edoas\u003c/code\u003e pour\nautoriser l\u0026rsquo;utilisateur dédié à utiliser l\u0026rsquo;outil \u003ccode\u003epfctl\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epermit nopass _iblock cmd /sbin/pfctl\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"inetd\"\u003einetd\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuraton : \u003ccode\u003e/etc/inetd.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eConfigurons maintenant le service \u003cstrong\u003einetd\u003c/strong\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e666 stream tcp nowait _iblock /usr/local/bin/iblock iblock blocked_tcp\n666 stream tcp6 nowait _iblock /usr/local/bin/iblock iblock blocked_tcp\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003ele port \u003cstrong\u003e666\u003c/strong\u003e est utilisé - \u003cem\u003ebien sûr, vous pouvez le changer\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003egéré par l\u0026rsquo;utilisateur \u003cstrong\u003e_iblock\u003c/strong\u003e, appelant le binaire \u003ccode\u003eiblock\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ele dernier argument est le nom du paramètre qui est ajouté aux adresses\nIP qui sont enregistrées dans la table gérée par PF.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt activons et démarrons le service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas rcctl enable inetd \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas rcctl start inetd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"shutdown\"\u003eshutdown\u003c/h3\u003e\n\u003cp\u003eEn premier, créons un fichier de \u0026ldquo;secours\u0026rdquo; pour rendre la future table\ndans PF persistante à l\u0026rsquo;extinction et au redémarrage du serveur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# touch /etc/pf-blocked_tcp.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis créons/modifions le fichier \u003ccode\u003e/etc/rc.shutdown\u003c/code\u003e pour y ajouter :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003epfctl -t blocked_tcp -T show \u0026gt; /etc/pf-blocked_tcp.txt\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eVoici un exemple de règles à ajouter à PF :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003edéclaration d\u0026rsquo;une variable, ici nommée \u003cstrong\u003eblock_tcp_ports\u003c/strong\u003e, soit un ensemble\nde ports à surveiller\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecréation d\u0026rsquo;une table persistante, ici nommée \u003cstrong\u003eblocked_tcp\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003erègle bloquante, portant le label \u003cstrong\u003eiblock\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles deux dernières règles analysent le flux TCP, sur les\nprotocoles IPv4 et IPv6, en \u0026ldquo;écoutant\u0026rdquo; les ports enregistrés dans la\nvariable \u003cstrong\u003eblock_tcp_ports\u003c/strong\u003e, puis redirigent sur l\u0026rsquo;interface locale,\nà destination du port \u003cstrong\u003e666\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003eblock_tcp_ports = \u0026#34;{ 21 23 111 135 137:139 445 1433 3306 3389 5432 6000:6010 7890 9999 25565 27019 }\u0026#34;\n\ntable \u0026lt;blocked_tcp\u0026gt; persist file \u0026#34;/etc/pf-blocked_tcp.txt\u0026#34;\n\n### iblock: block all in table\nblock in quick from \u0026lt;blocked_tcp\u0026gt; label iblock\n\n### iblock: redirect to inetd service on localhost\npass in quick on egress inet  proto tcp to port $block_tcp_ports rdr-to 127.0.0.1 port 666\npass in quick on egress inet6 proto tcp to port $block_tcp_ports rdr-to ::1       port 666\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eLes ports analysés, par défaut, sont FTP, telnet, DNS, RPC, SMB,\nMSSQL, MySQL, RDP, PostgreSQL, Minecraft, Steam. \u003cbr\u003e\nJ\u0026rsquo;ai rajouté : X11, Goaccess, pfstat ; \u003cem\u003eà vous de rajouter…\u003c/em\u003e\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eSi vous hébergez un service, tel que DNS, vous allez bloquer\ntoutes les connexions, car par défaut, le port 53 adéquat est analysé\npour être bloqué. \u003cbr\u003e\n\u003cem\u003e(cette remarque vaut pour tout service que vous hébergez !)\u003c/em\u003e\u003c/div\u003e\n\n\u003cp\u003ePensez à faire recharger le jeu de règles par PF : \u003cbr\u003e\n\u003ccode\u003e$ doas pfctl -f /etc/pf.conf\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"surveillance\"\u003eSurveillance\u003c/h2\u003e\n\u003cblockquote\u003e\n\u003cp\u003eMais qui surveille ?\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003e⇒ L\u0026rsquo;activité est enregistrée dans les deux logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ grep iblock /var/log/messages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eApr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:26:38 sh1 iblock: blocking 46.23.148.71\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eApr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:30:28 sh1 iblock: blocking 180.225.98.236\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eApr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:31:48 sh1 iblock: blocking 46.23.157.246\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eApr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:32:43 sh1 iblock: blocking 95.57.218.103\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eApr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:36:00 sh1 iblock: blocking 103.89.91.158\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eApr \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 12:38:41 sh1 iblock: blocking 23.128.248.41\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ De même, l\u0026rsquo;outil \u003ccode\u003epfctl\u003c/code\u003e peut nous montrer les différentes adresses IP\nenregistrées dans la table, gérée par PF :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas pfctl -t blocked_tcp -T show\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   23.128.248.41\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   46.23.148.71\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   46.23.157.246\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   95.57.218.103\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   103.89.91.158\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   180.225.98.236\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003evoire de l\u0026rsquo;utiliser pour connaître les statistiques liées - \u003cem\u003epour comprendre\nces informations, merci de lire le \u003ca href=\"https://man.openbsd.org/pfctl#s~8\" rel=\"external\"\u003emanpage de l\u0026rsquo;outil\u003c/a\u003e\npour connaître la signification du colonnage\u003c/em\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas pfctl -sl | grep iblock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiblock \u003cspan style=\"color:#f99b15\"\u003e44666\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1188\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e58504\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1188\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e58504\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Il est possible de surveiller l\u0026rsquo;activité de l\u0026rsquo;utilisateur \u003cstrong\u003e_iblock\u003c/strong\u003e\navec - \u003cem\u003emais dans ce cas, franchement peu utile\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etop -U _iblock\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efstat -u _iblock -n\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eps aux -U _iblock\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"munin\"\u003emunin\u003c/h3\u003e\n\u003cp\u003eSi vous souhaitez obtenir des statistiques avec \u003ca class=\"tag\" href=\"/fr/tags/munin\"\u003emunin\u003c/a\u003e\n,\nSolène m\u0026rsquo;a fournit un script, à exécuter avec les droits de l\u0026rsquo;utilisateur\n\u003cstrong\u003e_munin\u003c/strong\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e#!/bin/sh\n\nif [ \u0026#34;$1\u0026#34; = \u0026#34;config\u0026#34; ]; then\n        echo \u0026#34;graph_title Banned IP absolute number\u0026#34;\n        echo \u0026#34;graph_vlabel gauge\u0026#34;\n        echo \u0026#34;a1.label value\u0026#34;\n        exit 0\nfi\n\nprintf \u0026#34;a1.value \u0026#34;\ndoas /sbin/pfctl -t blocked_tcp -T show | sort -n -u | awk \u0026#39;END { print NR }\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCe qui nécessite de modifier la configuration de \u003ca href=\"/fr/monitor/iblock-openbsd/#doas\"\u003edoas\u003c/a\u003e pour autoriser\nl\u0026rsquo;utilisateur \u003cstrong\u003e_munin\u003c/strong\u003e à utiliser l\u0026rsquo;outil \u003ccode\u003epfctl\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e:# iblock: auth _munin-plugin to use pfctl\npermit nopass _munin-plugin cmd /sbin/pfctl args -t blocked_tcp -T show\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003eCi-dessous, voici une image de statistiques d\u0026rsquo;adresses IP bloquées, restituée\npar Solène, en date du 10/04/2022 :\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/monitor/iblock-stats.png\" title=\"Statistiques d\u0026#39;adresses IP bloquées grâce à iblock\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/monitor/iblock-stats_hu_f5825dfa88eb4837.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Statistiques d\u0026#39;adresses IP bloquées grâce à iblock\" height=\"142\" loading=\"lazy\" src=\"/images/monitor/iblock-stats_hu_67ff3052dd3359a4.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eStatistiques d'adresses IP bloquées grâce à iblock\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003eDans les logs \u0026lsquo;daemon\u0026rsquo; et \u0026lsquo;messages\u0026rsquo;, vous retrouvez le message suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003einetd[69849]: execv /usr/local/bin/iblock: No such file or directory\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAssurez-vous d\u0026rsquo;avoir compiler puis copier le binaire iblock dans le\nrépertoire en question !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "iblock est un outil pour bloquer des connexions TCP indésirables, conjointement au parefeu d'OpenBSD, Packet-Filter, utilisant le service inetd.",
            "tags": ["supervision", "TCP", "OpenBSD", "PF", "inetd"],
            "date_published": "2022-04-10T22:34:06+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:819fb7f4-d53e-d397-75ba-dc74f8c127f0",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/sshlockout/",
            "title": "sshlockout : protéger le serveur SSH, sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description sshlockout est un petit outil logiciel bien pratique pour surveiller les connexions sur le service SSH. Il gardera une trace des tentatives de connexions par des utilisateurs inconnus aussi bien que des erreurs d\u0026rsquo;authentification.\nAu bout de 5 tentatives sur une période d\u0026rsquo;une heure, une entrée permanente est ajoutée à la table associée aux adresses IP par pf(4).\nEn deux, trois minutes d\u0026rsquo;installation et de configuration, voici un système de surveillance, géré avec le parefeu, efficace et fonctionnel !\nInstallation Installez le paquet sshlockout.\nConfiguration Packet-Filter Il faut ajouter/modifier vos règles du parefeu Packet-Filter :\nune table persistante, nommée lockout, telle que : table \u0026lt;lockout\u0026gt; persist puis l\u0026rsquo;équivalent de cette règle bloquante : block in quick on egress proto tcp from \u0026lt;lockout\u0026gt; to port ssh /etc/syslog.conf Il est nécessaire de modifier le fichier de configuration /etc/syslog.conf, en ajoutant la déclaration suivante :\nauth.info;authpriv.info | exec /usr/bin/doas -n /usr/local/sbin/sshlockout -pf \u0026quot;lockout\u0026quot;\ncron Pour finir, il faut ajouter une tâche cron, pour libérer les adresses IP de la table lockout, dont l\u0026rsquo;enregistrement est vieux de plus d\u0026rsquo;un jour.\nLe manpage officiel informe de mettre dans la cron-table de root : 3 3 * * * pfctl -t lockout -T expire 86400\nPersonnellement, je préfère ajouter à mon fichier daily.local, l\u0026rsquo;écriture suivante :\n## sshlockout: expire IP pfctl -t lockout -T expire 84600 printf \u0026#39;%s\\n\u0026#39; \u0026#34;=\u0026gt; Nb IPs into lockout table:\u0026#34; pfctl -t lockout -T show | wc -l ce qui libére les adresses IP enregistrées depuis une journée, et me restitue dans le mail quotidien le nombre d\u0026rsquo;IP enregistrées dans la table.\nVoilà !\nDocumentation le manpage, une fois installé : man 8 sshlockout gestion des tables dans Packet-Filter : https://www.openbsd.org/faq/pf/tables.html https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/pf/tables daily(8) ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003esshlockout\u003c/strong\u003e est un petit outil logiciel bien pratique pour surveiller\nles connexions sur le service SSH. Il gardera une trace des tentatives\nde connexions par des utilisateurs inconnus aussi bien que des erreurs\nd\u0026rsquo;authentification.\u003c/p\u003e\n\u003cp\u003eAu bout de 5 tentatives sur une période d\u0026rsquo;une heure, une entrée permanente\nest ajoutée à la table associée aux adresses IP par pf(4).\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eEn deux, trois minutes d\u0026rsquo;installation et de configuration, voici un système\nde surveillance, géré avec le parefeu, efficace et fonctionnel !\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003cstrong\u003esshlockout\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"packet-filter\"\u003ePacket-Filter\u003c/h3\u003e\n\u003cp\u003eIl faut ajouter/modifier vos règles du parefeu Packet-Filter :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eune table persistante, nommée \u003cstrong\u003elockout\u003c/strong\u003e, telle que : \u003cbr\u003e\n\u003ccode\u003etable \u0026lt;lockout\u0026gt; persist\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epuis l\u0026rsquo;équivalent de cette règle bloquante : \u003cbr\u003e\n\u003ccode\u003eblock in quick on egress proto tcp from \u0026lt;lockout\u0026gt; to port ssh\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch3 id=\"etcsyslogconf\"\u003e/etc/syslog.conf\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de modifier le fichier de configuration \u003ccode\u003e/etc/syslog.conf\u003c/code\u003e,\nen ajoutant la déclaration suivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eauth.info;authpriv.info | exec /usr/bin/doas -n /usr/local/sbin/sshlockout -pf \u0026quot;lockout\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"cron\"\u003ecron\u003c/h3\u003e\n\u003cp\u003ePour finir, il faut ajouter une tâche cron, pour libérer les adresses IP\nde la table \u003cstrong\u003elockout\u003c/strong\u003e, dont l\u0026rsquo;enregistrement est vieux de plus d\u0026rsquo;un jour.\u003c/p\u003e\n\u003cp\u003eLe manpage officiel informe de mettre dans la cron-table de root :\n\u003ccode\u003e3 3 * * *  pfctl -t lockout -T expire 86400\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePersonnellement, je préfère ajouter à mon fichier \u003cstrong\u003edaily.local\u003c/strong\u003e, l\u0026rsquo;écriture\nsuivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## sshlockout: expire IP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epfctl -t lockout -T expire \u003cspan style=\"color:#f99b15\"\u003e84600\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprintf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;=\u0026gt; Nb IPs into lockout table:\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epfctl -t lockout -T show | wc -l\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003ece qui libére les adresses IP enregistrées depuis une journée, et me\nrestitue dans le mail quotidien le nombre d\u0026rsquo;IP enregistrées dans la table.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele manpage, une fois installé : \u003ccode\u003eman 8 sshlockout\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003egestion des tables dans Packet-Filter :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/pf/tables.html\" rel=\"external\"\u003ehttps://www.openbsd.org/faq/pf/tables.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/pf/tables\" rel=\"external\"\u003ehttps://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/pf/tables\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/daily.8\" title=\"Page du Manuel OpenBSD pour : daily\"\u003edaily(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment protéger le serveur SSH des abus de connexions, sous OpenBSD, avec l'outil sshlockout",
            "tags": ["Surveillance", "SSH", "OpenBSD", "PF"],
            "date_published": "2022-04-03T08:01:04+02:00",
            "date_modified": "2023-05-02T16:04:51+02:00"
        },{
            "id": "urn:uuid:edd6ef9b-beea-7301-a04b-1c20a44b97b0",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/sshfs/",
            "title": "SshFS : Monter un répertoire à distance par connexion SSH / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description SSHFS permet de monter un répertoire à distance dans une connexion ssh normale.\nInstallation Installez le paquet sshfs-fuse.\nDepuis OpenBSD 6.0 AttentionAvec la version 6.0, la variable système kern.usermount - [sysctl(3)]http://man.openbsd.org/OpenBSD-5.9/man3/sysctl.3) - n\u0026rsquo;est plus gérée… d\u0026rsquo;où la nécessité d\u0026rsquo;utiliser des droits d\u0026rsquo;administration, tel que par doas(1) ! Utilisation Pour monter, un répertoire à distance, depuis une machine faisant fonctionner le service SSH, sur votre station :\n$ doas sshfs -o compression=yes -o port=numero_de_port -o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER) identifiant@hote_distant:/repertoire_cible /point_de_montage Explications sur les options possibles :\n-o compression=yes peut être remplacée par l\u0026rsquo;option -C - option peu nécessaire -o port=numero_de_port : le numéro du port SSH à contacter sur la machine distante ; si c\u0026rsquo;est le port par défaut, à savoir 22, il n\u0026rsquo;y a pas besoin de spécifier l\u0026rsquo;option \u0026lsquo;port\u0026rsquo;… cette option peut tout simplement être remplacée par l\u0026rsquo;option -p numero_de_port les options -o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER) vous permettront d\u0026rsquo;avoir accès localement aux données montées. l\u0026rsquo;option allow_other nécessite l\u0026rsquo;ajout de l\u0026rsquo;option user_allow_other dans le fichier /etc/fuse.conf si ce dernier n\u0026rsquo;est pas créé, faites-le… identifiant : votre identifiant sur la machine distante hote_distant : le nom FQDN ou l\u0026rsquo;adresse IP de la machine distante. repertoire_cible : le répertoire, sur la machine distante, que vous souhaitez pouvoir atteindre. Selon les paramètres de configuration du serveur SSH, vous ne pourrez très certainement pas monter plus haut que votre partition /home. Si vous ne spécifiez rien, tel que id@hote:, alors sshfs se connectera à votre répertoire /home. point_de_montage : l\u0026rsquo;endroit où vous désirez que le répertoire distant se connecte sur votre station de travail. Pour démonter le point de montage :\n$ doas umount /point_de_montage Astuce AstuceSi vous utilisez un environnement graphique, tel que Xfce, préférez l\u0026rsquo;usage de Gigolo , en créant un signet SSH… car il ne nécessite pas l\u0026rsquo;usage de doas ! Documentation Il peut vous être utile de lire localement sur votre station de travail OpenBSD, la page de manuel correspondante man sshfs.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://fuse.sourceforge.net/sshfs.html\" rel=\"external\"\u003eSSHFS\u003c/a\u003e\u003c/strong\u003e permet de monter un\nrépertoire à distance dans une connexion ssh normale.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003esshfs-fuse\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"depuis-openbsd-60\"\u003eDepuis OpenBSD 6.0\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eAvec la version 6.0, la variable système \u003ccode\u003ekern.usermount\u003c/code\u003e -\n\u003cem\u003e[sysctl(3)]http://man.openbsd.org/OpenBSD-5.9/man3/sysctl.3)\u003c/em\u003e - n\u0026rsquo;est\nplus gérée… d\u0026rsquo;où la nécessité d\u0026rsquo;utiliser des droits d\u0026rsquo;administration, tel\nque par \u003ca href=\"https://man.openbsd.org/doas\" rel=\"external\"\u003edoas(1)\u003c/a\u003e !\u003c/div\u003e\n\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ePour monter\u003c/strong\u003e, un répertoire à distance, depuis une machine faisant\nfonctionner le service SSH, sur votre station :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas sshfs -o \u003cspan style=\"color:#ef6155\"\u003ecompression\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eyes -o \u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003enumero_de_port -o allow_other -o \u003cspan style=\"color:#ef6155\"\u003euid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -u \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e -o \u003cspan style=\"color:#ef6155\"\u003egid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -g \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e identifiant@hote_distant:/repertoire_cible /point_de_montage\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExplications sur les options possibles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-o compression=yes\u003c/code\u003e peut être remplacée par l\u0026rsquo;option \u003ccode\u003e-C\u003c/code\u003e - \u003cem\u003eoption\npeu nécessaire\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-o port=numero_de_port\u003c/code\u003e : le numéro du port SSH à contacter sur la\nmachine distante ; si c\u0026rsquo;est le port par défaut, à savoir 22, il n\u0026rsquo;y\na pas besoin de spécifier l\u0026rsquo;option \u0026lsquo;port\u0026rsquo;… cette option peut tout\nsimplement être remplacée par l\u0026rsquo;option \u003ccode\u003e-p numero_de_port\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eles options \u003ccode\u003e-o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER)\u003c/code\u003e\nvous permettront d\u0026rsquo;avoir accès localement aux données montées.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003eallow_other\u003c/code\u003e nécessite l\u0026rsquo;ajout de l\u0026rsquo;option \u003ccode\u003euser_allow_other\u003c/code\u003e\ndans le fichier \u003ccode\u003e/etc/fuse.conf\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003esi ce dernier n\u0026rsquo;est pas créé, faites-le\u003c/em\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eidentifiant\u003c/code\u003e : votre identifiant sur la machine distante\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehote_distant\u003c/code\u003e : le nom FQDN ou l\u0026rsquo;adresse IP de la machine distante.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erepertoire_cible\u003c/code\u003e : le répertoire, sur la machine distante, que vous\nsouhaitez pouvoir atteindre. Selon les paramètres de configuration\ndu serveur SSH, vous ne pourrez très certainement pas monter plus\nhaut que votre partition \u003ccode\u003e/home\u003c/code\u003e. Si vous ne spécifiez rien, tel que\n\u003ccode\u003eid@hote:\u003c/code\u003e, alors sshfs se connectera à votre répertoire \u003ccode\u003e/home\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epoint_de_montage\u003c/code\u003e : l\u0026rsquo;endroit où vous désirez que le répertoire\ndistant se connecte sur votre station de travail.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003ePour démonter\u003c/strong\u003e le point de montage :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas umount /point_de_montage\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"astuce\"\u003eAstuce\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eSi vous utilisez un environnement graphique, tel que Xfce, préférez\nl\u0026rsquo;usage de \u003ca class=\"inside\" href=\"/fr/sys/openbsd/gigolo/\" title=\"Lien interne vers l\u0026#39;article : 'Gigolo / OpenBSD'\"\u003eGigolo\u003c/a\u003e\n, en créant\nun signet SSH… car il ne nécessite pas l\u0026rsquo;usage de doas !\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eIl peut vous être utile de lire localement sur votre station de travail OpenBSD, la page de manuel correspondante \u003ccode\u003eman sshfs\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Monter sous OpenBSD un répertoire distant sur le système de fichier local, en SSH, grâce à l'outil SSHFS.",
            "tags": ["OpenBSD", "sshfs", "fuse", "SSH"],
            "date_published": "2022-01-19T15:33:07+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:a3501605-0f67-1fd2-f601-1bd098a8736d",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/goaccess-openbsd/",
            "title": "Goaccess / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Goaccess est un logiciel libre, réputé pour être léger, rapide, afin d\u0026rsquo;analyser en temps réel ou non l\u0026rsquo;activité sur un serveur web, soit directement au sein d\u0026rsquo;un terminal Unix, soit sur le protocol HTTPS.\nIl est capable de produire des statitisques au format HTML, JSON, voire CSV.\n⇒ Environnement :\nOpenBSD : 6.9 → 7.1 Installation Classique : :# pkg_add goaccess\nConfiguration Le fichier de configuration principal est : /etc/goaccess/goaccess.conf. ⇒ Il est possible sans aucun soucis d\u0026rsquo;utiliser goaccess avec son fichier de configuration sans rien modifier. Cela nécessite de passer toutes les options nécessaires dans la ligne de commande, hors certaines options sont clairement communes et peuvent être \u0026ldquo;figées\u0026rdquo; dans la configuration commune.\n⇒ Il est aussi possible de créer plusieurs fichiers de configuration, chacun spécifique à un domaine web et de paramètrer selon le domaine. Dans ce cas-là, il faudra cibler tel fichier de configuration.\nDans la suite de cet article, j\u0026rsquo;utilise un seul fichier de configuration, et je cible quelques options dans la ligne de commande.\nVoyons les principales options de configuration :\nTime, Date format Le formatage de l\u0026rsquo;heure !\n⇒ Si vous utilisez le service httpd, il faudra faire attention à paramètrer correctement le style de log dans son propre fichier de configuration, et de le répercuter dans le fichier de configuration de goaccess dans la section Time Format Options.\npour httpd.conf(5)#style ⇒ Pour nginx, il suffira de décommenter les options suivantes :\ntime-format %H:%M:%S date-format %d/%b/%Y - ce dernier étant dans la section Date Format Options Log format log-format : préférez le format COMBINED - sauf si concernant httpd, vous en restez au format common, dans ce cas choisissez l\u0026rsquo;équivalent. Si vous utilisez nginx, il est impératif d\u0026rsquo;enregistrer tous les statuts, de ne pas filter les statuts 2xx et 3xx - si vous aviez créer une directive map en ce sens, il vous faudra à minima la commenter puis relancer le service web.\nFile Options Si vous n\u0026rsquo;avez qu\u0026rsquo;un seul domaine web sur votre serveur à analyser, il est utile de paramètrer l\u0026rsquo;option log-file vers le chemin absolu du fichier access.log relatif.\nParse Options exclude-ip : n\u0026rsquo;hésitez pas à utiliser cette option pour exclure de l\u0026rsquo;analyse soit des adresses IP, soit des segments réseaux, tel votre réseau personnel, si votre serveur est par exemple à domicile.\n444-as-404 : l\u0026rsquo;erreur 444 est spécifique au serveur Nginx. À vous de voir, si vous voulez que ces erreurs soient considérées comme étant des entrées d\u0026rsquo;erreur 404. Si oui, changez la en true.\nignore-crawlers : afin d\u0026rsquo;ignorer les robots ; changez la à true\nignore-panel est un ensemble de panneau qui peut être désactivé (voire activé) ; pour des histoires de RGPD, mieux vaut désactiver le panneau REMOTE_USER\nanonymize-ip : changez-la à true - en ces temps de RGPD, il vaut mieux !\nPersistence Options db-path : le chemin /absolu vers la base de données de goaccess - à ne configurer que s\u0026rsquo;il y a un seul domaine. persist : permet d\u0026rsquo;enregistrer les données analysées restore : charge les données à visualiser depuis les données enregistrées. ⇒ Activer les deux dernières options en positionnant sur true, si vous voulez garder les enregistrements de l\u0026rsquo;analyse dans la base de donnée de goaccess.\nAlors, bien sûr, comme vous le verrez, il existe beaucoup d\u0026rsquo;autres options. À vous de voir…\nEnsuite il suffit d\u0026rsquo;utiliser basiquement le binaire goaccess.\nMaintenant, poussons un peu plus la configuration :\nUtilisateur dédié Personnellement je préfère créer et utiliser un utilisateur système dédié. Parmi les avantages, citons la recherche dans les log messages, voire cron.\n:# useradd -s /sbin/nologin -d /var/db/goaccess _goaccess ⇒ la recherche dans les logs se faisant ainsi :\n:$ grep goaccess /var/log/messages ou :$ doas grep _goaccess /var/cron/log\ndoas ⇒ J\u0026rsquo;ai préféré ajouter l\u0026rsquo;autorisation d\u0026rsquo;utiliser le binaire goaccess à l\u0026rsquo;utilisateur _goaccess.\nAjoutez à votre fichier /etc/doas.conf :\npermit nopass _goaccess cmd /usr/local/bin/goaccess (J\u0026rsquo;avoue, je ne suis pas sûr que ce soit réellement nécessaire car le binaire goaccess semble s\u0026rsquo;exécuter sans droit particulier).\nRépertoire de la base de données ⇒ Création du répertoire principal pour la base de données de goaccess :\n:# mkdir -p /var/db/goaccess :# chown _goaccess:daemon /var/db/goaccess (personnellement, j\u0026rsquo;ai préféré un autre chemin absolu).\nPensez à ajouter ce répertoire dans vos sauvegardes !\nEnsuite si comme moi, vous avez plusieurs domaines web sur votre serveur, créez autant de sous-répertoire portant le nom du domaine web, tel que :\n:$ domain= :$ doas -u _goaccess mkdir \u0026#34;/var/db/goaccess/${domain}\u0026#34; Ainsi, les futures statistiques seront vraiment dédiés à un domaine…\ncrontab ⇒ Il ne reste plus qu\u0026rsquo;à ajouter autant de règles cron que nécessaire, tel que :\n:$ doas -u _goaccess crontab -e (Il est possible d\u0026rsquo;appeler la crontab utilisateur, tel que : doas crontab -u _goaccess -e).\nPour ajouter :\n*/15 * * * * -ns goaccess -a --db-path \u0026#34;/var/db/goaccess/domain/\u0026#34; -f /var/www/logs/domain/access.log -o /var/www/goaccess/domain/stats.html Petites explications :\nune tâche cron programmée pour être exécutée tous les quarts d\u0026rsquo;heure. Gardez à l\u0026rsquo;esprit que c\u0026rsquo;est un exemple. remplacez la chaine \u0026lsquo;domain\u0026rsquo; par le nom de domaine web… Authentification requise À vous de voir si vous désirez une authentification web avant la consultation des pages HTML ; d\u0026rsquo;aucuns estiment qu\u0026rsquo;il le faut, d\u0026rsquo;autres non ; personnellement je préfère.\nAprès l\u0026rsquo;utilisation du binaire htpasswd, elle se configure au-niveau du fichier de configuration de votre serveur web.\npour httpd, c\u0026rsquo;est la directive authenticate qui servira. pour nginx, ce sont les directives auth_basic et auth_basic_user_file qui répondront au besoin. Configuration httpd De manière basique :\nserver \u0026#34;domain.tld\u0026#34; { (…) root \u0026#34;/htdocs/domain.tld/www\u0026#34; location \u0026#34;/stats\u0026#34; { authenticate with \u0026#34;/file_htpwd\u0026#34; directory auto index } (…) } Ne pas oubliez que le chemin du fichier htpasswd est relatif au chroot web !\nConfiguration nginx Idem, basiquement :\n(…) location /stats/ { auth_basic \u0026#34;Auth Area\u0026#34;; auth_basic_user_file /file_htpwd; autoindex on; } (…) Voilà pour la partie \u0026ldquo;configuration\u0026rdquo; !\nUtilisation Utilisation basique Basiquement le binaire s\u0026rsquo;exécute ainsi :\n:$ goaccess -o /var/www/htdocs/domain.tld/stats/index.html Par l\u0026rsquo;utilisateur dédié ⇒ Une fois configuré, goaccess s\u0026rsquo;utilise ainsi :\nPar exemple, une première fois, en précisant une date de mois-année :\n:$ domain= :$ date=\u0026#34;$(date +\u0026#39;%Y-%m\u0026#39;)\u0026#34; :$ doas -u _goaccess goaccess -a --db-path \u0026#34;/var/db/goaccess/${domain}/\u0026#34; -f \u0026#34;/var/www/logs/${domain}/access.log\u0026#34; -o \u0026#34;/var/db/goaccess/${domain}/stats-${domain}-${date}.html\u0026#34; Je me suis créé un script shell pour me faciliter la vie - nommé goaccess.sh :\n#!/bin/sh ### # # générer les stats du domain # ## date=\u0026#34;$(date +\u0026#39;%m-%Y\u0026#39;)\u0026#34; dir_db=\u0026#34;/var/db/goaccess\u0026#34; domain=\u0026#34;$1\u0026#34; if [ -z \u0026#34;${domain}\u0026#34; ]; then printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;No domain. Script stops!\u0026#34; logger \u0026#34;$0: no domain found as option; script stops!\u0026#34; exit 1 fi if [ ! -d \u0026#34;${dir_db}/${domain}/\u0026#34; ]; then printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;The destination directory \u0026#39;${dir_db}/${domain}/\u0026#39; seems not exist!\u0026#34; logger \u0026#34;$0: The destination directory for goaccess not exists; script stops!\u0026#34; exit 2 fi goaccess -a --db-path \u0026#34;${dir_db}/${domain}/\u0026#34; -f \u0026#34;/var/www/logs/${domain}/access.log\u0026#34; -o \u0026#34;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#34; Puis modifié la crontab de l\u0026rsquo;utilisateur _goaccess :\n*/15 * * * * -ns /repertoire/goaccess.sh domain-x.tld 0 * * * * -ns /repertoire/goaccess.sh domain-y.tld 0 0 * * * -ns /repertoire/goaccess.sh domain-z.tld (chacun à des moments différents).\nEt non ce n\u0026rsquo;est pas fini !\nEn effet, le fichier d\u0026rsquo;analyse HTML généré est écrit dans le répertoire de base de données dédié. L\u0026rsquo;utilisateur _goaccess n\u0026rsquo;a pas accès au(x) répertoire(s) web, et n\u0026rsquo;a pas avoir accès.\nPar contre, il est possible de demander à l\u0026rsquo;utilisateur web www de copier le fichier de statistiques HTML pour le déposer dans le répertoire web correspondant.\nAinsi, j\u0026rsquo;utilise le script shell suivant, nommé cp_stats.sh :\n#!/bin/sh set -e #set -x ### # # copier les stats d\u0026#39;un domaine pour les publier enligne # ## date=\u0026#34;$(date +\u0026#39;%m-%Y\u0026#39;)\u0026#34; domain=\u0026#34;$1\u0026#34; dir_db=\u0026#34;/var/db/goaccess\u0026#34; dir_stats=\u0026#34;/var/www/htdocs/${domain}/www/stats/\u0026#34; if [ -z \u0026#34;${domain}\u0026#34; ]; then printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;No domain. Script stops!\u0026#34; logger \u0026#34;$0: no domain found as option; script stops!\u0026#34; exit 1 fi if [ ! -f \u0026#34;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#34; ]; then printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;The needed file \u0026#39;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#39; not exists. Script stops!\u0026#34; logger \u0026#34;$0: The needed file \u0026#39;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#39; not exists; script stops!\u0026#34; exit 2 fi if [ ! -d \u0026#34;${dir_stats}\u0026#34; ]; then mkdir -p \u0026#34;${dir_stats}\u0026#34;; fi cp \u0026#34;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#34; \u0026#34;${dir_stats}\u0026#34; chown -R www \u0026#34;${dir_stats}\u0026#34; Puis à modifier la crontab de l\u0026rsquo;utilisateur web :\n:$ doas -u www crontab -e Tel que, pour l\u0026rsquo;exemple :\n*/15 * * * * -ns /repertoire/cp_stats.sh domain-x.tld 5 * * * * -ns /repertoire/cp_stats.sh domain-y.tld 5 0 * * * -ns /repertoire/cp_stats.sh domain-z.tld Utilisation temps réel L\u0026rsquo;utilisation temps réel se fait de deux manières possibles.\nDans ces contextes, nous n\u0026rsquo;aurons pas besoin de l\u0026rsquo;utilisateur dédié _goaccess.\npar terminal ⇒ À minima, faites :\n:$ goaccess -f /var/www/logs/${domain}/access.log Profitez de l\u0026rsquo;esthétique vue basée sur les couleurs monokaï, par défaut.\npar proxy web Là, ça devient intéressant, mais un peu compliqué :\nproxy httpd Là, malheureusement, je n\u0026rsquo;ai pas trouvé de solution. Voire avec relayd!\nproxy nginx Modifions la configuration du serveur en ajoutant une directive location :\nlocation /ws { proxy_pass http://localhost:7890; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection \u0026#34;Upgrade\u0026#34;; } websocket Maintenant il faut exécuter goaccess avec les droits de l\u0026rsquo;utilisateur www :\n:$ doas -u www goaccess -p /etc/goaccess/goaccess.realtime.conf -o /var/www/htdocs/huc.fr.eu.org/www/stats/realtime.html --ws-url=wss://huc.fr.eu.org:443/ws --port 7890 [PARSING /var/www/logs/doc.huc.fr.eu.org/access.log] {0} @ {0/s} WebSocket server ready to accept new client connections Remarquez que pour ce test, j\u0026rsquo;ai :\ncréer un nouveau fichier de configuration pour goaccess nommé goaccess.realtime.conf je lui demande de créer le fichier HTML et d\u0026rsquo;écouter le serveur sur le websocket sécurisé Du fait d\u0026rsquo;être obligé d\u0026rsquo;utiliser l\u0026rsquo;utilisateur web, nous pouvons en temps réel, surveillez dans une console SSH, l\u0026rsquo;activité de l\u0026rsquo;utilisateur, avec des binaires tels fstat, ps, par exemple :\n:$ fstat -u www -n USER CMD PID FD DEV INUM MODE R/W SZ|DV www goaccess 76729 wd 4,15 725760 40755 r 512 www goaccess 76729 0 4,0 78329 20620 rw 5,0 www goaccess 76729 1 4,0 78329 20620 rw 5,0 www goaccess 76729 2 4,0 78329 20620 rw 5,0 www goaccess 76729 3 4,3 175 10644 rw 0 www goaccess 76729 4 4,3 176 10644 rw 0 www goaccess 76729 5 4,3 175 10644 w 0 www goaccess 76729 6 4,3 176 10644 w 0 www goaccess 76729 7 pipe 0x0 state: www goaccess 76729 8 pipe 0x0 state: www goaccess 76729 9* internet stream tcp 0x0 *:7890 www goaccess 76729 10 pipe 0x0 state: www goaccess 76729 11 pipe 0x0 state: www goaccess 76729 12* internet stream tcp 0x0 127.0.0.1:7890 \u0026lt;-- 127.0.0.1:6459 $ ps aux -U www USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND www 4071 0.0 0.1 1572 3488 ?? S 10:12AM 0:00.88 sshd: www@notty (sshd) www 76729 0.0 0.3 10096 12752 p0 S+ 7:56PM 0:01.49 goaccess -p /etc/goaccess/goaccess.realtime.conf -o /var/www/htdocs/huc.fr.eu.org/www/stats/realtime.html /var/www/logs/do Il ne reste plus qu\u0026rsquo;à pointer un navigateur web le chemin du fichier realtime.html.\ndashboard goaccess real time Remarquez le petit point vert sous l\u0026rsquo;icône en forme de roue crantée, en haut à gauche de l\u0026rsquo;écran.\nIl semble nécessaire de rafraîchir soit même la page ; au bout de temps d\u0026rsquo;un certain temps, elle perd le connecteur. Un petit coup de F5…\nPour finir, on peut s\u0026rsquo;amuser à exécuter goaccess en tant que service, soit en utilisant l\u0026rsquo;option \u0026ndash;daemonize, soit en configurant le fichier de configuration dédiée.\n:$ doas -u www goaccess --daemonize -p /etc/goaccess/goaccess.realtime.conf -o /var/www/htdocs/huc.fr.eu.org/www/stats/realtime.html --ws-url=wss://huc.fr.eu.org:443/ws --port 7890 Daemonized GoAccess: 48646 Cette option ne fonctionne qu\u0026rsquo;avec l\u0026rsquo;option de temps réel active.\nDe même, il est impératif que l\u0026rsquo;utilisateur web est accès au chemin qui enregistrera le fichier de processus PID - autrement vous serez en échec ! Il faut donc paramètrer l\u0026rsquo;option pid-file dans le fichier de configuratin.\nSous OpenBSD, pour rappel, du fait du chroot web, c\u0026rsquo;est le répertoire /var/www/run par défaut - préférez un sous-répertoire dédié à l\u0026rsquo;utilisateur www.\nBien-sûr, tout cela, c\u0026rsquo;est pour le FUN, et l\u0026rsquo;exemple ! :D\nVoilà !\n(C\u0026rsquo;est mon expérience… et la vôtre !?)\nDépannages Voici quelques erreurs rencontrées :\nPermission denied Couldn't open file /var/db/goaccess/xxx/I32_DATES.db: Permission denied Unable to open the specified pid file. Permission denied Unable to open the specified pid file. Permission denied goaccess ne peut pas écrire dans le répertoire en question ! Vérifiez que le répertoire cible existe… Vérifiez les droits utilisateurs ; ils doivent impérativement correspondre à celui de l\u0026rsquo;utilisateur qui exécute goaccess : _goaccess:daemon Ce problème est identique lors de la génération des fichiers HTML. Si les droits ne sont pas attribués à l\u0026rsquo;utilisateur _goaccess, vous ne pourrez pas les générer.\nExemple de message d\u0026rsquo;erreur :\nGoAccess - version 1.5.1 - Sep 26 2021 14:08:19 Config file: /etc/goaccess/goaccess.conf Fatal error has occurred Error occurred at: src/output.c - output_html - 1183 Unable to open HTML file: Permission denied. Error opening the specified MaxMind DB file GoAccess - version 1.5.5 - Apr 8 2022 09:03:43 Config file: /etc/goaccess/goaccess.conf Fatal error has occurred Error occurred at: src/geoip2.c - init_geoip - 89 Unable to open GeoIP2 database /var/db/GeoIP/GeoLite2-Country.mmdb: Error opening the specified MaxMind DB file Vous avez activé certainement l\u0026rsquo;option geoip-database.\nMais avez-vous téléchargé les fichiers nécessaires et installés dans le répertoire /var/db/GeoIP/ ?\nNo home directory Assurez-vous que le home directory déclaré pour l\u0026rsquo;utilisateur dédié existe bel et bien ! Puis vérifier l\u0026rsquo;existence du chemin dans votre système de fichiers, sans oublier que les droits utilisateurs correspondent bien à l\u0026rsquo;utilisateur dédié !\nAccessoirement, assurez-vous de la correspondance entre le home directory de l\u0026rsquo;utilisateur dédié ET la variable dir_db du script goaccess.sh. Documentations https://www.geeek.org/goaccess-analyser-access-log/ - où j\u0026rsquo;ai piqué la config de proxy nginx\nhttps://hautefeuille.eu/post/goaccess-openbsd/ : un autre exemple de configuration pour httpd, juste pour de la consultation différée.\nhttps://www.arsouyes.org/blog/2020/20_Stats_Goaccess\nWikipédia Liste_des_codes_HTTP : 4xx_-_Erreur_du_client_HTTP WP Enjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGoaccess\u003c/strong\u003e est un logiciel libre, réputé pour être léger, rapide, afin\nd\u0026rsquo;analyser en temps réel ou non l\u0026rsquo;activité sur un serveur web, soit directement\nau sein d\u0026rsquo;un terminal Unix, soit sur le protocol HTTPS.\u003c/p\u003e\n\u003cp\u003eIl est capable de produire des statitisques au format HTML, JSON, voire CSV.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Environnement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : \u003cdel\u003e6.9\u003c/del\u003e → 7.1\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eClassique : \u003ccode\u003e:# pkg_add goaccess\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration principal est : \u003ccode\u003e/etc/goaccess/goaccess.conf\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Il est possible sans aucun soucis d\u0026rsquo;utiliser goaccess avec son fichier de\nconfiguration sans rien modifier. \u003cbr\u003e\nCela nécessite de passer toutes les options nécessaires dans la ligne de\ncommande, hors certaines options sont clairement communes et peuvent être\n\u0026ldquo;figées\u0026rdquo; dans la configuration commune.\u003c/p\u003e\n\u003cp\u003e⇒ Il est aussi possible de créer plusieurs fichiers de configuration, chacun\nspécifique à un domaine web et de paramètrer selon le domaine. Dans ce cas-là,\nil faudra cibler tel fichier de configuration.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eDans la suite de cet article, j\u0026rsquo;utilise un seul fichier de configuration,\net je cible quelques options dans la ligne de commande.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eVoyons les principales options de configuration :\u003c/p\u003e\n\u003ch3 id=\"time-date-format\"\u003eTime, Date format\u003c/h3\u003e\n\u003cp\u003eLe formatage de l\u0026rsquo;heure !\u003c/p\u003e\n\u003cp\u003e⇒ Si vous utilisez le service \u003cstrong\u003ehttpd\u003c/strong\u003e, il faudra faire attention à\nparamètrer correctement le style de log dans son propre fichier de\nconfiguration, et de le répercuter dans le fichier de configuration\nde goaccess dans la section \u003cstrong\u003eTime Format Options\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour \u003ca href=\"https://man.openbsd.org/httpd.conf.5#style\" rel=\"external\"\u003ehttpd.conf\u003c/a\u003e(5)#style\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Pour \u003cstrong\u003enginx\u003c/strong\u003e, il suffira de décommenter les options suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etime-format %H:%M:%S\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edate-format %d/%b/%Y\u003c/code\u003e - ce dernier étant dans la section \u003cstrong\u003eDate Format Options\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"log-format\"\u003eLog format\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elog-format\u003c/code\u003e : préférez le format \u003cstrong\u003eCOMBINED\u003c/strong\u003e - \u003cem\u003esauf si concernant httpd,\nvous en restez au format \u003cstrong\u003ecommon\u003c/strong\u003e, dans ce cas choisissez l\u0026rsquo;équivalent\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eSi vous utilisez \u003cstrong\u003enginx\u003c/strong\u003e, il est impératif d\u0026rsquo;enregistrer tous les statuts,\nde ne pas filter les statuts 2xx et 3xx - si vous aviez créer une directive\n\u003cstrong\u003emap\u003c/strong\u003e en ce sens, il vous faudra à minima la commenter puis relancer le\nservice web\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"file-options\"\u003eFile Options\u003c/h3\u003e\n\u003cp\u003eSi vous n\u0026rsquo;avez qu\u0026rsquo;un seul domaine web sur votre serveur à analyser, il\nest utile de paramètrer l\u0026rsquo;option \u003cstrong\u003elog-file\u003c/strong\u003e vers le chemin absolu du\nfichier \u003cstrong\u003eaccess.log\u003c/strong\u003e relatif.\u003c/p\u003e\n\u003ch3 id=\"parse-options\"\u003eParse Options\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eexclude-ip\u003c/code\u003e : n\u0026rsquo;hésitez pas à utiliser cette option pour exclure de\nl\u0026rsquo;analyse soit des adresses IP, soit des segments réseaux, \u003cem\u003etel votre\nréseau personnel, si votre serveur est par exemple à domicile\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e444-as-404\u003c/code\u003e : l\u0026rsquo;erreur 444 est spécifique au serveur Nginx. À vous\nde voir, si vous voulez que ces erreurs soient considérées comme étant\ndes entrées d\u0026rsquo;erreur 404. Si oui, changez la en \u003cstrong\u003etrue\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eignore-crawlers\u003c/code\u003e : afin d\u0026rsquo;ignorer les robots ; changez la à \u003cstrong\u003etrue\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eignore-panel\u003c/code\u003e est un ensemble de panneau qui peut être désactivé\n\u003cem\u003e(voire activé)\u003c/em\u003e ; pour des histoires de RGPD, mieux vaut désactiver\nle panneau \u003cstrong\u003eREMOTE_USER\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eanonymize-ip\u003c/code\u003e : changez-la à \u003cstrong\u003etrue\u003c/strong\u003e - \u003cem\u003een ces temps de RGPD, il vaut mieux !\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"persistence-options\"\u003ePersistence Options\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edb-path\u003c/code\u003e : le chemin /absolu vers la base de données de goaccess -\nà ne configurer que s\u0026rsquo;il y a un seul domaine.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epersist\u003c/code\u003e : permet d\u0026rsquo;enregistrer les données analysées\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erestore\u003c/code\u003e : charge les données à visualiser depuis les données enregistrées.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Activer les deux dernières options en positionnant sur \u003cstrong\u003etrue\u003c/strong\u003e, si vous\nvoulez garder les enregistrements de l\u0026rsquo;analyse dans la base de donnée de\ngoaccess.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAlors, bien sûr, comme vous le verrez, il existe beaucoup d\u0026rsquo;autres options.\nÀ vous de voir…\u003c/p\u003e\n\u003cp\u003eEnsuite il suffit d\u0026rsquo;\u003ca href=\"/fr/monitor/goaccess-openbsd/#utilisation-basique\"\u003eutiliser basiquement\u003c/a\u003e le binaire\n\u003cstrong\u003egoaccess\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eMaintenant, poussons un peu plus la configuration :\u003c/p\u003e\n\u003ch3 id=\"utilisateur-dédié\"\u003eUtilisateur dédié\u003c/h3\u003e\n\u003cp\u003ePersonnellement je préfère créer et utiliser un utilisateur système dédié.\nParmi les avantages, citons la recherche dans les log messages, voire cron.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# useradd -s /sbin/nologin -d /var/db/goaccess _goaccess\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e⇒ la recherche dans les logs se faisant ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ grep goaccess /var/log/messages\u003c/code\u003e ou \u003cbr\u003e\n\u003ccode\u003e:$ doas grep _goaccess /var/cron/log\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"doas\"\u003edoas\u003c/h4\u003e\n\u003cp\u003e⇒ J\u0026rsquo;ai préféré ajouter l\u0026rsquo;autorisation d\u0026rsquo;utiliser le binaire \u003cstrong\u003egoaccess\u003c/strong\u003e\nà l\u0026rsquo;utilisateur \u003cstrong\u003e_goaccess\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eAjoutez à votre fichier \u003ccode\u003e/etc/doas.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epermit nopass _goaccess cmd /usr/local/bin/goaccess\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(J\u0026rsquo;avoue, je ne suis pas sûr que ce soit réellement nécessaire car le binaire\ngoaccess semble s\u0026rsquo;exécuter sans droit particulier)\u003c/em\u003e.\u003c/p\u003e\n\u003ch4 id=\"répertoire-de-la-base-de-données\"\u003eRépertoire de la base de données\u003c/h4\u003e\n\u003cp\u003e⇒ Création du répertoire principal pour la base de données de goaccess :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /var/db/goaccess\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown _goaccess:daemon /var/db/goaccess\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(personnellement, j\u0026rsquo;ai préféré un autre chemin absolu)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePensez à ajouter ce répertoire dans vos sauvegardes !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eEnsuite si comme moi, vous avez plusieurs domaines web sur votre serveur,\ncréez autant de sous-répertoire portant le nom du domaine web, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas -u _goaccess mkdir \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/db/goaccess/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi, les futures statistiques seront vraiment dédiés à un domaine…\u003c/p\u003e\n\u003ch4 id=\"crontab\"\u003ecrontab\u003c/h4\u003e\n\u003cp\u003e⇒ Il ne reste plus qu\u0026rsquo;à ajouter autant de règles cron que nécessaire, tel\nque :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas -u _goaccess crontab -e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(Il est possible d\u0026rsquo;appeler la crontab utilisateur, tel que : \u003cbr\u003e\n\u003ccode\u003edoas crontab -u _goaccess -e\u003c/code\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePour ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e*/15 * * * * -ns goaccess -a --db-path \u0026#34;/var/db/goaccess/domain/\u0026#34; -f /var/www/logs/domain/access.log -o /var/www/goaccess/domain/stats.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePetites explications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eune tâche cron programmée pour être exécutée tous les quarts d\u0026rsquo;heure.\n\u003cem\u003eGardez à l\u0026rsquo;esprit que c\u0026rsquo;est un exemple\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eremplacez la chaine \u0026lsquo;\u003cem\u003edomain\u003c/em\u003e\u0026rsquo; par le nom de domaine web…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"authentification-requise\"\u003eAuthentification requise\u003c/h3\u003e\n\u003cp\u003eÀ vous de voir si vous désirez une authentification web avant la consultation\ndes pages HTML ; d\u0026rsquo;aucuns estiment qu\u0026rsquo;il le faut, d\u0026rsquo;autres non ; personnellement\nje préfère.\u003c/p\u003e\n\u003cp\u003eAprès l\u0026rsquo;utilisation du binaire \u003cstrong\u003ehtpasswd\u003c/strong\u003e, elle se configure au-niveau\ndu fichier de configuration de votre serveur web.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour httpd, c\u0026rsquo;est la directive \u003cstrong\u003eauthenticate\u003c/strong\u003e qui servira.\u003c/li\u003e\n\u003cli\u003epour nginx, ce sont les directives \u003cstrong\u003eauth_basic\u003c/strong\u003e et \u003cstrong\u003eauth_basic_user_file\u003c/strong\u003e\nqui répondront au besoin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"configuration-httpd\"\u003eConfiguration httpd\u003c/h4\u003e\n\u003cp\u003eDe manière basique :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eserver \u0026#34;domain.tld\u0026#34; {\n\n(…)\n\n    root \u0026#34;/htdocs/domain.tld/www\u0026#34;\n\n    location \u0026#34;/stats\u0026#34; {\n        authenticate with \u0026#34;/file_htpwd\u0026#34;\n        directory auto index\n    }\n\n(…)\n\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNe pas oubliez que le chemin du fichier htpasswd est relatif au chroot web !\u003c/p\u003e\n\u003ch4 id=\"configuration-nginx\"\u003eConfiguration nginx\u003c/h4\u003e\n\u003cp\u003eIdem, basiquement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003elocation\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/stats/\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eauth_basic\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Auth\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eArea\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eauth_basic_user_file\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/file_htpwd\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eautoindex\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eon\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eVoilà pour la partie \u0026ldquo;configuration\u0026rdquo; !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"utilisation-basique\"\u003eUtilisation basique\u003c/h3\u003e\n\u003cp\u003eBasiquement le binaire s\u0026rsquo;exécute ainsi :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ goaccess -o /var/www/htdocs/domain.tld/stats/index.html\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"par-lutilisateur-dédié\"\u003ePar l\u0026rsquo;utilisateur dédié\u003c/h3\u003e\n\u003cp\u003e⇒ Une fois configuré, goaccess s\u0026rsquo;utilise ainsi :\u003c/p\u003e\n\u003cp\u003ePar exemple, une première fois, en précisant une date de mois-année :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003edate\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edate +\u003cspan style=\"color:#48b685\"\u003e\u0026#39;%Y-%m\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas -u _goaccess goaccess -a --db-path \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/db/goaccess/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/\u0026#34;\u003c/span\u003e -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/www/logs/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/access.log\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/db/goaccess/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/stats-\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edate\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.html\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eJe me suis créé un script shell pour me faciliter la vie - nommé \u003cstrong\u003egoaccess.sh\u003c/strong\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-file\" data-lang=\"file\"\u003e#!/bin/sh\n\n###\n#\n# générer les stats du domain\n#\n##\n\ndate=\u0026#34;$(date +\u0026#39;%m-%Y\u0026#39;)\u0026#34;\ndir_db=\u0026#34;/var/db/goaccess\u0026#34;\ndomain=\u0026#34;$1\u0026#34;\n\nif [ -z \u0026#34;${domain}\u0026#34; ]; then\n    printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;No domain. Script stops!\u0026#34;\n    logger \u0026#34;$0: no domain found as option; script stops!\u0026#34;\n    exit 1\nfi\n\nif [ ! -d \u0026#34;${dir_db}/${domain}/\u0026#34; ]; then\n    printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;The destination directory \u0026#39;${dir_db}/${domain}/\u0026#39; seems not exist!\u0026#34;\n    logger \u0026#34;$0: The destination directory for goaccess not exists; script stops!\u0026#34;\n    exit 2\nfi\n\ngoaccess -a --db-path \u0026#34;${dir_db}/${domain}/\u0026#34; -f \u0026#34;/var/www/logs/${domain}/access.log\u0026#34; -o \u0026#34;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis modifié la crontab de l\u0026rsquo;utilisateur \u003cstrong\u003e_goaccess\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e*/15 * * * * -ns /repertoire/goaccess.sh domain-x.tld\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e0    * * * * -ns /repertoire/goaccess.sh domain-y.tld\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e0    0 * * * -ns /repertoire/goaccess.sh domain-z.tld\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(chacun à des moments différents)\u003c/em\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eEt non ce n\u0026rsquo;est pas fini !\u003c/p\u003e\n\u003cp\u003eEn effet, le fichier d\u0026rsquo;analyse HTML généré est écrit dans le répertoire\nde base de données dédié. L\u0026rsquo;utilisateur \u003cstrong\u003e_goaccess\u003c/strong\u003e n\u0026rsquo;a pas accès au(x)\nrépertoire(s) web, et n\u0026rsquo;a pas avoir accès.\u003c/p\u003e\n\u003cp\u003ePar contre, il est possible de demander à l\u0026rsquo;utilisateur web \u003cstrong\u003ewww\u003c/strong\u003e de copier\nle fichier de statistiques HTML pour le déposer dans le répertoire web\ncorrespondant.\u003c/p\u003e\n\u003cp\u003eAinsi, j\u0026rsquo;utilise le script shell suivant, nommé \u003cstrong\u003ecp_stats.sh\u003c/strong\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-file\" data-lang=\"file\"\u003e#!/bin/sh\n\nset -e\n#set -x\n\n###\n#\n# copier les stats d\u0026#39;un domaine pour les publier enligne\n#\n##\n\ndate=\u0026#34;$(date +\u0026#39;%m-%Y\u0026#39;)\u0026#34;\ndomain=\u0026#34;$1\u0026#34;\ndir_db=\u0026#34;/var/db/goaccess\u0026#34;\ndir_stats=\u0026#34;/var/www/htdocs/${domain}/www/stats/\u0026#34;\n\nif [ -z \u0026#34;${domain}\u0026#34; ]; then\n    printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;No domain. Script stops!\u0026#34;\n    logger \u0026#34;$0: no domain found as option; script stops!\u0026#34;\n    exit 1\nfi\n\nif [ ! -f \u0026#34;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#34; ]; then\n    printf \u0026#39;%s %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;The needed file \u0026#39;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#39; not exists. Script stops!\u0026#34;\n    logger \u0026#34;$0: The needed file \u0026#39;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#39; not exists; script stops!\u0026#34;\n    exit 2\nfi\n\nif [ ! -d \u0026#34;${dir_stats}\u0026#34; ]; then mkdir -p \u0026#34;${dir_stats}\u0026#34;; fi\n\ncp \u0026#34;${dir_db}/${domain}/stats-${domain}-${date}.html\u0026#34; \u0026#34;${dir_stats}\u0026#34;\nchown -R www \u0026#34;${dir_stats}\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis à modifier la crontab de l\u0026rsquo;utilisateur web :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas -u www crontab -e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTel que, pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e*/15 * * * * -ns /repertoire/cp_stats.sh domain-x.tld\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e5    * * * * -ns /repertoire/cp_stats.sh domain-y.tld\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e5    0 * * * -ns /repertoire/cp_stats.sh domain-z.tld\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"utilisation-temps-réel\"\u003eUtilisation temps réel\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;utilisation temps réel se fait de deux manières possibles.\u003c/p\u003e\n\u003cp\u003eDans ces contextes, nous n\u0026rsquo;aurons pas besoin de l\u0026rsquo;utilisateur dédié \u003cstrong\u003e_goaccess\u003c/strong\u003e.\u003c/p\u003e\n\u003ch4 id=\"par-terminal\"\u003epar terminal\u003c/h4\u003e\n\u003cp\u003e⇒ À minima, faites :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ goaccess -f /var/www/logs/\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e/access.log\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eProfitez de l\u0026rsquo;esthétique vue basée sur les couleurs monokaï, par défaut.\u003c/p\u003e\n\u003ch4 id=\"par-proxy-web\"\u003epar proxy web\u003c/h4\u003e\n\u003cp\u003eLà, ça devient intéressant, mais un peu compliqué :\u003c/p\u003e\n\u003ch5 id=\"proxy-httpd\"\u003eproxy httpd\u003c/h5\u003e\n\u003cp\u003eLà, malheureusement, je n\u0026rsquo;ai pas trouvé de solution. Voire avec relayd!\u003c/p\u003e\n\u003ch5 id=\"proxy-nginx\"\u003eproxy nginx\u003c/h5\u003e\n\u003cp\u003eModifions la configuration du serveur en ajoutant une directive \u003cstrong\u003elocation\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/ws\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003eproxy_pass\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ehttp://localhost:7890\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003eproxy_http_version\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.1\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003eproxy_set_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eUpgrade\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$http_upgrade\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003eproxy_set_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eConnection\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Upgrade\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch5 id=\"websocket\"\u003ewebsocket\u003c/h5\u003e\n\u003cp\u003eMaintenant il faut exécuter goaccess avec les droits de l\u0026rsquo;utilisateur \u003cstrong\u003ewww\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas -u www goaccess -p /etc/goaccess/goaccess.realtime.conf -o /var/www/htdocs/huc.fr.eu.org/www/stats/realtime.html --ws-url\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ewss://huc.fr.eu.org:443/ws --port \u003cspan style=\"color:#f99b15\"\u003e7890\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ePARSING /var/www/logs/doc.huc.fr.eu.org/access.log\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e @ \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e0/s\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWebSocket server ready to accept new client connections\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRemarquez que pour ce test, j\u0026rsquo;ai :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecréer un nouveau fichier de configuration pour goaccess nommé\n\u003cstrong\u003egoaccess.realtime.conf\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eje lui demande de créer le fichier HTML\u003c/li\u003e\n\u003cli\u003eet d\u0026rsquo;écouter le serveur sur le websocket sécurisé\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDu fait d\u0026rsquo;être obligé d\u0026rsquo;utiliser l\u0026rsquo;utilisateur web, nous pouvons en temps réel,\nsurveillez dans une console SSH, l\u0026rsquo;activité de l\u0026rsquo;utilisateur, avec des binaires\ntels \u003cstrong\u003efstat\u003c/strong\u003e, \u003cstrong\u003eps\u003c/strong\u003e, par exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ fstat -u www -n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER     CMD          PID   FD  DEV      INUM        MODE   R/W    SZ|DV\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e   wd  4,15   \u003cspan style=\"color:#f99b15\"\u003e725760\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e40755\u003c/span\u003e    r      \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e78329\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20620\u003c/span\u003e   rw    5,0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e78329\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20620\u003c/span\u003e   rw    5,0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e78329\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20620\u003c/span\u003e   rw    5,0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e  4,3       \u003cspan style=\"color:#f99b15\"\u003e175\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e10644\u003c/span\u003e   rw        \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e  4,3       \u003cspan style=\"color:#f99b15\"\u003e176\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e10644\u003c/span\u003e   rw        \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e  4,3       \u003cspan style=\"color:#f99b15\"\u003e175\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e10644\u003c/span\u003e    w        \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e  4,3       \u003cspan style=\"color:#f99b15\"\u003e176\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e10644\u003c/span\u003e    w        \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e pipe 0x0 state:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e pipe 0x0 state:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e    9* internet stream tcp 0x0 *:7890\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e pipe 0x0 state:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e pipe 0x0 state:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  goaccess   \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e   12* internet stream tcp 0x0 127.0.0.1:7890 \u0026lt;-- 127.0.0.1:6459\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ps aux -U www\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER       PID %CPU %MEM   VSZ   RSS TT  STAT   STARTED       TIME COMMAND\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww   \u003cspan style=\"color:#f99b15\"\u003e4071\u003c/span\u003e  0.0  0.1  \u003cspan style=\"color:#f99b15\"\u003e1572\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e3488\u003c/span\u003e ??  S      10:12AM    0:00.88 sshd: www@notty \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esshd\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewww  \u003cspan style=\"color:#f99b15\"\u003e76729\u003c/span\u003e  0.0  0.3 \u003cspan style=\"color:#f99b15\"\u003e10096\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e12752\u003c/span\u003e p0  S+      7:56PM    0:01.49 goaccess -p /etc/goaccess/goaccess.realtime.conf -o /var/www/htdocs/huc.fr.eu.org/www/stats/realtime.html /var/www/logs/do\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl ne reste plus qu\u0026rsquo;à pointer un navigateur web le chemin du fichier \u003cstrong\u003erealtime.html\u003c/strong\u003e.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/monitor/goaccess-realtime.png\" title=\"dashboard goaccess real time\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/monitor/goaccess-realtime_hu_9392cc2e2daef76c.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"dashboard goaccess real time\" height=\"36\" loading=\"lazy\" src=\"/images/monitor/goaccess-realtime_hu_cdf83e6b6bbb2dde.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003edashboard goaccess real time\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eRemarquez le petit point vert sous l\u0026rsquo;icône en forme de roue crantée, en haut à gauche de l\u0026rsquo;écran.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl semble nécessaire de rafraîchir soit même la page ; au bout de temps\nd\u0026rsquo;un certain temps, elle perd le connecteur. Un petit coup de \u003ckbd\u003eF5\u003c/kbd\u003e…\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour finir, on peut s\u0026rsquo;amuser à exécuter goaccess en tant que service, soit\nen utilisant l\u0026rsquo;option \u003cstrong\u003e\u0026ndash;daemonize\u003c/strong\u003e, soit en configurant le fichier de configuration dédiée.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas -u www goaccess --daemonize -p /etc/goaccess/goaccess.realtime.conf -o /var/www/htdocs/huc.fr.eu.org/www/stats/realtime.html --ws-url\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ewss://huc.fr.eu.org:443/ws --port \u003cspan style=\"color:#f99b15\"\u003e7890\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDaemonized GoAccess: \u003cspan style=\"color:#f99b15\"\u003e48646\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCette option \u003cstrong\u003ene fonctionne qu\u0026rsquo;avec l\u0026rsquo;option de temps réel\u003c/strong\u003e active.\u003c/p\u003e\n\u003cp\u003eDe même, il est \u003cstrong\u003eimpératif que l\u0026rsquo;utilisateur web est accès au chemin qui\nenregistrera le fichier de processus PID\u003c/strong\u003e - autrement vous serez en échec ! \u003cbr\u003e\nIl faut donc paramètrer l\u0026rsquo;option \u003cstrong\u003epid-file\u003c/strong\u003e dans le fichier de configuratin.\u003c/p\u003e\n\u003cp\u003eSous OpenBSD, pour rappel, du fait du chroot web, c\u0026rsquo;est le répertoire\n\u003ccode\u003e/var/www/run\u003c/code\u003e par défaut - \u003cem\u003epréférez un sous-répertoire dédié à l\u0026rsquo;utilisateur\n\u003cstrong\u003ewww\u003c/strong\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eBien-sûr, tout cela, c\u0026rsquo;est pour le FUN, et l\u0026rsquo;exemple ! :D\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(C\u0026rsquo;est mon expérience… et la vôtre !?)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"dépannages\"\u003eDépannages\u003c/h2\u003e\n\u003cp\u003eVoici quelques erreurs rencontrées :\u003c/p\u003e\n\u003ch3 id=\"permission-denied\"\u003ePermission denied\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eCouldn't open file /var/db/goaccess/xxx/I32_DATES.db: Permission denied\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eUnable to open the specified pid file. Permission denied\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eUnable to open the specified pid file. Permission denied\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003col\u003e\n\u003cli\u003egoaccess ne peut pas écrire dans le répertoire en question !\u003c/li\u003e\n\u003cli\u003eVérifiez que le répertoire cible existe…\u003c/li\u003e\n\u003cli\u003eVérifiez les droits utilisateurs ; ils doivent impérativement correspondre\nà celui de l\u0026rsquo;utilisateur qui exécute goaccess : \u003ccode\u003e_goaccess:daemon\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eCe problème est identique lors de la génération des fichiers HTML. Si les\ndroits ne sont pas attribués à l\u0026rsquo;utilisateur \u003cstrong\u003e_goaccess\u003c/strong\u003e, vous ne pourrez\npas les générer.\u003c/p\u003e\n\u003cp\u003eExemple de message d\u0026rsquo;erreur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGoAccess - version 1.5.1 - Sep \u003cspan style=\"color:#f99b15\"\u003e26\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2021\u003c/span\u003e 14:08:19\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConfig file: /etc/goaccess/goaccess.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFatal error has occurred\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eError occurred at: src/output.c - output_html - \u003cspan style=\"color:#f99b15\"\u003e1183\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnable to open HTML file: Permission denied.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"error-opening-the-specified-maxmind-db-file\"\u003eError opening the specified MaxMind DB file\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGoAccess - version 1.5.5 - Apr  \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2022\u003c/span\u003e 09:03:43\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConfig file: /etc/goaccess/goaccess.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFatal error has occurred\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eError occurred at: src/geoip2.c - init_geoip - \u003cspan style=\"color:#f99b15\"\u003e89\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnable to open GeoIP2 database /var/db/GeoIP/GeoLite2-Country.mmdb: Error opening the specified MaxMind DB file\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous avez activé certainement l\u0026rsquo;option \u003ccode\u003egeoip-database\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eMais avez-vous téléchargé les fichiers nécessaires et installés dans le\nrépertoire \u003ccode\u003e/var/db/GeoIP/\u003c/code\u003e ?\u003c/p\u003e\n\u003ch3 id=\"no-home-directory\"\u003eNo home directory\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eAssurez-vous que le home directory déclaré pour l\u0026rsquo;utilisateur dédié\nexiste bel et bien !\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis vérifier l\u0026rsquo;existence du chemin dans votre système de fichiers, sans\noublier que les droits utilisateurs correspondent bien à l\u0026rsquo;utilisateur\ndédié !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAccessoirement, assurez-vous de la correspondance entre le home directory\nde l\u0026rsquo;utilisateur dédié ET la variable \u003ccode\u003edir_db\u003c/code\u003e du script \u003ccode\u003egoaccess.sh\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.geeek.org/goaccess-analyser-access-log/\" rel=\"external\"\u003ehttps://www.geeek.org/goaccess-analyser-access-log/\u003c/a\u003e - où j\u0026rsquo;ai piqué la\nconfig de proxy nginx\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://hautefeuille.eu/post/goaccess-openbsd/\" rel=\"external\"\u003ehttps://hautefeuille.eu/post/goaccess-openbsd/\u003c/a\u003e : un autre exemple de\nconfiguration pour httpd, juste pour de la consultation différée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://www.arsouyes.org/blog/2020/20_Stats_Goaccess\" rel=\"external\"\u003ehttps://www.arsouyes.org/blog/2020/20_Stats_Goaccess\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"wikipédia\"\u003eWikipédia\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP#4xx_-_Erreur_du_client_HTTP\" title=\"Article Wikipédia : Liste_des_codes_HTTP\"\u003eListe_des_codes_HTTP : 4xx_-_Erreur_du_client_HTTP \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID!\u003c/strong\u003e\u003c/em\u003e \u003cbr\u003e\n\u003cem\u003e\u003cstrong\u003eEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n",
            "summary": "Installer et utiliser Goaccess sur OpenBSD (avec des bouts de configuration pour les serveurs web httpd ou nginx)",
            "tags": ["supervision", "dataviz", "log", "goaccess", "OpenBSD", "httpd", "nginx"],
            "date_published": "2021-07-30T15:35:45+02:00",
            "date_modified": "2025-11-11T15:44:28+01:00"
        },{
            "id": "urn:uuid:f03efc2f-4b6a-c81b-f816-6086e4a5d732",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/redirect-permanent-nginx-openbsd/",
            "title": "Hugo : Redirection permanente pour Nginx sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Comment faire une redirection permanente, appelée aussi 301, pour Hugo, avec le serveur web nginx… sous OpenBSD ?!\nL\u0026rsquo;article de Romain Therrat donne les grandes lignes… sauf que sous OpenBSD, ça ne fonctionne pas !\nJe reprends les grands principes ci-dessous, adapté à OpenBSD :\nConfiguration Hugo Le principe est l\u0026rsquo;utilisation des alias d\u0026rsquo;URL.\nEn partant du principe de l\u0026rsquo;utilisation du format toml, ouvrez le fichier que vous voulez rediriger et dans son entête, ajoutez :\naliases = [/ancienne/URL/de/publication/fichier/] Si votre format de fichier de configuration est autre, adaptez !\nPuis modifier le fichier de configuration de Hugo, pour ajouter les directives suivantes :\n⇒ Ajoutez un type de media\n[mediaTypes.\u0026#34;conf/nginx\u0026#34;] ⇒ Ajoutez une sortie à générer, pour la variable home :\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;nginx\u0026#34;, …] ⇒ Ajoutez la sortie du format adéquat pour créer le fichier de redirections pour nginx :\n[outputFormats.nginx] baseName = \u0026#34;redirections.conf\u0026#34; isPlainText = true mediatype = \u0026#34;conf/nginx\u0026#34; notAlternative = true path = \u0026#34;nginx-config\u0026#34; Puis, créer le layout nécessaire : layout/index.nginx, tel que :\n# Nginx redirect {{- range $p := site.Pages -}} {{- range .Aliases }} rewrite ^{{ . }}$ {{ $p.RelPermalink }} permanent;{{ end }} {{- end }} Si votre site est monolingue, hugo générera dans le sous-répertoire nginx-config/redirections.conf Si votre site est multilingues, hugo générera chaque fichier redirections.conf dans chaque sous-répertoire de langue, tel que fr/nginx-config/redirections.conf. Voilà, toute la configuration Hugo prête à être fonctionnelle !\nnginx La configuration présentée ci-dessous est relative à mon site multilingue… Si le votre est monolingue, adaptez !\nLorsque vous testerez la configuration, nginx se plaindra, telle que :\nnginx: [emerg] open() \u0026#34;/var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-conf/redirections.conf\u0026#34; failed (2: No such file or directory) in /etc/nginx/conf.d/domain.tld.conf:15 Et, oui le fichier existe bien, au bon endroit :\n$ ls -al /var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-config/redirections.conf -rw-r--r-- 1 www www 397 Jul 28 13:23 /var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-config/redirections.conf Copions les fichiers de redirections à la racine du répertoire de configuration de nginx :\n# cp /var/www/htdocs/doc.huc.fr.eu.org/www/en/nginx-config/redirections.conf /etc/nginx/hugo-en-redirections.conf # cp /var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-config/redirections.conf /etc/nginx/hugo-fr-redirections.conf Puis, avec la directive include, incluez ces fichiers de configuration dans la directive server de l\u0026rsquo;hôte virtuel relatif au domaine, tel que :\nserver \u0026#34;domain.tld\u0026#34; { (…) include /etc/nginx/hugo-en-redirections.conf; include /etc/nginx/hugo-fr-redirections.conf; (…) location /(en|fr)/nginx-conf/redirections.conf { deny all; } (…) } Pour finir, remarquez la directive location afin d\u0026rsquo;interdire toute consultation.\nPensez à vérifier la configuration puis redémarrer le service :\n# nginx -t \u0026amp;\u0026amp; rcctl restart nginx Voilà !\nDocumentations ⇒ Hugo: URL Management: Aliases\nEnjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eComment faire une redirection permanente, appelée aussi 301, pour Hugo,\navec le serveur web nginx… sous OpenBSD ?!\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;article de \u003ca href=\"https://romain.therrat.fr/posts/2020/04/hugo-redirections-301/\" rel=\"external\"\u003eRomain Therrat\u003c/a\u003e\ndonne les grandes lignes… sauf que sous OpenBSD, ça ne fonctionne pas !\u003c/p\u003e\n\u003cp\u003eJe reprends les grands principes ci-dessous, adapté à OpenBSD :\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"hugo\"\u003eHugo\u003c/h3\u003e\n\u003cp\u003eLe principe est l\u0026rsquo;utilisation des alias d\u0026rsquo;URL.\u003c/p\u003e\n\u003cp\u003eEn partant du principe de l\u0026rsquo;utilisation du format toml, ouvrez le fichier que vous voulez rediriger et dans son entête, ajoutez :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealiases\u003c/span\u003e = [\u003cspan style=\"color:#ef6155\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eancienne\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eURL\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ede\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003epublication\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003efichier\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eSi votre format de fichier de configuration est autre, adaptez !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePuis modifier le fichier de configuration de Hugo, pour ajouter les directives\nsuivantes :\u003c/p\u003e\n\u003cp\u003e⇒ Ajoutez un type de media\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;conf/nginx\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Ajoutez une sortie à générer, pour la variable \u003cstrong\u003ehome\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;nginx\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Ajoutez la sortie du format adéquat pour créer le fichier de redirections\npour nginx :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003enginx\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebaseName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;redirections.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisPlainText\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediatype\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;conf/nginx\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003enotAlternative\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epath\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;nginx-config\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003ePuis, créer le \u003cstrong\u003elayout\u003c/strong\u003e nécessaire : \u003ccode\u003elayout/index.nginx\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Nginx redirect\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e{{-  range $p :\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003esite.Pages -}}\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    {{- range .Aliases }}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003erewrite ^{{  . }}$ {{ $p.RelPermalink }} permanent;{{ end }}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e{{- end }}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eSi votre site est monolingue, hugo générera dans le sous-répertoire\n\u003ccode\u003enginx-config/redirections.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSi votre site est multilingues, hugo générera chaque fichier \u003ccode\u003eredirections.conf\u003c/code\u003e\ndans chaque sous-répertoire de langue, tel que \u003ccode\u003efr/nginx-config/redirections.conf\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoilà, toute la configuration Hugo prête à être fonctionnelle !\u003c/p\u003e\n\u003ch3 id=\"nginx\"\u003enginx\u003c/h3\u003e\n\u003cp\u003eLa configuration présentée ci-dessous est relative à mon site multilingue…\n\u003cem\u003eSi le votre est monolingue, adaptez !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLorsque vous testerez la configuration, nginx se plaindra, telle que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enginx: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eemerg\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e open\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-conf/redirections.conf\u0026#34;\u003c/span\u003e failed \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2: No such file or directory\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e in /etc/nginx/conf.d/domain.tld.conf:15\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, oui le fichier existe bien, au bon endroit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ls -al /var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-config/redirections.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rw-r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e www  www  \u003cspan style=\"color:#f99b15\"\u003e397\u003c/span\u003e Jul \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e 13:23 /var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-config/redirections.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eCopions les fichiers de redirections à la racine du répertoire de configuration\nde nginx :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cp /var/www/htdocs/doc.huc.fr.eu.org/www/en/nginx-config/redirections.conf /etc/nginx/hugo-en-redirections.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cp /var/www/htdocs/doc.huc.fr.eu.org/www/fr/nginx-config/redirections.conf /etc/nginx/hugo-fr-redirections.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, avec la directive \u003cstrong\u003einclude\u003c/strong\u003e, incluez ces fichiers de configuration\ndans la directive \u003cstrong\u003eserver\u003c/strong\u003e de l\u0026rsquo;hôte virtuel relatif au domaine, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eserver\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;domain.tld\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/hugo-en-redirections.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/hugo-fr-redirections.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003elocation\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/(en|fr)/nginx-conf/redirections.conf\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003edeny\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eall\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour finir, remarquez la directive \u003cstrong\u003elocation\u003c/strong\u003e afin d\u0026rsquo;interdire toute\nconsultation.\u003c/p\u003e\n\u003cp\u003ePensez à vérifier la configuration puis redémarrer le service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# nginx -t \u0026amp;\u0026amp; rcctl restart nginx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003e⇒ \u003ca href=\"https://gohugo.io/content-management/urls/\" rel=\"external\"\u003eHugo: URL Management: Aliases\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID! \u003cbr\u003e\nEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Configurer Hugo et Nginx sous OpenBSD pour effectuer des redirections permanentes",
            "tags": ["Hugo", "OpenBSD", "nginx", "redirection"],
            "date_published": "2021-07-28T13:50:33+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:61e2abb8-60f9-7ebe-6758-0e3d34cda9e0",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/pfstat-openbsd/",
            "title": "pfstat sur OpenBSD : analyser le flux IPv4 et IPv6 dans PF",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description pfstat est un projet de Daniel Hartmeir pour générer des statistiques graphiques du flux réseau qui passe au-travers du parefeu PF (Packet Filter) .\nSite web officiel : https://www.benzedrine.ch/pfstat.html ⇒ Environnement :\nOpenBSD : 6.9 ⇒ 7.1 Installation Classique : # pkg_add pfstat pfstatd\nLe paquet pfstatd n\u0026rsquo;est pas essentiel pour une configuration simple et minimale. Il devient intéressant pour être fonctionner avec un utilisateur dédié. ;-)\nConfiguration PF En admettant que l\u0026rsquo;interface réseau est de type em0, modifions le fichier de configuration /etc/pf.conf pour ajouter :\nset loginterface em0 InfoSi vous avez plusieurs interfaces réseaux, il est possible de toutes les analyser ; ligne après ligne, ajoutez chacune d\u0026rsquo;elles, si nécessaire. pfstat La configuration de pfstat n\u0026rsquo;est pas compliquée. Pour débuter, le package installe un fichier de configuration exemple, juste pour IPv4.\nFichier de configuration : /etc/pfstat.conf Il faut le modifier pour changer le chemin du répertoire de destination où seront les futures images créées pour la vision et l\u0026rsquo;analyse.\nEn admettant toujours que l\u0026rsquo;interface reseau à analyser est em0 :\n:# sed -i -e \u0026#39;s/sis0/em0/g;s/benzedrine.cx/pfstat/g\u0026#39; /etc/pfstat.conf La commande va changer toutes les lignes où :\nl\u0026rsquo;interface sis0 par em0 le chemin de publication contenant benzedrine.cx par pfstat. Ensuite, il suffit de configurer la crontab de root pour que le binaire pfstat analyse le flux réseau.\n* * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db */15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db 30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db la première ligne fonctionne toutes les minutes pour analyser et enregistrer la seconde ligne a pour propos de générer les images toutes les quinze minutes depuis la base de données de pfstat la troisième ligne aura pour propos d\u0026rsquo;effacer toutes les jours à 0:30 les données qui sont vieilles de plus de trente jours. ⇒ Cela nécessite la création du répertoire de la future base de données :\n:# mkdir -p /var/db/pfstat/ Juste pour info, cela peut être absolument un tout autre chemin sur le système d\u0026rsquo;exploitation, et avoir un tout autre nom de base de données. C\u0026rsquo;est à vous de voir…\nVoilà une configuration minimale fonctionnelle !\nPassons à une configuration plus poussée avec un utilisateur dédié qui va gérer et le service et l\u0026rsquo;utilisation du binaire.\nUtilisateur _pfstat L\u0026rsquo;utilisateur dédié nous sera utile pour démarrer le service pfstatd avec les droits utilisateurs de _pfstat, puis d\u0026rsquo;utiliser pfstat avec cet utilisateur…\n:# useradd -s /sbin/nologin -d /var/db/pfstat _pfstat :# chown _pfstat /var/db/pfstat pfstatd Il suffit d\u0026rsquo;activer le service, de le paramétrer et le démarrer :\n:# rcctl enable pfstatd :# rcctl set pfstatd flags -u _pfstat -a 127.0.0.1 :# rcctl start pfstatd N\u0026rsquo;ayant pas paramétré de numéro de port, c\u0026rsquo;est celui par défaut, à savoir 9999, qui sera écouté.\nDes outils comme nc peuvent permettre de s\u0026rsquo;assurer du fonctionnement ; essayez nc localhost 9999, vous devriez avoir les statistiques qui s\u0026rsquo;affichent rapidement les unes à les suites des autres, ligne après ligne. Si ce n\u0026rsquo;est pas le cas, il y a un soucis…\npfstatd et PF Je vous encourage vivement à bloquer au niveau du pare-feu d\u0026rsquo;OpenBSD, toutes tentatives de communications sur le service de pfstatd !\nUne règle comme la suivante devrait suffire :\nblock drop in on ! lo0 proto tcp to port 9999 pfstat et _pfstat Maintenant nous allons pouvoir reconfigurer l\u0026rsquo;utilisation de pfstat en tenant compte de l\u0026rsquo;utilisateur dédié _pfstat\ndans un premier temps, décommentons ou supprimons les écritures dans la crontab de root,\npour paramétrer celle de l\u0026rsquo;utilisateur _pfstat :\ncréer un fichier de crontab, tel que crontab4pfstat, contenant les déclarations suivantes : * * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db -r 127.0.0.1 */15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db 30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db Petites explications :\nRemarquez l\u0026rsquo;usage de l\u0026rsquo;option -r suivie de l\u0026rsquo;adresse de bouclage localhost ; cette option nous permet d\u0026rsquo;interroger le service \u0026ldquo;à distance\u0026rdquo; pour récupèrer les statistiques et les enregistrer dans la base de données. Maintenant injections le fichier crontab4pfstat dans la crontab de l\u0026rsquo;utilisateur _pfstat :\n:# crontab -u _pfstat crontab4pfstat Surveillance de _pfstat Il y a différents moyens de surveiller l\u0026rsquo;activité de l\u0026rsquo;utilisateur _pfstat :\ntop -U _pfstat : load averages: 0.05, 0.38, 0.38 56 processes: 54 idle, 2 on processor CPU0 states: 0.0% user, 0.0% nice, 0.0% sys, 0.0% spin, 0.0% intr, 100% idle Memory: Real: 84M/5985M act/tot Free: 9778M Cache: 2757M Swap: 0K/32G PID USERNAME PRI NICE SIZE RES STATE WAIT TIME CPU COMMAND 16833 _pfstat 2 0 700K 984K sleep/6 netcon 0:00 0.00% pfstatd :$ fstat -u _pfstat -n USER CMD PID FD DEV INUM MODE R/W SZ|DV _pfstat pfstatd 16833 wd 4,0 2 40755 r 512 _pfstat pfstatd 16833 0 4,0 27162 20666 rw 2,2 _pfstat pfstatd 16833 1 4,0 27162 20666 rw 2,2 _pfstat pfstatd 16833 2 4,0 27162 20666 rw 2,2 _pfstat pfstatd 16833 3 4,0 27028 20600 r 73,0 _pfstat pfstatd 16833 4* internet stream tcp 0x0 127.0.0.1:9999 :$ ps aux -U _pfstat USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND _pfstat 16833 0.0 0.0 700 984 ?? I 1:19AM 0:00.02 /usr/local/bin/pfstatd -u _pfstat -a 127.0.0.1 Ces trois commandes nous confirment que :\nle service pfstatd est démarré avec l\u0026rsquo;utilisateur _pfstat le service pfstatd écoute bien sur la boucle locale, sur le port 9999 et qu\u0026rsquo;il est en attente de connexion, dans le cas de ces exemples. Configurons maintenant httpd !\nhttpd Commençons par créer le répertoire :\n:# mkdir -p /var/www/htdocs/pfstat/ Puis occupons-nous du fichier de configuration de httpd /etc/httpd.conf et ajoutons les déclarations suivantes, au besoin :\ntypes { include \u0026#34;/usr/share/misc/mime.types\u0026#34; } server \u0026#34;pfstat\u0026#34; { listen on 127.0.0.1 port 80 location \u0026#34;/pfstat/\u0026#34; { directory auto index root \u0026#34;/htdocs/\u0026#34; } } Il reste à vérifier la configuration et activer/démarrer le service :\n:# rcctl enable httpd :# httpd -n \u0026amp;\u0026amp; rcctl start httpd Il ne reste plus qu\u0026rsquo;à consulter localement, tel que : http://localhost/pfstat\nVoilà une configuration minimale qui fonctionne et qui restituera des images.\nhttpd et _pfstat Du fait d\u0026rsquo;avoir créé l\u0026rsquo;utilisateur _pfstat, donnons à l\u0026rsquo;utilisateur le droit d\u0026rsquo;écrire dans le répertoire web :\n:# usermod -G www _pfstat :# chown -R _pfstat:www /var/www/htdocs/pfstat ainsi nous intégrons l\u0026rsquo;utilisateur _pfstat au groupe web www cela nous permet ensuite de pouvoir écrire dans le répertoire web PFstats PFstats est mon petit projet de page responsive web pour consulter de manière agréable les images générées par pfstat.\nElle est conçue pour analyser des statistiques d\u0026rsquo;une heure, quotidiennes, hebdomadaires, et mensuelles, voire annuelles.\ndépôt : https://tildegit.org/hucste/pfstats N\u0026rsquo;hésitez pas à lire le fichier README.md Sous Licence BSD 2 Clauses Voici un aperçu :\nAperçu de la page 'pfstat.hml' Quelques explications :\npfstat.conf ⇒ Le fichier de configuration pfstat.conf est configuré :\npour analyser IPv4 et IPv6, au-travers de l\u0026rsquo;interface réseau em0, Modifier l\u0026rsquo;interface par la vôtre. pour restituer des graphiques d\u0026rsquo;une heure, quotidien, hebdomadaire, et mensuel. et pour publier vers le répertoire de publication web /var/www/htdocs/pfstat. Il faut le copier à la place du fichier de configuration original.\nSi vous analysez le fichier correctement, j\u0026rsquo;ai commenté toutes les lignes concernant le traitement des queues ; en effet quand les lignes sont actives, pfstat se plaint et s\u0026rsquo;arrête avec le message suivant : /etc/pfstat.conf:61: ALTQ-style queues not supported anymore\nIl semble que ce ne soit plus supporté !\npfstat.html Copier les fichiers .css, .js, et .html dans le répertoire de publication web\nconvert-img.sh ⇒ Ce script shell sert à convertir les images JPEG générées par pfstat au format avif, et webp.\nIl nécessite l\u0026rsquo;installation des paquets libavif, et libwebp.\nAjoutez l\u0026rsquo;utilisateur _pfstat au groupe de votre utilisateur, puis donnez les droits nécessaires sur le script shell :# usermod -G votre-identifiant-utilisateur _pfstat :# chmod 0750 /home/votre-identifiant-utilisateur/pfstats/convert-img.sh InfoLa génération des images au format AVIF est un peu lente ; ce qui n\u0026rsquo;est pas le cas des images Webp. Cela dépend aussi de la puissance machine. pfstats et crontab Il faudra modifier la deuxième ligne de la crontab de l\u0026rsquo;utilisateur _pfstat, tel que :\n15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db; /dir/convert-img.sh Ainsi se déroulent les étapes suivantes :\nla création des images se fait à l\u0026rsquo;heure programmée le script de conversion d\u0026rsquo;images s\u0026rsquo;exécute pfstats et httpd Pour gérer correctement les images au format avif et webp, il peut être nécessaire de modifier légérement la configuration d\u0026rsquo;httpd, pour ajouter dans le bloc de directives types :\nimage/avif avif Tel que :\ntypes { include \u0026#34;/usr/share/misc/mime.types\u0026#34; image/avif avif } ⇒ Pour vérifier le support du format webp :\n:$ grep webp /usr/share/misc/mime.types image/webp webp Si la commande n\u0026rsquo;affiche aucun résultat, alors il faudra ajouter au bloc types : image/webp webp. Depuis OpenBSD 6.9, ce n\u0026rsquo;est pas nécessaire.\npfstats et nginx Si vous êtes plutôt un fan de nginx, lisez mes articles suivants pour savoir comment gérer :\nle format avif : Nginx gère les images au format AVIF le format webp : Nginx gère les images au format Webp Il vous suffit d\u0026rsquo;adapter la configuration pour la consultation de la page web de pfstats.\nDépannage ALTQ-style queues not supported anymore Le message complet est le suivant : /etc/pfstat.conf:61: ALTQ-style queues not supported anymore\nIl semble que l\u0026rsquo;analyse des queues ne soit plus possible. Supprimez ou commentez toutes lignes relatives.\nDans le fichier de configuration que je fournis, elles sont commentées, juste au cas où ce serait une erreur de compréhension ou qu\u0026rsquo;il me manque une information pour les rendre fonctionnelles.\ndbopen: /var/db/pfstat/pfstat.db: No such file or directory Avez-vous bien pensé à créer le répertoire ; vérifiez !\nVoilà !\nDocumentations ⇒ Projet PFstats : https://tildegit.org/hucste/pfstats\n⇒ Qui supportent ces formats :\nhttps://caniuse.com/avif https://caniuse.com/webp https://oldblog.chown.me/blog/faire-des-graphes-a-partir-des-infos-de-pf.html ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epfstat\u003c/strong\u003e est un projet de Daniel Hartmeir pour générer des statistiques\ngraphiques du flux réseau qui passe au-travers du parefeu \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePF \u003cem\u003e(Packet Filter)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web officiel : \u003ca href=\"https://www.benzedrine.ch/pfstat.html\" rel=\"external\"\u003ehttps://www.benzedrine.ch/pfstat.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Environnement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : \u003cdel\u003e6.9\u003c/del\u003e ⇒ 7.1\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eClassique : \u003ccode\u003e# pkg_add pfstat pfstatd\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLe paquet \u003cstrong\u003epfstatd\u003c/strong\u003e n\u0026rsquo;est pas essentiel pour une configuration simple\net minimale. Il devient intéressant pour être fonctionner avec un utilisateur\ndédié. ;-)\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eEn admettant que l\u0026rsquo;interface réseau est de type \u003cstrong\u003eem0\u003c/strong\u003e, modifions le fichier\nde configuration \u003ccode\u003e/etc/pf.conf\u003c/code\u003e pour ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset loginterface em0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSi vous avez plusieurs interfaces réseaux, il est possible de toutes les\nanalyser ; ligne après ligne, ajoutez chacune d\u0026rsquo;elles, si nécessaire.\u003c/div\u003e\n\n\u003ch3 id=\"pfstat\"\u003epfstat\u003c/h3\u003e\n\u003cp\u003eLa configuration de pfstat n\u0026rsquo;est pas compliquée. Pour débuter, le package\ninstalle un fichier de configuration exemple, juste pour IPv4.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/etc/pfstat.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl faut le modifier pour changer le chemin du répertoire de destination\noù seront les futures images créées pour la vision et l\u0026rsquo;analyse.\u003c/p\u003e\n\u003cp\u003eEn admettant toujours que l\u0026rsquo;interface reseau à analyser est \u003cstrong\u003eem0\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s/sis0/em0/g;s/benzedrine.cx/pfstat/g\u0026#39;\u003c/span\u003e /etc/pfstat.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa commande va changer toutes les lignes où :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;interface \u003cstrong\u003esis0\u003c/strong\u003e par \u003cstrong\u003eem0\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele chemin de publication contenant \u003cem\u003ebenzedrine.cx\u003c/em\u003e par \u003cem\u003epfstat\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eEnsuite, il suffit de configurer la crontab de root pour que le binaire\n\u003cstrong\u003epfstat\u003c/strong\u003e analyse le flux réseau.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e*  * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e*/15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ela première ligne fonctionne toutes les minutes pour analyser et enregistrer\u003c/li\u003e\n\u003cli\u003ela seconde ligne a pour propos de générer les images toutes les quinze minutes\ndepuis la base de données de pfstat\u003c/li\u003e\n\u003cli\u003ela troisième ligne aura pour propos d\u0026rsquo;effacer toutes les jours à 0:30\nles données qui sont vieilles de plus de trente jours.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Cela nécessite la création du répertoire de la future base de données :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /var/db/pfstat/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eJuste pour info, cela peut être absolument un tout autre chemin sur le\nsystème d\u0026rsquo;exploitation, et avoir un tout autre nom de base de données.\nC\u0026rsquo;est à vous de voir…\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà une configuration minimale fonctionnelle !\u003c/p\u003e\n\u003cp\u003ePassons à une configuration plus poussée avec un utilisateur dédié qui\nva gérer et le service et l\u0026rsquo;utilisation du binaire.\u003c/p\u003e\n\u003ch3 id=\"utilisateur-_pfstat\"\u003eUtilisateur _pfstat\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;utilisateur dédié nous sera utile pour démarrer le service pfstatd\navec les droits utilisateurs de \u003cstrong\u003e_pfstat\u003c/strong\u003e, puis d\u0026rsquo;utiliser \u003cstrong\u003epfstat\u003c/strong\u003e\navec cet utilisateur…\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# useradd -s /sbin/nologin -d /var/db/pfstat _pfstat\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown _pfstat /var/db/pfstat\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"pfstatd\"\u003epfstatd\u003c/h4\u003e\n\u003cp\u003eIl suffit d\u0026rsquo;activer le service, de le paramétrer et le démarrer :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl enable pfstatd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl set pfstatd flags -u _pfstat -a 127.0.0.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl start pfstatd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eN\u0026rsquo;ayant pas paramétré de numéro de port, c\u0026rsquo;est celui par défaut, à savoir\n9999, qui sera écouté.\u003c/p\u003e\n\u003cp\u003eDes outils comme \u003cstrong\u003enc\u003c/strong\u003e peuvent permettre de s\u0026rsquo;assurer du fonctionnement ;\nessayez \u003ccode\u003enc localhost 9999\u003c/code\u003e, vous devriez avoir les statistiques qui\ns\u0026rsquo;affichent rapidement les unes à les suites des autres, ligne après ligne. \u003cbr\u003e\n\u003cem\u003eSi ce n\u0026rsquo;est pas le cas, il y a un soucis…\u003c/em\u003e\u003c/p\u003e\n\u003ch5 id=\"pfstatd-et-pf\"\u003epfstatd et PF\u003c/h5\u003e\n\u003cp\u003eJe vous encourage vivement à bloquer au niveau du pare-feu d\u0026rsquo;OpenBSD,\ntoutes tentatives de communications sur le service de pfstatd !\u003c/p\u003e\n\u003cp\u003eUne règle comme la suivante devrait suffire :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop in on ! lo0 proto tcp to port 9999\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"pfstat-et-_pfstat\"\u003epfstat et _pfstat\u003c/h4\u003e\n\u003cp\u003eMaintenant nous allons pouvoir reconfigurer l\u0026rsquo;utilisation de pfstat en\ntenant compte de l\u0026rsquo;utilisateur dédié \u003cstrong\u003e_pfstat\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003edans un premier temps, décommentons ou supprimons les écritures dans\nla crontab de root,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epour paramétrer celle de l\u0026rsquo;utilisateur \u003cstrong\u003e_pfstat\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecréer un fichier de crontab, tel que \u003cstrong\u003ecrontab4pfstat\u003c/strong\u003e, contenant\nles déclarations suivantes :\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e*  * * * * -ns /usr/local/bin/pfstat -q -d /var/db/pfstat/pfstat.db -r 127.0.0.1\n*/15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db\n30 0 * * * -ns /usr/local/bin/pfstat -t 30 -d /var/db/pfstat/pfstat.db\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePetites explications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRemarquez l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003e-r\u003c/code\u003e suivie de l\u0026rsquo;adresse de bouclage\nlocalhost ; cette option nous permet d\u0026rsquo;interroger le service \u0026ldquo;à distance\u0026rdquo;\npour récupèrer les statistiques et les enregistrer dans la base de données.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMaintenant injections le fichier \u003cstrong\u003ecrontab4pfstat\u003c/strong\u003e dans la crontab de\nl\u0026rsquo;utilisateur \u003cstrong\u003e_pfstat\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# crontab -u _pfstat crontab4pfstat\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"surveillance-de-_pfstat\"\u003eSurveillance de _pfstat\u003c/h4\u003e\n\u003cp\u003eIl y a différents moyens de surveiller l\u0026rsquo;activité de l\u0026rsquo;utilisateur \u003cstrong\u003e_pfstat\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etop -U _pfstat\u003c/code\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eload averages:  0.05,  0.38,  0.38\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e56\u003c/span\u003e processes: \u003cspan style=\"color:#f99b15\"\u003e54\u003c/span\u003e idle, \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e on processor\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCPU0 states:  0.0% user,  0.0% nice,  0.0% sys,  0.0% spin,  0.0% intr,  100% idle\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMemory: Real: 84M/5985M act/tot Free: 9778M Cache: 2757M Swap: 0K/32G\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  PID USERNAME PRI NICE  SIZE   RES STATE     WAIT      TIME    CPU COMMAND\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e _pfstat    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  700K  984K sleep/6   netcon    0:00  0.00% pfstatd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ fstat -u _pfstat -n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER     CMD          PID   FD  DEV      INUM        MODE   R/W    SZ|DV\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_pfstat  pfstatd    \u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e   wd  4,0         \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e40755\u003c/span\u003e    r      \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_pfstat  pfstatd    \u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_pfstat  pfstatd    \u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_pfstat  pfstatd    \u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_pfstat  pfstatd    \u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27028\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20600\u003c/span\u003e    r   73,0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_pfstat  pfstatd    \u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e    4* internet stream tcp 0x0 127.0.0.1:9999\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ps aux -U _pfstat\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER       PID %CPU %MEM   VSZ   RSS TT  STAT   STARTED       TIME COMMAND\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_pfstat  \u003cspan style=\"color:#f99b15\"\u003e16833\u003c/span\u003e  0.0  0.0   \u003cspan style=\"color:#f99b15\"\u003e700\u003c/span\u003e   \u003cspan style=\"color:#f99b15\"\u003e984\u003c/span\u003e ??  I       1:19AM    0:00.02 /usr/local/bin/pfstatd -u _pfstat -a 127.0.0.1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCes trois commandes nous confirment que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele service \u003cstrong\u003epfstatd\u003c/strong\u003e est démarré avec l\u0026rsquo;utilisateur \u003cstrong\u003e_pfstat\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele service \u003cstrong\u003epfstatd\u003c/strong\u003e écoute bien sur la boucle locale, sur le port 9999\net qu\u0026rsquo;il est en attente de connexion, dans le cas de ces exemples.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eConfigurons maintenant httpd !\u003c/p\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003eCommençons par créer le répertoire :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /var/www/htdocs/pfstat/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis occupons-nous du fichier de configuration de httpd \u003ccode\u003e/etc/httpd.conf\u003c/code\u003e\net ajoutons les déclarations suivantes, au besoin :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etypes {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einclude \u0026#34;/usr/share/misc/mime.types\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver \u0026#34;pfstat\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elisten on 127.0.0.1 port 80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elocation \u0026#34;/pfstat/\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edirectory auto index\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/htdocs/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl reste à vérifier la configuration et activer/démarrer le service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl enable httpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# httpd -n \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rcctl start httpd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl ne reste plus qu\u0026rsquo;à consulter localement, tel que : http://localhost/pfstat\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà une configuration minimale qui fonctionne et qui restituera des images.\u003c/p\u003e\n\u003ch4 id=\"httpd-et-_pfstat\"\u003ehttpd et _pfstat\u003c/h4\u003e\n\u003cp\u003eDu fait d\u0026rsquo;avoir créé l\u0026rsquo;utilisateur \u003cstrong\u003e_pfstat\u003c/strong\u003e, donnons à l\u0026rsquo;utilisateur\nle droit d\u0026rsquo;écrire dans le répertoire web :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# usermod -G www _pfstat\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown -R _pfstat:www /var/www/htdocs/pfstat\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eainsi nous intégrons l\u0026rsquo;utilisateur \u003cstrong\u003e_pfstat\u003c/strong\u003e au groupe web \u003cstrong\u003ewww\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ecela nous permet ensuite de pouvoir écrire dans le répertoire web\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"pfstats\"\u003ePFstats\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ePFstats\u003c/strong\u003e est mon petit projet de page responsive web pour consulter de\nmanière agréable les images générées par pfstat.\u003c/p\u003e\n\u003cp\u003eElle est conçue pour analyser des statistiques d\u0026rsquo;une heure, quotidiennes,\nhebdomadaires, et mensuelles, voire annuelles.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edépôt : \u003ca href=\"https://tildegit.org/hucste/pfstats\" rel=\"external\"\u003ehttps://tildegit.org/hucste/pfstats\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eN\u0026rsquo;hésitez pas à lire le fichier \u003ca href=\"https://tildegit.org/hucste/pfstats/src/branch/main/README.md\" rel=\"external\"\u003eREADME.md\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSous \u003ca href=\"https://tildegit.org/hucste/pfstats/src/branch/main/LICENSE\" rel=\"external\"\u003eLicence BSD 2 Clauses\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoici un aperçu :\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/pfstats.html.png\" title=\"Aperçu de la page \u0026#39;pfstat.hml\u0026#39;\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/pfstats.html_hu_24bd26f0d013a58a.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Aperçu de la page \u0026#39;pfstat.hml\u0026#39;\" height=\"204\" loading=\"lazy\" src=\"/images/openbsd/pfstats.html_hu_1f25c63853e61cda.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eAperçu de la page 'pfstat.hml'\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003chr\u003e\n\u003cp\u003eQuelques explications :\u003c/p\u003e\n\u003ch3 id=\"pfstatconf\"\u003epfstat.conf\u003c/h3\u003e\n\u003cp\u003e⇒ Le fichier de configuration pfstat.conf est configuré :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour analyser IPv4 et IPv6, au-travers de l\u0026rsquo;interface réseau \u003cstrong\u003eem0\u003c/strong\u003e,\n\u003cem\u003eModifier l\u0026rsquo;interface par la vôtre\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003epour restituer des graphiques d\u0026rsquo;une heure, quotidien, hebdomadaire, et\nmensuel.\u003c/li\u003e\n\u003cli\u003eet pour publier vers le répertoire de publication web \u003ccode\u003e/var/www/htdocs/pfstat\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl faut le copier à la place du fichier de configuration original.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eSi vous analysez le fichier correctement, j\u0026rsquo;ai commenté toutes les lignes\nconcernant le traitement des queues ; en effet quand les lignes sont actives,\npfstat se plaint et s\u0026rsquo;arrête avec le message suivant\u003c/em\u003e : \u003cbr\u003e\n\u003ccode\u003e/etc/pfstat.conf:61: ALTQ-style queues not supported anymore\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl semble que ce ne soit plus supporté !\u003c/p\u003e\n\u003ch3 id=\"pfstathtml\"\u003epfstat.html\u003c/h3\u003e\n\u003cp\u003eCopier les fichiers .css, .js, et .html dans le répertoire de publication web\u003c/p\u003e\n\u003ch3 id=\"convert-imgsh\"\u003econvert-img.sh\u003c/h3\u003e\n\u003cp\u003e⇒ Ce script shell sert à convertir les images JPEG générées par pfstat\nau format avif, et webp.\u003c/p\u003e\n\u003cp\u003eIl nécessite l\u0026rsquo;installation des paquets \u003cstrong\u003elibavif\u003c/strong\u003e, et \u003cstrong\u003elibwebp\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAjoutez l\u0026rsquo;utilisateur \u003cstrong\u003e_pfstat\u003c/strong\u003e au groupe de votre utilisateur, puis\u003c/li\u003e\n\u003cli\u003edonnez les droits nécessaires sur le script shell\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# usermod -G votre-identifiant-utilisateur _pfstat\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chmod \u003cspan style=\"color:#f99b15\"\u003e0750\u003c/span\u003e /home/votre-identifiant-utilisateur/pfstats/convert-img.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eLa génération des images au format AVIF est un peu lente ; ce qui n\u0026rsquo;est\npas le cas des images Webp. Cela dépend aussi de la puissance machine.\u003c/div\u003e\n\n\u003ch3 id=\"pfstats-et-crontab\"\u003epfstats et crontab\u003c/h3\u003e\n\u003cp\u003eIl faudra modifier la deuxième ligne de la crontab de l\u0026rsquo;utilisateur\n\u003cstrong\u003e_pfstat\u003c/strong\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e15 * * * * -ns /usr/local/bin/pfstat -p -d /var/db/pfstat/pfstat.db; /dir/convert-img.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi se déroulent les étapes suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela création des images se fait à l\u0026rsquo;heure programmée\u003c/li\u003e\n\u003cli\u003ele script de conversion d\u0026rsquo;images s\u0026rsquo;exécute\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pfstats-et-httpd\"\u003epfstats et httpd\u003c/h3\u003e\n\u003cp\u003ePour gérer correctement les images au format avif et webp, il peut être\nnécessaire de modifier légérement la configuration d\u0026rsquo;httpd, pour ajouter\ndans le bloc de directives \u003cstrong\u003etypes\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eimage/avif  avif\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etypes {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einclude \u0026#34;/usr/share/misc/mime.types\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eimage/avif  avif\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Pour vérifier le support du format webp :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ grep webp /usr/share/misc/mime.types\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eimage/webp                      webp\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi la commande n\u0026rsquo;affiche aucun résultat, alors il faudra ajouter au bloc\n\u003cstrong\u003etypes\u003c/strong\u003e : \u003ccode\u003eimage/webp webp\u003c/code\u003e.\n\u003cem\u003eDepuis OpenBSD 6.9, ce n\u0026rsquo;est pas nécessaire.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"pfstats-et-nginx\"\u003epfstats et nginx\u003c/h3\u003e\n\u003cp\u003eSi vous êtes plutôt un fan de nginx, lisez mes articles suivants pour\nsavoir comment gérer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele format avif : \n\u003ca class=\"inside\" href=\"/fr/web/nginx/nginx-image-avif/\" title=\"Lien interne vers l\u0026#39;article : 'Nginx gère les images au format AVIF'\"\u003eNginx gère les images au format AVIF\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003ele format webp : \n\u003ca class=\"inside\" href=\"/fr/web/nginx/nginx-image-webp/\" title=\"Lien interne vers l\u0026#39;article : 'Nginx gère les images au format Webp'\"\u003eNginx gère les images au format Webp\u003c/a\u003e\n\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl vous suffit d\u0026rsquo;adapter la configuration pour la consultation de la page\nweb de pfstats.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"altq-style-queues-not-supported-anymore\"\u003eALTQ-style queues not supported anymore\u003c/h3\u003e\n\u003cp\u003eLe message complet est le suivant :\n\u003ccode\u003e/etc/pfstat.conf:61: ALTQ-style queues not supported anymore\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl semble que l\u0026rsquo;analyse des queues ne soit plus possible. Supprimez ou\n\u003cstrong\u003ecommentez\u003c/strong\u003e toutes lignes relatives.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eDans le fichier de configuration que\nje fournis, elles sont commentées, juste au cas où ce serait une erreur\nde compréhension ou qu\u0026rsquo;il me manque une information pour les rendre fonctionnelles.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"dbopen-vardbpfstatpfstatdb-no-such-file-or-directory\"\u003edbopen: /var/db/pfstat/pfstat.db: No such file or directory\u003c/h3\u003e\n\u003cp\u003eAvez-vous bien pensé à créer le répertoire ; vérifiez !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003e⇒ Projet \u003cstrong\u003ePFstats\u003c/strong\u003e : \u003ca href=\"https://tildegit.org/hucste/pfstats\" rel=\"external\"\u003ehttps://tildegit.org/hucste/pfstats\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Qui supportent ces formats :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://caniuse.com/avif\" rel=\"external\"\u003ehttps://caniuse.com/avif\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://caniuse.com/webp\" rel=\"external\"\u003ehttps://caniuse.com/webp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://oldblog.chown.me/blog/faire-des-graphes-a-partir-des-infos-de-pf.html\" rel=\"external\"\u003ehttps://oldblog.chown.me/blog/faire-des-graphes-a-partir-des-infos-de-pf.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Installer et utiliser pfstat, pour analyser le flux réseau IPv4 et IPv6 au-travers du parefeu PF, sous OpenBSD !",
            "tags": ["supervision", "dataviz", "pfstat", "OpenBSD", "httpd"],
            "date_published": "2021-07-28T00:13:24+02:00",
            "date_modified": "2025-11-11T15:44:28+01:00"
        },{
            "id": "urn:uuid:4077d964-5b48-8d78-09f2-c181cfc1a080",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/gnome/",
            "title": "OpenBSD : Utiliser Gnome",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Gnome est un des environnements de bureau graphique, disponible aussi sous OpenBSD.\n⇒ Environnement :\nOpenBSD : 6.9 → 7.1 Dans ce tutoriel, je pars du principe qu\u0026rsquo;OpenBSD vient d\u0026rsquo;être fraîchement installé, et que tout est à faire.\nInstallation Installez les paquets gnome gnome-extras\nL\u0026rsquo;installation de ces paquets installent des dépendances, tels les paquets avahi, consolekit2, dbus, voire samba, sane-backend et bien d\u0026rsquo;autres.\nConfiguration L\u0026rsquo;environnement Gnome3 fonctionne différement des autres environnements de bureau. Ne cherchez pas à configurer les fichiers personnels .profile, .kshrc, voire .xsession, ils ne seront pas pris en compte pour le démarrage et l\u0026rsquo;utilisation de Gnome.\nDes services Si lors de l\u0026rsquo;installation d\u0026rsquo;OpenBSD, vous avez activé xenodm - le gestionnaire d\u0026rsquo;affichage par défaut - désactivez-le !\n# rcctl disable xenodm # rcctl stop xenodm Puis on active le gestionnaire de session gdm ainsi que tous les services nécessaires !\n# rcctl enable multicast messagebus avahi_daemon gdm # rcctl start multicast messagebus avahi_daemon gdm Limites système Ainsi que le mentionne le fichier pkg-readme de Gnome, les limites système par défaut dans OpenBSD ne sont pas assez élevées pour exécuter correctement Gnome.\nFaisons cela bien:\nCréons une classe de login \u0026ldquo;gnome\u0026rdquo;, et ajoutons notre utilisateur à la classe Pour cela, modifions le fichier /etc/login.conf, en ajoutant :\ngnome:\\ :datasize-cur=1024M:\\ :tc=default: ⇒ OpenBSD ≤ 7.0 : de même, pour gdm, qui n\u0026rsquo;aura pas assez de descripteurs de fichiers à disposition.\ncréons une classe de login \u0026ldquo;gdm\u0026rdquo;, et ajoutons-la à celle de \u0026ldquo;xenodm\u0026rdquo;.\ngdm:\\ :tc=xenodm: Puis modifions notre utilisateur :\n# usermod -L gnome user (où \u0026lsquo;user\u0026rsquo; est votre identifiant utilisateur…)\nVoilà !\nC\u0026rsquo;est suffisant pour faire fonctionner correctement Gnome sous OpenBSD. Un petit redémarrage de l\u0026rsquo;OS et ça devrait le faire. :p\nMaintenant allons un peu plus loin dans la configuration, tel qu\u0026rsquo;avoir sa session en langue française, et d\u0026rsquo;autres petites astuces utiles.\nLangue Pour gérer votre langue - dans mon cas, FR - dès le gestionnaire de session gdm, il faut modifier le fichier /etc/gdm/locale.conf, tel que :\n# $OpenBSD: locale.conf,v 1.4 2014/01/08 14:07:48 ajacoutot Exp $ # # Mimics Linux\u0026#39;s /etc/locale.conf. # See locale(1) for a list of supported locales (`locale -a`). # OpenBSD setlocale(3) does not handle LANG #LANG=\u0026#34;en_US.UTF-8\u0026#34; LC_CTYPE=\u0026#34;fr_FR.UTF-8\u0026#34; LC_MESSAGES=\u0026#34;fr_FR.UTF-8\u0026#34; Si vous ne faites pas cette modification, et si vous avez un mot-de-passe avec des caractères accentués dans votre langue, selon le clavier paramétré lors de l\u0026rsquo;installation d\u0026rsquo;OpenBSD, vous ne pourrez pas vous connecter, car gdm utilise par défaut la langue anglaise.\nPensez à redémarrer gdm…\nGestion Énergie Pour la gestion des fonctionnalités de mise en veille et d\u0026rsquo;hibernation, activez le service apmd :\n# rcctl enable apmd # rcctl set apmd flags -A # rcctl start apmd Impression Pour gérer l\u0026rsquo;impression, il est utile d\u0026rsquo;installer Cups :\n# pkg_add cups cups-filters cups-libs foomatic-db gutenprint Démarrons les services cupsd, voire cups_browsed - ce dernier étant utile pour la détection des imprimantes sur le réseau, utilisant les messages broadcast de type Bonjour, tel Avahi.\n# rcctl enable cupsd cups_browsed # rcctl start cups cups_browsed L\u0026rsquo;administration peut se faire au-travers des paramètres Imprimantes, voire de l\u0026rsquo;interface web de Cups, disponible depuis l\u0026rsquo;URL http://localhost:631, ou des outils cupsctl, lpadmin.\nLibreOffice Le gestionnaire gnome-documents ne gère pas, par défaut, le type des documents Office. Il suffit d\u0026rsquo;installer le paquet unoconv.\nAstuces Clavier Affichage Bureau ⇒ Ne cherchez pas à masquer toutes les fenêtres pour afficher juste le bureau, l\u0026rsquo;option n\u0026rsquo;est pas activée par défaut !\nOuvrer l\u0026rsquo;application \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;Raccourcis clavier\u0026rdquo;, puis dans la section \u0026ldquo;Navigation\u0026rdquo;, chercher \u0026ldquo;Masquer toutes les fenêtres normales\u0026rdquo; qui sera \u0026ldquo;Désactivé\u0026rdquo;.\nCliquez dessus, et paramétrez la combinaison de touches que vous désirez, tel que les touches \u0026ldquo;Super\u0026rdquo; + \u0026ldquo;D\u0026rdquo; (pour Desktop - Bureau en anglais), ou \u0026ldquo;Super\u0026rdquo; + \u0026ldquo;B\u0026rdquo;. À vous de voir…\nFond d\u0026rsquo;écran aléatoire Cette fonctionnalité n\u0026rsquo;existe pas par défaut !\nJe mets à disposition deux scripts pour implémenter cette fonctionnalité.\nRetrouvez-les sur mon Git : WallpaperManager\nLisez les informations pour l\u0026rsquo;installer et l\u0026rsquo;utiliser sans soucis.\nPF Je n\u0026rsquo;ai pas abordé la question des règles de parefeu, mais voici par exemple :\n⇒ Cups :\npass in on egress proto tcp from egress:network to egress port 631 flags S/SA modulate state ⇒ Avahi :\npass proto udp from any to 224.0.0.251 port mdns allow-opts pass inet6 proto udp from any to ff02::fb port mdns allow-opts pass proto udp from any to 239.255.255.250 port ssdp allow-opts pass inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port ssdp allow-opts Bien-sûr, c\u0026rsquo;est à vous de voir à les utiliser, voire à les améliorer selon vos évidences.\nDépannage GDM refuse de démarrer !\nLisez direct le fichier log des démons, voire celui des messages :\n# grep gdm /var/log/daemon Gdm: Couldn\u0026rsquo;t connect to system bus: Dans les logs daemons ou messages, vous avez l\u0026rsquo;équivalent de ce message :\nJul 23 09:38:14 og3 gdm[56941]: Gdm: Couldn\u0026#39;t connect to system bus: Could not connect: No such file or directory Il est très probable que ce soit parce que le service messagebus ne soit pas activé et démarré.\nAvez-vous bien activé tous les services comme écrit en début de cet article ?!\nDocumentations les différents fichiers pkg-readme : /usr/local/share/doc/pkg-readmes/gnome /usr/local/share/doc/pkg-readmes/gnupg /usr/local/share/doc/pkg-readmes/samba /usr/local/share/doc/pkg-readmes/sane-backends et bien d\u0026rsquo;autres… Voilà !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGnome\u003c/strong\u003e est un des environnements de bureau graphique, disponible aussi sous OpenBSD.\u003c/p\u003e\n\u003cp\u003e⇒ Environnement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : \u003cdel\u003e6.9\u003c/del\u003e → 7.1\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eDans ce tutoriel, je pars du principe qu\u0026rsquo;OpenBSD vient d\u0026rsquo;être fraîchement\ninstallé, et que tout est à faire.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n les paquets \u003cstrong\u003egnome gnome-extras\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;installation de ces paquets installent des dépendances, tels les paquets\n\u003cstrong\u003eavahi\u003c/strong\u003e, \u003cstrong\u003econsolekit2\u003c/strong\u003e, \u003cstrong\u003edbus\u003c/strong\u003e, voire \u003cstrong\u003esamba\u003c/strong\u003e, \u003cstrong\u003esane-backend\u003c/strong\u003e\net bien d\u0026rsquo;autres.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;environnement Gnome3 fonctionne différement des autres environnements\nde bureau. Ne cherchez pas à configurer les fichiers personnels\n\u003cstrong\u003e.profile\u003c/strong\u003e, \u003cstrong\u003e.kshrc\u003c/strong\u003e, voire \u003cstrong\u003e.xsession\u003c/strong\u003e, ils ne seront pas pris en\ncompte pour le démarrage et l\u0026rsquo;utilisation de Gnome.\u003c/p\u003e\n\u003ch3 id=\"des-services\"\u003eDes services\u003c/h3\u003e\n\u003cp\u003eSi lors de l\u0026rsquo;installation d\u0026rsquo;OpenBSD, vous avez activé \u003cstrong\u003exenodm\u003c/strong\u003e - \u003cem\u003ele gestionnaire\nd\u0026rsquo;affichage par défaut\u003c/em\u003e - désactivez-le !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl disable xenodm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl stop xenodm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis on active le gestionnaire de session \u003cstrong\u003egdm\u003c/strong\u003e ainsi que tous les services\nnécessaires !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl enable multicast messagebus avahi_daemon gdm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start multicast messagebus avahi_daemon gdm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"limites-système\"\u003eLimites système\u003c/h3\u003e\n\u003cp\u003eAinsi que le mentionne le fichier pkg-readme de Gnome, les limites système\npar défaut dans OpenBSD ne sont pas assez élevées pour exécuter correctement\nGnome.\u003c/p\u003e\n\u003cp\u003eFaisons cela bien:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCréons une classe de login \u0026ldquo;gnome\u0026rdquo;, et ajoutons notre utilisateur à la classe\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour cela, modifions le fichier \u003ccode\u003e/etc/login.conf\u003c/code\u003e, en ajoutant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003egnome:\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003e:datasize-cur\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e1024M:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\t:tc=default:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e⇒ OpenBSD ≤ 7.0 : de même, pour gdm, qui n\u0026rsquo;aura pas assez de descripteurs de fichiers\nà disposition.\u003c/p\u003e\n\u003cp\u003ecréons une classe de login \u0026ldquo;gdm\u0026rdquo;, et ajoutons-la à celle de \u0026ldquo;xenodm\u0026rdquo;.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003egdm:\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003e:tc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003exenodm:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003ePuis modifions notre utilisateur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# usermod -L gnome user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(où \u0026lsquo;user\u0026rsquo; est votre identifiant utilisateur…)\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est suffisant pour faire fonctionner correctement Gnome sous OpenBSD.\nUn petit redémarrage de l\u0026rsquo;OS et ça devrait le faire. :p\u003c/p\u003e\n\u003cp\u003eMaintenant allons un peu plus loin dans la configuration, tel qu\u0026rsquo;avoir sa\nsession en langue française, et d\u0026rsquo;autres petites astuces utiles.\u003c/p\u003e\n\u003ch3 id=\"langue\"\u003eLangue\u003c/h3\u003e\n\u003cp\u003ePour gérer votre langue - \u003cem\u003edans mon cas, FR\u003c/em\u003e - dès le gestionnaire de session\n\u003cstrong\u003egdm\u003c/strong\u003e, il faut modifier le fichier \u003ccode\u003e/etc/gdm/locale.conf\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: locale.conf,v 1.4 2014/01/08 14:07:48 ajacoutot Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Mimics Linux\u0026#39;s /etc/locale.conf.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# See locale(1) for a list of supported locales (`locale -a`).\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# OpenBSD setlocale(3) does not handle LANG\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#LANG=\u0026#34;en_US.UTF-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLC_CTYPE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr_FR.UTF-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLC_MESSAGES\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr_FR.UTF-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi vous ne faites pas cette modification, et si vous avez un mot-de-passe\navec des caractères accentués dans votre langue, selon le clavier paramétré\nlors de l\u0026rsquo;installation d\u0026rsquo;OpenBSD, vous ne pourrez pas vous connecter, car\ngdm utilise par défaut la langue anglaise.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePensez à redémarrer gdm…\u003c/p\u003e\n\u003ch3 id=\"gestion-énergie\"\u003eGestion Énergie\u003c/h3\u003e\n\u003cp\u003ePour la gestion des fonctionnalités de mise en veille et d\u0026rsquo;hibernation,\nactivez le service \u003cstrong\u003eapmd\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl enable apmd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set apmd flags -A\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start apmd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"impression\"\u003eImpression\u003c/h3\u003e\n\u003cp\u003ePour gérer l\u0026rsquo;impression, il est utile d\u0026rsquo;installer Cups :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pkg_add cups cups-filters cups-libs foomatic-db gutenprint \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDémarrons les services \u003cstrong\u003ecupsd\u003c/strong\u003e, voire \u003cstrong\u003ecups_browsed\u003c/strong\u003e - \u003cem\u003ece dernier étant\nutile pour la détection des imprimantes sur le réseau, utilisant les messages\nbroadcast de type Bonjour, tel Avahi.\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl enable cupsd cups_browsed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start cups cups_browsed\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;administration peut se faire au-travers des paramètres \u003cstrong\u003eImprimantes\u003c/strong\u003e,\nvoire de l\u0026rsquo;interface web de Cups, disponible depuis l\u0026rsquo;URL http://localhost:631,\nou des outils \u003cstrong\u003ecupsctl\u003c/strong\u003e, \u003cstrong\u003elpadmin\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"libreoffice\"\u003eLibreOffice\u003c/h3\u003e\n\u003cp\u003eLe gestionnaire \u003cstrong\u003egnome-documents\u003c/strong\u003e ne gère pas, par défaut, le type des\ndocuments Office. Il suffit d\u0026rsquo;installer le paquet \u003cstrong\u003eunoconv\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"astuces\"\u003eAstuces\u003c/h2\u003e\n\u003ch3 id=\"clavier\"\u003eClavier\u003c/h3\u003e\n\u003ch4 id=\"affichage-bureau\"\u003eAffichage Bureau\u003c/h4\u003e\n\u003cp\u003e⇒ Ne cherchez pas à masquer toutes les fenêtres pour afficher juste le bureau,\nl\u0026rsquo;option n\u0026rsquo;est pas activée par défaut !\u003c/p\u003e\n\u003cp\u003eOuvrer l\u0026rsquo;application \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;Raccourcis clavier\u0026rdquo;, puis dans la section\n\u0026ldquo;Navigation\u0026rdquo;, chercher \u0026ldquo;Masquer toutes les fenêtres normales\u0026rdquo; qui sera \u0026ldquo;Désactivé\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eCliquez dessus, et paramétrez la combinaison de touches que vous désirez,\ntel que les touches \u0026ldquo;Super\u0026rdquo; + \u0026ldquo;D\u0026rdquo; (pour Desktop - \u003cem\u003eBureau en anglais\u003c/em\u003e), ou\n\u0026ldquo;Super\u0026rdquo; + \u0026ldquo;B\u0026rdquo;. À vous de voir…\u003c/p\u003e\n\u003ch3 id=\"fond-décran-aléatoire\"\u003eFond d\u0026rsquo;écran aléatoire\u003c/h3\u003e\n\u003cp\u003eCette fonctionnalité n\u0026rsquo;existe pas par défaut !\u003c/p\u003e\n\u003cp\u003eJe mets à disposition deux scripts pour implémenter cette fonctionnalité.\u003c/p\u003e\n\u003cp\u003eRetrouvez-les sur mon Git : \u003ca href=\"https://framagit.org/hucste/tools/tree/master/OpenBSD/Gnome3/WallpaperManager\" rel=\"external\"\u003eWallpaperManager\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eLisez les informations pour l\u0026rsquo;installer et l\u0026rsquo;utiliser sans soucis.\u003c/p\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eJe n\u0026rsquo;ai pas abordé la question des règles de parefeu, mais voici par exemple :\u003c/p\u003e\n\u003cp\u003e⇒ Cups :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in on egress proto tcp from egress:network to egress port 631 flags S/SA modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Avahi :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to 224.0.0.251 port mdns allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass inet6 proto udp from any to ff02::fb port mdns allow-opts \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to 239.255.255.250 port ssdp allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port ssdp allow-opts \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr, c\u0026rsquo;est à vous de voir à les utiliser, voire à les améliorer selon\nvos évidences.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eGDM\u003c/strong\u003e refuse de démarrer !\u003c/p\u003e\n\u003cp\u003eLisez direct le fichier log des démons, voire celui des messages :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# grep gdm /var/log/daemon\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"gdm-couldnt-connect-to-system-bus\"\u003eGdm: Couldn\u0026rsquo;t connect to system bus:\u003c/h3\u003e\n\u003cp\u003eDans les logs \u003cstrong\u003edaemons\u003c/strong\u003e ou \u003cstrong\u003emessages\u003c/strong\u003e, vous avez l\u0026rsquo;équivalent de ce message :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003eJul 23 09:38:14 og3 gdm[56941]: Gdm: Couldn\u0026#39;t connect to system bus: Could not connect: No such file or directory\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl est très probable que ce soit parce que le service \u003cstrong\u003emessagebus\u003c/strong\u003e ne\nsoit pas activé et démarré.\u003c/p\u003e\n\u003cp\u003eAvez-vous bien activé tous les services comme écrit en début de cet article ?!\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eles différents fichiers pkg-readme :\n\u003cul\u003e\n\u003cli\u003e/usr/local/share/doc/pkg-readmes/gnome\u003c/li\u003e\n\u003cli\u003e/usr/local/share/doc/pkg-readmes/gnupg\u003c/li\u003e\n\u003cli\u003e/usr/local/share/doc/pkg-readmes/samba\u003c/li\u003e\n\u003cli\u003e/usr/local/share/doc/pkg-readmes/sane-backends\u003c/li\u003e\n\u003cli\u003eet bien d\u0026rsquo;autres…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Installer et utiliser l'environnement de bureau graphique Gnome sous OpenBSD !",
            "tags": ["OpenBSD", "Gnome"],
            "date_published": "2021-07-23T10:49:42+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:e02490c7-7eaa-a32d-f4e7-2fb057f4f362",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/xfce4/",
            "title": "OpenBSD : Utiliser Xfce4",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Xfce4 est un environnement de bureau graphique, disponible aussi sous OpenBSD.\n⇒ Environnement :\nOpenBSD : 6.6 → 7.4 Xfce4 : 4.14 → 4.18 Dans ce tutoriel, je pars du principe qu\u0026rsquo;OpenBSD vient d\u0026rsquo;être fraîchement installé, et que tout est à faire.\nInstallation Installez les paquets xfce xfce-extras.\nL\u0026rsquo;installation de ces paquets installent des dépendances, tel le paquet dbus.\nPaquets supplémentaires Par défaut, certains paquets liés à l\u0026rsquo;environnement de bureau ne sont pas installés. À vous de voir si vous voulez le faire !\nxfce4-icon-theme : deux, trois packs d\u0026rsquo;icônes supplémentaires xfce4-power-manager : gestion de l\u0026rsquo;énergie pour ordinateur portable xfce4-pulseaudio : greffon pour le système de son pulseaudio - mais pulseaudio n\u0026rsquo;est pas nécessaire… xfce4-xkb : permet la bascule de calques de différentes langues de clavier - mais est-ce vraiment utile, quand l\u0026rsquo;usage de la commande setxkbmap, voire tout simplement kbd, suivie du code de langue… suffit. Configuration Depuis la version 4.14 d\u0026rsquo;Xfce4, disponible depuis OpenBSD 6.6, il est un peu plus simple de configurer son environnement système personnel, pour faire fonctionner aisément Xfce4.\nDans un premier temps, je montre un configuration basique fonctionnel ; puis, j\u0026rsquo;ajouterai des informations qui peuvent améliorer votre \u0026ldquo;confort\u0026rdquo; fonctionnel.\n.xsession Le premier fichier à créer est le fichier personnel de session ~/.xsession pour y ajouter simplement :\nexec xfce4-session profil utilisateur Il est impératif d\u0026rsquo;ajouter votre utilisateur système aux deux groupes systèmes suivants :\npour utiliser les fonctions d\u0026rsquo;extinctions et de redémarrage : OpenBSD ≤ 7.3 : operator OpenBSD ≥ 7.4 : _shutdown wheel qui autorise à utiliser les fonctions de veille et d\u0026rsquo;hibernation, si elles sont disponibles sur votre système. Avec des droits administrateurs :\n# usermod -G _shutdown,wheel user (modifier \u0026lsquo;user\u0026rsquo; par votre identifiant utilisateur, bien-sûr…)\nPerformances apmd Configurer apmd va nous permettre d\u0026rsquo;utiliser la veille et l\u0026rsquo;hibernation. Pour se faciliter, nous le mettrons en mode automatique d\u0026rsquo;ajustement des performances.\nobsdfreqd Si vous avez un laptop ou que vous souhaitez que le système gère plus finement l\u0026rsquo;ajustement des performances, vous pouvez préférer l\u0026rsquo;utilisation d\u0026rsquo;obsdfreqd : un service pour gérer la fréquence CPU / OpenBSD.\nobsdfreqd est un gestionnaire de fréquences de CPU, créé par Solène Rapenne. Il a été officiellement packagé depuis OpenBSD 7.1.\nIl remplace le service natif apmd.\nExplications :\nil est nécessaire de démarrer apmd en mode manuel, pour qu\u0026rsquo;obsdfreqd le gère sans soucis. les paramètres par défaut d\u0026rsquo;obsdfreqd suffisent généralement. Voilà !\nC\u0026rsquo;est suffisant pour faire fonctionner correctement Xfce4 sous OpenBSD. Un petit redémarrage de l\u0026rsquo;OS et ça devrait le faire. :p\nMaintenant allons un peu plus loin dans la configuration, tel qu\u0026rsquo;avoir sa session en langue française, et d\u0026rsquo;autres petites astuces utiles.\n.profile Commençons par configurer votre fichier personnel de profil ~/.profile.\nAjouter à celui de base les mentions suivantes :\nEDITOR=vi\t# ou nano, emacs, voire vim ENV=$HOME/.kshrc LC_MESSAGES=fr\t# ou fr_FR.UTF8, si vous préférez ; mais ça sera pareil ! export EDITOR ENV LC_MESSAGES ⇒ Explications :\nPersonnellement j\u0026rsquo;aime et utilise l\u0026rsquo;éditeur de texte nano ; vi est installé de base, les autres sont à installer. Déclaration d\u0026rsquo;un ENVironnement personnalisé, ici l\u0026rsquo;usage du Korn Shell, par défaut, qui est pdksh. Définissons simplement la langue FRançaise - il n\u0026rsquo;y a vraiment pas besoin de plus. Bien-sûr, nous exportons les trois variables afin qu\u0026rsquo;elles soient toutes utiles et utilisées ensuite.\nPour finir sur ce sujet, il est bien sûr possible de définir toute variable d\u0026rsquo;environnement, telle PS1 par exemple :\nexport PS1=\u0026quot;[\\t] \\e[0;35m:\\u@\\h: \\e[0;32m\\w \\e[0;36m\\$ \\e[m\u0026quot;\nVoici un exemple du fichier fini :\n# $OpenBSD: dot.profile,v 1.7 2020/01/24 02:09:51 okan Exp $ # # sh/ksh initialization PATH=$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/games export PATH HOME TERM EDITOR=nano ENV=$HOME/.kshrc LC_MESSAGES=fr export EDITOR ENV LC_MESSAGES Concernant la variable ENV, nous avons déclaré un fichier personnel ~/.kshrc. Par défaut, il n\u0026rsquo;existe pas ; il suffit de le créer avec votre éditeur de texte favori - ce que nous verrons ci-dessous…\nIl faut modifier votre fichier personnel ~/.xsession pour ajouter l\u0026rsquo;environnement du profil, tel que :\n. $HOME/.profile exec xfce4-session Ainsi votre session graphique tiendra compte des différents paramètrages de votre profil, tel que la gestion de la langue, par exemple…\n.kshrc Le contenu de ce fichier personnel n\u0026rsquo;est pas compliqué. Voici quoi ajouter pour être fonctionnel :\n. /etc/ksh.kshrc . $HOME/.profile HISTCONTROL=ignoredumps HISTFILE=$HOME/.mksh_hist HISTSIZE=10000 PAGER=less export PAGER ⇒ Explications utiles :\nOn source le fichier d\u0026rsquo;initialisation globale pour ksh /etc/ksh.kshrc afin d\u0026rsquo;avoir un environnement shell correctement configuré par défaut On source le fichier de profil personnel et personnalisé Les variables HIST* sont utiles pour l\u0026rsquo;historique des commandes effectuées : HISTFILE est la variable pour définir le fichier de sauvegarde de l\u0026rsquo;historique HISTSIZE est le nombre de commande à se souvenir ; à ne pas confondre avec le nombre de lignes du fichier, qui lui est défini par la variable HISTFILESIZE - non définie ici. Pour finir, il n\u0026rsquo;y a pas besoin d\u0026rsquo;exporter ces variables dbus Le paquet dbus est installé en tant que dépendance.\nLes modifications ci-dessous ne sont pas essentielles, bien qu\u0026rsquo;utiles. Elles sont relatées dans le fichier pkg-readme relatif.\nAjouter à votre fichier personnel de session ~/.xsession :\nif [ -x /usr/local/bin/dbus-launch -a -z \u0026#34;${DBUS_SESSION_BUS_ADDRESS}\u0026#34; ]; then eval `dbus-launch --sh-syntax --exit-with-x11` fi Le fichier ressemblera ainsi au final à cela :\n. $HOME/.profile if [ -x /usr/local/bin/dbus-launch -a -z \u0026#34;${DBUS_SESSION_BUS_ADDRESS}\u0026#34; ]; then eval `dbus-launch --sh-syntax --exit-with-x11` fi exec xfce4-session Le pkg-readme upower nous informe qu\u0026rsquo;il est utile d\u0026rsquo;exécuter les services apmd et messagebus afin que le système de gestion d\u0026rsquo;énergie fonctionne ; activons et démarrons messagebus\n⇒ À ce propos si votre machine est un ordinateur portable, installez le paquet xfce4-power-manager, qui n\u0026rsquo;est pas fourni par défaut.\nImpression Pour gérer l\u0026rsquo;impression, il est utile d\u0026rsquo;installer CUPS .\nDémarrons les services cupsd, voire cups_browsed - ce dernier étant utile pour la détection des imprimantes sur le réseau, utilisant les messages broadcast de type Bonjour.\nVoir : CUPS L\u0026rsquo;administration peut se faire au-travers de l\u0026rsquo;interface web de Cups, disponible depuis l\u0026rsquo;URL http://localhost:631, ou des outils cupsctl, lpadmin.\nDepuis OpenBSD 6.2, les binaires lpq, lpr, et lprm doivent être symboliquement liés, pour fonctionner plus facilement.\nÉditons à nouveau le fichier personnel ~/.kshrc pour y ajouter :\nfor i in lpq lpr lprm; do alias $i=/usr/local/bin/$i; done Avahi Avahi est sous OpenBSD le service de découverte multicast DNS, de type Bonjour.\nIl suffit d\u0026rsquo;installer le paquet avahi pour en profiter puis d\u0026rsquo;activer et démarrer les services dans le bon ordre.\nAstuces PF Je n\u0026rsquo;ai pas abordé la question des règles de parefeu, mais voici par exemple :\n⇒ les règles PF pour Cups,\n⇒ les règles PF pour Avahi.\nBien-sûr, c\u0026rsquo;est à vous de voir à les utiliser, voire à les améliorer selon vos nécessités.\nPour finir Pensez après vos modifications des fichiers personnels, à redémarrer à minima votre session, voire la machine. À vous de voir ! ;-)\nAprès, à vous d\u0026rsquo;installer tout autre logiciel qui peut vous être utile.\nVoilà !\nDocumentations les différents fichiers pkg-readme : /usr/local/share/doc/pkg-readmes/xfce /usr/local/share/doc/pkg-readmes/dbus /usr/local/share/doc/pkg-readmes/upower la FAQ officielle : https://wiki.xfce.org/faq les trucs et astuces : https://wiki.xfce.org/tips ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eXfce4\u003c/strong\u003e est un environnement de bureau graphique, disponible aussi\nsous OpenBSD.\u003c/p\u003e\n\u003cp\u003e⇒ Environnement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : \u003cdel\u003e6.6\u003c/del\u003e → 7.4\u003c/li\u003e\n\u003cli\u003eXfce4 : \u003cdel\u003e4.14\u003c/del\u003e → 4.18\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eDans ce tutoriel, je pars du principe qu\u0026rsquo;OpenBSD vient d\u0026rsquo;être fraîchement\ninstallé, et que tout est à faire.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n les\npaquets \u003ccode\u003exfce xfce-extras\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;installation de ces paquets installent des dépendances, tel le paquet\n\u003cstrong\u003edbus\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"paquets-supplémentaires\"\u003ePaquets supplémentaires\u003c/h3\u003e\n\u003cp\u003ePar défaut, certains paquets liés à l\u0026rsquo;environnement de bureau ne sont\npas installés. À vous de voir si vous voulez le faire !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003exfce4-icon-theme\u003c/strong\u003e : deux, trois packs d\u0026rsquo;icônes supplémentaires\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003exfce4-power-manager\u003c/strong\u003e : gestion de l\u0026rsquo;énergie pour ordinateur portable\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003exfce4-pulseaudio\u003c/strong\u003e : greffon pour le système de son pulseaudio -\n\u003cem\u003emais pulseaudio n\u0026rsquo;est pas nécessaire…\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003exfce4-xkb\u003c/strong\u003e : permet la bascule de calques de différentes langues de\nclavier - \u003cem\u003emais est-ce vraiment utile, quand l\u0026rsquo;usage de la commande\n\u003ccode\u003esetxkbmap\u003c/code\u003e, voire tout simplement \u003ccode\u003ekbd\u003c/code\u003e, suivie du code de langue…\nsuffit.\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eDepuis la version 4.14 d\u0026rsquo;Xfce4, disponible depuis OpenBSD 6.6, il est un\npeu plus simple de configurer son environnement système personnel, pour\nfaire fonctionner aisément Xfce4.\u003c/p\u003e\n\u003cp\u003eDans un premier temps, je montre un configuration basique fonctionnel ;\npuis, j\u0026rsquo;ajouterai des informations qui peuvent améliorer votre \u0026ldquo;confort\u0026rdquo;\nfonctionnel.\u003c/p\u003e\n\u003ch3 id=\"xsession\"\u003e.xsession\u003c/h3\u003e\n\u003cp\u003eLe premier fichier à créer est le fichier personnel de session\n\u003ccode\u003e~/.xsession\u003c/code\u003e pour y ajouter simplement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexec xfce4-session\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"profil-utilisateur\"\u003eprofil utilisateur\u003c/h3\u003e\n\u003cp\u003eIl est impératif d\u0026rsquo;ajouter votre utilisateur système aux deux groupes\nsystèmes suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour utiliser les fonctions d\u0026rsquo;extinctions et de redémarrage :\n\u003cul\u003e\n\u003cli\u003eOpenBSD ≤ 7.3 : \u003cstrong\u003eoperator\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eOpenBSD ≥ 7.4 : \u003cstrong\u003e_shutdown\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ewheel\u003c/strong\u003e qui autorise à utiliser les fonctions de veille et\nd\u0026rsquo;hibernation, si elles sont disponibles sur votre système.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAvec des droits administrateurs :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# usermod -G _shutdown,wheel user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(modifier \u0026lsquo;user\u0026rsquo; par votre identifiant utilisateur, bien-sûr…)\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"performances\"\u003ePerformances\u003c/h3\u003e\n\u003ch4 id=\"apmd\"\u003eapmd\u003c/h4\u003e\n\u003cp\u003eConfigurer \u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/apm/\" title=\"Lien interne vers l\u0026#39;article : 'Apm : Programme de contrôle de la gestion de l\u0026#39;énergie et de l\u0026#39;hibernation'\"\u003eapmd\u003c/a\u003e\n\u003c/code\u003e va nous\npermettre d\u0026rsquo;utiliser la veille et l\u0026rsquo;hibernation.\nPour se faciliter, nous le mettrons en mode automatique d\u0026rsquo;ajustement des\nperformances.\u003c/p\u003e\n\u003ch4 id=\"obsdfreqd\"\u003eobsdfreqd\u003c/h4\u003e\n\u003cp\u003eSi vous avez un laptop ou que vous souhaitez que le système gère plus\nfinement l\u0026rsquo;ajustement des performances, vous pouvez préférer\nl\u0026rsquo;utilisation d\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/obsdfreqd/\" title=\"Lien interne vers l\u0026#39;article : 'obsdfreqd : un service pour gérer la fréquence CPU / OpenBSD'\"\u003eobsdfreqd : un service pour gérer la fréquence CPU / OpenBSD\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eobsdfreqd\u003c/strong\u003e est un gestionnaire de fréquences de CPU, créé par Solène\nRapenne. Il a été officiellement packagé depuis OpenBSD 7.1.\u003c/p\u003e\n\u003cp\u003eIl remplace le service natif \u003cstrong\u003eapmd\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eExplications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eil est nécessaire de démarrer \u003cstrong\u003eapmd\u003c/strong\u003e en mode manuel, pour\nqu\u0026rsquo;obsdfreqd le gère sans soucis.\u003c/li\u003e\n\u003cli\u003eles paramètres par défaut d\u0026rsquo;obsdfreqd suffisent généralement.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est suffisant pour faire fonctionner correctement Xfce4 sous OpenBSD.\nUn petit redémarrage de l\u0026rsquo;OS et ça devrait le faire. :p\u003c/p\u003e\n\u003cp\u003eMaintenant allons un peu plus loin dans la configuration, tel qu\u0026rsquo;avoir\nsa session en langue française, et d\u0026rsquo;autres petites astuces utiles.\u003c/p\u003e\n\u003ch3 id=\"profile\"\u003e.profile\u003c/h3\u003e\n\u003cp\u003eCommençons par configurer votre fichier personnel de profil \u003ccode\u003e~/.profile\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAjouter à celui de base les mentions suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEDITOR\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003evi\t# ou nano, emacs, voire vim\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eENV\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$HOME/.kshrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLC_MESSAGES\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003efr\t# ou fr_FR.UTF8, si vous préférez ; mais ça sera pareil !\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport EDITOR ENV LC_MESSAGES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Explications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePersonnellement j\u0026rsquo;aime et utilise l\u0026rsquo;éditeur de texte \u003cstrong\u003enano\u003c/strong\u003e ; \u003ccode\u003evi\u003c/code\u003e\nest installé de base, les autres sont à installer.\u003c/li\u003e\n\u003cli\u003eDéclaration d\u0026rsquo;un ENVironnement personnalisé, ici l\u0026rsquo;usage du\n\u003cstrong\u003eKorn Shell\u003c/strong\u003e, par défaut, qui est \u003cstrong\u003epdksh\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eDéfinissons simplement la langue FRançaise - il n\u0026rsquo;y a vraiment pas\nbesoin de plus.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBien-sûr, nous exportons les trois variables afin qu\u0026rsquo;elles soient toutes\nutiles et utilisées ensuite.\u003c/p\u003e\n\u003cp\u003ePour finir sur ce sujet, il est bien sûr possible de définir toute\nvariable d\u0026rsquo;environnement, telle \u003ccode\u003ePS1\u003c/code\u003e par exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eexport PS1=\u0026quot;[\\t] \\e[0;35m:\\u@\\h: \\e[0;32m\\w \\e[0;36m\\$ \\e[m\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoici un exemple du fichier fini :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: dot.profile,v 1.7 2020/01/24 02:09:51 okan Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sh/ksh initialization\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePATH\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:/usr/games\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport PATH HOME TERM\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEDITOR\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003enano\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eENV\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$HOME/.kshrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLC_MESSAGES\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003efr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport EDITOR ENV LC_MESSAGES\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eConcernant la variable \u003cstrong\u003eENV\u003c/strong\u003e, nous avons déclaré un fichier personnel\n\u003ccode\u003e~/.kshrc\u003c/code\u003e. Par défaut, il n\u0026rsquo;existe pas ; il suffit de le créer avec\nvotre éditeur de texte favori - \u003cem\u003ece que nous verrons ci-dessous…\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eIl faut modifier votre fichier personnel \u003ccode\u003e~/.xsession\u003c/code\u003e pour ajouter\nl\u0026rsquo;environnement du profil, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e. $HOME/.profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexec xfce4-session\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi votre session graphique tiendra compte des différents paramètrages\nde votre profil, tel que la gestion de la langue, par exemple…\u003c/p\u003e\n\u003ch3 id=\"kshrc\"\u003e.kshrc\u003c/h3\u003e\n\u003cp\u003eLe contenu de ce fichier personnel n\u0026rsquo;est pas compliqué. Voici quoi\najouter pour être fonctionnel :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e. /etc/ksh.kshrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e. $HOME/.profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHISTCONTROL\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eignoredumps\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHISTFILE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$HOME/.mksh_hist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHISTSIZE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e10000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePAGER\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eless\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport PAGER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Explications utiles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOn source le fichier d\u0026rsquo;initialisation globale pour ksh \u003ccode\u003e/etc/ksh.kshrc\u003c/code\u003e\nafin d\u0026rsquo;avoir un environnement shell correctement configuré par défaut\u003c/li\u003e\n\u003cli\u003eOn source le fichier de profil personnel et personnalisé\u003c/li\u003e\n\u003cli\u003eLes variables HIST* sont utiles pour l\u0026rsquo;historique des commandes\neffectuées :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eHISTFILE\u003c/code\u003e est la variable pour définir le fichier de sauvegarde de\nl\u0026rsquo;historique\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHISTSIZE\u003c/code\u003e est le nombre de commande à se souvenir ; à ne pas confondre\navec le nombre de lignes du fichier, qui lui est défini par la\nvariable \u003ccode\u003eHISTFILESIZE\u003c/code\u003e -\n\u003cem\u003enon définie ici\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003ePour finir, il n\u0026rsquo;y a pas besoin d\u0026rsquo;exporter ces variables\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dbus\"\u003edbus\u003c/h3\u003e\n\u003cp\u003eLe paquet \u003cstrong\u003edbus\u003c/strong\u003e est installé en tant que dépendance.\u003c/p\u003e\n\u003cp\u003eLes modifications ci-dessous ne sont pas essentielles, bien qu\u0026rsquo;utiles.\nElles sont relatées dans le fichier pkg-readme relatif.\u003c/p\u003e\n\u003cp\u003eAjouter à votre fichier personnel de session \u003ccode\u003e~/.xsession\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eif [ -x /usr/local/bin/dbus-launch -a -z \u0026#34;${DBUS_SESSION_BUS_ADDRESS}\u0026#34; ]; then\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eeval `dbus-launch --sh-syntax --exit-with-x11`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe fichier ressemblera ainsi au final à cela :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e. $HOME/.profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eif [ -x /usr/local/bin/dbus-launch -a -z \u0026#34;${DBUS_SESSION_BUS_ADDRESS}\u0026#34; ]; then\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eeval `dbus-launch --sh-syntax --exit-with-x11`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexec xfce4-session\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eLe pkg-readme \u003cstrong\u003eupower\u003c/strong\u003e nous informe qu\u0026rsquo;il est utile d\u0026rsquo;exécuter les\nservices \u003cstrong\u003eapmd\u003c/strong\u003e et \u003cstrong\u003emessagebus\u003c/strong\u003e afin que le système de gestion\nd\u0026rsquo;énergie fonctionne ; \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eactivons\u003c/a\u003e\n\net \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003edémarrons\u003c/a\u003e\n\n\u003cstrong\u003emessagebus\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ À ce propos si votre machine est un ordinateur portable,\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003exfce4-power-manager\u003c/code\u003e, qui n\u0026rsquo;est pas fourni par défaut.\u003c/p\u003e\n\u003ch3 id=\"impression\"\u003eImpression\u003c/h3\u003e\n\u003cp\u003ePour gérer l\u0026rsquo;impression, il est utile d\u0026rsquo;installer\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003eCUPS\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eDémarrons les services \u003cstrong\u003ecupsd\u003c/strong\u003e, voire \u003cstrong\u003ecups_browsed\u003c/strong\u003e - \u003cem\u003ece dernier\nétant utile pour la détection des imprimantes sur le réseau, utilisant\nles messages broadcast de type Bonjour.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eVoir : \u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/#cups\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003eCUPS\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;administration peut se faire au-travers de l\u0026rsquo;interface web de Cups,\ndisponible depuis l\u0026rsquo;URL http://localhost:631, ou des outils \u003cstrong\u003ecupsctl\u003c/strong\u003e,\n\u003cstrong\u003elpadmin\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDepuis OpenBSD 6.2, les binaires \u003cstrong\u003elpq\u003c/strong\u003e, \u003cstrong\u003elpr\u003c/strong\u003e, et \u003cstrong\u003elprm\u003c/strong\u003e doivent\nêtre symboliquement liés, pour fonctionner plus facilement.\u003c/p\u003e\n\u003cp\u003eÉditons à nouveau le fichier personnel \u003ccode\u003e~/.kshrc\u003c/code\u003e pour y ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efor i in lpq lpr lprm; do alias $i\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/usr/local/bin/$i; done \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"avahi\"\u003eAvahi\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eAvahi\u003c/strong\u003e est sous OpenBSD le service de découverte multicast DNS, de\ntype Bonjour.\u003c/p\u003e\n\u003cp\u003eIl suffit d\u0026rsquo;installer le paquet \u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003eavahi\u003c/a\u003e\n\u003c/code\u003e\npour en profiter puis d\u0026rsquo;activer et démarrer les services dans le bon\nordre.\u003c/p\u003e\n\u003ch2 id=\"astuces\"\u003eAstuces\u003c/h2\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eJe n\u0026rsquo;ai pas abordé la question des règles de parefeu, mais voici par\nexemple :\u003c/p\u003e\n\u003cp\u003e⇒ les \u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/#r%c3%a8gles-pf\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003erègles PF\u003c/a\u003e\n\npour Cups,\u003c/p\u003e\n\u003cp\u003e⇒ les \u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/#r%c3%a8gles-pf\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003erègles PF\u003c/a\u003e\n\npour Avahi.\u003c/p\u003e\n\u003cp\u003eBien-sûr, c\u0026rsquo;est à vous de voir à les utiliser, voire à les améliorer\nselon vos nécessités.\u003c/p\u003e\n\u003ch3 id=\"pour-finir\"\u003ePour finir\u003c/h3\u003e\n\u003cp\u003ePensez après vos modifications des fichiers personnels, à redémarrer à\nminima votre session, voire la machine. À vous de voir ! ;-)\u003c/p\u003e\n\u003cp\u003eAprès, à vous d\u0026rsquo;installer tout autre logiciel qui peut vous être utile.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eles différents fichiers pkg-readme :\n\u003cul\u003e\n\u003cli\u003e/usr/local/share/doc/pkg-readmes/xfce\u003c/li\u003e\n\u003cli\u003e/usr/local/share/doc/pkg-readmes/dbus\u003c/li\u003e\n\u003cli\u003e/usr/local/share/doc/pkg-readmes/upower\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003ela FAQ officielle : \u003ca href=\"https://wiki.xfce.org/faq\" rel=\"external\"\u003ehttps://wiki.xfce.org/faq\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eles trucs et astuces : \u003ca href=\"https://wiki.xfce.org/tips\" rel=\"external\"\u003ehttps://wiki.xfce.org/tips\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Installer et utiliser l'environnement de bureau graphique Xfce4 sous OpenBSD !",
            "tags": ["OpenBSD", "Xfce", "Xfce4"],
            "date_published": "2021-07-20T21:05:54+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:32df3fba-ff30-6979-fc60-60f623b95456",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/nut/",
            "title": "OpenBSD : Gérer un onduleur avec NUT",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Ayant un onduleur Eaton Ellipse ECO, j\u0026rsquo;utilise le projet NUT pour le gérer sous OpenBSD.\n⇒ Environnement :\nOpenBSD : 6.9 ⇒ 7.6 ⇒ Matériel UPS : Eaton Ellipse ECO 650 VA USB FR, MGE ELLIPSE 1000\nInstallation Installez nut\nConfiguration Le binaire nut-scanner permet de détecter tout matériel UPS connecté, que ce soit par USB, ou réseau.\nAvec des droits admins :\nExemple pour le Eaton Ellipse ECO 650 VA USB FR : :$ doas nut-scanner SNMP library not found. SNMP search disabled. Neon library not found. XML search disabled. AVAHI client library not found. AVAHI search disabled. Scanning USB bus. No start IP, skipping NUT bus (old connect method) [nutdev1] driver = \u0026#34;usbhid-ups\u0026#34; port = \u0026#34;auto\u0026#34; vendorid = \u0026#34;0463\u0026#34; productid = \u0026#34;FFFF\u0026#34; product = \u0026#34;Ellipse ECO\u0026#34; serial = \u0026#34;000000000\u0026#34; vendor = \u0026#34;EATON\u0026#34; bus = \u0026#34;005\u0026#34; Exemple avec le MGE ELLIPSE 1000 : Cannot load SNMP library (libnetsnmp.so) : file not found. SNMP search disabled. Cannot load XML library (libneon.so) : file not found. XML search disabled. Scanning USB bus. No start IP, skipping NUT bus (old connect method) Scanning NUT bus (avahi method). [nutdev1] driver = \u0026#34;usbhid-ups\u0026#34; port = \u0026#34;auto\u0026#34; vendorid = \u0026#34;0463\u0026#34; productid = \u0026#34;FFFF\u0026#34; product = \u0026#34;ELLIPSE\u0026#34; serial = \u0026#34;1H6G4401F\u0026#34; vendor = \u0026#34;MGE UPS SYSTEMS\u0026#34; bus = \u0026#34;001\u0026#34; device = \u0026#34;002\u0026#34; busport = \u0026#34;002\u0026#34; ###NOTMATCHED-YET###bcdDevice = \u0026#34;4241\u0026#34; Ensuite, plusieurs fichiers de configurations sont à modifier. Tout changement dans un des fichiers de configuration nécessite le redémarre des services ad hoc.\nups.conf Il faut remplir le fichier de configuration /etc/nut/ups.conf avec les informations retournées par le logiciel.\nExemple pour le Eaton Ellipse ECO 650 VA USB FR : (…) [eaton] desc = \u0026#34;Eaton Ellipse ECO 650 VA USB FR\u0026#34; driver = \u0026#34;usbhid-ups\u0026#34; port = \u0026#34;auto\u0026#34; vendorid = \u0026#34;0463\u0026#34; productid = \u0026#34;FFFF\u0026#34; product = \u0026#34;Ellipse ECO\u0026#34; serial = \u0026#34;000000000\u0026#34; vendor = \u0026#34;EATON\u0026#34; bus = \u0026#34;005\u0026#34; upsd.conf Ce fichier de configuration permet de paramètrer le contrôle de l\u0026rsquo;accès aux données gérées par le serveur upsd. Par défaut, le service est seulement accessible sur localhost, en IPv4 et IPv6, sur le port 3493.\nC\u0026rsquo;est ce fichier de configuration qu\u0026rsquo;il faudra modifier pour utiliser l\u0026rsquo;encapsulation TLS, si besoin.\nInfoDepuis la version 2.4.0 du projet NUT, les directives ACL et allowfrom ont été remplacés par la directive LISTEN et le mécanisme tcp-wrappers. (cf la note de changements…)\nNe cherchez plus à utiliser les directives ACL ; beaucoup de vieux tutoriels y font de fait références. Tenez en compte !\nAttentionSi la directive LISTEN est modifiée/configurée pour permettre l\u0026rsquo;écoute sur une adresse IPv4, IPv6, il sera nécessaire de configurer le parefeu PF pour autoriser la connexion sur le port adéquat, et filtrer ainsi les requêtes. upsd.users Ce fichier de configuration permet de configurer des utilisateurs qui auront les droits d\u0026rsquo;interagir avec le serveur upsd.\nAttentionIl est IMPératif que ce fichier ait des droits systèmes les plus minimalistes ! Par défaut, sous OpenBSD, seul l\u0026rsquo;utilisateur dédié y a accès en lecture-écriture.\n:$ doas chmod 0400 /etc/nut/upsd.users Profitons en pour configurer un utilisateur qui aura le droit de communiquer entre les services upsd et upsmon.\n[upsmon] password = *** upsmon master Ainsi nous créons :\nun utilisateur nommé upsmon - vous pouvez très bien choisir tout autre caractère ; à vous de le réutiliser correctement ensuite… qui a des droits maître sur le service upsmon. (la connotation n\u0026rsquo;a rien à voire avec de l\u0026rsquo;esclavage, elle définit le rôle qui selon sa dominance arrêtera en premier ou dernier le système, dans le cas de gestion des plusieurs OS connectés ; dans le contexte d\u0026rsquo;un seul OS géré, la valeur master s\u0026rsquo;impose d\u0026rsquo;elle-même). ensuite, modifier la valeur de la directive password par celle de votre choix. Puis modifions le fichier upsmon.conf.\nupsmon.conf Ce fichier de configuration paramètre le service moniteur.\nAttentionAttention ce fichier renferme des informations sensibles, il est donc impératif de veiller aux permissions et droits utilisateur. Suite à la modification du fichier upsd.users pour configurer un utilisateur upsmon, il nous faut ajouter une directive MONITOR, telle que :\nMONITOR eaton@localhost 1 upsmon *** master (Les \u0026lsquo;***\u0026rsquo; doivent correspondre au mot de passe configuré dans le fichier upsd.users pour l\u0026rsquo;utilisateur upsmon).\nEnsuite, il faut modifier à minima, les directives NOTIFYMSG, NOTIFYFLAG ; je vous renvoie à la documentation officielle, ainsi que pour connaître le rôle des autres directives.\nConcernant les directives NOTIFYFLAG, il importe d\u0026rsquo;ajouter le drapeau EXEC pour l\u0026rsquo;exécution des commandes liées. Sans, celles-ci ne seront pas exécutées.\nFinissons par parler de la directive NOTIFYCMD qui n\u0026rsquo;est pas paramétrée correctement :\ndans un premier temps, décommentons-la, puis changeons le chemin vers le binaire upssched Tel que :\nNOTIFYCMD /usr/local/sbin/upssched\nAinsi le service upsmon passera le relais au binaire upssched, qui lira alors la configuration du fichier upssched.conf.\nInfoPourquoi faire cela ?\nC\u0026rsquo;est simplement recommandé par la doc officielle, dans la sous section Suppressing notify storms où il est clairement écrit d\u0026rsquo;utiliser upssched en tant que notificateur de commande, afin d\u0026rsquo;éviter une \u0026ldquo;tornade de notifications\u0026rdquo;, qui pourrait avoir lieu dans certains contextes, si la directive NOTIFYCMD n\u0026rsquo;était pas configurée.\nupssched.conf Ce fichier de configuration permet de configurer des actions à planifier.\nIl faut décommenter les directives PIPEFN, LOCKFN, et enfin les directives AT.\nConcernant les deux directives LOCKFN et PIPEFN, le chemin absolu renseigné par défaut n\u0026rsquo;existe pas ; il faut le créer et lui donner les droits de l\u0026rsquo;utilisateur _ups :\n:# install -d -o _ups -g wheel -m 750 /var/db/nut/upssched Ensuite créer les directives AT nécessaires ; voici ce que j\u0026rsquo;ai configuré :\n(…) AT ONBATT * START-TIMER onbatt 15 AT ONBATT * START-TIMER onbattwarn 30 (…) AT ONLINE * CANCEL-TIMER onbatt AT ONLINE * CANCEL-TIMER onbattwarn (…) AT ONLINE * EXECUTE ups-back-on-line Sans parler qu\u0026rsquo;il est possible de modifier le script /usr/local/bin/upssched-cmd, pour interagir avec le système selon l\u0026rsquo;événement appelé.\nVeuillez lire plus profondément la doc officielle.\nupsset.conf Ce fichier de configuration permet l\u0026rsquo;usage de scripts CGI, fournit dans le paquet nut-cgi et n\u0026rsquo;a qu\u0026rsquo;un rôle : celui d\u0026rsquo;attester que la configuration pour utiliser les scripts CGI en question est bel et bien (soit-disant ?) sécurisée.\nIl ne sert que dans ce contexte.\nPermissions InfoÀ chaque migration de version d\u0026rsquo;OpenBSD, il sera nécessaire de changer à nouveau les permissions, car elles sont réinitialisées par défaut. Sous OpenBSD, lors de l\u0026rsquo;installation du binaire, sont configurés :\nun utilisateur : _ups le groupe : _ups Il est nécessaire de configurer les permissions utilisateurs afin d\u0026rsquo;avoir accès au nœud de dispositif adéquat.\n⇒ Pour les dispositifs USB, il faut identifier le contrôleur USB sur lequel est connecté le périphérique UPS, voire le(s) nœud(s) de dispositifs ugen.\nUtilisons la commande usbdevs :\n:$ doas usbdevs (…) Controller /dev/usb5: addr 01: 1002:0000 ATI, OHCI root hub addr 02: 0463:ffff EATON, Ellipse ECO (…) Dans mon cas, le périphérique UPS est connecté sur le contrôleur usb5, sans nœud de dispositifs précisé.\nEnsuite, il suffit de changer les droits utilisateurs sur le dispositif adéquat ; dans mon cas :\n:$ doas chown :_ups /dev/usb5 # ou, chgrp _ups /dev/usb5 :$ doas chmod g+w /dev/usb5 Ainsi le groupe _ups a accès au contrôleur !\nPour finir, assurons-nous d\u0026rsquo;avoir les droits utilisateurs sur les fichiers du répertoire de configuration \u0026lsquo;/etc/nut\u0026rsquo; :\n:$ doas chown _ups:_ups /etc/nut/ups* Normalement, cela suffit pour démarrer les services adéquats.\nAttentionCertains onduleurs de type APC USB ont des soucis, veuillez vous réferer au fichier pkg-readme fourni ! ⇒ Si l\u0026rsquo;onduleur est connecté par le port RS232, il faut soit :\najouter l\u0026rsquo;utilisateur _ups au groupe dialer, modifier les droits utilisateur sur le dispositif /dev/tty adéquat pour que l\u0026rsquo;utilisateur _ups puisse le gérer. Ce n\u0026rsquo;est pas le cas de mon onduleur ! ;-)\nServices Côté service, il faut donc activer puis démarrer les démons suivants :\nupsd : le service qui gère le serveur réseau upsmon : le service qui gère le moniteur Le service upsd doit être démarré avant le service upsmon.\n:$ doas rcctl enable upsd upsmon :$ doas rcctl set upsd flags -u _ups :$ doas rcctl start upsd upsmon Normallement, le log daemon doit notifier ainsi les services :\n(…) Jul 17 13:25:34 sh1 usbhid-ups[47317]: Startup successful Jul 17 13:25:34 sh1 upsd[83153]: listening on ::1 port 3493 Jul 17 13:25:34 sh1 upsd[83153]: listening on 127.0.0.1 port 3493 Jul 17 13:25:34 sh1 upsd[83153]: Connected to UPS [eaton]: usbhid-ups-eaton Jul 17 13:25:34 sh1 upsd[90348]: Startup successful Jul 17 13:25:34 sh1 upsmon[19005]: Startup successful (…) Vérification État Le binaire upsc permet de vérifier l\u0026rsquo;état de l\u0026rsquo;onduleur, tel que :\n:$ upsc eaton est la même chose que faire :$ upsc eaton@localhost\n⇒ Connaître l\u0026rsquo;état de la batterie :\n:$ upsc eaton ups.status OL La réponse OL signifie que la batterie fonctionne bien et que l\u0026rsquo;UPS est bien en ligne électrique ; OL : On Line OB : On Battery signifie que l\u0026rsquo;onduleur ne fonctionne plus que sur la batterie LB : Low Battery signifie que la batterie est à son niveau de charge le plus bas Les indicateurs OB et LB doivent déclencher des actions selon ce qui est paramétré dans les fichiers de configuration upsmon.conf, voire upssched.conf.\nProcessus et fichiers ouverts Il est possible de vérifier quels processus sont gérés par l\u0026rsquo;utilisateur _ups, voire quels sont les fichiers ouverts par lui, par exemple avec les commandes ps et fstat, tels que :\n:$ ps aux -U _ups USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND _ups 31655 0.0 0.0 836 1668 ?? S 5:07PM 0:00.70 /usr/local/bin/usbhid-ups -a eaton _ups 4840 0.0 0.0 764 1308 ?? S 5:07PM 0:00.12 /usr/local/sbin/upsd -u _ups _ups 65469 0.0 0.0 780 3084 ?? S 5:07PM 0:00.09 /usr/local/sbin/upsmon :$ fstat -u _ups -n USER CMD PID FD DEV INUM MODE R/W SZ|DV _ups upsmon 65469 wd 4,0 103712 40700 r 512 _ups upsmon 65469 0 4,0 27162 20666 rw 2,2 _ups upsmon 65469 1 4,0 27162 20666 rw 2,2 _ups upsmon 65469 2 4,0 27162 20666 rw 2,2 _ups upsmon 65469 3* internet stream tcp 0x0 127.0.0.1:26706 --\u0026gt; 127.0.0.1:3493 _ups upsmon 65469 4 pipe 0x0 state: _ups upsd 4840 wd 4,4 26111 40700 r 512 _ups upsd 4840 0 4,0 27162 20666 rw 2,2 _ups upsd 4840 1 4,0 27162 20666 rw 2,2 _ups upsd 4840 2 4,0 27162 20666 rw 2,2 _ups upsd 4840 3* internet6 stream tcp 0x0 [::1]:3493 _ups upsd 4840 4* internet stream tcp 0x0 127.0.0.1:3493 _ups upsd 4840 5* unix stream 0x0 _ups upsd 4840 6* internet stream tcp 0x0 127.0.0.1:3493 \u0026lt;-- 127.0.0.1:26706 _ups usbhid-ups 31655 wd 4,4 26111 40700 r 512 _ups usbhid-ups 31655 0 4,0 27162 20666 rw 2,2 _ups usbhid-ups 31655 1 4,0 27162 20666 rw 2,2 _ups usbhid-ups 31655 2 4,0 27162 20666 rw 2,2 _ups usbhid-ups 31655 3 pipe 0x0 state: _ups usbhid-ups 31655 4 pipe 0x0 state: _ups usbhid-ups 31655 5* unix stream 0x0 /var/db/nut/usbhid-ups-eaton _ups usbhid-ups 31655 6* unix stream 0x0 /var/db/nut/usbhid-ups-eaton Ainsi, on remarque que :\nles services upsd et upsmon fonctionnent, bien gérés par l\u0026rsquo;utilisateur _ups des flux TCP sont bien créés, utilisés sur localhost que le binaire usbhid-ups correspondant à celui qui prend en charge l\u0026rsquo;UPS fonctionne bien sur le profil eaton créé Dépannage Connection refused Voici, la série de messages :\n(…) upsd[55984]: Can\u0026#39;t connect to UPS [eaton] (usbhid-ups-eaton): Connection refused upsmon[20574]: Poll UPS [eaton@localhost] failed - Driver not connected upsmon[20574]: Communications with UPS eaton@localhost lost (…) upsmon[44238]: UPS eaton@localhost is unavailable upsmon[44238]: UPS [eaton@localhost]: connect failed: Connection failure: Connection refused (…) Au minimum, deux raisons possibles :\nvérifiez la connexion physique USB de l\u0026rsquo;onduleur. Il peut être utile de changer de câble USB, et/ou de débrancher pour rebrancher le câble. De même les ports USB de votre carte-mère, ou de votre hub USB commencent peut-être à être défectueux.\nlors d\u0026rsquo;une migration d\u0026rsquo;OpenBSD : il faut refaire les permissions nécessaires !\nLogin failed upsmon[39287]: Login on UPS [eaton@localhost] failed - got [ERR ACCESS-DENIED] Vérifier qu\u0026rsquo;un utilisateur a été configuré dans les fichiers upsd.users, qu\u0026rsquo;il corresponde bien à celui paramétré dans upsmon.conf.\nPermission denied upsd[87303]: Can\u0026#39;t open /etc/nut/upsd.conf: Permission denied Vérifier les droits utilisateurs sur le fichier en question, il doit appartenir à l\u0026rsquo;utilisateur _ups\nnut-cgi Le binaire nut-cgi fournit des scripts CGI pour interagir/visionner au-travers d\u0026rsquo;un service web le fonctionnement de l\u0026rsquo;onduleur.\nDans les faits, cela ne fonctionne officiellement qu\u0026rsquo;avec le serveur Apache, et nécessite l\u0026rsquo;écriture d\u0026rsquo;un fichier de configuration hosts.conf, non créé par défaut.\nPour la petite histoire, j\u0026rsquo;ai essayé de paramétrer et utiliser les services natifs que sont httpd et slowcgi puis à modifier le fichier de configuration upsset.conf, mais le service refuse de fonctionner en informant qu\u0026rsquo;il s\u0026rsquo;arrête par défaut de sécurité.\nRésultat : nut-cgi semble ne pas fonctionner avec httpd…\nVoici ci-dessous la configuration testée :\nhttpd Ici la configuration minimaliste du serveur httpd utilisée :\ntypes { include \u0026#34;/usr/share/misc/mime.types\u0026#34; } server \u0026#34;default\u0026#34; { listen on 127.0.0.1 port 80 log { access \u0026#34;httpd-default-access.log\u0026#34;, error \u0026#34;httpd-default-error.log\u0026#34; } location \u0026#34;/cgi-bin/nut/upsset.cgi\u0026#34; { fastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34; root \u0026#34;/\u0026#34; } } bin sh Pour que les scripts CGI, il semble nécessaire d\u0026rsquo;installer le binaire sh dans le chroot web :\n:$ doas install -o root -g bin -m 0555 /bin/sh /var/www/bin/ utilisateur www Il faut aussi donner les droits de l\u0026rsquo;utilsateur www sur le scrit CGI, tel que :\n:$ doas chown www:bin /var/www/cgi-bin/nut/upsset.cgi Il est de même possible de faire de même pour les deux autres scripts CGI ; à ne faire que si vraiment le besoin est réel.\nnut-cgi et hosts.conf Le fichier de configuration hosts.conf n\u0026rsquo;existe pas par défaut, sous OpenBSD. Il faut le créer et lui donner les droits de l\u0026rsquo;utilisateur _ups.\nDans mon cas :\n:$ doas echo \u0026#34;MONITOR eaton@localhost \\\u0026#34;Eaton Ellipse ECO 650 VA USB FR\\\u0026#34;\u0026#34; \u0026gt; /etc/nut/hosts.conf :$ doas chown _ups:_ups /etc/nut/hosts.conf nut-cgi et upsset.conf Il est nécessaire de décommenter l\u0026rsquo;écriture I_HAVE_SECURED_MY_CGI_DIRECTORY dans le fichier de configuration upsset.conf\nDocumentations Projet NUT : https://networkupstools.org/ pkg-readme : /usr/local/share/doc/pkg-readmes/nut ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eAyant un onduleur Eaton Ellipse ECO, j\u0026rsquo;utilise le projet \u003cabbr title=\"Network UPS Tools\"\u003eNUT\u003c/abbr\u003e\npour le gérer sous OpenBSD.\u003c/p\u003e\n\u003cp\u003e⇒ Environnement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : \u003cdel\u003e6.9\u003c/del\u003e ⇒ 7.6\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Matériel UPS : \u003cdel\u003eEaton Ellipse ECO 650 VA USB FR\u003c/del\u003e, \u003cstrong\u003eMGE ELLIPSE 1000\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n \u003cstrong\u003enut\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe binaire \u003cstrong\u003enut-scanner\u003c/strong\u003e permet de détecter tout matériel UPS connecté,\nque ce soit par USB, ou réseau.\u003c/p\u003e\n\u003cp\u003eAvec des droits admins :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExemple pour le Eaton Ellipse ECO 650 VA USB FR :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas nut-scanner\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSNMP library not found. SNMP search disabled.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNeon library not found. XML search disabled.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAVAHI client library not found. AVAHI search disabled.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning USB bus.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNo start IP, skipping NUT bus \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eold connect method\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003enutdev1\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003edriver\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;usbhid-ups\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;auto\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003evendorid\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;0463\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eproductid\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;FFFF\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eproduct\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ellipse ECO\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eserial\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;000000000\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003evendor\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;EATON\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003ebus\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;005\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eExemple avec le MGE ELLIPSE 1000 :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCannot load SNMP library \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elibnetsnmp.so\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e : file not found. SNMP search disabled.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCannot load XML library \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elibneon.so\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e : file not found. XML search disabled.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning USB bus.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNo start IP, skipping NUT bus \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eold connect method\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eScanning NUT bus \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eavahi method\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003enutdev1\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003edriver\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;usbhid-ups\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;auto\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003evendorid\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;0463\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eproductid\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;FFFF\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eproduct\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ELLIPSE\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003eserial\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;1H6G4401F\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003evendor\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;MGE UPS SYSTEMS\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003ebus\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;001\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003edevice\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;002\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003ebusport\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;002\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e###NOTMATCHED-YET###bcdDevice = \u0026#34;4241\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, plusieurs fichiers de configurations sont à modifier. Tout changement\ndans un des fichiers de configuration nécessite le redémarre des services\nad hoc.\u003c/p\u003e\n\u003ch3 id=\"upsconf\"\u003eups.conf\u003c/h3\u003e\n\u003cp\u003eIl faut remplir le fichier de configuration \u003ccode\u003e/etc/nut/ups.conf\u003c/code\u003e avec les\ninformations retournées par le logiciel.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExemple pour le Eaton Ellipse ECO 650 VA USB FR :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[eaton]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edesc\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Eaton Ellipse ECO 650 VA USB FR\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    driver = \u0026#34;usbhid-ups\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    port = \u0026#34;auto\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    vendorid = \u0026#34;0463\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    productid = \u0026#34;FFFF\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    product = \u0026#34;Ellipse ECO\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    serial = \u0026#34;000000000\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    vendor = \u0026#34;EATON\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    bus = \u0026#34;005\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"upsdconf\"\u003eupsd.conf\u003c/h3\u003e\n\u003cp\u003eCe fichier de configuration permet de paramètrer le contrôle de l\u0026rsquo;accès\naux données gérées par le serveur upsd. Par défaut, le service est seulement\naccessible sur localhost, en IPv4 et IPv6, sur le port 3493.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est ce fichier de configuration qu\u0026rsquo;il faudra modifier pour utiliser\nl\u0026rsquo;encapsulation TLS, si besoin.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eDepuis la version 2.4.0 du projet NUT, les directives \u003cstrong\u003eACL\u003c/strong\u003e et \u003cstrong\u003eallowfrom\u003c/strong\u003e\nont été remplacés par la directive \u003cstrong\u003eLISTEN\u003c/strong\u003e et le mécanisme tcp-wrappers.\n\u003cem\u003e(cf la \u003ca href=\"https://networkupstools.org/docs/user-manual.chunked/apis12.html\" rel=\"external\"\u003enote de changements\u003c/a\u003e…)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eNe cherchez plus à utiliser les directives ACL ; beaucoup de vieux tutoriels\ny font de fait références. Tenez en compte !\u003c/p\u003e\n\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eSi la directive LISTEN est modifiée/configurée pour permettre l\u0026rsquo;écoute sur\nune adresse IPv4, IPv6, il sera nécessaire de configurer le parefeu PF\npour autoriser la connexion sur le port adéquat, et filtrer ainsi les requêtes.\u003c/div\u003e\n\n\u003ch3 id=\"upsdusers\"\u003eupsd.users\u003c/h3\u003e\n\u003cp\u003eCe fichier de configuration permet de configurer des utilisateurs qui auront\nles droits d\u0026rsquo;interagir avec le serveur upsd.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl est IMPératif que ce fichier ait des droits systèmes les plus minimalistes !\n\u003cem\u003ePar défaut, sous OpenBSD, seul l\u0026rsquo;utilisateur dédié y a accès en lecture-écriture.\u003c/em\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas chmod \u003cspan style=\"color:#f99b15\"\u003e0400\u003c/span\u003e /etc/nut/upsd.users\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\n\u003cp\u003eProfitons en pour configurer un utilisateur qui aura le droit de communiquer\nentre les services upsd et upsmon.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[upsmon]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epassword\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e***\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    upsmon master\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi nous créons :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun utilisateur nommé \u003cstrong\u003eupsmon\u003c/strong\u003e - \u003cem\u003evous pouvez très bien choisir tout autre\ncaractère ; à vous de le réutiliser correctement ensuite\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003equi a des droits maître sur le service upsmon.\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003e(la connotation n\u0026rsquo;a rien à voire avec de l\u0026rsquo;esclavage, elle définit\nle rôle qui selon sa dominance arrêtera en premier ou dernier le système,\ndans le cas de gestion des plusieurs OS connectés ; dans le contexte\nd\u0026rsquo;un seul OS géré, la valeur \u003cstrong\u003emaster\u003c/strong\u003e s\u0026rsquo;impose d\u0026rsquo;elle-même)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eensuite, modifier la valeur de la directive \u003cstrong\u003epassword\u003c/strong\u003e par celle de votre choix.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis modifions le fichier \u003cstrong\u003eupsmon.conf\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"upsmonconf\"\u003eupsmon.conf\u003c/h3\u003e\n\u003cp\u003eCe fichier de configuration paramètre le service moniteur.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eAttention ce fichier renferme des informations sensibles, il est donc\nimpératif de veiller aux permissions et droits utilisateur.\u003c/div\u003e\n\n\u003cp\u003eSuite à la modification du fichier \u003cstrong\u003eupsd.users\u003c/strong\u003e pour configurer un utilisateur\n\u003cstrong\u003eupsmon\u003c/strong\u003e, il nous faut ajouter une directive \u003cstrong\u003eMONITOR\u003c/strong\u003e, telle que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eMONITOR eaton@localhost 1 upsmon *** master\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e(Les \u0026lsquo;***\u0026rsquo; doivent correspondre au mot de passe configuré dans le\nfichier \u003cstrong\u003eupsd.users\u003c/strong\u003e pour l\u0026rsquo;utilisateur \u003cstrong\u003eupsmon\u003c/strong\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eEnsuite, il faut modifier à minima, les directives \u003cstrong\u003eNOTIFYMSG\u003c/strong\u003e, \u003cstrong\u003eNOTIFYFLAG\u003c/strong\u003e ;\nje vous renvoie à la documentation officielle, ainsi que pour connaître\nle rôle des autres directives.\u003c/p\u003e\n\u003cp\u003eConcernant les directives \u003cstrong\u003eNOTIFYFLAG\u003c/strong\u003e, il importe d\u0026rsquo;ajouter le drapeau \u003cstrong\u003eEXEC\u003c/strong\u003e\npour l\u0026rsquo;exécution des commandes liées. Sans, celles-ci ne seront pas exécutées.\u003c/p\u003e\n\u003cp\u003eFinissons par parler de la directive \u003cstrong\u003eNOTIFYCMD\u003c/strong\u003e qui n\u0026rsquo;est pas paramétrée\ncorrectement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edans un premier temps, décommentons-la, puis\u003c/li\u003e\n\u003cli\u003echangeons le chemin vers le binaire \u003cstrong\u003eupssched\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eNOTIFYCMD /usr/local/sbin/upssched\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAinsi le service \u003cstrong\u003eupsmon\u003c/strong\u003e passera le relais au binaire \u003cstrong\u003eupssched\u003c/strong\u003e,\nqui lira alors la configuration du fichier \u003cstrong\u003eupssched.conf\u003c/strong\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003ePourquoi faire cela ?\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est simplement recommandé par la doc officielle, dans la sous section\n\u003cstrong\u003e\u003ca href=\"https://networkupstools.org/docs/user-manual.chunked/ar01s07.html\" rel=\"external\"\u003eSuppressing notify storms\u003c/a\u003e\u003c/strong\u003e\noù il est clairement écrit d\u0026rsquo;utiliser \u003cstrong\u003eupssched\u003c/strong\u003e en tant que\nnotificateur de commande, afin d\u0026rsquo;éviter une \u0026ldquo;tornade de notifications\u0026rdquo;,\nqui pourrait avoir lieu dans certains contextes, si la directive \u003cstrong\u003eNOTIFYCMD\u003c/strong\u003e\nn\u0026rsquo;était pas configurée.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"upsschedconf\"\u003eupssched.conf\u003c/h3\u003e\n\u003cp\u003eCe fichier de configuration permet de configurer des actions à planifier.\u003c/p\u003e\n\u003cp\u003eIl faut décommenter les directives \u003cstrong\u003ePIPEFN\u003c/strong\u003e, \u003cstrong\u003eLOCKFN\u003c/strong\u003e, et enfin les\ndirectives \u003cstrong\u003eAT\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eConcernant les deux directives \u003cstrong\u003eLOCKFN\u003c/strong\u003e et \u003cstrong\u003ePIPEFN\u003c/strong\u003e, le chemin absolu\nrenseigné par défaut n\u0026rsquo;existe pas ; il faut le créer et lui donner les droits\nde l\u0026rsquo;utilisateur \u003cstrong\u003e_ups\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# install -d -o _ups -g wheel -m \u003cspan style=\"color:#f99b15\"\u003e750\u003c/span\u003e /var/db/nut/upssched\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite créer les directives \u003cstrong\u003eAT\u003c/strong\u003e nécessaires ; voici ce que j\u0026rsquo;ai configuré :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAT ONBATT * START-TIMER onbatt 15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAT ONBATT * START-TIMER onbattwarn 30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAT ONLINE * CANCEL-TIMER onbatt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAT ONLINE * CANCEL-TIMER onbattwarn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAT ONLINE * EXECUTE ups-back-on-line\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSans parler qu\u0026rsquo;il est possible de modifier le script \u003ccode\u003e/usr/local/bin/upssched-cmd\u003c/code\u003e,\npour interagir avec le système selon l\u0026rsquo;événement appelé.\u003c/p\u003e\n\u003cp\u003eVeuillez lire plus profondément la doc officielle.\u003c/p\u003e\n\u003ch3 id=\"upssetconf\"\u003eupsset.conf\u003c/h3\u003e\n\u003cp\u003eCe fichier de configuration permet l\u0026rsquo;usage de scripts CGI, fournit dans le\npaquet \u003cstrong\u003enut-cgi\u003c/strong\u003e et n\u0026rsquo;a qu\u0026rsquo;un rôle : celui d\u0026rsquo;attester que la configuration\npour utiliser les scripts CGI en question est bel et bien (soit-disant ?)\nsécurisée.\u003c/p\u003e\n\u003cp\u003eIl ne sert \u003cstrong\u003eque\u003c/strong\u003e dans ce contexte.\u003c/p\u003e\n\u003ch3 id=\"permissions\"\u003ePermissions\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eÀ chaque migration de version d\u0026rsquo;OpenBSD, il sera nécessaire de changer à\nnouveau les permissions, car elles sont réinitialisées par défaut.\u003c/div\u003e\n\n\u003cp\u003eSous OpenBSD, lors de l\u0026rsquo;installation du binaire, sont configurés :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun utilisateur : \u003cstrong\u003e_ups\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele groupe : \u003cstrong\u003e_ups\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl est nécessaire de configurer les permissions utilisateurs afin d\u0026rsquo;avoir\naccès au nœud de dispositif adéquat.\u003c/p\u003e\n\u003cp\u003e⇒ Pour les dispositifs USB, il faut identifier le contrôleur USB sur lequel\nest connecté le périphérique UPS, voire le(s) nœud(s) de dispositifs \u003cstrong\u003eugen\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUtilisons la commande \u003cstrong\u003eusbdevs\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas usbdevs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eController /dev/usb5:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaddr 01: 1002:0000 ATI, OHCI root hub\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaddr 02: 0463:ffff EATON, Ellipse ECO\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eDans mon cas, le périphérique UPS est connecté sur le contrôleur \u003cstrong\u003eusb5\u003c/strong\u003e,\nsans nœud de dispositifs précisé\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eEnsuite, il suffit de changer les droits utilisateurs sur le dispositif adéquat ;\ndans mon cas :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas chown :_ups /dev/usb5 \u003cspan style=\"color:#776e71\"\u003e# ou, chgrp _ups /dev/usb5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas chmod g+w /dev/usb5\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi le groupe \u003cstrong\u003e_ups\u003c/strong\u003e a accès au contrôleur !\u003c/p\u003e\n\u003cp\u003ePour finir, assurons-nous d\u0026rsquo;avoir les droits utilisateurs sur les fichiers du\nrépertoire de configuration \u0026lsquo;/etc/nut\u0026rsquo; :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas chown _ups:_ups /etc/nut/ups*\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNormalement, cela suffit pour démarrer les services adéquats.\u003c/p\u003e\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCertains onduleurs de type APC USB ont des soucis, veuillez vous réferer au\nfichier pkg-readme fourni !\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003e⇒ Si l\u0026rsquo;onduleur est connecté par le port RS232, il faut soit :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eajouter l\u0026rsquo;utilisateur \u003cstrong\u003e_ups\u003c/strong\u003e au groupe \u003cstrong\u003edialer\u003c/strong\u003e,\u003c/li\u003e\n\u003cli\u003emodifier les droits utilisateur sur le dispositif \u003ccode\u003e/dev/tty\u003c/code\u003e adéquat pour\nque l\u0026rsquo;utilisateur \u003cstrong\u003e_ups\u003c/strong\u003e puisse le gérer.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eCe n\u0026rsquo;est pas le cas de mon onduleur !\u003c/em\u003e ;-)\u003c/p\u003e\n\u003ch3 id=\"services\"\u003eServices\u003c/h3\u003e\n\u003cp\u003eCôté service, il faut donc activer puis démarrer les démons suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eupsd\u003c/strong\u003e : le service qui gère le serveur réseau\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eupsmon\u003c/strong\u003e : le service qui gère le moniteur\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe service \u003cstrong\u003eupsd\u003c/strong\u003e doit être démarré avant le service \u003cstrong\u003eupsmon\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas rcctl enable upsd upsmon\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas rcctl set upsd flags -u _ups\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas rcctl start upsd upsmon\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNormallement, le log \u003cstrong\u003edaemon\u003c/strong\u003e doit notifier ainsi les services :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJul \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 13:25:34 sh1 usbhid-ups\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e47317\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Startup successful\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJul \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 13:25:34 sh1 upsd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e83153\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: listening on ::1 port \u003cspan style=\"color:#f99b15\"\u003e3493\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJul \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 13:25:34 sh1 upsd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e83153\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: listening on 127.0.0.1 port \u003cspan style=\"color:#f99b15\"\u003e3493\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJul \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 13:25:34 sh1 upsd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e83153\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Connected to UPS \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eeaton\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: usbhid-ups-eaton\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJul \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 13:25:34 sh1 upsd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e90348\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Startup successful\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eJul \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 13:25:34 sh1 upsmon\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e19005\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Startup successful\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"vérification\"\u003eVérification\u003c/h2\u003e\n\u003ch3 id=\"état\"\u003eÉtat\u003c/h3\u003e\n\u003cp\u003eLe binaire \u003cstrong\u003eupsc\u003c/strong\u003e permet de vérifier l\u0026rsquo;état de l\u0026rsquo;onduleur, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ upsc eaton\u003c/code\u003e est la même chose que faire \u003ccode\u003e:$ upsc eaton@localhost\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Connaître l\u0026rsquo;état de la batterie :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ upsc eaton ups.status\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOL\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eLa réponse \u003cstrong\u003eOL\u003c/strong\u003e signifie que la batterie fonctionne bien et que l\u0026rsquo;UPS est bien en ligne électrique ; \u003cstrong\u003eOL\u003c/strong\u003e : \u003cstrong\u003eOn Line\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOB\u003c/strong\u003e : \u003cstrong\u003eOn Battery\u003c/strong\u003e  signifie que l\u0026rsquo;onduleur ne fonctionne plus que sur la batterie\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eLB\u003c/strong\u003e : \u003cstrong\u003eLow Battery\u003c/strong\u003e signifie que la batterie est à son niveau de charge le plus bas\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes indicateurs \u003cstrong\u003eOB\u003c/strong\u003e et \u003cstrong\u003eLB\u003c/strong\u003e doivent déclencher des actions selon ce\nqui est paramétré dans les fichiers de configuration \u003cstrong\u003eupsmon.conf\u003c/strong\u003e, voire\n\u003cstrong\u003eupssched.conf\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"processus-et-fichiers-ouverts\"\u003eProcessus et fichiers ouverts\u003c/h3\u003e\n\u003cp\u003eIl est possible de vérifier quels processus sont gérés par l\u0026rsquo;utilisateur \u003cstrong\u003e_ups\u003c/strong\u003e,\nvoire quels sont les fichiers ouverts par lui, par exemple avec les\ncommandes \u003ccode\u003eps\u003c/code\u003e et \u003ccode\u003efstat\u003c/code\u003e, tels que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ps aux -U _ups\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER       PID %CPU %MEM   VSZ   RSS TT  STAT   STARTED       TIME COMMAND\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e  0.0  0.0   \u003cspan style=\"color:#f99b15\"\u003e836\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e1668\u003c/span\u003e ??  S       5:07PM    0:00.70 /usr/local/bin/usbhid-ups -a eaton\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups      \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e  0.0  0.0   \u003cspan style=\"color:#f99b15\"\u003e764\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e1308\u003c/span\u003e ??  S       5:07PM    0:00.12 /usr/local/sbin/upsd -u _ups\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     \u003cspan style=\"color:#f99b15\"\u003e65469\u003c/span\u003e  0.0  0.0   \u003cspan style=\"color:#f99b15\"\u003e780\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e3084\u003c/span\u003e ??  S       5:07PM    0:00.09 /usr/local/sbin/upsmon\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ fstat -u _ups -n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER     CMD          PID   FD  DEV      INUM        MODE   R/W    SZ|DV\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsmon     \u003cspan style=\"color:#f99b15\"\u003e65469\u003c/span\u003e   wd  4,0    \u003cspan style=\"color:#f99b15\"\u003e103712\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e40700\u003c/span\u003e    r      \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsmon     \u003cspan style=\"color:#f99b15\"\u003e65469\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsmon     \u003cspan style=\"color:#f99b15\"\u003e65469\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsmon     \u003cspan style=\"color:#f99b15\"\u003e65469\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsmon     \u003cspan style=\"color:#f99b15\"\u003e65469\u003c/span\u003e    3* internet stream tcp 0x0 127.0.0.1:26706 --\u0026gt; 127.0.0.1:3493\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsmon     \u003cspan style=\"color:#f99b15\"\u003e65469\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e pipe 0x0 state:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e   wd  4,4     \u003cspan style=\"color:#f99b15\"\u003e26111\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e40700\u003c/span\u003e    r      \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e    3* internet6 stream tcp 0x0 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e::1\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:3493\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e    4* internet stream tcp 0x0 127.0.0.1:3493\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e    5* unix stream 0x0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     upsd        \u003cspan style=\"color:#f99b15\"\u003e4840\u003c/span\u003e    6* internet stream tcp 0x0 127.0.0.1:3493 \u0026lt;-- 127.0.0.1:26706\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e   wd  4,4     \u003cspan style=\"color:#f99b15\"\u003e26111\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e40700\u003c/span\u003e    r      \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e  4,0     \u003cspan style=\"color:#f99b15\"\u003e27162\u003c/span\u003e        \u003cspan style=\"color:#f99b15\"\u003e20666\u003c/span\u003e   rw    2,2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e pipe 0x0 state:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e pipe 0x0 state:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e    5* unix stream 0x0 /var/db/nut/usbhid-ups-eaton\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_ups     usbhid-ups \u003cspan style=\"color:#f99b15\"\u003e31655\u003c/span\u003e    6* unix stream 0x0 /var/db/nut/usbhid-ups-eaton\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi, on remarque que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles services upsd et upsmon fonctionnent, bien gérés par l\u0026rsquo;utilisateur \u003cstrong\u003e_ups\u003c/strong\u003e\n\u003cul\u003e\n\u003cli\u003edes flux TCP sont bien créés, utilisés sur localhost\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eque le binaire \u003cstrong\u003eusbhid-ups\u003c/strong\u003e correspondant à celui qui prend en charge\nl\u0026rsquo;UPS fonctionne bien sur le profil \u003cstrong\u003eeaton\u003c/strong\u003e créé\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"connection-refused\"\u003eConnection refused\u003c/h3\u003e\n\u003cp\u003eVoici, la série de messages :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupsd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e55984\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Can\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003et connect to UPS \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eeaton\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eusbhid-ups-eaton\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: Connection refused\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupsmon\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e20574\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Poll UPS \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eeaton@localhost\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e failed - Driver not connected\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupsmon\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e20574\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Communications with UPS eaton@localhost lost\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupsmon\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e44238\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: UPS eaton@localhost is unavailable\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupsmon\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e44238\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: UPS \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eeaton@localhost\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: connect failed: Connection failure: Connection refused\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAu minimum, deux raisons possibles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003evérifiez la connexion physique USB\u003c/strong\u003e de l\u0026rsquo;onduleur. Il peut être utile\nde changer de câble USB, et/ou de débrancher pour rebrancher le câble.\nDe même les ports USB de votre carte-mère, ou de votre hub USB commencent\npeut-être à être défectueux.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003elors d\u0026rsquo;une migration d\u0026rsquo;OpenBSD\u003c/strong\u003e : il faut refaire les\n\u003ca href=\"/fr/sys/openbsd/nut/#permissions\"\u003epermissions\u003c/a\u003e nécessaires !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"login-failed\"\u003eLogin failed\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupsmon\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e39287\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Login on UPS \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eeaton@localhost\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e failed - got \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eERR ACCESS-DENIED\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVérifier qu\u0026rsquo;un utilisateur a été configuré dans les fichiers \u003cstrong\u003eupsd.users\u003c/strong\u003e,\nqu\u0026rsquo;il corresponde bien à celui paramétré dans \u003cstrong\u003eupsmon.conf\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"permission-denied\"\u003ePermission denied\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eupsd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e87303\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: Can\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003et open /etc/nut/upsd.conf: Permission denied\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVérifier les droits utilisateurs sur le fichier en question, il doit appartenir\nà l\u0026rsquo;utilisateur \u003cstrong\u003e_ups\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"nut-cgi\"\u003enut-cgi\u003c/h2\u003e\n\u003cp\u003eLe binaire \u003cstrong\u003enut-cgi\u003c/strong\u003e fournit des scripts CGI pour interagir/visionner\nau-travers d\u0026rsquo;un service web le fonctionnement de l\u0026rsquo;onduleur.\u003c/p\u003e\n\u003cp\u003eDans les faits, cela ne fonctionne officiellement qu\u0026rsquo;avec le serveur Apache,\net nécessite l\u0026rsquo;écriture d\u0026rsquo;un fichier de configuration \u003cstrong\u003ehosts.conf\u003c/strong\u003e, non créé par défaut.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour la petite histoire, j\u0026rsquo;ai essayé de paramétrer et utiliser les services\nnatifs que sont \u003cstrong\u003ehttpd\u003c/strong\u003e et \u003cstrong\u003eslowcgi\u003c/strong\u003e puis à modifier le fichier de configuration\n\u003cstrong\u003eupsset.conf\u003c/strong\u003e, mais le service refuse de fonctionner en informant qu\u0026rsquo;il\ns\u0026rsquo;arrête par défaut de sécurité.\u003c/p\u003e\n\u003cp\u003eRésultat : \u003cstrong\u003enut-cgi\u003c/strong\u003e semble ne pas fonctionner avec \u003cstrong\u003ehttpd\u003c/strong\u003e…\u003c/p\u003e\n\u003cp\u003eVoici ci-dessous la configuration testée :\u003c/p\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003eIci la configuration minimaliste du serveur httpd utilisée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etypes {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einclude \u0026#34;/usr/share/misc/mime.types\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver \u0026#34;default\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elisten on 127.0.0.1 port 80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elog { access \u0026#34;httpd-default-access.log\u0026#34;, error \u0026#34;httpd-default-error.log\u0026#34; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elocation \u0026#34;/cgi-bin/nut/upsset.cgi\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003efastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"bin-sh\"\u003ebin sh\u003c/h3\u003e\n\u003cp\u003ePour que les scripts CGI, il semble nécessaire d\u0026rsquo;installer le binaire \u003cstrong\u003esh\u003c/strong\u003e\ndans le chroot web :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas install -o root -g bin -m \u003cspan style=\"color:#f99b15\"\u003e0555\u003c/span\u003e /bin/sh /var/www/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"utilisateur-www\"\u003eutilisateur www\u003c/h3\u003e\n\u003cp\u003eIl faut aussi donner les droits de l\u0026rsquo;utilsateur \u003cstrong\u003ewww\u003c/strong\u003e sur le scrit CGI,\ntel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas chown www:bin /var/www/cgi-bin/nut/upsset.cgi\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est de même possible de faire de même pour les deux autres scripts CGI ;\nà ne faire que si vraiment le besoin est réel.\u003c/p\u003e\n\u003ch3 id=\"nut-cgi-et-hostsconf\"\u003enut-cgi et hosts.conf\u003c/h3\u003e\n\u003cp\u003eLe fichier de configuration \u003cstrong\u003ehosts.conf\u003c/strong\u003e n\u0026rsquo;existe pas par défaut, sous OpenBSD.\nIl faut le créer et lui donner les droits de l\u0026rsquo;utilisateur \u003cstrong\u003e_ups\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eDans mon cas :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;MONITOR eaton@localhost \\\u0026#34;Eaton Ellipse ECO 650 VA USB FR\\\u0026#34;\u0026#34;\u003c/span\u003e \u0026gt; /etc/nut/hosts.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas chown _ups:_ups /etc/nut/hosts.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"nut-cgi-et-upssetconf\"\u003enut-cgi et upsset.conf\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de décommenter l\u0026rsquo;écriture \u003cstrong\u003eI_HAVE_SECURED_MY_CGI_DIRECTORY\u003c/strong\u003e\ndans le fichier de configuration \u003cstrong\u003eupsset.conf\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eProjet NUT : \u003ca href=\"https://networkupstools.org/\" rel=\"external\"\u003ehttps://networkupstools.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003epkg-readme : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/nut\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Gérer un onduleur avec le projet NUT sur OpenBSD",
            "tags": ["OpenBSD", "NUT", "UPS"],
            "date_published": "2021-07-18T15:34:24+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:1efe3dc1-2b3f-8d26-c8b6-89c0b21b4843",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-howto-dl/",
            "title": "Comment télécharger en ligne de commande sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Par défaut, il y a la commande ftp utile pour télécharger un fichier en http :\n$ ftp -o /chemin/vers/lefichier.zip http://URL.com/fichier Il n\u0026rsquo;y a ni wget ni curl par défaut !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePar défaut, il y a la commande \u003ccode\u003eftp\u003c/code\u003e utile pour télécharger un fichier en http :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ftp -o /chemin/vers/lefichier.zip http://URL.com/fichier\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eIl n\u0026rsquo;y a ni \u003ccode\u003ewget\u003c/code\u003e ni \u003ccode\u003ecurl\u003c/code\u003e par défaut !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuce pour savoir comment télécharger en mode CLI depuis OpenBSD",
            "tags": ["OpenBSD", "Astuce"],
            "date_published": "2021-05-25T16:16:33+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:4d63b2ec-8ecd-4238-87fd-691d94db7154",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-checksum/",
            "title": "Créer une somme de contrôle sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Historiquement, sous OpenBSD, on utilise l\u0026rsquo;outil natif cksum(1) :\n$ cksum -a ${algo} -h ${hashfile} nom_fichier algo : est le nom de l\u0026rsquo;algorithme à choisir, parmi cksum, md5, rmd160, sha1, sha224, sha256, sha384, sha512/256, et sha512 hashfile : est le fichier de sorti de la somme de contrôle calculée InfoNote: il est aussi possible d\u0026rsquo;utiliser directement les algorithmes, tel que : $ sha256 -h ${hashfile} nom_fichier DangerAinsi que le rappelle le manpage md5(1) : Il n\u0026rsquo;est pas recommandé d\u0026rsquo;utiliser les algorithmes MD5, SHA1. Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eHistoriquement, sous OpenBSD, on utilise l\u0026rsquo;outil natif\n\u003ca href=\"https://man.openbsd.org/cksum\" rel=\"external\"\u003e\u003ccode\u003ecksum\u003c/code\u003e(1)\u003c/a\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cksum -a \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ealgo\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e -h \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ehashfile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e nom_fichier\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ealgo\u003c/code\u003e : est le nom de l\u0026rsquo;algorithme à choisir, parmi \u003ccode\u003ecksum\u003c/code\u003e, \u003ccode\u003emd5\u003c/code\u003e,\n\u003ccode\u003ermd160\u003c/code\u003e, \u003ccode\u003esha1\u003c/code\u003e, \u003ccode\u003esha224\u003c/code\u003e, \u003ccode\u003esha256\u003c/code\u003e, \u003ccode\u003esha384\u003c/code\u003e, \u003ccode\u003esha512/256\u003c/code\u003e, et\n\u003ccode\u003esha512\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehashfile\u003c/code\u003e : est le fichier de sorti de la somme de contrôle calculée\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eNote: il est aussi possible d\u0026rsquo;utiliser directement les algorithmes, tel que :\n\u003ccode\u003e$ sha256 -h ${hashfile} nom_fichier\u003c/code\u003e\u003c/div\u003e\n\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003eAinsi que le rappelle le manpage \u003ca href=\"https://man.openbsd.org/md5.1\" rel=\"external\"\u003e\u003ccode\u003emd5\u003c/code\u003e(1)\u003c/a\u003e :\nIl n\u0026rsquo;est pas recommandé d\u0026rsquo;utiliser les algorithmes MD5, SHA1.\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "tags": ["OpenBSD", "Astuce", "checksum"],
            "date_published": "2021-05-25T16:03:18+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:18be315d-e310-48ba-0f52-7e079bf0575f",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-video/",
            "title": "Gérer la vidéo sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Enregistrement Vidéo Par défaut, depuis OpenBSD 6.9, pour des raisons de confidentialité, l\u0026rsquo;enregistrement vidéo est désactivé !\nPour le réactiver : # sysctl kern.video.record=1\nN\u0026rsquo;oubliez pas de modifier le fichier /etc/sysctl.conf en conséquence, si vous désirez qu\u0026rsquo;il soit actif dès le démarrage :\n# echo kern.video.record=1 \u0026gt;\u0026gt; /etc/sysctl.conf\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"enregistrement-vidéo\"\u003eEnregistrement Vidéo\u003c/h2\u003e\n\u003cp\u003ePar défaut, depuis OpenBSD 6.9, pour des raisons de confidentialité,\nl\u0026rsquo;enregistrement vidéo est désactivé !\u003c/p\u003e\n\u003cp\u003ePour le réactiver : \u003ccode\u003e# sysctl kern.video.record=1\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de modifier le fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e en conséquence,\nsi vous désirez qu\u0026rsquo;il soit actif dès le démarrage :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# echo kern.video.record=1 \u0026gt;\u0026gt; /etc/sysctl.conf\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuce pour gérer la vidéo sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Video"],
            "date_published": "2021-05-15T12:48:12+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:88c8a4bc-882b-5042-bbe4-17af688b1f70",
            "url": "http://doc.huc.fr.eu.org/fr/trad/solene-rapenne/openbsd-bases-services/",
            "title": "Liste complète des services offerts par défaut dans OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;Full list of services offered by a default OpenBSD installation\u0026rdquo;, écrit par Solène Rapenne.\nIntroduction Cet article donne une courte description de CHACUN des services disponibles dans l\u0026rsquo;installation par défaut d\u0026rsquo;OpenBSD ( càd (c\u0026#39;est-à-dire) hors packages installés).\nParmi tous dans cette liste, les services suivant sont démarrés par défaut : cron, pflogd, sndiod, openssh, ntpd, syslogd et smtpd. Les démons réseaux que sont smtpd (localement), openssh et ntpd (client), sont fonctionnels.\nListe des Services J\u0026rsquo;ai extrait cette liste des services installés dans la base en recherchant dans /etc/rc/conf.\n:$ grep _flags /etc/rc.conf | cut -d '_' -f 1\namd Ce démon est utilisé pour monter automatiquement un serveur NFS (Network File System) distant quand une personne veut y accéder ; il peut fournir une méthode alternative en cas où le système de fichier n\u0026rsquo;est pas joignable. Vous aurez plus d\u0026rsquo;informations en utilisant la commande \u0026ldquo;info amd\u0026rdquo;.\namd apmd Ce démon est responsable de la gestion de la frèquence CPU (Central Processing Unit) . Il est important de l\u0026rsquo;exécuter sur une station de travail et spécifiquement sur un portable ; il peut aussi déclencher automatiquement la mise en veille ou une hibernation en cas de niveau de batterie bas.\napmd , apm bgpd C\u0026rsquo;est le démon BGP (Border Gateway Protocol) qui est utilisé par les routeurs réseaux pour échanger les routes avec d\u0026rsquo;autres routeurs. C\u0026rsquo;est ce qui fait principalement qu\u0026rsquo;Internet fonctionne ; chaque compagnie d\u0026rsquo;hébergement annonce leurs ensembles d\u0026rsquo;adresses IP (Internet Protocol) et comment les atteindre, en retour, elles reçoivent aussi les chemins pour se connecter à toutes les autres adresses.\nle site web d\u0026rsquo;OpenBGPD bootparamd Ce démon est utilisé pour le démarrage sans disque sur réseau ; il fournit l\u0026rsquo;information pour qu\u0026rsquo;un client, tel un point de montage NFS , utilise des dispositifs racine ou swap.\ndiskless cron C\u0026rsquo;est le démon qui lira la table de cron de chaque utilisateur et celles du système afin d\u0026rsquo;exécuter les commandes programmées. Les tables de cron utilisateur sont modifiées par l\u0026rsquo;usage de la commande crontab.\ncron , crontab , crontab(5) dhcpd C\u0026rsquo;est le serveur DHCP (Dynamic Host Control Protocol) utilisé pour fournir automatiquement des adresses IPv4 (Internet Protocol v4) sur le réseau aux systèmes utilisant un client DHCP .\ndhcpd(8) dhcpleased C\u0026rsquo;est un client DHCP - apparu sous OpenBSD 6.9 1\ndhcpleased(8) dhcrelay C\u0026rsquo;est un relais de requêtes DHCP , utilisé par une interface réseau pour relayer les requêtes vers une autre interface.\ndhcrelay(8) dvmrpd Ce démon est un démon de routage multicast, au cas où vous auriez besoin d\u0026rsquo;un spanning multicast pour le déployer en dehors de votre LAN (Local Area Network) local. Il est toutefois remplacé par PIM (Protocol-Independent Multicast) .\ndvmrpd(8) eigrpd Ce démon est un protocol de routage à états de liens pour une passerelle Internet ; il est comparable à OSPF (Open Shortest Path First) mais compatible avec CISCO.\neigrpd(8) ftpd C\u0026rsquo;est un serveur FTP (File Transfer Protocol) fournissant beaucoup de fonctionnalités. Bien que FTP soit abandonné et obsolète (certainement parce qu\u0026rsquo;il n\u0026rsquo;est pas pleinement fonctionnel dans le cas de NAT (Network Address Translation) ), il peut être utilisé pour fournir des accès en lecture et écriture anonymes sur un répertoire (et bien d\u0026rsquo;autres choses).\nftpd(8) ftpproxy C\u0026rsquo;est un démon proxy FTP qui est un de ceux supposés être fonctionnels par dessus NAT ; il ajoutera les règles PF (Packet Filter) automatiquement afin de connecter les requêtes entrantes au serveur derrière la NAT . C\u0026rsquo;est une partie de la folie FTP .\nftpproxy6 La version IPv6 (Internet Protocol v6) du précédent. Utiliser IPv6 derrière une NAT n\u0026rsquo;a pas de sens.\nhostapd C\u0026rsquo;est le démon qui permet à OpenBSD de devenir un point d\u0026rsquo;accès Wifi.\nhostapd(8) , hostapd.conf(5) hotplugd hotplugd est un magnifique démon qui exécutera des actions lorsque des dispositifs sont connectés ou déconnectés. Il pourrait être programmé pour exécuter automatiquement une sauvegarde si certaines conditions sont remplies, comme l\u0026rsquo;insertion d\u0026rsquo;un disque USB (Universal Serial Bus) correspondant à un nom connu ou comme le montage d\u0026rsquo;un lecteur.\nhotplugd(8) httpd httpd est le démon HTTP (HyperText Transfer Protocol) (S) qui supporte certaines fonctionnalités, telles la prise en charge de FastCGI, la réécriture d\u0026rsquo; URL (Uniform Resource Locator) et SNI (Server Name Indication) . Bien qu\u0026rsquo;il n\u0026rsquo;ait pas toutes les fonctionnalités d\u0026rsquo;un serveur web tel nginx, il est capable d\u0026rsquo;héberger certains programmes PHP tels que nextcloud, roundcube ou mediawiki.\nhttpd(8) , httpd.conf(5) identd identd est un démon pour le Protocole d\u0026rsquo;Identification qui retourne le nom de session pour un utilisateur qui a initié une connexion, qui peut être utilisé sur IRC (Internet Relay Chat) pour authentifier l\u0026rsquo;utilisateur.\nidentd(8) ifstated C\u0026rsquo;est le démon pour surveiller l\u0026rsquo;état des interfaces réseaux et qui peut mettre en place des actions lors de changements. Il peut être utiliser pour déclencher des changements en cas où une interface perd sa connectivité. Je l\u0026rsquo;ai utiliser pour déclencher un changement de route pour un dispositif 4G dans le cas où un ping échoue par dessus l\u0026rsquo;interface de liaison montante.\nifstated(8) , ifstated.conf(5) iked C\u0026rsquo;est le démon utilisé pour fournir une authentification IKEv2 afin d\u0026rsquo;établir un tunnel IPSec (Internet Protocol Security) .\nOpenBSD FAQ VPN inetd Ce démon est souvent oublié mais est très utile. inetd peut écouter sur les ports TCP (Transfer Control Protocol) ou UDP (User Datagram Protocol) et exécutera une commande lors de la connexion à un port donné, des données entrantes seront passées à l\u0026rsquo;entrée standard d\u0026rsquo;un programme et la sortie sera retournée au client. C\u0026rsquo;est une manière facile de transformer un programme en programme réseau ; il n\u0026rsquo;est pas largement utilisé car il n\u0026rsquo;est pas très évolutif. En effet, le processus d\u0026rsquo;exécution d\u0026rsquo;un nouveau programme à chaque connexion peut pousser un système à ses limites.\ninetd(8) isakmpd Ce démon est utilisé pour fournir une authentification IKEv1 afin d\u0026rsquo;établir un tunnel IPSec .\nisakmpd(8) iscsid Ce démon est un initiateur iSCSI (Internet Small Computer System Interface) qui connectera une cible iSCSI (c\u0026rsquo;est ainsi qu\u0026rsquo;est appelé un dispositif de bloc réseau) et l\u0026rsquo;exposera localement en tant que dispositif /dev/vcsi. OpenBSD ne fournit pas de démon de cible iSCSI dans son système de base mais il en existe un dans les ports.\niscsid(8) ldapd C\u0026rsquo;est un serveur LDAP (Lightweight Directory Access Protocol) léger, offrant la version 3 du protocole.\nldap , ldapd(8) , ldapd.conf(5) ldattach Ce démon permet de configurer des programmes exposés sur le port série, tels des dispositifs gps.\nldattach(8) ldomd Ce démon est spécifique à la plateforme sparc64 et fournit des services pour la fonctionnalité dom.\nldomd(8) ldpd Ce démon est utilisé pour les routeurs MPLS (MultiProtocol Label Switching) afin d\u0026rsquo;obtenir des labels.\nldpd(8) lockd Ce démon est utilisé comme part de l\u0026rsquo;environnement NFS pour supporter le verrouillage de fichiers.\nlpd Ce démon est utilisé pour gérer un accès à une imprimante.\nlpd(8) mountd Ce démon est utilisé pour les clients distants NFS afin d\u0026rsquo;obtenir l\u0026rsquo;information sur ce que le système offre actuellement. La commande showmount peut être utilisée pour voir ce qu\u0026rsquo;expose mountd.\nmountd(8) , showmount(8) mopd Ce démon est utilisé pour distribuer des images MOP, qui semble être relatif aux architectures alpha et WAX.\nmopd(8) mrouted Identique à dvmrpd.\nmrouted(8) nfsd Ce serveur est utiliser pour servir les requêtes NFS venant des clients NFS . Des statistiques NFS (client ou serveur) peuvent être obtenues par la commande nfsstat.\nnfsd(8) , nfsstat npppd Ce démon est utilisé pour établir une connexion par PPP (Point to Point Protocol) mais peut aussi créer des tunnels avec les protocoles L2TP (Layer 2 Tunneling Protocol) , PPTP (Point-to-Point Tunneling Protocol) et PPPoE (Point-to-Point Protocol over Ethernet) . PPP est utilisé par certains modems pour se connecter à Internet.\nnpppd(8) nsd Ce démon est un serveur de nom DNS (Domain Name Service) faisant autorité, ce qui signifie qu\u0026rsquo;il gère toutes les informations à-propos d\u0026rsquo;un nom de domaine et de ses sous-domaines. Il reçoit les requêtes depuis les serveurs récursifs, tels qu\u0026rsquo;unbound ou unwind, etc. Si vous voulez gérer un nom de domaine et que vous souhaitez le faire depuis votre système, c\u0026rsquo;est ce qu\u0026rsquo;il vous faut.\nnsd(8) , nsd.conf(5) ntpd Ce démon est un service NTP (Network Time Protocol) qui permet de garder l\u0026rsquo;horloge système à l\u0026rsquo;heure ; il peut utiliser des serveurs NTP ou des senseurs (tels des GPS (Global Positioning System) ) comme source de temps, mais aussi supporter des serveurs distants afin de challenger vos sources de temps. Il peut agir comme démon afin de fournir le temps aux autres clients NTP .\nntpd(8) ospfd C\u0026rsquo;est un démon pour le protocole de routage OSPF .\nospfd(8) ospf6d La version IPv6 du démon ci-dessus.\nospf6d(8) pflogd Ce démon reçoit les paquets depuis des règles PF correspondantes au mot clé \u0026ldquo;log\u0026rdquo; et enregistrera les données dans un fichier journal qui peut être réutiliser plus tard avec la commande tcpdump. Chaque paquet dans le fichier journal contient l\u0026rsquo;information sur quelle règle l\u0026rsquo;a déclenché, ce qui est très pratique pour l\u0026rsquo;analyse.\npflogd(8) , tcpdump(8) portmap Ce démon est utilisé en tant que partie de l\u0026rsquo;environnement NFS .\nportmap(8) rad Ce démon est utilisé sur les routeurs IPv6 pour avertir des routes, ainsi les clients peuvent automatiquement les obtenir.\nrad(8) radiusd Ce démon est utilisé pour offrir le protocole d\u0026rsquo;authentification RADIUS.\nradiusd(8) rarpd Ce démon est utilisé pour les démarrages sans disque, qui aide à associer une adresse ARP (Address Resolution Protocol) à une adresse IP et un nom d\u0026rsquo;hôte.\nrarpd(8) , diskless(8) rbootd Selon le manpage, il est dit \u0026ldquo;rboot répond aux demandes de démarrage d\u0026rsquo;une station de travail Hewlett-Packard sur le LAN \u0026rdquo;.\nrbootd(8) relayd Ce démon est utilisé pour accepter les connexions entrantes et les distribue aux services en arrière plan. Il prend en charge beaucoup de protocoles et peut agir de manière transparente ; son but est d\u0026rsquo;avoir un frontend qui délivrera les connexionx à un liste de backend mais aussi de vérifier leurs statuts.\nrelayd(8) , relayctl(8) , relayd.conf(5) resolvd C\u0026rsquo;est un démon pour gérer la configuration du fichier /etc/resolv.conf, qui contient les détails des noms de serveurs à interroger - apparu sous OpenBSD 6.9 1\nresolvd(8) ripd C\u0026rsquo;est un démon de routage utilisant un vieux protocole largement supporté.\nripd(8) route6d La version IPv6 du service ci-dessus.\nroute6d(8) sasyncd Ce démon est utilisé pour garder les passerelles IPSec synchronisées, en cas de repli nécessaire. Il peut être utilisé avec les dispositifs carp.\nsasyncd(8) savecore Ce démon a pour propos de sauvegarder un core dump du système d\u0026rsquo;exploitation.\nsavecore(8) sensorsd Ce démon recueille les informations de surveillance venant du matériel tel la température ou le status du disque. Si une vérification excède un niveau, une commande peut être exécutée.\nsensorsd(8) , sensorsd.conf(5) slaacd Ce service est un démon qui obtiendra automatiquement une configuration IPv6 sur le réseau.\nslaacd(8) slowcgi Ce démon est utilisé pour exposer un programme CGI (Common Gateway Interface) en tant que service FastCGI, permettant au serveur HTTP httpd d\u0026rsquo;exécuter du CGI . C\u0026rsquo;est l\u0026rsquo;équivalent d\u0026rsquo;inetd pour FastCGI.\nslowcgi(8) smtpd Ce démon est le serveur SMTP (Simple Mail Transfer Protocol) qui sera utilisé pour délivrer des mails localement ou vers un serveur mails distant.\nsmtpd(8) , smtpctl(8) , smtpd.conf(5) sndiod C\u0026rsquo;est un démon gérant le son depuis de nombreuses sources. Il prend en charge l\u0026rsquo;envoi de son local vers un serveur sndiod distant.\nsndiod(8) , sndioctl , mixerctl(8) OpenBSD FAQ Multimedia snmpd Ce démon est un serveur SNMP (Simple Network Management Protocol) exposant certaines métriques système à un client SNMP .\nsnmpd(8) , snmpd.conf(5) spamd Ce démon agit comme un faux serveur qui délaiera, bloquera ou laissera passer des courriels selon certaines règles. Il peut être utilisé pour ajouter une adresse IP à une liste de blocage, qui essaie d\u0026rsquo;envoyer un courriel à une adresse spécifique (tel qu\u0026rsquo;un \u0026ldquo;pot de miel\u0026rdquo;), de transmettre des courriels depuis des serveurs figurant dans une liste d\u0026rsquo;acceptation ou de délayer des connexions depuis des serveurs inconnus (liste grise) pour qu\u0026rsquo;ils se reconnectent plusieurs fois avant de transmettre le mail au serveur SMTP . C\u0026rsquo;est un moyen assez efficace d\u0026rsquo;empêcher le spam, mais perd de sa pertinence lorsque l\u0026rsquo;envoyeur utilise de larges ensembles d\u0026rsquo;adresses IP pour envoyer des courriels, signifiant que si vous essayer de recevoir un mail depuis un gros serveur, vous bloquerez le serveur X.Y.Z.1, mais X.Y.Z.2 essaiera et ainsi de suite, résultat aucun ne passera la liste grise.\nspamd(8) spamlogd Ce démon est dédié pour la mise à jour de liste d\u0026rsquo;acceptation de spamd.\nspamlogd(8) sshd C\u0026rsquo;est le bien connu serveur SSH (Secure SHell) . Permettre les connexions sécurisées vers un shell depuis un client distant. Il a beaucoup de fonctionnalités qui gagneraient à être connues, telles que les commandes de restriction par clé publique dans les fichiers ~/.ssh/authorized_keys ou SFTP (SSH File Transfer Protocol) permettant seuls les accès chrootés.\nsshd(8) , sshd_config(5) statd Ce démon est utilisé dans un environnement NFS gérant lockd afin de vérifier si l\u0026rsquo;hôte distant est toujours en vie.\nswitchd Ce démon est utilisé pour contrôler un pseudo dispositif de commutation;\nswitchd(8) , switchctl(8) , switch(4) syslogd C\u0026rsquo;est le serveur de journalisation qui reçoit les messages depuis les programmes locaux et les enregistrent en accord avec le fichier journal. Il peut être configuré pour capturer certains messages depuis des commandes, des programmes tels que sshlockout qui utilise cette méthode pour apprendre quelle adresse IP doit être bloquée, mais peut aussi écouter sur le réseau afin d\u0026rsquo;aggréger les journaux d\u0026rsquo;autres machines. Le programme newsyslog est utilisé pour faire une rotation des fichiers (déplacer un fichier, le compresser et permettre la création d\u0026rsquo;un nouveau et supprimer aussi les anciennes archives). Un script peut utiliser la commande logger pour envoyer du texte au syslog.\nsyslogd(8) , syslog.conf(5) , newsyslog(8) , logger tftpd Ce démon est le serveur TFTP (Trivial File Transfer Protocol) , utilisé afin de fournir des noyaux sur le réseau pour les machines sans disques ou pousser des fichiers aux appareils.\ndiskless(8) tftpproxy Ce démon est utilisé pour manipuler le parefeu PF afin de relayer les requêtes TFTP vers un serveur TFTP .\nunbound Ce démon est un serveur DNS récursif ; c\u0026rsquo;est le type de serveur listé dans le fichier /etc/resolv.conf qui est responsable de traduire un nom de domaine pleinement qualifié à l\u0026rsquo;adresse IP correspondante, en demandant un serveur à la fois, par exemple en demandant le serveur www.dataswamp.org, il est requis de demander au serveur faisant autorité .org où est le serveur faisant autorité pour dataswamp (faisant partie du domaine supérieur .org), puis le serveur DNS dataswamp.org sera interrogé pour savoir quelle est l\u0026rsquo;adresse IP de www.dataswamp.org. Il peut aussi garder les requêtes en cache et valide les requêtes et les réponses ; c\u0026rsquo;est une bonne idée d\u0026rsquo;avoir un tel serveur sur un LAN ayant beaucoup de clients pour lesquels partager un cache de requêtes.\nunbound(8) , unbound.conf(5) unwind Ce démon est un serveur DNS récursif local qui fera de son mieux pour donner des réponses valides ; il est conçu pour les utilisateurs nomades qui peuvent rencontrer des environnements hostiles tels que des portails captifs ou un serveur DNS par DHCP empêchant le fonctionnement de DNSSEC (Domain Name System Security Extensions) , etc. unwind interroge certaines sources DNS (récursif à partir des serveurs racines, fourni par DNS , stub ou un serveur DoT (DNS-over-TCP) depuis un fichier de configuration) régulièrement et choisit le plus rapide. Il agira aussi comme cache local et ne peut écouter sur le réseau pour ne pas être utilisé par d\u0026rsquo;autres clients. Il prend en charge aussi une liste bloquante de domaines en entrée.\nunwind(8) , unwindctl(8) , unwind.conf(5) vmd C\u0026rsquo;est le démon qui permet d\u0026rsquo;exécuter des machines virtuelles utilisant vmm. Depuis OpenBSD 6.4, il est capable de faire fonctionner des invités OpenBSD et Linux, sans interface graphique, et avec un seul cœur.\nvmd(8) , vmd.conf(5) , vmctl(8) , vmm(4) OpenBSD FAQ Virtualization watchdogd Ce démon est utilisé pour déclencher les timers watchdog, s\u0026rsquo;il y en a.\nwatchdogd(8) wsmoused Ce démon est utilisé pour fournir la prise en charge de la souris à la console.\nwsmoused(8) xenodm Ce démon est utilisé pour démarrer le serveur X et permettre aux utilisateurs leur propre authentification et se connecter à leur session.\nxenodm ypbind Ce démon est utilisé avec un serveur de Pages Jaunes ( YP (Yellow Page) pour garder et maintenir un fichier d\u0026rsquo;informations.\nypbind(8) ypldap Ce démon offre un service ( YP en utilisant un backend LDAP .\nypldap(8) ypserv Ce démon est un serveur ( YP.\nypserv(8) FIN\nNotes de Traduction 1 cette information n\u0026rsquo;est pas disponible sur l\u0026rsquo;article originel. ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://dataswamp.org/~solene/2021-02-16-openbsd-base-services.html\" rel=\"external\"\u003eFull list of services offered by a default OpenBSD installation\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Solène Rapenne.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eCet article donne une courte description de CHACUN des services disponibles\ndans l\u0026rsquo;installation par défaut d\u0026rsquo;OpenBSD (\n\n\n\n\n\n\n\u003cspan lang=\"fr\"\u003ecàd \u003cem\u003e(c\u0026#39;est-à-dire)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n hors packages\ninstallés).\u003c/p\u003e\n\u003cp\u003eParmi tous dans cette liste, les services suivant sont démarrés par défaut :\ncron, pflogd, sndiod, openssh, ntpd, syslogd et smtpd. Les démons réseaux\nque sont smtpd (localement), openssh et ntpd (client), sont fonctionnels.\u003c/p\u003e\n\u003ch2 id=\"liste-des-services\"\u003eListe des Services\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai extrait cette liste des services installés dans la base en recherchant\ndans \u003ccode\u003e/etc/rc/conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ grep _flags /etc/rc.conf | cut -d '_' -f 1\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"amd\"\u003eamd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour monter automatiquement un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eNFS \u003cem\u003e(Network File System)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ndistant quand une personne veut y accéder ; il peut fournir une méthode\nalternative en cas où le système de fichier n\u0026rsquo;est pas joignable. \u003cbr\u003e\nVous aurez plus d\u0026rsquo;informations en utilisant la commande \u0026ldquo;\u003ccode\u003einfo amd\u003c/code\u003e\u0026rdquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/amd\" title=\"Page du Manuel OpenBSD pour : amd\"\u003eamd\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"apmd\"\u003eapmd\u003c/h3\u003e\n\u003cp\u003eCe démon est responsable de la gestion de la frèquence \n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eCPU \u003cem\u003e(Central Processing Unit)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. Il\nest important de l\u0026rsquo;exécuter sur une station de travail et spécifiquement sur un\nportable ; il peut aussi déclencher automatiquement la mise en veille ou une\nhibernation en cas de niveau de batterie bas.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/apmd\" title=\"Page du Manuel OpenBSD pour : apmd\"\u003eapmd\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/apm\" title=\"Page du Manuel OpenBSD pour : apm\"\u003eapm\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"bgpd\"\u003ebgpd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le démon \n\n\n\n\n\n\u003cspan lang=\"en\"\u003eBGP \u003cem\u003e(Border Gateway Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n qui est utilisé par les routeurs réseaux pour\néchanger les routes avec d\u0026rsquo;autres routeurs. C\u0026rsquo;est ce qui fait principalement\nqu\u0026rsquo;Internet fonctionne ; chaque compagnie d\u0026rsquo;hébergement annonce leurs ensembles\nd\u0026rsquo;adresses \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIP \u003cem\u003e(Internet Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et comment les atteindre, en retour, elles\nreçoivent aussi les chemins pour se connecter à toutes les autres adresses.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele \u003ca href=\"http://www.openbgpd.org/\" rel=\"external\"\u003esite web d\u0026rsquo;OpenBGPD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"bootparamd\"\u003ebootparamd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour le démarrage sans disque sur réseau ; il fournit\nl\u0026rsquo;information pour qu\u0026rsquo;un client, tel un point de montage \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\nutilise des dispositifs racine ou swap.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/diskless\" title=\"Page du Manuel OpenBSD pour : diskless\"\u003ediskless\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"cron\"\u003ecron\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le démon qui lira la table de cron de chaque utilisateur et celles\ndu système afin d\u0026rsquo;exécuter les commandes programmées. Les tables de cron\nutilisateur sont modifiées par l\u0026rsquo;usage de la commande \u003ccode\u003ecrontab\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/cron\" title=\"Page du Manuel OpenBSD pour : cron\"\u003ecron\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/crontab\" title=\"Page du Manuel OpenBSD pour : crontab\"\u003ecrontab\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/crontab.5\" title=\"Page du Manuel OpenBSD pour : crontab\"\u003ecrontab(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dhcpd\"\u003edhcpd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDHCP \u003cem\u003e(Dynamic Host Control Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n utilisé pour fournir automatiquement des\nadresses \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPv4 \u003cem\u003e(Internet Protocol v4)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sur le réseau aux systèmes utilisant un client\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Dynamic Host Control Protocol\"\u003eDHCP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/dhcpd.8\" title=\"Page du Manuel OpenBSD pour : dhcpd\"\u003edhcpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dhcpleased\"\u003edhcpleased\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un client \n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Dynamic Host Control Protocol\"\u003eDHCP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n - \u003cem\u003eapparu sous OpenBSD 6.9\u003c/em\u003e \u003csup\u003e1\u003c/sup\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/dhcpleased.8\" title=\"Page du Manuel OpenBSD pour : dhcpleased\"\u003edhcpleased(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dhcrelay\"\u003edhcrelay\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un relais de requêtes \n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Dynamic Host Control Protocol\"\u003eDHCP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, utilisé par une interface\nréseau pour relayer les requêtes vers une autre interface.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/dhcrelay.8\" title=\"Page du Manuel OpenBSD pour : dhcrelay\"\u003edhcrelay(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dvmrpd\"\u003edvmrpd\u003c/h3\u003e\n\u003cp\u003eCe démon est un démon de routage multicast, au cas où vous auriez besoin\nd\u0026rsquo;un spanning multicast pour le déployer en dehors de votre \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eLAN \u003cem\u003e(Local Area Network)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nlocal. \u003cbr\u003e\nIl est toutefois remplacé par \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePIM \u003cem\u003e(Protocol-Independent Multicast)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/dvmrpd.8\" title=\"Page du Manuel OpenBSD pour : dvmrpd\"\u003edvmrpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"eigrpd\"\u003eeigrpd\u003c/h3\u003e\n\u003cp\u003eCe démon est un protocol de routage à états de liens pour une passerelle\nInternet ; il est comparable à \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eOSPF \u003cem\u003e(Open Shortest Path First)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n mais compatible avec CISCO.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/eigrpd.8\" title=\"Page du Manuel OpenBSD pour : eigrpd\"\u003eeigrpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ftpd\"\u003eftpd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eFTP \u003cem\u003e(File Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n fournissant beaucoup de fonctionnalités.\nBien que \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"File Transfer Protocol\"\u003eFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n soit abandonné et obsolète (certainement parce qu\u0026rsquo;il\nn\u0026rsquo;est pas pleinement fonctionnel dans le cas de \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eNAT \u003cem\u003e(Network Address Translation)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n), il peut\nêtre utilisé pour fournir des accès en lecture et écriture anonymes sur un\nrépertoire (et bien d\u0026rsquo;autres choses).\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ftpd.8\" title=\"Page du Manuel OpenBSD pour : ftpd\"\u003eftpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ftpproxy\"\u003eftpproxy\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un démon proxy \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"File Transfer Protocol\"\u003eFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n qui est un de ceux supposés être\nfonctionnels par dessus \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network Address Translation\"\u003eNAT\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ; il ajoutera les règles\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePF \u003cem\u003e(Packet Filter)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n automatiquement afin de connecter les requêtes entrantes au\nserveur derrière la \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network Address Translation\"\u003eNAT\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. C\u0026rsquo;est une partie de la folie\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"File Transfer Protocol\"\u003eFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003ch3 id=\"ftpproxy6\"\u003eftpproxy6\u003c/h3\u003e\n\u003cp\u003eLa version \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPv6 \u003cem\u003e(Internet Protocol v6)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du précédent. \u003cbr\u003e\nUtiliser \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n derrière une \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network Address Translation\"\u003eNAT\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n n\u0026rsquo;a pas de sens.\u003c/p\u003e\n\u003ch3 id=\"hostapd\"\u003ehostapd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le démon qui permet à OpenBSD de devenir un point d\u0026rsquo;accès Wifi.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/hostapd.8\" title=\"Page du Manuel OpenBSD pour : hostapd\"\u003ehostapd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/hostapd.conf.5\" title=\"Page du Manuel OpenBSD pour : hostapd.conf\"\u003ehostapd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"hotplugd\"\u003ehotplugd\u003c/h3\u003e\n\u003cp\u003ehotplugd est un magnifique démon qui exécutera des actions lorsque des\ndispositifs sont connectés ou déconnectés. \u003cbr\u003e\nIl pourrait être programmé pour exécuter automatiquement une sauvegarde si\ncertaines conditions sont remplies, comme l\u0026rsquo;insertion d\u0026rsquo;un disque\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eUSB \u003cem\u003e(Universal Serial Bus)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n correspondant à un nom connu ou comme le montage d\u0026rsquo;un lecteur.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/hotplugd.8\" title=\"Page du Manuel OpenBSD pour : hotplugd\"\u003ehotplugd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003ehttpd est le démon \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eHTTP \u003cem\u003e(HyperText Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n(S) qui supporte certaines fonctionnalités,\ntelles la prise en charge de FastCGI, la réécriture d\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eURL \u003cem\u003e(Uniform Resource Locator)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n et\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSNI \u003cem\u003e(Server Name Indication)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. \u003cbr\u003e\nBien qu\u0026rsquo;il n\u0026rsquo;ait pas toutes les fonctionnalités d\u0026rsquo;un serveur web tel nginx,\nil est capable d\u0026rsquo;héberger certains programmes PHP tels que nextcloud, roundcube\nou mediawiki.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.8\" title=\"Page du Manuel OpenBSD pour : httpd\"\u003ehttpd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.conf.5\" title=\"Page du Manuel OpenBSD pour : httpd.conf\"\u003ehttpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"identd\"\u003eidentd\u003c/h3\u003e\n\u003cp\u003eidentd est un démon pour le Protocole d\u0026rsquo;Identification qui retourne le nom\nde session pour un utilisateur qui a initié une connexion, qui peut être\nutilisé sur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIRC \u003cem\u003e(Internet Relay Chat)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour authentifier l\u0026rsquo;utilisateur.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/identd.8\" title=\"Page du Manuel OpenBSD pour : identd\"\u003eidentd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ifstated\"\u003eifstated\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le démon pour surveiller l\u0026rsquo;état des interfaces réseaux et qui peut\nmettre en place des actions lors de changements. Il peut être utiliser\npour déclencher des changements en cas où une interface perd sa connectivité.\nJe l\u0026rsquo;ai utiliser pour déclencher un changement de route pour un dispositif\n4G dans le cas où un ping échoue par dessus l\u0026rsquo;interface de liaison montante.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ifstated.8\" title=\"Page du Manuel OpenBSD pour : ifstated\"\u003eifstated(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/ifstated.conf.5\" title=\"Page du Manuel OpenBSD pour : ifstated.conf\"\u003eifstated.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"iked\"\u003eiked\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le démon utilisé pour fournir une authentification IKEv2 afin d\u0026rsquo;établir\nun tunnel \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPSec \u003cem\u003e(Internet Protocol Security)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/faq17.html\" rel=\"external\"\u003eOpenBSD FAQ VPN\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"inetd\"\u003einetd\u003c/h3\u003e\n\u003cp\u003eCe démon est souvent oublié mais est très utile. inetd peut écouter\nsur les ports \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eTCP \u003cem\u003e(Transfer Control Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ou \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eUDP \u003cem\u003e(User Datagram Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n et exécutera une commande\nlors de la connexion à un port donné, des données entrantes seront passées à\nl\u0026rsquo;entrée standard d\u0026rsquo;un programme et la sortie sera retournée au client. \u003cbr\u003e\nC\u0026rsquo;est une manière facile de transformer un programme en programme réseau ;\nil n\u0026rsquo;est pas largement utilisé car il n\u0026rsquo;est pas très évolutif.\nEn effet, le processus d\u0026rsquo;exécution d\u0026rsquo;un nouveau programme à chaque connexion\npeut pousser un système à ses limites.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/inetd.8\" title=\"Page du Manuel OpenBSD pour : inetd\"\u003einetd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"isakmpd\"\u003eisakmpd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour fournir une authentification IKEv1 afin d\u0026rsquo;établir\nun tunnel \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol Security\"\u003eIPSec\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/isakmpd.8\" title=\"Page du Manuel OpenBSD pour : isakmpd\"\u003eisakmpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"iscsid\"\u003eiscsid\u003c/h3\u003e\n\u003cp\u003eCe démon est un initiateur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eiSCSI \u003cem\u003e(Internet Small Computer System Interface)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n qui connectera une cible\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Small Computer System Interface\"\u003eiSCSI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n (c\u0026rsquo;est ainsi qu\u0026rsquo;est appelé un dispositif de bloc réseau) et\nl\u0026rsquo;exposera localement en tant que dispositif \u003ccode\u003e/dev/vcsi\u003c/code\u003e. OpenBSD ne fournit\npas de démon de cible \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Small Computer System Interface\"\u003eiSCSI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n dans son système de base mais il en\nexiste un dans les ports.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/iscsid.8\" title=\"Page du Manuel OpenBSD pour : iscsid\"\u003eiscsid(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ldapd\"\u003eldapd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eLDAP \u003cem\u003e(Lightweight Directory Access Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n léger, offrant la version 3 du protocole.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ldap\" title=\"Page du Manuel OpenBSD pour : ldap\"\u003eldap\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/ldapd.8\" title=\"Page du Manuel OpenBSD pour : ldapd\"\u003eldapd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/ldapd.conf.5\" title=\"Page du Manuel OpenBSD pour : ldapd.conf\"\u003eldapd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ldattach\"\u003eldattach\u003c/h3\u003e\n\u003cp\u003eCe démon permet de configurer des programmes exposés sur le port série,\ntels des dispositifs gps.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ldattach.8\" title=\"Page du Manuel OpenBSD pour : ldattach\"\u003eldattach(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ldomd\"\u003eldomd\u003c/h3\u003e\n\u003cp\u003eCe démon est spécifique à la plateforme sparc64 et fournit des services\npour la fonctionnalité dom.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ldomd.8\" title=\"Page du Manuel OpenBSD pour : ldomd\"\u003eldomd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ldpd\"\u003eldpd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour les routeurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eMPLS \u003cem\u003e(MultiProtocol Label Switching)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n afin d\u0026rsquo;obtenir des\nlabels.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ldpd.8\" title=\"Page du Manuel OpenBSD pour : ldpd\"\u003eldpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"lockd\"\u003elockd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé comme part de l\u0026rsquo;environnement \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour\nsupporter le verrouillage de fichiers.\u003c/p\u003e\n\u003ch3 id=\"lpd\"\u003elpd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour gérer un accès à une imprimante.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/lpd.8\" title=\"Page du Manuel OpenBSD pour : lpd\"\u003elpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mountd\"\u003emountd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour les clients distants \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n afin d\u0026rsquo;obtenir\nl\u0026rsquo;information sur ce que le système offre actuellement. La commande \u003ccode\u003eshowmount\u003c/code\u003e\npeut être utilisée pour voir ce qu\u0026rsquo;expose mountd.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/mountd.8\" title=\"Page du Manuel OpenBSD pour : mountd\"\u003emountd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/showmount.8\" title=\"Page du Manuel OpenBSD pour : showmount\"\u003eshowmount(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mopd\"\u003emopd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour distribuer des images MOP, qui semble être relatif\naux architectures alpha et WAX.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/mopd.8\" title=\"Page du Manuel OpenBSD pour : mopd\"\u003emopd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mrouted\"\u003emrouted\u003c/h3\u003e\n\u003cp\u003eIdentique à \u003ca href=\"/fr/trad/solene-rapenne/openbsd-bases-services/#dvmrpd\"\u003edvmrpd\u003c/a\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/mrouted.8\" title=\"Page du Manuel OpenBSD pour : mrouted\"\u003emrouted(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nfsd\"\u003enfsd\u003c/h3\u003e\n\u003cp\u003eCe serveur est utiliser pour servir les requêtes \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n venant des\nclients \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. Des statistiques \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n (client ou serveur)\npeuvent être obtenues par la commande \u003ccode\u003enfsstat\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/nfsd.8\" title=\"Page du Manuel OpenBSD pour : nfsd\"\u003enfsd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/nfsstat\" title=\"Page du Manuel OpenBSD pour : nfsstat\"\u003enfsstat\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"npppd\"\u003enpppd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour établir une connexion par \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePPP \u003cem\u003e(Point to Point Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nmais peut aussi créer des tunnels avec les protocoles \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eL2TP \u003cem\u003e(Layer 2 Tunneling Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePPTP \u003cem\u003e(Point-to-Point Tunneling Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePPPoE \u003cem\u003e(Point-to-Point Protocol over Ethernet)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. \u003cbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Point to Point Protocol\"\u003ePPP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est utilisé par certains modems pour se connecter à Internet.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/npppd.8\" title=\"Page du Manuel OpenBSD pour : npppd\"\u003enpppd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nsd\"\u003ensd\u003c/h3\u003e\n\u003cp\u003eCe démon est un serveur de nom \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDNS \u003cem\u003e(Domain Name Service)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n faisant autorité, ce qui\nsignifie qu\u0026rsquo;il gère toutes les informations à-propos d\u0026rsquo;un nom de domaine et de\nses sous-domaines. \u003cbr\u003e\nIl reçoit les requêtes depuis les serveurs récursifs, tels qu\u0026rsquo;unbound ou\nunwind, etc. \u003cbr\u003e\nSi vous voulez gérer un nom de domaine et que vous souhaitez le faire depuis\nvotre système, c\u0026rsquo;est ce qu\u0026rsquo;il vous faut.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/nsd.8\" title=\"Page du Manuel OpenBSD pour : nsd\"\u003ensd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/nsd.conf.5\" title=\"Page du Manuel OpenBSD pour : nsd.conf\"\u003ensd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ntpd\"\u003entpd\u003c/h3\u003e\n\u003cp\u003eCe démon est un service \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eNTP \u003cem\u003e(Network Time Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n qui permet de garder l\u0026rsquo;horloge\nsystème à l\u0026rsquo;heure ; il peut utiliser des serveurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network Time Protocol\"\u003eNTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ou des\nsenseurs (tels des \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eGPS \u003cem\u003e(Global Positioning System)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n) comme source de temps, mais aussi\nsupporter des serveurs distants afin de challenger vos sources de temps. Il\npeut agir comme démon afin de fournir le temps aux autres clients\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network Time Protocol\"\u003eNTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n .\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ntpd.8\" title=\"Page du Manuel OpenBSD pour : ntpd\"\u003entpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ospfd\"\u003eospfd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un démon pour le protocole de routage \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Open Shortest Path First\"\u003eOSPF\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ospfd.8\" title=\"Page du Manuel OpenBSD pour : ospfd\"\u003eospfd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ospf6d\"\u003eospf6d\u003c/h3\u003e\n\u003cp\u003eLa version \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du démon ci-dessus.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ospf6d.8\" title=\"Page du Manuel OpenBSD pour : ospf6d\"\u003eospf6d(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pflogd\"\u003epflogd\u003c/h3\u003e\n\u003cp\u003eCe démon reçoit les paquets depuis des règles \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Packet Filter\"\u003ePF\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n correspondantes\nau mot clé \u0026ldquo;log\u0026rdquo; et enregistrera les données dans un fichier journal qui peut\nêtre réutiliser plus tard avec la commande \u003ccode\u003etcpdump\u003c/code\u003e. \u003cbr\u003e\nChaque paquet dans le fichier journal contient l\u0026rsquo;information sur quelle règle\nl\u0026rsquo;a déclenché, ce qui est très pratique pour l\u0026rsquo;analyse.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/pflogd.8\" title=\"Page du Manuel OpenBSD pour : pflogd\"\u003epflogd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/tcpdump.8\" title=\"Page du Manuel OpenBSD pour : tcpdump\"\u003etcpdump(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"portmap\"\u003eportmap\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé en tant que partie de l\u0026rsquo;environnement \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/portmap.8\" title=\"Page du Manuel OpenBSD pour : portmap\"\u003eportmap(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rad\"\u003erad\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé sur les routeurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour avertir des\nroutes, ainsi les clients peuvent automatiquement les obtenir.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/rad.8\" title=\"Page du Manuel OpenBSD pour : rad\"\u003erad(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"radiusd\"\u003eradiusd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour offrir le protocole d\u0026rsquo;authentification RADIUS.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/radiusd.8\" title=\"Page du Manuel OpenBSD pour : radiusd\"\u003eradiusd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rarpd\"\u003erarpd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour les démarrages sans disque, qui aide à associer\nune adresse \n\n\n\n\u003cspan lang=\"en\"\u003eARP \u003cem\u003e(Address Resolution Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n à une adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et un nom d\u0026rsquo;hôte.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/rarpd.8\" title=\"Page du Manuel OpenBSD pour : rarpd\"\u003erarpd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/diskless.8\" title=\"Page du Manuel OpenBSD pour : diskless\"\u003ediskless(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rbootd\"\u003erbootd\u003c/h3\u003e\n\u003cp\u003eSelon le manpage, il est dit \u0026ldquo;rboot répond aux demandes de démarrage d\u0026rsquo;une\nstation de travail Hewlett-Packard sur le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Local Area Network\"\u003eLAN\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u0026rdquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/rbootd.8\" title=\"Page du Manuel OpenBSD pour : rbootd\"\u003erbootd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour accepter les connexions entrantes et les distribue\naux services en arrière plan.\nIl prend en charge beaucoup de protocoles et peut agir de manière transparente ;\nson but est d\u0026rsquo;avoir un frontend qui délivrera les connexionx à un liste\nde backend mais aussi de vérifier leurs statuts.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayctl.8\" title=\"Page du Manuel OpenBSD pour : relayctl\"\u003erelayctl(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.conf.5\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"resolvd\"\u003eresolvd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un démon pour gérer la configuration du fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e,\nqui contient les détails des noms de serveurs à interroger -\n\u003cem\u003eapparu sous OpenBSD 6.9\u003c/em\u003e \u003csup\u003e1\u003c/sup\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/resolvd.8\" title=\"Page du Manuel OpenBSD pour : resolvd\"\u003eresolvd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ripd\"\u003eripd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un démon de routage utilisant un vieux protocole largement supporté.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ripd.8\" title=\"Page du Manuel OpenBSD pour : ripd\"\u003eripd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"route6d\"\u003eroute6d\u003c/h3\u003e\n\u003cp\u003eLa version \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du service ci-dessus.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/route6d.8\" title=\"Page du Manuel OpenBSD pour : route6d\"\u003eroute6d(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"sasyncd\"\u003esasyncd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour garder les passerelles \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol Security\"\u003eIPSec\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nsynchronisées, en cas de repli nécessaire. Il peut être utilisé avec les\ndispositifs carp.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/sasyncd.8\" title=\"Page du Manuel OpenBSD pour : sasyncd\"\u003esasyncd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"savecore\"\u003esavecore\u003c/h3\u003e\n\u003cp\u003eCe démon a pour propos de sauvegarder un core dump du système d\u0026rsquo;exploitation.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/savecore.8\" title=\"Page du Manuel OpenBSD pour : savecore\"\u003esavecore(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"sensorsd\"\u003esensorsd\u003c/h3\u003e\n\u003cp\u003eCe démon recueille les informations de surveillance venant du matériel\ntel la température ou le status du disque. Si une vérification excède un\nniveau, une commande peut être exécutée.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/sensorsd.8\" title=\"Page du Manuel OpenBSD pour : sensorsd\"\u003esensorsd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sensorsd.conf.5\" title=\"Page du Manuel OpenBSD pour : sensorsd.conf\"\u003esensorsd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"slaacd\"\u003eslaacd\u003c/h3\u003e\n\u003cp\u003eCe service est un démon qui obtiendra automatiquement une configuration\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sur le réseau.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/slaacd.8\" title=\"Page du Manuel OpenBSD pour : slaacd\"\u003eslaacd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"slowcgi\"\u003eslowcgi\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour exposer un programme \n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eCGI \u003cem\u003e(Common Gateway Interface)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n en tant que\nservice FastCGI, permettant au serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \u003ca href=\"/fr/trad/solene-rapenne/openbsd-bases-services/#httpd\"\u003ehttpd\u003c/a\u003e\nd\u0026rsquo;exécuter du \n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Common Gateway Interface\"\u003eCGI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. C\u0026rsquo;est l\u0026rsquo;équivalent d\u0026rsquo;\u003ca href=\"/fr/trad/solene-rapenne/openbsd-bases-services/#inetd\"\u003einetd\u003c/a\u003e pour\nFastCGI.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/slowcgi.8\" title=\"Page du Manuel OpenBSD pour : slowcgi\"\u003eslowcgi(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"smtpd\"\u003esmtpd\u003c/h3\u003e\n\u003cp\u003eCe démon est le serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSMTP \u003cem\u003e(Simple Mail Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n qui sera utilisé pour délivrer des\nmails localement ou vers un serveur mails distant.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/smtpd.8\" title=\"Page du Manuel OpenBSD pour : smtpd\"\u003esmtpd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/smtpctl.8\" title=\"Page du Manuel OpenBSD pour : smtpctl\"\u003esmtpctl(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/smtpd.conf.5\" title=\"Page du Manuel OpenBSD pour : smtpd.conf\"\u003esmtpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"sndiod\"\u003esndiod\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est un démon gérant le son depuis de nombreuses sources. Il prend en\ncharge l\u0026rsquo;envoi de son local vers un serveur sndiod distant.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/sndiod.8\" title=\"Page du Manuel OpenBSD pour : sndiod\"\u003esndiod(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sndioctl\" title=\"Page du Manuel OpenBSD pour : sndioctl\"\u003esndioctl\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/mixerctl.8\" title=\"Page du Manuel OpenBSD pour : mixerctl\"\u003emixerctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/faq13.html\" rel=\"external\"\u003eOpenBSD FAQ Multimedia\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"snmpd\"\u003esnmpd\u003c/h3\u003e\n\u003cp\u003eCe démon est un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSNMP \u003cem\u003e(Simple Network Management Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n exposant certaines métriques système\nà un client \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/snmpd.8\" title=\"Page du Manuel OpenBSD pour : snmpd\"\u003esnmpd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/snmpd.conf.5\" title=\"Page du Manuel OpenBSD pour : snmpd.conf\"\u003esnmpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"spamd\"\u003espamd\u003c/h3\u003e\n\u003cp\u003eCe démon agit comme un faux serveur qui délaiera, bloquera ou laissera passer\ndes courriels selon certaines règles. Il peut être utilisé pour ajouter\nune adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n à une liste de blocage, qui essaie d\u0026rsquo;envoyer un\ncourriel à une adresse spécifique (tel qu\u0026rsquo;un \u0026ldquo;pot de miel\u0026rdquo;), de transmettre des\ncourriels depuis des serveurs figurant dans une liste d\u0026rsquo;acceptation ou de délayer\ndes connexions depuis des serveurs inconnus (liste grise) pour qu\u0026rsquo;ils se\nreconnectent plusieurs fois avant de transmettre le mail au serveur\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Mail Transfer Protocol\"\u003eSMTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. \u003cbr\u003e\nC\u0026rsquo;est un moyen assez efficace d\u0026rsquo;empêcher le spam, mais perd de sa pertinence\nlorsque l\u0026rsquo;envoyeur utilise de larges ensembles d\u0026rsquo;adresses \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour\nenvoyer des courriels, signifiant que si vous essayer de recevoir un mail depuis\nun gros serveur, vous bloquerez le serveur X.Y.Z.1, mais X.Y.Z.2 essaiera\net ainsi de suite, résultat aucun ne passera la liste grise.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/spamd.8\" title=\"Page du Manuel OpenBSD pour : spamd\"\u003espamd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"spamlogd\"\u003espamlogd\u003c/h3\u003e\n\u003cp\u003eCe démon est dédié pour la mise à jour de liste d\u0026rsquo;acceptation de \u003ca href=\"/fr/trad/solene-rapenne/openbsd-bases-services/#spamd\"\u003espamd\u003c/a\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/spamlogd.8\" title=\"Page du Manuel OpenBSD pour : spamlogd\"\u003espamlogd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"sshd\"\u003esshd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le bien connu serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSSH \u003cem\u003e(Secure SHell)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. Permettre les connexions\nsécurisées vers un shell depuis un client distant. Il a beaucoup de\nfonctionnalités qui gagneraient à être connues, telles que les commandes de\nrestriction par clé publique dans les fichiers \u003ccode\u003e~/.ssh/authorized_keys\u003c/code\u003e ou\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSFTP \u003cem\u003e(SSH File Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n permettant seuls les accès chrootés.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/sshd.8\" title=\"Page du Manuel OpenBSD pour : sshd\"\u003esshd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sshd_config.5\" title=\"Page du Manuel OpenBSD pour : sshd_config\"\u003esshd_config(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"statd\"\u003estatd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé dans un environnement \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Network File System\"\u003eNFS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n gérant \u003ca href=\"/fr/trad/solene-rapenne/openbsd-bases-services/#lockd\"\u003elockd\u003c/a\u003e\nafin de vérifier si l\u0026rsquo;hôte distant est toujours en vie.\u003c/p\u003e\n\u003ch3 id=\"switchd\"\u003eswitchd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour contrôler un pseudo dispositif de commutation;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/switchd.8\" title=\"Page du Manuel OpenBSD pour : switchd\"\u003eswitchd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/switchctl.8\" title=\"Page du Manuel OpenBSD pour : switchctl\"\u003eswitchctl(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/switch.4\" title=\"Page du Manuel OpenBSD pour : switch\"\u003eswitch(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"syslogd\"\u003esyslogd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le serveur de journalisation qui reçoit les messages depuis les\nprogrammes locaux et les enregistrent en accord avec le fichier journal.\nIl peut être configuré pour capturer certains messages depuis des commandes,\ndes programmes tels que sshlockout qui utilise cette méthode pour apprendre\nquelle adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n doit être bloquée, mais peut aussi écouter sur\nle réseau afin d\u0026rsquo;aggréger les journaux d\u0026rsquo;autres machines. \u003cbr\u003e\nLe programme \u003ccode\u003enewsyslog\u003c/code\u003e est utilisé pour faire une rotation des fichiers\n(déplacer un fichier, le compresser et permettre la création d\u0026rsquo;un nouveau\net supprimer aussi les anciennes archives). Un script peut utiliser la\ncommande \u003ccode\u003elogger\u003c/code\u003e pour envoyer du texte au syslog.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/syslogd.8\" title=\"Page du Manuel OpenBSD pour : syslogd\"\u003esyslogd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/syslog.conf.5\" title=\"Page du Manuel OpenBSD pour : syslog.conf\"\u003esyslog.conf(5)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/newsyslog.8\" title=\"Page du Manuel OpenBSD pour : newsyslog\"\u003enewsyslog(8)\u003c/a\u003e\n,\n\n    \u003ca class=\"man\" href=\"https://man.openbsd.org/logger\" title=\"Page du Manuel OpenBSD pour : logger\"\u003elogger\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"tftpd\"\u003etftpd\u003c/h3\u003e\n\u003cp\u003eCe démon est le serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eTFTP \u003cem\u003e(Trivial File Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, utilisé afin de fournir des noyaux\nsur le réseau pour les machines sans disques ou pousser des fichiers aux\nappareils.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/diskless.8\" title=\"Page du Manuel OpenBSD pour : diskless\"\u003ediskless(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"tftpproxy\"\u003etftpproxy\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour manipuler le parefeu \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Packet Filter\"\u003ePF\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n afin de relayer\nles requêtes \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Trivial File Transfer Protocol\"\u003eTFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n vers un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Trivial File Transfer Protocol\"\u003eTFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003ch3 id=\"unbound\"\u003eunbound\u003c/h3\u003e\n\u003cp\u003eCe démon est un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n récursif ; c\u0026rsquo;est le type de serveur\nlisté dans le fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e qui est responsable de traduire un nom\nde domaine pleinement qualifié à l\u0026rsquo;adresse IP correspondante, en demandant\nun serveur à la fois, par exemple en demandant le serveur \u003ca href=\"https://www.dataswamp.org\" rel=\"external\"\u003ewww.dataswamp.org\u003c/a\u003e,\nil est requis de demander au serveur faisant autorité .org où est le serveur\nfaisant autorité pour dataswamp (faisant partie du domaine supérieur .org),\npuis le serveur DNS dataswamp.org sera interrogé pour savoir quelle est\nl\u0026rsquo;adresse IP de \u003ca href=\"https://www.dataswamp.org\" rel=\"external\"\u003ewww.dataswamp.org\u003c/a\u003e. \u003cbr\u003e\nIl peut aussi garder les requêtes en cache et valide les requêtes et les\nréponses ; c\u0026rsquo;est une bonne idée d\u0026rsquo;avoir un tel serveur sur un \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Local Area Network\"\u003eLAN\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nayant beaucoup de clients pour lesquels partager un cache de requêtes.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/unbound.8\" title=\"Page du Manuel OpenBSD pour : unbound\"\u003eunbound(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unbound.conf.5\" title=\"Page du Manuel OpenBSD pour : unbound.conf\"\u003eunbound.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"unwind\"\u003eunwind\u003c/h3\u003e\n\u003cp\u003eCe démon est un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n récursif local qui fera de son mieux\npour donner des réponses valides ; il est conçu pour les utilisateurs nomades\nqui peuvent rencontrer des environnements hostiles tels que des portails\ncaptifs ou un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n par \n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Dynamic Host Control Protocol\"\u003eDHCP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n empêchant le\nfonctionnement de \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDNSSEC \u003cem\u003e(Domain Name System Security Extensions)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, etc. \u003cbr\u003e\nunwind interroge certaines sources \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n (récursif à partir des\nserveurs racines, fourni par \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, stub ou un serveur\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDoT \u003cem\u003e(DNS-over-TCP)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n depuis un fichier de configuration) régulièrement et choisit\nle plus rapide. \u003cbr\u003e\nIl agira aussi comme cache local et ne peut écouter sur le réseau pour ne\npas être utilisé par d\u0026rsquo;autres clients. Il prend en charge aussi une liste\nbloquante de domaines en entrée.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/unwind.8\" title=\"Page du Manuel OpenBSD pour : unwind\"\u003eunwind(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unwindctl.8\" title=\"Page du Manuel OpenBSD pour : unwindctl\"\u003eunwindctl(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unwind.conf.5\" title=\"Page du Manuel OpenBSD pour : unwind.conf\"\u003eunwind.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"vmd\"\u003evmd\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le démon qui permet d\u0026rsquo;exécuter des machines virtuelles utilisant vmm.\nDepuis OpenBSD 6.4, il est capable de faire fonctionner des invités OpenBSD\net Linux, sans interface graphique, et avec un seul cœur.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmd.8\" title=\"Page du Manuel OpenBSD pour : vmd\"\u003evmd(8)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmd.conf.5\" title=\"Page du Manuel OpenBSD pour : vmd.conf\"\u003evmd.conf(5)\u003c/a\u003e\n,  \n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmctl.8\" title=\"Page du Manuel OpenBSD pour : vmctl\"\u003evmctl(8)\u003c/a\u003e\n,\n\n    \u003ca class=\"man\" href=\"https://man.openbsd.org/vmm.4\" title=\"Page du Manuel OpenBSD pour : vmm\"\u003evmm(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/faq16.html\" rel=\"external\"\u003eOpenBSD FAQ Virtualization\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"watchdogd\"\u003ewatchdogd\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour déclencher les timers watchdog, s\u0026rsquo;il y en a.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/watchdogd.8\" title=\"Page du Manuel OpenBSD pour : watchdogd\"\u003ewatchdogd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"wsmoused\"\u003ewsmoused\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour fournir la prise en charge de la souris à la console.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/wsmoused.8\" title=\"Page du Manuel OpenBSD pour : wsmoused\"\u003ewsmoused(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"xenodm\"\u003exenodm\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé pour démarrer le serveur X et permettre aux utilisateurs\nleur propre authentification et se connecter à leur session.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/xenodm\" title=\"Page du Manuel OpenBSD pour : xenodm\"\u003exenodm\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ypbind\"\u003eypbind\u003c/h3\u003e\n\u003cp\u003eCe démon est utilisé avec un serveur de Pages Jaunes (\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eYP \u003cem\u003e(Yellow Page)\u003c/em\u003e\u003c/span\u003e pour\ngarder et maintenir un fichier d\u0026rsquo;informations.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ypbind.8\" title=\"Page du Manuel OpenBSD pour : ypbind\"\u003eypbind(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ypldap\"\u003eypldap\u003c/h3\u003e\n\u003cp\u003eCe démon offre un service (\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Yellow Page\"\u003eYP\u003c/abbr\u003e en utilisant un backend\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Lightweight Directory Access Protocol\"\u003eLDAP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ypldap.8\" title=\"Page du Manuel OpenBSD pour : ypldap\"\u003eypldap(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ypserv\"\u003eypserv\u003c/h3\u003e\n\u003cp\u003eCe démon est un serveur (\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Yellow Page\"\u003eYP\u003c/abbr\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ypserv.8\" title=\"Page du Manuel OpenBSD pour : ypserv\"\u003eypserv(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eFIN\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"notes-de-traduction\"\u003eNotes de Traduction\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003csup\u003e1\u003c/sup\u003e cette information n\u0026rsquo;est pas disponible sur l\u0026rsquo;article originel.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Traduction du Tutoriel EN → FR 'Full list of services offered by a default OpenBSD installation' - article de Solène Rapenne - expliquant les différents services par défaut sous OpenBSD",
            "tags": ["Traduction", "OpenBSD", "Services"],
            "date_published": "2021-05-07T15:08:51+02:00",
            "date_modified": "2025-11-18T16:07:44+01:00"
        },{
            "id": "urn:uuid:f5bdd635-a3fd-21ea-efbb-38bac3a42d66",
            "url": "http://doc.huc.fr.eu.org/fr/trad/solene-rapenne/openbsd-getting-started/",
            "title": "OpenBSD : pour (bien) commencer !",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;OpenBSD: getting started\u0026rdquo;, écrit par Solène Rapenne.\nIntroduction Ceci est un guide pour les débutants sous OpenBSD ; j\u0026rsquo;espère que cet article deviendra une ressource utile pour aider les gens à se familiariser avec ce système d\u0026rsquo;exploitation que j\u0026rsquo;adore. Je vais utiliser beaucoup de liens parce que je préfère me référer à la documentation officielle.\nSi vous êtes nouveau sous OpenBSD, vous êtes bienvenue, ce guide est pour vous. Si vous ne l\u0026rsquo;êtes pas, et bien, vous pourriez apprendre plusieurs choses.\nÉtapes d\u0026rsquo;installation Cet article n\u0026rsquo;a pas pour propos d\u0026rsquo;expliquer comment installer OpenBSD. Il y a assez de documentation officielle pour cela.\nOpenBSD FAQ about installation Premier démarrage Ainsi, vous avez installé OpenBSD ; maintenant vous devez choisir d\u0026rsquo;activer X (l\u0026rsquo;interface graphique au démarrage) et vous avez face à vous un terminal sur un fond gris. Plusieurs choses deviennent intéressant ici.\nDevenir administrateur (root) Vous allez souvent avoir besoin d\u0026rsquo;utiliser le compte root pour diverses commande ou modifier des fichiers systèmes.\n$ su -l\nVous allez devoir entrer le mot de passe root (défini lors de l\u0026rsquo;installation) afin de changer d\u0026rsquo;utilisateur. Si vous tapez la commande \u0026ldquo;whoami\u0026rdquo;, alors vous devriez voir \u0026ldquo;root\u0026rdquo; comme résultat.\nVous avez un courriel Quand vous installez le système (ou le mettez à jour), vous aurez un courriel dans le compte root ; vous pouvez le lire par l\u0026rsquo;usage de la commande \u0026ldquo;mail\u0026rdquo;. C\u0026rsquo;est un mail venant de Theo De Raadt (fondateur d\u0026rsquo;OpenBSD) vous remerciant.\nVous remarquerez que ce courriel contient des indications, et a basiquement le même propos que mon article - celui que vous êtes en train de lire. Une page de manuel importante à lire est afterboot(8).\nafterboot(8) Qu\u0026rsquo;est-ce qu\u0026rsquo;un manpage ? Si vous ne savez pas ce qu\u0026rsquo;est un manpage (ou une page de manuel), c\u0026rsquo;est vraiment le moment de l\u0026rsquo;apprendre parce que vous en aurez besoin. Quand quelqu\u0026rsquo;un dit un \u0026ldquo;man page\u0026rdquo;, cela implique \u0026ldquo;une page de manuel\u0026rdquo;. La documentation dans OpenBSD est faite de pages de manuels relatifs à de nombreux logiciels, concepts ou fonctions du langage C.\nPour lire un manpage, tapez dans un terminal (ou une console) \u0026ldquo;man afterboot\u0026rdquo;, et utilisez les flèches de votre clavier (ou les touches page haut ou bas) à l\u0026rsquo;intérieur du manpage. Vous pouvez lire le \u0026ldquo;man man\u0026rdquo; à-propos du manpage man.\nPrécédemment, j\u0026rsquo;ai écrit \u0026ldquo;afterboot(8)\u0026rdquo; mais le nom réel du manpage est \u0026ldquo;afterboot\u0026rdquo;, le \u0026ldquo;(8)\u0026rdquo; permet de spécifier la section du manpage. Certains mots peuvent être utilisé dans des contextes variés, selon la section où ils sont placés. Par exemple, il y a sysctl(2) qui est la documentation des appels systèmes \u0026ldquo;sysctl()\u0026rdquo;, là où sysctl(8) vous donnera les informations à-propos de la commande sysctl afin de changer des paramètres noyaux. Vous pouvez spécifier quelle section vous désirez lire en tapant le numéro avant le nom de la page, tel que \u0026ldquo;man 2 sysctl\u0026rdquo; ou \u0026ldquo;man 8 sysctl\u0026rdquo;.\nLes manpages sont construits de la même manière : NAME, SYNOPSIS, DESCRIPTION… SEE ALSO… ; la section \u0026ldquo;SEE ALSO\u0026rdquo; est une section importante, qui vous donne en références d\u0026rsquo;autres manpages que vous pouvez lire. Par exemple, afterboot(8) vous donne les indications à-propos de doas(1), pkg_add(1), hier(7) et beaucoup d\u0026rsquo;autres pages.\nMaintenant, vous devriez être capable d\u0026rsquo;utiliser les pages de manuels.\nInstaller un environnement de bureau Si vous voulez installer un environnement de bureau, il vous est offert un \u0026ldquo;meta paquet\u0026rdquo; qui récupérera tous les paquets requis pour que l\u0026rsquo;environnement fonctionne.\nOpenBSD fournit certains environnements de bureau, tels que :\nGnome 3 ⇒ pkg_add gnome\nXfce ⇒ pkg_add xfce\nMATE ⇒ pkg_add mate\nQuand vous installez un paquet utilisant la commande \u0026ldquo;pkg_add\u0026rdquo;, vous aurez peut-être un message final vous informant qu\u0026rsquo;il y a un fichier à lire dans le répertoire /usr/local/share/doc/pkg-readmes/ ; ces fichiers sont spécifiques aux paquets et contiennent des instructions qu\u0026rsquo;il faut lire avant d\u0026rsquo;utiliser un paquet.\nCes instructions peuvent être relatives à la performance, à des problèmes potentielles de limites, des bouts de configuration, comment initier le service, etc… Il est très important de les lire, et dans le cas d\u0026rsquo;un environnement de bureau, ils vous diront tout ce qu\u0026rsquo;il faut savoir pour le faire démarrer.\nSession graphique Quand vous vous connectez depuis l\u0026rsquo;écran de connexion de xenodm (celui où vous avez le poisson globe et le logo OpenBSD qui vous demande votre identifiant et mot de passe de connexion), le programme xenodm lira votre fichier ~/.xsession, là où vous avez préparez votre environnement de bureau et les commandes à exécuter. Habituellement, la première commande bloquante (celle qui continue de s\u0026rsquo;exécuter au premier plan) est votre gestionnaire de fenêtres ; vous pouvez placez des commandes avant, afin de paramétrer votre système ou d\u0026rsquo;exécuter des programmes en arrière-plan.\n# désactiver bell xset b off # auto blank après 10 minutes xset s 600 600 # exécuter xclock et xload xclock -geometry 75x75-70-0 -padding 1 \u0026amp; xload -nolabel -update 5 -geometry 75x75-145-0 \u0026amp; # charger le fichier ~/.profile file pour définir ENV . ~/.profile # afficher des notifications dunst \u0026amp; # charger des changements dans les paramètres du serveur X xrdb -merge ~/.Xresources # diminuer la couleur bleue sct 5600 # synchroniser les tampons de copie autocutsel \u0026amp; # kdeconnect pour contrôler un smartphone Android kdeconnect-indicator \u0026amp; # réduire le son par défaut sndioctl -f snd/1 output.level=0.3 # le compositeur pour dessiner plus rapidement les fenêtres picom \u0026amp; # certains paramètres pour ma souris xset mouse 1 1 xinput set-prop 8 273 1.1 # exécuter mon gestionnaire de fenêtres fvwm2 Configurer votre shell C\u0026rsquo;est une question vraiment récurrente : comment faire pour que les alias de votre shell fonctionnent une fois que vous vous êtes connecté ? Pour les shells bash, sh, et ksh (et peut-être d\u0026rsquo;autres shells), à chaque fois que vous créez un nouveau shell interactif (dans lequel vous pouvez entrer des commandes), la variable d\u0026rsquo;environnement ENV sera lue et si sa valeur correspond à un chemin de fichier, il sera chargé.\nLa conception de votre environnement shell préféré est la suivante :\nle fichier ~/.xsession qui sourcera le fichier ~/.profile lors du démarrage de X, héritant du contenu de tout ce qui est exécuté à partir de X\nle fichier ~/.profile qui exportera ENV tel que \u0026ldquo;export ENV=~/.myshellfile\u0026rdquo;\nÉchelle automatique de la fréquence du CPU Si vous avez un ordinateur commun (architecture amd64), vous voudrez exécuter le service \u0026ldquo;apmd\u0026rdquo; en mode automatique ; il maintiendra votre CPU à la fréquence la plus basse et augmentera la fréquence lorsque vous aurez une certaine charge, ce qui permettra de réduire la chaleur, la consommation d\u0026rsquo;énergie et le bruit.\nVoici les commandes à exécuter en tant que root :\n# rcctl enable apmd # rcctl set apmd flags -A # rcctl start apmd Que sont -release et -stable ? Pour faire simple, la version \u0026ldquo;-release\u0026rdquo; est l\u0026rsquo;ensemble des fichiers pour installer OpenBSD dans cette version quand elle sort. D\u0026rsquo;autres mises à jour pour cette version sont appelés la branche -stable ; si vous exécutez \u0026ldquo;pkg_add -u\u0026rdquo; pour mettre à jour vos paquets et \u0026ldquo;syspatch\u0026rdquo; pour mettre à jour la base de votre système, vous suivrez automatiquement la branche stable (ce qui est bien !). Release est un état unique à un moment précis de l\u0026rsquo;état d\u0026rsquo;OpenBSD.\nFAQ Rapide Où est steam ? Pas de steam ; c\u0026rsquo;est propriétaire et ne peut être exécuter sous OpenBSD.\nOù est wine ? Pas de wine ; cela requiert des changements dans le noyau.\nEst-ce que ma récente carte NVIDIA fonctionne ? Pas de pilote nvidia ; cela pourrait fonctionner mais avec le pilote VESA, cela sera vraiment très lent.\nEst-ce que l\u0026rsquo;émulation Linux fonctionne ? Il n\u0026rsquo;y a pas d\u0026rsquo;émulation Linux.\nJe veux que mon programme favori fonctionne sous OpenBSD S\u0026rsquo;il n\u0026rsquo;est pas Open Source et n\u0026rsquo;utilise pas un langage tel Java ou C# qui utilise une Machine Virtuelle de Langage, calque d\u0026rsquo;abstratction pour fonctionner, il ne fonctionnera pas (et la plupart des programmes ne sont pas ainsi).\nS\u0026rsquo;il est Open Source, cela peut être possible si toutes ses dépendances sont disponibles pour OpenBSD.\nGet into the ports tree to make things run on OpenBSD Puis-je avoir sudo ? OpenBSD est livré avec une alternative à sudo nommé \u0026ldquo;doas\u0026rdquo; dans le système de base, mais sudo peut être installé en tant que paquet.\ndoas doas.conf Comment voir la liste des paquets Vous pouvez vérifier le répertoire des paquets depuis un miroir ou visitez :\nOpenports.pl (qui utilise la version de développement de l\u0026rsquo;arborescence des ports) Quel outil de virtualisation avez-vous ? Le système de virtualisation d\u0026rsquo;OpenBSD peut exécuter OpenBSD et certaines distributions Linux mais sans interface graphique et avec un seul CPU. Cela signifie que vous aurez à configurer une console série afin de procéder à l\u0026rsquo;installation puis d\u0026rsquo;utiliser ssh ou la console série pour utiliser votre système.\nqemu est dans les ports mais il n\u0026rsquo;est pas accéléré et ne correspondra pas aux besoins de la plupart des personnes car il est terriblement lent.\nFIN\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article\n\u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://dataswamp.org/~solene/2021-05-03-openbsd-getting-started.html\" rel=\"external\"\u003eOpenBSD: getting started\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;, écrit par Solène Rapenne.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eCeci est un guide pour les débutants sous OpenBSD ; j\u0026rsquo;espère que cet article\ndeviendra une ressource utile pour aider les gens à se familiariser avec\nce système d\u0026rsquo;exploitation que j\u0026rsquo;adore. Je vais utiliser beaucoup de liens\nparce que je préfère me référer à la documentation officielle.\u003c/p\u003e\n\u003cp\u003eSi vous êtes nouveau sous OpenBSD, vous êtes bienvenue, ce guide est pour\nvous. Si vous ne l\u0026rsquo;êtes pas, et bien, vous pourriez apprendre plusieurs\nchoses.\u003c/p\u003e\n\u003ch2 id=\"étapes-dinstallation\"\u003eÉtapes d\u0026rsquo;installation\u003c/h2\u003e\n\u003cp\u003eCet article n\u0026rsquo;a pas pour propos d\u0026rsquo;expliquer comment installer OpenBSD.\nIl y a assez de documentation officielle pour cela.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/faq4.html\" rel=\"external\"\u003eOpenBSD FAQ about installation\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"premier-démarrage\"\u003ePremier démarrage\u003c/h2\u003e\n\u003cp\u003eAinsi, vous avez installé OpenBSD ; maintenant vous devez choisir d\u0026rsquo;activer\nX (l\u0026rsquo;interface graphique au démarrage) et vous avez face à vous un terminal\nsur un fond gris. Plusieurs choses deviennent intéressant ici.\u003c/p\u003e\n\u003ch3 id=\"devenir-administrateur-root\"\u003eDevenir administrateur (root)\u003c/h3\u003e\n\u003cp\u003eVous allez souvent avoir besoin d\u0026rsquo;utiliser le compte root pour diverses\ncommande ou modifier des fichiers systèmes.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ su -l\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVous allez devoir entrer le mot de passe root (défini lors de l\u0026rsquo;installation)\nafin de changer d\u0026rsquo;utilisateur. Si vous tapez la commande \u0026ldquo;\u003ccode\u003ewhoami\u003c/code\u003e\u0026rdquo;, alors\nvous devriez voir \u0026ldquo;root\u0026rdquo; comme résultat.\u003c/p\u003e\n\u003ch3 id=\"vous-avez-un-courriel\"\u003eVous avez un courriel\u003c/h3\u003e\n\u003cp\u003eQuand vous installez le système (ou le mettez à jour), vous aurez un courriel\ndans le compte root ; vous pouvez le lire par l\u0026rsquo;usage de la commande \u0026ldquo;\u003ccode\u003email\u003c/code\u003e\u0026rdquo;.\nC\u0026rsquo;est un mail venant de Theo De Raadt (fondateur d\u0026rsquo;OpenBSD) vous remerciant.\u003c/p\u003e\n\u003cp\u003eVous remarquerez que ce courriel contient des indications, et a basiquement\nle même propos que mon article - celui que vous êtes en train de lire.\nUne page de manuel importante à lire est afterboot(8).\u003c/p\u003e\n\n\u003ca class=\"man\" href=\"https://man.openbsd.org/afterboot.8\" title=\"Page du Manuel OpenBSD pour : afterboot\"\u003eafterboot(8)\u003c/a\u003e\n\n\u003ch3 id=\"quest-ce-quun-manpage-\"\u003eQu\u0026rsquo;est-ce qu\u0026rsquo;un manpage ?\u003c/h3\u003e\n\u003cp\u003eSi vous ne savez pas ce qu\u0026rsquo;est un manpage (ou une page de manuel), c\u0026rsquo;est\nvraiment le moment de l\u0026rsquo;apprendre parce que vous en aurez besoin. Quand\nquelqu\u0026rsquo;un dit un \u0026ldquo;\u003ccode\u003eman page\u003c/code\u003e\u0026rdquo;, cela implique \u0026ldquo;une page de manuel\u0026rdquo;.\nLa documentation dans OpenBSD est faite de pages de manuels relatifs à de\nnombreux logiciels, concepts ou fonctions du langage C.\u003c/p\u003e\n\u003cp\u003ePour lire un manpage, tapez dans un terminal (ou une console) \u0026ldquo;\u003ccode\u003eman afterboot\u003c/code\u003e\u0026rdquo;,\net utilisez les flèches de votre clavier (ou les touches page haut ou bas)\nà l\u0026rsquo;intérieur du manpage. Vous pouvez lire le \u0026ldquo;\u003ccode\u003eman man\u003c/code\u003e\u0026rdquo; à-propos du manpage man.\u003c/p\u003e\n\u003cp\u003ePrécédemment, j\u0026rsquo;ai écrit \u0026ldquo;afterboot(8)\u0026rdquo; mais le nom réel du manpage est\n\u0026ldquo;afterboot\u0026rdquo;, le \u0026ldquo;(8)\u0026rdquo; permet de spécifier la section du manpage.\nCertains mots peuvent être utilisé dans des contextes variés, selon la section\noù ils sont placés. Par exemple, il y a sysctl(2) qui est la documentation\ndes appels systèmes \u0026ldquo;sysctl()\u0026rdquo;, là où sysctl(8) vous donnera les informations\nà-propos de la commande sysctl afin de changer des paramètres noyaux.\nVous pouvez spécifier quelle section vous désirez lire en tapant le numéro\navant le nom de la page, tel que \u0026ldquo;\u003ccode\u003eman 2 sysctl\u003c/code\u003e\u0026rdquo; ou \u0026ldquo;\u003ccode\u003eman 8 sysctl\u003c/code\u003e\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eLes manpages sont construits de la même manière : NAME, SYNOPSIS, DESCRIPTION…\nSEE ALSO… ; la section \u0026ldquo;SEE ALSO\u0026rdquo; est une section importante, qui vous\ndonne en références d\u0026rsquo;autres manpages que vous pouvez lire.\nPar exemple, afterboot(8) vous donne les indications à-propos de doas(1),\npkg_add(1), hier(7) et beaucoup d\u0026rsquo;autres pages.\u003c/p\u003e\n\u003cp\u003eMaintenant, vous devriez être capable d\u0026rsquo;utiliser les pages de manuels.\u003c/p\u003e\n\u003ch2 id=\"installer-un-environnement-de-bureau\"\u003eInstaller un environnement de bureau\u003c/h2\u003e\n\u003cp\u003eSi vous voulez installer un environnement de bureau, il vous est offert\nun \u0026ldquo;meta paquet\u0026rdquo; qui récupérera tous les paquets requis pour que l\u0026rsquo;environnement\nfonctionne.\u003c/p\u003e\n\u003cp\u003eOpenBSD fournit certains environnements de bureau, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eGnome 3 ⇒ \u003ccode\u003epkg_add gnome\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eXfce ⇒ \u003ccode\u003epkg_add xfce\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eMATE ⇒ \u003ccode\u003epkg_add mate\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuand vous installez un paquet utilisant la commande \u0026ldquo;\u003ccode\u003epkg_add\u003c/code\u003e\u0026rdquo;, vous aurez\npeut-être un message final vous informant qu\u0026rsquo;il y a un fichier à lire dans le\nrépertoire /usr/local/share/doc/pkg-readmes/ ; ces fichiers sont spécifiques\naux paquets et contiennent des instructions qu\u0026rsquo;il faut lire avant d\u0026rsquo;utiliser\nun paquet.\u003c/p\u003e\n\u003cp\u003eCes instructions peuvent être relatives à la performance, à des problèmes\npotentielles de limites, des bouts de configuration, comment initier le\nservice, etc… Il est très important de les lire, et dans le cas d\u0026rsquo;un\nenvironnement de bureau, ils vous diront tout ce qu\u0026rsquo;il faut savoir pour\nle faire démarrer.\u003c/p\u003e\n\u003ch2 id=\"session-graphique\"\u003eSession graphique\u003c/h2\u003e\n\u003cp\u003eQuand vous vous connectez depuis l\u0026rsquo;écran de connexion de xenodm (celui\noù vous avez le poisson globe et le logo OpenBSD qui vous demande votre\nidentifiant et mot de passe de connexion), le programme xenodm lira votre\nfichier ~/.xsession, là où vous avez préparez votre environnement de bureau\net les commandes à exécuter.\nHabituellement, la première commande bloquante (celle qui continue de s\u0026rsquo;exécuter\nau premier plan) est votre gestionnaire de fenêtres ; vous pouvez placez\ndes commandes avant, afin de paramétrer votre système ou d\u0026rsquo;exécuter des\nprogrammes en arrière-plan.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# désactiver bell\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exset b off\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# auto blank après 10 minutes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exset s 600 600\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# exécuter xclock et xload\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exclock -geometry 75x75-70-0 -padding 1 \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exload -nolabel -update 5 -geometry 75x75-145-0 \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# charger le fichier ~/.profile file pour définir ENV\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e. ~/.profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# afficher des notifications\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edunst \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# charger des changements dans les paramètres du serveur X\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exrdb -merge ~/.Xresources\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# diminuer la couleur bleue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003esct 5600\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# synchroniser les tampons de copie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eautocutsel \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# kdeconnect pour contrôler un smartphone Android\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekdeconnect-indicator \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# réduire le son par défaut\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003esndioctl -f snd/1 output.level\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0.3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# le compositeur pour dessiner plus rapidement les fenêtres\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epicom \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# certains paramètres pour ma souris\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exset mouse 1 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exinput set-prop 8 273 1.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# exécuter mon gestionnaire de fenêtres\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efvwm2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"configurer-votre-shell\"\u003eConfigurer votre shell\u003c/h2\u003e\n\u003cp\u003eC\u0026rsquo;est une question vraiment récurrente : comment faire pour que les alias\nde votre shell fonctionnent une fois que vous vous êtes connecté ?\nPour les shells bash, sh, et ksh (et peut-être d\u0026rsquo;autres shells), à chaque\nfois que vous créez un nouveau shell interactif (dans lequel vous pouvez\nentrer des commandes), la variable d\u0026rsquo;environnement ENV sera lue et si sa\nvaleur correspond à un chemin de fichier, il sera chargé.\u003c/p\u003e\n\u003cp\u003eLa conception de votre environnement shell préféré est la suivante :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ele fichier ~/.xsession qui sourcera le fichier ~/.profile lors du démarrage\nde X, héritant du contenu de tout ce qui est exécuté à partir de X\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele fichier ~/.profile qui exportera ENV tel que \u0026ldquo;\u003ccode\u003eexport ENV=~/.myshellfile\u003c/code\u003e\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"échelle-automatique-de-la-fréquence-du-cpu\"\u003eÉchelle automatique de la fréquence du CPU\u003c/h2\u003e\n\u003cp\u003eSi vous avez un ordinateur commun (architecture amd64), vous voudrez exécuter\nle service \u0026ldquo;apmd\u0026rdquo; en mode automatique ; il maintiendra votre CPU à la fréquence\nla plus basse et augmentera la fréquence lorsque vous aurez une certaine charge,\nce qui permettra de réduire la chaleur, la consommation d\u0026rsquo;énergie et le bruit.\u003c/p\u003e\n\u003cp\u003eVoici les commandes à exécuter en tant que root :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl enable apmd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set apmd flags -A\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start apmd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"que-sont--release-et--stable-\"\u003eQue sont -release et -stable ?\u003c/h2\u003e\n\u003cp\u003ePour faire simple, la version \u0026ldquo;-release\u0026rdquo; est l\u0026rsquo;ensemble des fichiers pour\ninstaller OpenBSD dans cette version quand elle sort. D\u0026rsquo;autres mises à jour\npour cette version sont appelés la branche -stable ; si vous exécutez\n\u0026ldquo;\u003ccode\u003epkg_add -u\u003c/code\u003e\u0026rdquo; pour mettre à jour vos paquets et \u0026ldquo;\u003ccode\u003esyspatch\u003c/code\u003e\u0026rdquo; pour mettre\nà jour la base de votre système, vous suivrez automatiquement la branche\nstable (ce qui est bien !). Release est un état unique à un moment précis\nde l\u0026rsquo;état d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"faq-rapide\"\u003eFAQ Rapide\u003c/h2\u003e\n\u003ch3 id=\"où-est-steam-\"\u003eOù est steam ?\u003c/h3\u003e\n\u003cp\u003ePas de steam ; c\u0026rsquo;est propriétaire et ne peut être exécuter sous OpenBSD.\u003c/p\u003e\n\u003ch3 id=\"où-est-wine-\"\u003eOù est wine ?\u003c/h3\u003e\n\u003cp\u003ePas de wine ; cela requiert des changements dans le noyau.\u003c/p\u003e\n\u003ch3 id=\"est-ce-que-ma-récente-carte-nvidia-fonctionne-\"\u003eEst-ce que ma récente carte NVIDIA fonctionne ?\u003c/h3\u003e\n\u003cp\u003ePas de pilote nvidia ; cela pourrait fonctionner mais avec le pilote VESA,\ncela sera vraiment très lent.\u003c/p\u003e\n\u003ch3 id=\"est-ce-que-lémulation-linux-fonctionne-\"\u003eEst-ce que l\u0026rsquo;émulation Linux fonctionne ?\u003c/h3\u003e\n\u003cp\u003eIl n\u0026rsquo;y a pas d\u0026rsquo;émulation Linux.\u003c/p\u003e\n\u003ch3 id=\"je-veux-que-mon-programme-favori-fonctionne-sous-openbsd\"\u003eJe veux que mon programme favori fonctionne sous OpenBSD\u003c/h3\u003e\n\u003cp\u003eS\u0026rsquo;il n\u0026rsquo;est pas Open Source et n\u0026rsquo;utilise pas un langage tel Java ou C# qui\nutilise une Machine Virtuelle de Langage, calque d\u0026rsquo;abstratction pour fonctionner,\nil ne fonctionnera pas (et la plupart des programmes ne sont pas ainsi).\u003c/p\u003e\n\u003cp\u003eS\u0026rsquo;il est Open Source, cela peut être possible si toutes ses dépendances\nsont disponibles pour OpenBSD.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/ports/\" rel=\"external\"\u003eGet into the ports tree to make things run on OpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"puis-je-avoir-sudo-\"\u003ePuis-je avoir sudo ?\u003c/h3\u003e\n\u003cp\u003eOpenBSD est livré avec une alternative à sudo nommé \u0026ldquo;doas\u0026rdquo; dans le système\nde base, mais sudo peut être installé en tant que paquet.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/doas\" title=\"Page du Manuel OpenBSD pour : doas\"\u003edoas\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/doas.conf\" title=\"Page du Manuel OpenBSD pour : doas.conf\"\u003edoas.conf\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"comment-voir-la-liste-des-paquets\"\u003eComment voir la liste des paquets\u003c/h3\u003e\n\u003cp\u003eVous pouvez vérifier le répertoire des paquets depuis un miroir ou visitez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openports.pl/\" rel=\"external\"\u003eOpenports.pl (qui utilise la version de développement de l\u0026rsquo;arborescence des ports)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"quel-outil-de-virtualisation-avez-vous-\"\u003eQuel outil de virtualisation avez-vous ?\u003c/h3\u003e\n\u003cp\u003eLe système de virtualisation d\u0026rsquo;OpenBSD peut exécuter OpenBSD et certaines\ndistributions Linux mais sans interface graphique et avec un seul CPU.\nCela signifie que vous aurez à configurer une console série afin de procéder\nà l\u0026rsquo;installation puis d\u0026rsquo;utiliser ssh ou la console série pour utiliser\nvotre système.\u003c/p\u003e\n\u003cp\u003eqemu est dans les ports mais il n\u0026rsquo;est pas accéléré et ne correspondra pas\naux besoins de la plupart des personnes car il est terriblement lent.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eFIN\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Traduction du Tutoriel EN → FR 'OpenBSD: getting started' expliquant ce qu'il savoir pour bien commencer sous OpenBSD, selon Solène Rapenne",
            "tags": ["Traduction", "OpenBSD", "Sécurité", "6.9"],
            "date_published": "2021-05-05T14:21:10+02:00",
            "date_modified": "2025-11-18T16:07:44+01:00"
        },{
            "id": "urn:uuid:fe3fc0d8-887a-39a1-bf02-c01c086cbcd9",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-relayd/",
            "title": "Astuces relayd (OpenBSD)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Anti-FLoC FLoC est une nouvelle technique de pistage développée par Google…\nAjoutez la règle suivante :\nmatch response header set \u0026quot;Permissions-Policy\u0026quot; value \u0026quot;interest-cohort=()\u0026quot;\nHTTPoxy La faille HTTPoxy utilise l\u0026rsquo;entête HTTP non standardisée, non conforme, nommée PROXY. Pour en savoir plus sur cette faille : https://httpoxy.org\nPour la bloquer, il faut modifier votre filtre httpfilter, en ajoutant :\nmatch request header remove \u0026quot;Proxy\u0026quot;\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"anti-floc\"\u003eAnti-FLoC\u003c/h2\u003e\n\u003cp\u003eFLoC est une nouvelle technique de pistage développée par Google…\u003c/p\u003e\n\u003cp\u003eAjoutez la règle suivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ematch response header set \u0026quot;Permissions-Policy\u0026quot; value \u0026quot;interest-cohort=()\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"httpoxy\"\u003eHTTPoxy\u003c/h2\u003e\n\u003cp\u003eLa faille HTTPoxy utilise l\u0026rsquo;entête HTTP non standardisée, non conforme, nommée PROXY.\nPour en savoir plus sur cette faille : \u003ca href=\"https://httpoxy.org\" rel=\"external\"\u003ehttps://httpoxy.org\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003ePour la bloquer, il faut modifier votre filtre \u003ccode\u003ehttpfilter\u003c/code\u003e, en ajoutant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ematch request header remove \u0026quot;Proxy\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour le serveur relayd sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "relayd"],
            "date_published": "2021-04-13T19:10:49+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:54494a07-19f3-9e49-2f33-b03c987eb280",
            "url": "http://doc.huc.fr.eu.org/fr/web/nginx/nginx-image-avif/",
            "title": "Nginx gère les images au format AVIF",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Il y a quelques semaines, j\u0026rsquo;ai écris l\u0026rsquo;article sur la gestion des images webp par nginx .\nActuellement, un récent format d\u0026rsquo;image apparaît, le format AVIF . Ainsi les images compressées dans ce format sont encore plus légères que le format Webp (bien sûr, généralement, cela dépend fortement des taux de qualités de compression utilisés).\nSupport web Actuellement seules les versions des clients suivants prennent en charge ce format AVIF :\nle navigateur web Chromium, et son pendant non libre dixit Google Chrome, depuis la version 85 le navigateur web Opera, depuis sa version 71 quant à Firefox, officiellement, avec sa version 86, sortie le 23/02/2021. Pour ceux qui migrent d\u0026rsquo;une ancienne version, il faut activer le paramètre image.avif.enabled sur true dans la configuration… Installation Bref, cela nécessite d\u0026rsquo;installer sur votre système d\u0026rsquo;exploitation la bibliothèque nécessaire :\nDe(bi|vu)an : le paquet libavif-bin OpenBSD : le paquet libavif qui installera principalement le binaire avifenc dont nous avons besoin.\nNote Debian Stable Malheureusement, sous De(bi|vu)an Stable, il semble manquer le support de la libyuv, ce qui empêchera bien des images d\u0026rsquo;être converties !\n$ avifenc --help (…) Version: 0.8.4 (dav1d [dec]:0.7.1, libgav1 [dec]:0.16.1) libyuv : unavailable Note cavif Heureusement, il existe le programme cavif, écrit en langage Rust. Reste plus qu\u0026rsquo;à télécharger la version .deb fournie : https://github.com/kornelski/cavif-rs/releases\nNote ImageMagick InfoImageMagick est aussi capable de convertir une image au format AVIF :\n$ convert \u0026quot;${file}\u0026quot; \u0026quot;${file}.avif\u0026quot;\nMais il semble qu\u0026rsquo;il faille attendre les versions 7.x pour que ce soit correctement géré !\nBien-sûr, il existe d\u0026rsquo;autres logiciels capable de convertir au format AVIF. Au dernière nouvelle, Gimp 2.10.x en est capable.\nUtilisation Il est ainsi possible de transformer les images gif, jpg, png et tiff.\nLa génération de l\u0026rsquo;image au format AVIF peut prendre un certain temps, plus ou moins considérable, selon les options choisies et le poids de l\u0026rsquo;image source à convertir !\navifenc $ avifenc -s 0 --min 25 --max 35 \u0026#34;${file}\u0026#34; \u0026#34;${file}.avif\u0026#34; cavif $ cavif --quality 50 \u0026#34;${file}\u0026#34; --output \u0026#34;${file}.avif\u0026#34; InfoAttention, par défaut, cavif ne réécrit pas sur un fichier AVIF déjà existant. Soit vous utilisez l\u0026rsquo;option --overwrite, soit vous veillez à le supprimer avant. Configuration Modifions la configuration de nginx, afin de lui signifier que quand il est demandé des images au format jpeg|gif|png|tiff, il essaye de diffuser celles au format AVIF, si elles existent.\n⇒ Dans le contexte http du serveur :\ndans le fichier /etc/nginx/mime.types, ajoutons la déclaration image/avif avif; puis, une map afin de déclarer une variable $avif_suffix qui nous permettra de reconnaître une image ayant l\u0026rsquo;extension .avif. map $http_accept $avif_suffix { avif_suffix \u0026#34;\u0026#34;; \u0026#34;~*avif\u0026#34; \u0026#34;.avif\u0026#34;; } ⇒ Modifions le contexte server, préalablement modifié pour le support webp :\nlocation ~ /*.(jpe?g|gif|png|tiff)$ { access_log off; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; add_header Pragma public; add_header Vary \u0026#34;Accept-Encoding\u0026#34;; expires max; log_not_found off; try_files $uri$avif_suffix $uri$webp_suffix $uri =404; } Et ajoutons lui ce nouveau bloc location :\nlocation ~ /*.(gif|jpe?g|png|tiff).avif { access_log off; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate, max-age=31536000\u0026#34;; add_header Content-Type image/avif; add_header Pragma public; add_header Vary \u0026#34;Accept-Encoding\u0026#34;; default_type image/avif; expires max; # try_files $uri$avif_suffix $uri =404; types { image/avif avif; } } Et, voilà !!!\nReste plus qu\u0026rsquo;à tester votre configuration avec nginx et redémarrer le service correspondant - par exemple, pour OpenBSD :\n:# nginx -t :# rcctl restart nginx HTML Pour finir, modifiez votre code HTML à-propos de la gestion des images, tel que, par exemple pour une image jpeg, à minima :\n\u0026lt;picture\u0026gt; \u0026lt;source srcset=\u0026#34;/img/{{ $img }}.jpg.avif\u0026#34; type=\u0026#34;image/avif\u0026#34;\u0026gt; \u0026lt;source srcset=\u0026#34;/img/{{ $img }}.jpg.webp\u0026#34; type=\u0026#34;image/webp\u0026#34;\u0026gt; \u0026lt;img alt=\u0026#34;texte\u0026#34; src=\u0026#34;/img/{{ $img }}.jpg\u0026#34; type=\u0026#34;image/jpeg\u0026#34;\u0026gt; \u0026lt;/picture\u0026gt; Ce qui permettra aux clients web qui supportent le format AVIF de demander l\u0026rsquo;affichage de ce format en lieu et place…\nEssai Test avec mon Logo :\nLogo Ainsi, selon le support du client web, vous recevrez soit le format webp, soit avif, sinon le fichier \u0026ldquo;source\u0026rdquo; png…\nDocumentations le site caniuse.com: https://caniuse.com/avif l\u0026rsquo;article \u0026ldquo;WebP and AVIF images on a Hugo website\u0026quot;… en anglais l\u0026rsquo;article \u0026ldquo;Convert to AVIF Programmatically\u0026rdquo; - en anglais - qui expliquent les raisons pour lesquelles utiliser un taux de compression min à 25, max à 35, et recommande la vitesse d\u0026rsquo;encodage sur 0 ! Remerciements @Lord et son article qui m\u0026rsquo;a fait découvrir ce format d\u0026rsquo;image…\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIl y a quelques semaines, j\u0026rsquo;ai écris l\u0026rsquo;article sur la gestion des \u003ca class=\"inside\" href=\"/fr/web/nginx/nginx-image-webp/\" title=\"Lien interne vers l\u0026#39;article : 'Nginx gère les images au format Webp'\"\u003eimages webp par nginx\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eActuellement, un récent format d\u0026rsquo;image apparaît, le format \u003cabbr title=\"AV1 Image Format\"\u003eAVIF\u003c/abbr\u003e\n.\nAinsi les images compressées dans ce format sont encore plus légères que\nle format Webp \u003cem\u003e(bien sûr, généralement, cela dépend fortement des taux\nde qualités de compression utilisés)\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"support-web\"\u003eSupport web\u003c/h3\u003e\n\u003cp\u003eActuellement seules les versions des clients suivants prennent en charge\nce format AVIF :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele navigateur web Chromium, et son pendant non libre dixit\nGoogle Chrome, depuis la version 85\u003c/li\u003e\n\u003cli\u003ele navigateur web Opera, depuis sa version 71\u003c/li\u003e\n\u003cli\u003equant à Firefox, officiellement, avec sa version 86, sortie le 23/02/2021.\n\u003cem\u003ePour ceux qui migrent d\u0026rsquo;une ancienne version, il faut activer le paramètre \u003ccode\u003eimage.avif.enabled\u003c/code\u003e\nsur \u003ccode\u003etrue\u003c/code\u003e dans la configuration…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eBref, cela nécessite d\u0026rsquo;installer sur votre système d\u0026rsquo;exploitation la\nbibliothèque nécessaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDe(bi|vu)an : le paquet \u003cstrong\u003elibavif-bin\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eOpenBSD : le paquet \u003cstrong\u003elibavif\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003equi installera principalement le binaire \u003ccode\u003eavifenc\u003c/code\u003e dont nous avons besoin.\u003c/p\u003e\n\u003ch3 id=\"note-debian-stable\"\u003eNote Debian Stable\u003c/h3\u003e\n\u003cp\u003eMalheureusement, sous De(bi|vu)an Stable, il semble manquer le support de\nla libyuv, ce qui empêchera bien des images d\u0026rsquo;être converties !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ avifenc --help\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVersion: 0.8.4 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003edav1d \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003edec\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:0.7.1, libgav1 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003edec\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:0.16.1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elibyuv : unavailable\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"note-cavif\"\u003eNote cavif\u003c/h3\u003e\n\u003cp\u003eHeureusement, il existe le programme \u003cstrong\u003e\u003ca href=\"https://github.com/kornelski/cavif-rs\" rel=\"external\"\u003ecavif\u003c/a\u003e\u003c/strong\u003e,\nécrit en langage Rust.\nReste plus qu\u0026rsquo;à télécharger la version .deb fournie :\n\u003ca href=\"https://github.com/kornelski/cavif-rs/releases\" rel=\"external\"\u003ehttps://github.com/kornelski/cavif-rs/releases\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"note-imagemagick\"\u003eNote ImageMagick\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eImageMagick est aussi capable de convertir une image au format AVIF :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ convert \u0026quot;${file}\u0026quot; \u0026quot;${file}.avif\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMais il semble qu\u0026rsquo;il faille attendre les versions 7.x pour que ce soit\ncorrectement géré !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eBien-sûr, il existe d\u0026rsquo;autres logiciels capable de convertir au format AVIF.\nAu dernière nouvelle, Gimp 2.10.x en est capable.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eIl est ainsi possible de transformer les images gif, jpg, png et tiff.\u003c/p\u003e\n\u003cp\u003eLa génération de l\u0026rsquo;image au format AVIF peut prendre un certain temps,\nplus ou moins considérable, selon les options choisies et le poids de\nl\u0026rsquo;image source à convertir !\u003c/p\u003e\n\u003ch3 id=\"avifenc\"\u003eavifenc\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ avifenc -s \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e --min \u003cspan style=\"color:#f99b15\"\u003e25\u003c/span\u003e --max \u003cspan style=\"color:#f99b15\"\u003e35\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.avif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"cavif\"\u003ecavif\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cavif --quality \u003cspan style=\"color:#f99b15\"\u003e50\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e --output \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.avif\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eAttention, par défaut, cavif ne réécrit pas sur un fichier AVIF déjà existant.\nSoit vous utilisez l\u0026rsquo;option \u003ccode\u003e--overwrite\u003c/code\u003e, soit vous veillez à le supprimer avant.\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eModifions la configuration de nginx, afin de lui signifier que quand il\nest demandé des images au format jpeg|gif|png|tiff, il essaye de diffuser\ncelles au format AVIF, si elles existent.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Dans le contexte \u003ccode\u003ehttp\u003c/code\u003e du serveur :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003edans le fichier \u003ccode\u003e/etc/nginx/mime.types\u003c/code\u003e, ajoutons la déclaration \u003ccode\u003eimage/avif                      avif;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epuis, une \u003ccode\u003emap\u003c/code\u003e afin de déclarer une variable \u003ccode\u003e$avif_suffix\u003c/code\u003e qui nous\npermettra de reconnaître une image ayant l\u0026rsquo;extension \u003ccode\u003e.avif\u003c/code\u003e.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003emap\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$http_accept\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$avif_suffix\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eavif_suffix\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;~*avif\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.avif\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e⇒ Modifions le contexte \u003ccode\u003eserver\u003c/code\u003e, \u003cem\u003epréalablement \u003ca class=\"inside\" href=\"/fr/web/nginx/nginx-image-webp/#configuration\" title=\"Lien interne vers l\u0026#39;article : 'Nginx gère les images au format Webp'\"\u003emodifié pour le support webp\u003c/a\u003e\n\u003c/em\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.(jpe?g|gif|png|tiff)$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eaccess_log\u003c/span\u003e        \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eCache-Control\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003emust-revalidate,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eproxy-revalidate\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ePragma\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003epublic\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eVary\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Accept-Encoding\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eexpires\u003c/span\u003e           \u003cspan style=\"color:#48b685\"\u003emax\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003elog_not_found\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003etry_files\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$uri$avif_suffix\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$uri$webp_suffix\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$uri\u003c/span\u003e =\u003cspan style=\"color:#f99b15\"\u003e404\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt ajoutons lui ce nouveau bloc \u003ccode\u003elocation\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.(gif|jpe?g|png|tiff).avif\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eaccess_log\u003c/span\u003e        \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eCache-Control\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003emust-revalidate,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eproxy-revalidate,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003emax-age=31536000\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eContent-Type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eimage/avif\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ePragma\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003epublic\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eVary\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Accept-Encoding\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eimage/avif\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eexpires\u003c/span\u003e           \u003cspan style=\"color:#48b685\"\u003emax\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#    try_files $uri$avif_suffix $uri =404;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003etypes\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003eimage/avif\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eavif\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eEt, voilà !!!\u003c/p\u003e\n\u003cp\u003eReste plus qu\u0026rsquo;à tester votre configuration avec nginx et redémarrer le service\ncorrespondant - \u003cem\u003epar exemple, pour OpenBSD\u003c/em\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# nginx -t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl restart nginx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"html\"\u003eHTML\u003c/h2\u003e\n\u003cp\u003ePour finir, modifiez votre code HTML à-propos de la gestion des images,\ntel que, par exemple pour une image jpeg, à minima :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003epicture\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003esource\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esrcset\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/img/{{ $img }}.jpg.avif\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/avif\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003esource\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esrcset\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/img/{{ $img }}.jpg.webp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eimg\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ealt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;texte\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esrc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/img/{{ $img }}.jpg\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/jpeg\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003epicture\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe qui permettra aux clients web qui supportent le format AVIF de demander\nl\u0026rsquo;affichage de ce format en lieu et place…\u003c/p\u003e\n\u003ch3 id=\"essai\"\u003eEssai\u003c/h3\u003e\n\u003cp\u003eTest avec mon Logo :\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/logo.png\" title=\"Logo\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/logo_hu_c9e055de1824af3f.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Logo\" height=\"128\" loading=\"lazy\" src=\"/images/logo.png\" type=\"image/png\" width=\"128\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eLogo\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eAinsi, selon le support du client web, vous recevrez soit le format webp,\nsoit avif, sinon le fichier \u0026ldquo;source\u0026rdquo; png…\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele site caniuse.com: \u003ca href=\"https://caniuse.com/avif\" rel=\"external\"\u003ehttps://caniuse.com/avif\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;article \u0026ldquo;\u003ca href=\"https://pawelgrzybek.com/webp-and-avif-images-on-a-hugo-website/\" rel=\"external\"\u003eWebP and AVIF images on a Hugo website\u003c/a\u003e\u0026quot;… \u003cem\u003een anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;article \u0026ldquo;\u003ca href=\"https://blog.uidrafter.com/engineering/convert-to-avif-programmatically\" rel=\"external\"\u003eConvert to AVIF Programmatically\u003c/a\u003e\u0026rdquo; -\n\u003cem\u003een anglais\u003c/em\u003e -\nqui expliquent les raisons pour lesquelles utiliser un taux de compression\nmin à 25, max à 35, et recommande la vitesse d\u0026rsquo;encodage sur 0 !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003e@Lord et son \u003ca href=\"https://lord.re/fast-posts/55-un-peu-plus-de-compression-sur-le-brog-brotli+avif/\" rel=\"external\"\u003earticle\u003c/a\u003e\nqui m\u0026rsquo;a fait découvrir ce format d\u0026rsquo;image…\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Configurer Nginx pour qu'il diffuse les images au format AVIF, au lieu de…",
            "tags": ["nginx", "image", "avif", "astuce"],
            "date_published": "2021-02-22T14:17:28+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:23ae0ec7-964f-d720-fd6f-aeca6f3bac5c",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/vmd-console-serie/",
            "title": "[OpenBSD :: Virtualisation] Pas d'écran de connexion ; pas de login !",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Pour rappel, l\u0026rsquo;hyperviseur vmm(4) sous OpenBSD n\u0026rsquo;a pas de support vidéo pour les VM invités. Seule la console série est prise en charge.\nQuand vous faites de la virtualisation sous OpenBSD amd64 ou i386, OpenBSD gère tout ce qu\u0026rsquo;il faut, comme de nécessaire. Ainsi la console série est configurée au sein du fichier de configuration /etc/boot.conf et le dispositif tty00 est configuré correctement pour utiliser ladite console série.\nLe problème est quand vous avez l\u0026rsquo;idée de créer votre VM, sous Linux par exemple, à moins de spécifiquement répondre yes lorsqu\u0026rsquo;est demandé le paramétrage de com0, il est possible de se retrouver avec le problème suivant :\nPas d\u0026rsquo;écran de connexion == pas de login possible !\n(où il y en a des malchanceux, et d\u0026rsquo;autres où ça roule sans soucis… je suis souvent de la première catégorie)\nPour illustrer le propos, une fois la VM OpenBSD copiée sur un hôte OpenBSD, voici le démarrage :\n$ vmctl start -c vm-test Using drive 0, partition 3. Loading...... probing: pc0 com0 mem[638K 1022M a20=on] disk: hd0+ \u0026gt;\u0026gt; OpenBSD/amd64 BOOT 3.52 boot\u0026gt; booting hd0a:/bsd: 14329128+3191816+337072+0+872448 [999468+128+1135344+859361]=0x14ba488 entry point at 0xffffffff81001000 [ using 2995336 bytes of bsd ELF symbol table ] Copyright (c) 1982, 1986, 1989, 1991, 1993 The Regents of the University of California. All rights reserved. Copyright (c) 1995-2020 OpenBSD. All rights reserved. https://www.OpenBSD.org OpenBSD 6.8 (GENERIC) #4: Mon Jan 11 10:34:36 MST 2021 root@syspatch-68-amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC real mem = 1056956416 (1007MB) avail mem = 1010040832 (963MB) random: good seed from bootblocks mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root bios0 at mainbus0: SMBIOS rev. 2.4 @ 0xf3f40 (10 entries) bios0: vendor SeaBIOS version \u0026#34;1.11.0p3-OpenBSD-vmm\u0026#34; date 01/01/2011 bios0: OpenBSD VMM acpi at bios0 not configured cpu0 at mainbus0: (uniprocessor) cpu0: AMD FX-8320E Eight-Core Processor, 3211.59 MHz, 15-02-00 cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,CX8,SEP,PGE,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,POPCNT,AES,XSAVE,AVX,F16C,HV,NXE,MMXX,FFXSR,PAGE1GB,LONG,LAHF,CMPLEG,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,XOP,SKINIT,WDT,FMA4,TCE,NODEID,TBM,TOPEXT,CPCTR,ITSC,BMI1 cpu0: 64KB 64b/line 2-way I-cache, 16KB 64b/line 4-way D-cache, 2MB 64b/line 16-way L2 cache, 8MB 64b/line 64-way L3 cache cpu0: ITLB 48 4KB entries fully associative, 24 4MB entries fully associative cpu0: DTLB 64 4KB entries fully associative, 64 4MB entries fully associative cpu0: smt 0, core 0, package 0 pvbus0 at mainbus0: OpenBSD pvclock0 at pvbus0 pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 \u0026#34;OpenBSD VMM Host\u0026#34; rev 0x00 virtio0 at pci0 dev 1 function 0 \u0026#34;Qumranet Virtio RNG\u0026#34; rev 0x00 viornd0 at virtio0 virtio0: irq 3 virtio1 at pci0 dev 2 function 0 \u0026#34;Qumranet Virtio Network\u0026#34; rev 0x00 vio0 at virtio1: address fe:e1:bb:d1:a9:7b virtio1: irq 5 virtio2 at pci0 dev 3 function 0 \u0026#34;Qumranet Virtio Storage\u0026#34; rev 0x00 vioblk0 at virtio2 scsibus1 at vioblk0: 1 targets sd0 at scsibus1 targ 0 lun 0: \u0026lt;VirtIO, Block Device, \u0026gt; sd0: 51200MB, 512 bytes/sector, 104857600 sectors virtio2: irq 6 virtio3 at pci0 dev 4 function 0 \u0026#34;OpenBSD VMM Control\u0026#34; rev 0x00 vmmci0 at virtio3 virtio3: irq 7 isa0 at mainbus0 isadma0 at isa0 com0 at isa0 port 0x3f8/8 irq 4: ns8250, no fifo com0: console vscsi0 at root scsibus2 at vscsi0: 256 targets softraid0 at root scsibus3 at softraid0: 256 targets root on sd0a (6dc570f70e2c7991.a) swap on sd0b dump on sd0b Automatic boot in progress: starting file system checks. /dev/sd0a (6dc570f70e2c7991.a): file system is clean; not checking /dev/sd0m (6dc570f70e2c7991.m): file system is clean; not checking /dev/sd0d (6dc570f70e2c7991.d): file system is clean; not checking /dev/sd0f (6dc570f70e2c7991.f): file system is clean; not checking /dev/sd0g (6dc570f70e2c7991.g): file system is clean; not checking /dev/sd0h (6dc570f70e2c7991.h): file system is clean; not checking /dev/sd0j (6dc570f70e2c7991.j): file system is clean; not checking /dev/sd0i (6dc570f70e2c7991.i): file system is clean; not checking /dev/sd0e (6dc570f70e2c7991.e): file system is clean; not checking /dev/sd0k (6dc570f70e2c7991.k): file system is clean; not checking /dev/sd0l (6dc570f70e2c7991.l): file system is clean; not checking pf enabled kern.seminfo.semmni: 10 -\u0026gt; 60 kern.seminfo.semmns: 60 -\u0026gt; 1024 starting network reordering libraries: done. starting early daemons: syslogd pflogd nsd ntpd. starting RPC daemons:. savecore: no core dump checking quotas: done. clearing /tmp kern.securelevel: 0 -\u0026gt; 1 creating runtime link editor directory cache. preserving editor files. starting network daemons: sshd smtpd. starting local daemons: cron. Thu Feb 18 12:25:45 CET 2021 Et, voilà cela s\u0026rsquo;arrête à l\u0026rsquo;affichage de l\u0026rsquo;heure… et vous allez pouvoir attendre longtemps l\u0026rsquo;écran de connexion de session qui ne viendra jamais !\nEt, au cas où tu te le demandes, toi lecteur, non cela ne vient pas d\u0026rsquo;une corruption de la VM lors de la copie/synchronisation, des tests à base de somme de contrôle sha256 ont été faits avant la copie et après celle-ci, tel que :\nSur la station Linux :\n$ cat vm-test.qcow2.sha256 73054a89bb2e0b13d78e8cb446424baa01f7761099d8681a59137655b28c979c vm-test.qcow2 Puis sur l\u0026rsquo;hôte OpenBSD :\n$ sha256 vm-test.qcow2 SHA256 (vm-test.qcow2) = 73054a89bb2e0b13d78e8cb446424baa01f7761099d8681a59137655b28c979c $ sha256 -C vm-test.qcow2.sha256 vm-test.qcow2 (SHA256) vm-test.qcow2: OK Mais alors que faire ?!\nSur ton OS source, par exemple le Linux où la VM a été créée, avec qemu et les différents outils virt*, connectes-toi à ta VM, et fais les deux petites modifications suivantes nécessaires :\nConfiguration boot.conf Le fichier de configuration /etc/boot.conf n\u0026rsquo;a pas été créé - s\u0026rsquo;il l\u0026rsquo;est, vérifies l\u0026rsquo;écriture. Il doit absolument contenir à minima ceci :\nset tty com0 Par défaut, le taux de connexion est ainsi de 9200 baups.\nOr, étant donné que le futur hôte est OpenBSD, faisons ça bien :\nstty com0 115200 set tty com0 Ainsi nous configurons le taux de débit au maximum supporté, soit de 115200.\nttys L\u0026rsquo;autre modification nécessaire à faire est de reparamétrer les informations d\u0026rsquo;initialisation du Terminal tty00.\nLe fichier est /etc/ttys, et il faut commenter/supprimer la ligne correspondante à tty00 pour ajouter la déclaration correcte suivante :\ntty00 \u0026#34;/usr/libexec/getty std.115200\u0026#34; vt220 on secure Si vous déclarez le fichier boot.conf ci-dessus a sa valeur par défaut, configurez cette déclaration ainsi :\ntty00 \u0026#34;/usr/libexec/getty std.9600\u0026#34; vt220 on secure Et, voilà !\nUne fois la VM recopiée sous OpenBSD, vous aurez à nouveau l\u0026rsquo;écran de connexion.\nDocumentations la FAQ Officielle d\u0026rsquo;OpenBSD \u0026ldquo;Configuring a Serial Console\u0026rdquo; (cf : la traduction FR faite par la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;) Remerciements @jggimi…\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePour rappel, l\u0026rsquo;hyperviseur \u003ca href=\"https://man.openbsd.org/vmm\" rel=\"external\"\u003evmm(4)\u003c/a\u003e sous OpenBSD\nn\u0026rsquo;a pas de support vidéo pour les VM invités. \u003cstrong\u003eSeule la console série est prise en charge\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eQuand vous faites de la virtualisation sous OpenBSD amd64 ou i386, OpenBSD\ngère tout ce qu\u0026rsquo;il faut, comme de nécessaire. Ainsi la console série est\nconfigurée au sein du fichier de configuration \u003ccode\u003e/etc/boot.conf\u003c/code\u003e et le dispositif\n\u003ccode\u003etty00\u003c/code\u003e est configuré correctement pour utiliser ladite console série.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLe problème est quand vous avez l\u0026rsquo;idée de créer votre VM, sous Linux par\nexemple, à moins de spécifiquement répondre \u003ccode\u003eyes\u003c/code\u003e lorsqu\u0026rsquo;est demandé le\nparamétrage de \u003ccode\u003ecom0\u003c/code\u003e, il est possible de se retrouver avec le problème\nsuivant :\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ePas d\u0026rsquo;écran de connexion == pas de login possible\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(où il y en a des malchanceux, et d\u0026rsquo;autres où ça roule sans soucis… je suis\nsouvent de la première catégorie)\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour illustrer le propos, une fois la VM OpenBSD copiée sur un hôte OpenBSD,\nvoici le démarrage :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ vmctl start -c vm-test\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsing drive 0, partition 3.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLoading......\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprobing: pc0 com0 mem\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e638K 1022M \u003cspan style=\"color:#ef6155\"\u003ea20\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eon\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edisk: hd0+\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt;\u0026gt; OpenBSD/amd64 BOOT 3.52\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eboot\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebooting hd0a:/bsd: 14329128+3191816+337072+0+872448 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e999468+128+1135344+859361\u003cspan style=\"color:#5bc4bf\"\u003e]=\u003c/span\u003e0x14ba488\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eentry point at 0xffffffff81001000\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e using \u003cspan style=\"color:#f99b15\"\u003e2995336\u003c/span\u003e bytes of bsd ELF symbol table \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ec\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 1982, 1986, 1989, 1991, \u003cspan style=\"color:#f99b15\"\u003e1993\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    The Regents of the University of California.  All rights reserved.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ec\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 1995-2020 OpenBSD. All rights reserved.  https://www.OpenBSD.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOpenBSD 6.8 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGENERIC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e#4: Mon Jan 11 10:34:36 MST 2021\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    root@syspatch-68-amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereal \u003cspan style=\"color:#ef6155\"\u003emem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1056956416\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1007MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eavail \u003cspan style=\"color:#ef6155\"\u003emem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1010040832\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e963MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erandom: good seed from bootblocks\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003empath0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus0 at mpath0: \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emainbus0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0 at mainbus0: SMBIOS rev. 2.4 @ 0xf3f40 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e entries\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0: vendor SeaBIOS version \u003cspan style=\"color:#48b685\"\u003e\u0026#34;1.11.0p3-OpenBSD-vmm\u0026#34;\u003c/span\u003e date 01/01/2011\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0: OpenBSD VMM\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi at bios0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0 at mainbus0: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003euniprocessor\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: AMD FX-8320E Eight-Core Processor, 3211.59 MHz, 15-02-00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,CX8,SEP,PGE,CMOV,PAT,PSE36,CFLUSH,MMX,FXSR,SSE,SSE2,SSE3,PCLMUL,SSSE3,FMA3,CX16,SSE4.1,SSE4.2,POPCNT,AES,XSAVE,AVX,F16C,HV,NXE,MMXX,FFXSR,PAGE1GB,LONG,LAHF,CMPLEG,EAPICSP,AMCR8,ABM,SSE4A,MASSE,3DNOWP,OSVW,IBS,XOP,SKINIT,WDT,FMA4,TCE,NODEID,TBM,TOPEXT,CPCTR,ITSC,BMI1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: 64KB 64b/line 2-way I-cache, 16KB 64b/line 4-way D-cache, 2MB 64b/line 16-way L2 cache, 8MB 64b/line 64-way L3 cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: ITLB \u003cspan style=\"color:#f99b15\"\u003e48\u003c/span\u003e 4KB entries fully associative, \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e 4MB entries fully associative\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: DTLB \u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e 4KB entries fully associative, \u003cspan style=\"color:#f99b15\"\u003e64\u003c/span\u003e 4MB entries fully associative\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: smt 0, core 0, package \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epvbus0 at mainbus0: OpenBSD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epvclock0 at pvbus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci0 at mainbus0 bus \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epchb0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OpenBSD VMM Host\u0026#34;\u003c/span\u003e rev 0x00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Qumranet Virtio RNG\u0026#34;\u003c/span\u003e rev 0x00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eviornd0 at virtio0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio0: irq \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio1 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Qumranet Virtio Network\u0026#34;\u003c/span\u003e rev 0x00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evio0 at virtio1: address fe:e1:bb:d1:a9:7b\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio1: irq \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio2 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Qumranet Virtio Storage\u0026#34;\u003c/span\u003e rev 0x00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evioblk0 at virtio2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus1 at vioblk0: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0 at scsibus1 targ \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e lun 0: \u0026lt;VirtIO, Block Device, \u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0: 51200MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e104857600\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio2: irq \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio3 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OpenBSD VMM Control\u0026#34;\u003c/span\u003e rev 0x00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmmci0 at virtio3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evirtio3: irq \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eisa0 at mainbus0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eisadma0 at isa0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom0 at isa0 port 0x3f8/8 irq 4: ns8250, no fifo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom0: console\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evscsi0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus2 at vscsi0: \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esoftraid0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus3 at softraid0: \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot on sd0a \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.a\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e swap on sd0b dump on sd0b\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAutomatic boot in progress: starting file system checks.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0a \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.a\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0m \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.m\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0d \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.d\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0f \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.f\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0g \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.g\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0h \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.h\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0j \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.j\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0i \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.i\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.e\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0k \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.k\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd0l \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6dc570f70e2c7991.l\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e: file system is clean; not checking\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epf enabled\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekern.seminfo.semmni: \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e -\u0026gt; \u003cspan style=\"color:#f99b15\"\u003e60\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekern.seminfo.semmns: \u003cspan style=\"color:#f99b15\"\u003e60\u003c/span\u003e -\u0026gt; \u003cspan style=\"color:#f99b15\"\u003e1024\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting network\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereordering libraries: \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting early daemons: syslogd pflogd nsd ntpd.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting RPC daemons:.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esavecore: no core dump\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echecking quotas: \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eclearing /tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ekern.securelevel: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -\u0026gt; \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecreating runtime link editor directory cache.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epreserving editor files.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting network daemons: sshd smtpd.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003estarting local daemons: cron.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThu Feb \u003cspan style=\"color:#f99b15\"\u003e18\u003c/span\u003e 12:25:45 CET \u003cspan style=\"color:#f99b15\"\u003e2021\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, voilà cela s\u0026rsquo;arrête à l\u0026rsquo;affichage de l\u0026rsquo;heure… et vous allez pouvoir\nattendre longtemps l\u0026rsquo;écran de connexion de session qui ne viendra jamais !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eEt, au cas où tu te le demandes, toi lecteur, non cela ne vient pas d\u0026rsquo;une\ncorruption de la VM lors de la copie/synchronisation, des tests à base de\nsomme de contrôle sha256 ont été faits avant la copie et après celle-ci,\ntel que :\u003c/p\u003e\n\u003cp\u003eSur la station Linux :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cat vm-test.qcow2.sha256\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e73054a89bb2e0b13d78e8cb446424baa01f7761099d8681a59137655b28c979c  vm-test.qcow2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis sur l\u0026rsquo;hôte OpenBSD :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sha256 vm-test.qcow2                                                                                                                                                                    \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSHA256 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003evm-test.qcow2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e 73054a89bb2e0b13d78e8cb446424baa01f7761099d8681a59137655b28c979c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sha256 -C vm-test.qcow2.sha256 vm-test.qcow2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eSHA256\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e vm-test.qcow2: OK\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eMais alors que faire ?!\u003c/p\u003e\n\u003cp\u003eSur ton OS source, par exemple le Linux où la VM a été créée, avec \u003cstrong\u003eqemu\u003c/strong\u003e\net les différents outils \u003cstrong\u003evirt*\u003c/strong\u003e, connectes-toi à ta VM, et fais les deux petites\nmodifications suivantes nécessaires :\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"bootconf\"\u003eboot.conf\u003c/h3\u003e\n\u003cp\u003eLe fichier de configuration \u003ccode\u003e/etc/boot.conf\u003c/code\u003e n\u0026rsquo;a pas été créé - \u003cem\u003es\u0026rsquo;il l\u0026rsquo;est,\nvérifies l\u0026rsquo;écriture\u003c/em\u003e. Il doit absolument contenir à minima ceci :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset tty com0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePar défaut, le taux de connexion est ainsi de 9200 baups.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eOr, étant donné que le futur hôte est OpenBSD, faisons ça bien :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003estty com0 115200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset tty com0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi nous configurons le taux de débit au maximum supporté, soit de 115200.\u003c/p\u003e\n\u003ch3 id=\"ttys\"\u003ettys\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;autre modification nécessaire à faire est de reparamétrer les informations\nd\u0026rsquo;initialisation du Terminal \u003cstrong\u003etty00\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLe fichier est \u003ccode\u003e/etc/ttys\u003c/code\u003e, et il faut commenter/supprimer la ligne correspondante\nà \u003cstrong\u003etty00\u003c/strong\u003e pour ajouter la déclaration correcte suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etty00   \u0026#34;/usr/libexec/getty std.115200\u0026#34; vt220    on secure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi vous déclarez le fichier \u003ccode\u003eboot.conf\u003c/code\u003e ci-dessus a sa valeur par défaut,\nconfigurez cette déclaration ainsi :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etty00   \u0026#34;/usr/libexec/getty std.9600\u0026#34;   vt220   on secure\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eEt, voilà !\u003c/p\u003e\n\u003cp\u003eUne fois la VM recopiée sous OpenBSD, vous aurez à nouveau l\u0026rsquo;écran de connexion.\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ela FAQ Officielle d\u0026rsquo;OpenBSD \u0026ldquo;\u003ca href=\"https://www.openbsd.org/faq/faq7.html#SerCon\" rel=\"external\"\u003eConfiguring a Serial Console\u003c/a\u003e\u0026rdquo;\n\u003cem\u003e(cf : la traduction \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/faq7#configurer-une-console-serie\" rel=\"external\"\u003eFR\u003c/a\u003e faite par la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003e@\u003ca href=\"http://daemonforums.org/showthread.php?t=11643\" rel=\"external\"\u003ejggimi\u003c/a\u003e…\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Résoudre le problème de console série pour une VM, copiée depuis un autre OS vers OpenBSD !",
            "tags": ["OpenBSD", "Virtualisation", "vmd", "astuce"],
            "date_published": "2021-02-21T23:14:42+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:1e91be69-17c6-eeb8-75a3-c8c7e7367eea",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/vmd-hote-invite-meme-reseau/",
            "title": "[OpenBSD :: Virtualisation] Hôte et invité(s) sont sur le même bateau",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description La virtualisation sous OpenBSD, disponible depuis 5.9, est assez aisée à mettre en place, à partir du moment où on fait attention à certains détails.\nCet article traite de la partie de la virtualisation où hôte et invité(s) sont sur le même réseau, et offrira en sus ce que ne restitue pas la FAQ officielle (ou sa traduction [FR][2]).\nVersion : native OS : OpenBSD 6.4 → 7.2 Pré-requis En premier, toujours vérifier et s\u0026rsquo;assurer de la compatibilité du processeur de votre machine :\n$ dmesg | egrep \u0026#39;(VMX/EPT|SVM/RVI)\u0026#39; La réponse du système doit être :\n⇒ pour CPU Intel :\nvmm0 at mainbus0: VMX/EPT ⇒ pour CPU AMD :\nvmm0 at mainbus0: SVM/RVI Si aucune ligne n\u0026rsquo;apparaît, aucune virtualisation ne sera possible. Par acquis de conscience, vérifiez votre BIOS|UEFI que celle-ci ne soit pas désactivée.\nInfoDe même, en rapport avec les failles CPU relatives à Meltdown, Spectre, certains CPU Intel sont patchés pour remédier à L1TF. Sous OpenBSD, ces CPU reçoivent un correctif approprié. Malheureusement, cela impacte la virtualisation et peut rendre celle-ci impossible. Vous pouvez vous retrouver dans la situation où vous auriez un CPU compatible, mais dans les faits, la virtualisation ne pourrait être pleinement fonctionnelle.\nPréférez AMD, en attendant ARM…\nCréation Après avoir téléchargé l\u0026rsquo;image instalXX.iso de la dernière version d\u0026rsquo;OpenBSD puis l\u0026rsquo;avoir vérifié - oui, préférez l\u0026rsquo;image iso, et lors de l\u0026rsquo;installation, choisissez cd0 au lieu de http, elle se fera plus vite car ira chercher les jeux d\u0026rsquo;installation sur votre média.\n⇒ Créons simplement une VM :\n$ vmctl create -s 50G disk.qcow2 ⇒ Démarrons l\u0026rsquo;installation :\n# vmctl start -c -m 1G -i 1 -r installXX.iso -d disk.qcow2 test AttentionIl est important de déclarer une interface réseau, au moins avec l\u0026rsquo;option -i lors de cette étape. Cela va permettre d\u0026rsquo;allouer automatiquement une interface tap(4) à la VM.\nPour la virtualisation de VM sur le même réseau que l\u0026rsquo;hôte, n\u0026rsquo;utilisez pas l\u0026rsquo;option -L qui déclare une interface locale, empêchant de communiquer avec le bridge. Il faudrait dans ce cas-là, faire de la traduction d\u0026rsquo;adresses réseaux, configurer sysctl, etc. - Avouez, ce serait dommage.\nFaites votre installation, et au bout de quelques minutes, à la fin de celle-ci choisissez [halt] pour arrêter proprement l\u0026rsquo;OS dans la VM.\nPuis déconnectez-vous de celle-ci, par exemple par les caractères d\u0026rsquo;échappement ~. ou ~~. si SSH.\nInfoUne autre raison pour laquelle il vaut mieux arrêter la VM : si vous ne le faites pas, vous allez redémarrer celle-ci sans soucis… mais vous n\u0026rsquo;aurez pas de réseau ; ne cherchez pas à à modifier vos paramètres réseaux, vous pouvez quand même vérifier l\u0026rsquo;adresse IP de votre passerelle/routeur, ainsi que résolveur DNS que vous avez paramétré.\nL\u0026rsquo;astuce est simplement de configurer le fichier /etc/vm.conf de l\u0026rsquo;hôte, puis de (re)démarrer le service vmd, et ensuite de redémarrer la VM. Normalement, là, vous devriez avoir du réseau… dans votre VM.\nConfiguration En admettant que :\nle réseau est de type de Classe C : 192.168.1.0 l\u0026rsquo;adresse IP de la passerelle serait : 192.168.1.1 les résolveurs DNS seraient ceux de la FDN… Ce sont les paramètres réseaux à fournir dans les VM.\nLes configurations suivantes se font sur l\u0026rsquo;hôte :\nRéseau Seuls les périphériques Ethernet, non Wifi, peuvent être utilisés.\nUtilisez dhcp peut compliquer les choses, préférez l\u0026rsquo;usage d\u0026rsquo;adresse IP statique.\nhostname.iface Partons du contexte où votre interface réseau est gérée par le pilote réseau Intel em(4).\nSi ce n\u0026rsquo;est pas votre cas, modifiez en conséquence.\nModifions le fichier /etc/hostname.em0, pour l\u0026rsquo;exemple :\ninet 192.168.1.2 vm.conf Le fichier de configuration est : /etc/vm.conf\nswitch \u0026#34;sw\u0026#34; { interface bridge0 } vm \u0026#34;test\u0026#34; { disk /home/vous/disk.qcow2 format qcow2 enable memory 1G interface { switch \u0026#34;sw\u0026#34; } owner vous } Bridge Configurons le pont :\n# echo \u0026#39;add em0\u0026#39; \u0026gt; /etc/hostname.bridge0 # sh /etc/netstart bridge0 Et, voilà !\nSauf que… ce dont ne parle pas la FAQ, a un rapport étroit avec PF, principalement.\nAutre information importante que ne restitue pas la FAQ est que lorsque la VM est active, une interface tap est créée et montée dans le bridge. Du moins, c\u0026rsquo;est compréhensible au-travers de la lecture des différents manpages.\nPF AttentionN\u0026rsquo;utilisez pas uRPF avec vm, autrement vous ne pourriez plus communiquer depuis vos VM avec l\u0026rsquo;extérieur et réciproquement ! Selon les notes du manpage relatif à bridge, paramétrer PF pour gérer le bridge est possible, mais il faut être très fin dans ces réglages et avoir une excellente compréhension du flux réseau au sein de PF.\nFaisons au plus simple, sur le fichier de configuration de PF de l\u0026rsquo;hôte :\n⇒ Gérons le groupe d\u0026rsquo;interface tap en autorisant tout le flux :\npass on tap L\u0026rsquo;avantage de gérer le groupe tap est de ne pas avoir à gérer finement toutes les interfaces tap liées à chacune des VM. En effet, chaque VM aura sa propre interface tap. La première aura l\u0026rsquo;interface tap0, la seconde aura tap1, etc.\nDans ces cas, il faudrait déclarer pour chaque interface, par exemple pour tap0 :\npass on tap0 ⇒ Ensuite, il faut gérer d\u0026rsquo;abord votre interface réseau, qui pour l\u0026rsquo;exemple est em0, au cas par cas selon le flux que vous désirez permettre en entrée depuis l\u0026rsquo;hôte vers l\u0026rsquo;IP de la VM.\nLà encore, pour simplifier, déclarer une table comprenant l\u0026rsquo;adresse IP de chaque VM, telle que :\ntable \u0026lt;vm_tap\u0026gt; const { 192.168.1.3 192.168.1.4 } Puis par exemple pour autoriser le flux à destination de SSH vers les VM :\npass in log on em0 inet proto tcp from any to \u0026lt;vm_tab\u0026gt; port 22 Bien sûr, ces règles PF sont minimalistes, en soit. À vous de les granuler plus finement, selon vos besoins et selon les services à accéder.\nPour finir, pensez à gérer vos règles PF au sein de la VM, elle-même. ;-)\nPseudo-dispositif virtuel tap Par défaut, OpenBSD fournit 4 pseudo-interfaces virtuelles tap. En cas, où vous nécessitez de plus de VM que ces 4 disponibles par défaut, il est nécessaire de créer le nombre d\u0026rsquo;interface supplémentaire.\nLire la note suivante… pour bien comprendre l\u0026rsquo;allocation automatique des interfaces virtuelles.\nIl faudra utiliser MAKEDEV(8), par exemple :\n# sh MAKEDEV tap5 De même, il est possible d\u0026rsquo;assigner tel pseudo-dispositif virtuel tap, à telle VM, utilisez pour cela le mot clé interface dans votre fichier de configuration, tel que par exemple :\nvm \u0026#34;test\u0026#34; { (…) interface tap5 { … } (…) } Autre point à bien comprendre est que tant que la VM n\u0026rsquo;est pas active, l\u0026rsquo;interface tap correspondante ne sera pas créée ni montée au sein du bridge. Faites la comparaison avec la commande ifconfig avant puis après… et vous comprendrez ;-)\nsysctl Non, il n\u0026rsquo;y a pas besoin de configurer sysctl pour rediriger (forward) le flux. Nous ne faisons pas de la traduction d\u0026rsquo;adresses réseaux, autrement appelée NAT. Ce serait le cas et le besoin dans le contexte de bridge où les VM auraient leur propre réseau différent de celui de l\u0026rsquo;hôte.\nLe rappel est fait dans la section suivante de la page de manuel vmctl :\nIf NAT is desired, the net.inet.ip.forwarding sysctl(8) must also be set to 1.\nDonc, non, dans le contexte de bridge où l\u0026rsquo;hôte et les invités sont sur le même bateau, pas besoin de forwarder le flux !\nDocumentations Merci de lire la documentation officielle FAQ Virtualisation (EN) afin de bien comprendre le sujet, les différentes informations nécessaires à une meilleure préhension de celui-ci.\nIl est fortement intéressant de lire les pages de manuels, en anglais, relative à :\nvmctl(8) vmd(8) vm.conf(5) vmm(4) sans oublier bridge(4) Voici un exemple - en anglais - de CPU Intel patché L1TF où le média de démarrage n\u0026rsquo;était pas trouvé, avec message d\u0026rsquo;erreur dans dmesg : vmx_fault_page: uvm_fault returns 14, GPA=0xffffca78, rip=0xfbd49 Enjoy-IT! Enjoy-ID!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa virtualisation sous OpenBSD, disponible depuis 5.9, est assez aisée à\nmettre en place, à partir du moment où on fait attention à certains détails.\u003c/p\u003e\n\u003cp\u003eCet article traite de la partie de la virtualisation où hôte et invité(s)\nsont sur le même réseau, et offrira en sus ce que ne restitue pas la \u003ca href=\"https://www.openbsd.org/faq/faq16.html\" rel=\"external\"\u003eFAQ\nofficielle\u003c/a\u003e \u003cem\u003e(ou sa traduction [FR][2])\u003c/em\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion : \u003cstrong\u003enative\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eOS : OpenBSD \u003cstrong\u003e6.4\u003c/strong\u003e → \u003cstrong\u003e7.2\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cp\u003eEn premier, toujours vérifier et s\u0026rsquo;assurer de la compatibilité du processeur\nde votre machine :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ dmesg | egrep \u003cspan style=\"color:#48b685\"\u003e\u0026#39;(VMX/EPT|SVM/RVI)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa réponse du système doit être :\u003c/p\u003e\n\u003cp\u003e⇒ pour CPU Intel :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmm0 at mainbus0: VMX/EPT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ pour CPU AMD :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmm0 at mainbus0: SVM/RVI\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi aucune ligne n\u0026rsquo;apparaît, aucune virtualisation ne sera possible. Par\nacquis de conscience, vérifiez votre BIOS|UEFI que celle-ci ne soit pas\ndésactivée.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eDe même, en rapport avec les failles CPU relatives à Meltdown, Spectre,\ncertains CPU Intel sont patchés pour remédier à\n\u003ca href=\"https://www.intel.fr/content/www/fr/fr/architecture-and-technology/l1tf.html\" rel=\"external\"\u003eL1TF\u003c/a\u003e.\nSous OpenBSD, ces CPU reçoivent un correctif approprié. Malheureusement,\ncela impacte la virtualisation et peut rendre celle-ci impossible.\nVous pouvez vous retrouver dans la situation où vous auriez un CPU\ncompatible, mais dans les faits, la virtualisation ne pourrait être\npleinement fonctionnelle.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePréférez AMD, en attendant ARM…\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"création\"\u003eCréation\u003c/h2\u003e\n\u003cp\u003eAprès avoir téléchargé l\u0026rsquo;image \u003ccode\u003einstalXX.iso\u003c/code\u003e de la dernière version d\u0026rsquo;OpenBSD\npuis l\u0026rsquo;avoir vérifié  - \u003cem\u003eoui, préférez l\u0026rsquo;image iso, et lors de l\u0026rsquo;installation,\nchoisissez \u003ccode\u003ecd0\u003c/code\u003e au lieu de \u003ccode\u003ehttp\u003c/code\u003e, elle se fera plus vite car ira chercher\nles jeux d\u0026rsquo;installation sur votre média\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ Créons simplement une VM :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ vmctl create -s 50G disk.qcow2\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Démarrons l\u0026rsquo;installation :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# vmctl start -c -m 1G -i 1 -r installXX.iso -d disk.qcow2 test\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl est important de déclarer une interface réseau, au moins avec l\u0026rsquo;option\n\u003ccode\u003e-i\u003c/code\u003e lors de cette étape. Cela va permettre d\u0026rsquo;allouer automatiquement une\ninterface \u003cstrong\u003e\u003ca href=\"https://man.openbsd.org/tap.4\" rel=\"external\"\u003etap(4)\u003c/a\u003e\u003c/strong\u003e à la VM.\u003c/p\u003e\n\u003cp\u003ePour la virtualisation de VM sur le même réseau que l\u0026rsquo;hôte, \u003cstrong\u003en\u0026rsquo;utilisez pas\nl\u0026rsquo;option \u003ccode\u003e-L\u003c/code\u003e\u003c/strong\u003e qui déclare une interface locale, empêchant de communiquer\navec le bridge. \u003cem\u003eIl faudrait dans ce cas-là, faire de la traduction d\u0026rsquo;adresses\nréseaux, configurer sysctl, etc. - Avouez, ce serait dommage.\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eFaites votre installation, et au bout de quelques minutes, à la fin de\ncelle-ci choisissez \u003ccode\u003e[halt]\u003c/code\u003e pour arrêter proprement l\u0026rsquo;OS dans la VM.\u003c/p\u003e\n\u003cp\u003ePuis déconnectez-vous de celle-ci, par exemple par les caractères d\u0026rsquo;échappement\n\u003ccode\u003e~.\u003c/code\u003e ou \u003ccode\u003e~~.\u003c/code\u003e si SSH.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eUne autre raison pour laquelle il vaut mieux arrêter la VM : si vous ne\nle faites pas, vous allez redémarrer celle-ci sans soucis… mais vous n\u0026rsquo;aurez\npas de réseau ; ne cherchez pas à à modifier vos paramètres réseaux,\nvous pouvez quand même vérifier l\u0026rsquo;adresse IP de votre passerelle/routeur,\nainsi que résolveur DNS que vous avez paramétré.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;astuce est simplement de configurer le fichier \u003ccode\u003e/etc/vm.conf\u003c/code\u003e de l\u0026rsquo;hôte,\npuis de (re)démarrer le service vmd, et ensuite de redémarrer la VM.\nNormalement, là, vous devriez avoir du réseau… dans votre VM.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eEn admettant que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele réseau est de type de Classe C : 192.168.1.0\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;adresse IP de la passerelle serait : 192.168.1.1\u003c/li\u003e\n\u003cli\u003eles \u003ca href=\"https://www.fdn.fr/actions/dns/\" rel=\"external\"\u003erésolveurs DNS\u003c/a\u003e seraient ceux de la FDN…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCe sont les paramètres réseaux à fournir dans les VM.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLes configurations suivantes se font sur l\u0026rsquo;hôte :\u003c/p\u003e\n\u003ch3 id=\"réseau\"\u003eRéseau\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSeuls les périphériques Ethernet, non Wifi, peuvent être utilisés\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUtilisez dhcp peut compliquer les choses, préférez l\u0026rsquo;usage d\u0026rsquo;adresse IP\nstatique.\u003c/p\u003e\n\u003ch3 id=\"hostnameiface\"\u003ehostname.iface\u003c/h3\u003e\n\u003cp\u003ePartons du contexte où votre interface réseau est gérée par le pilote réseau\nIntel \u003cstrong\u003e\u003ca href=\"https://man.openbsd.org/man4/em.4\" rel=\"external\"\u003eem(4)\u003c/a\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eSi ce n\u0026rsquo;est pas votre cas, modifiez en conséquence.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eModifions le fichier \u003ccode\u003e/etc/hostname.em0\u003c/code\u003e, pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einet 192.168.1.2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"vmconf\"\u003evm.conf\u003c/h3\u003e\n\u003cp\u003eLe fichier de configuration est : \u003ccode\u003e/etc/vm.conf\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eswitch \u0026#34;sw\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einterface bridge0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003evm \u0026#34;test\u0026#34; {    \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edisk /home/vous/disk.qcow2 format qcow2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eenable\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ememory 1G\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einterface { switch \u0026#34;sw\u0026#34; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eowner vous\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"bridge\"\u003eBridge\u003c/h3\u003e\n\u003cp\u003eConfigurons le pont :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# echo \u0026#39;add em0\u0026#39; \u0026gt; /etc/hostname.bridge0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sh /etc/netstart bridge0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, voilà !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eSauf que… ce dont ne parle pas la FAQ, a un rapport étroit avec PF, principalement.\u003c/p\u003e\n\u003cp\u003eAutre information importante que ne restitue pas la FAQ est que lorsque\nla VM est active, une interface tap est créée et montée dans le bridge.\nDu moins, c\u0026rsquo;est compréhensible au-travers de la lecture des différents manpages.\u003c/p\u003e\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eN\u0026rsquo;utilisez pas \u003ca href=\"https://www.openbsd.org/faq/pf/filter.html#urpf\" rel=\"external\"\u003euRPF\u003c/a\u003e\navec vm, autrement vous ne pourriez plus communiquer depuis vos VM avec\nl\u0026rsquo;extérieur et réciproquement !\u003c/div\u003e\n\n\u003cp\u003eSelon les \u003ca href=\"https://man.openbsd.org/bridge.4#NOTES\" rel=\"external\"\u003enotes du manpage relatif à bridge\u003c/a\u003e,\nparamétrer PF pour gérer le bridge est possible, mais il faut être très\nfin dans ces réglages et avoir une excellente compréhension du flux réseau\nau sein de PF.\u003c/p\u003e\n\u003cp\u003eFaisons au plus simple, sur le fichier de configuration de PF de l\u0026rsquo;hôte :\u003c/p\u003e\n\u003cp\u003e⇒ Gérons le groupe d\u0026rsquo;interface \u003cstrong\u003etap\u003c/strong\u003e en autorisant tout le flux :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass on tap\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;avantage de gérer le groupe \u003cstrong\u003etap\u003c/strong\u003e est de ne pas avoir à gérer finement\ntoutes les interfaces tap liées à chacune des VM. En effet, chaque VM aura\nsa propre interface tap. La première aura l\u0026rsquo;interface \u003cstrong\u003etap0\u003c/strong\u003e, la seconde\naura \u003cstrong\u003etap1\u003c/strong\u003e, etc.\u003c/p\u003e\n\u003cp\u003eDans ces cas, il faudrait déclarer pour chaque interface, par exemple\npour tap0 :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass on tap0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Ensuite, il faut gérer d\u0026rsquo;abord votre interface réseau, qui pour l\u0026rsquo;exemple\nest \u003cstrong\u003eem0\u003c/strong\u003e, au cas par cas selon le flux que vous désirez permettre en\nentrée depuis l\u0026rsquo;hôte vers l\u0026rsquo;IP de la VM.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLà encore, pour simplifier, déclarer une table comprenant l\u0026rsquo;adresse IP\nde chaque VM, telle que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;vm_tap\u0026gt; const { 192.168.1.3 192.168.1.4 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis par exemple pour autoriser le flux à destination de SSH vers les VM :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in log on em0 inet proto tcp from any to \u0026lt;vm_tab\u0026gt; port 22 \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien sûr, ces règles PF sont minimalistes, en soit. À vous de les granuler\nplus finement, selon vos besoins et selon les services à accéder.\u003c/p\u003e\n\u003cp\u003ePour finir, pensez à gérer vos règles PF au sein de la VM, elle-même. ;-)\u003c/p\u003e\n\u003ch3 id=\"pseudo-dispositif-virtuel-tap\"\u003ePseudo-dispositif virtuel tap\u003c/h3\u003e\n\u003cp\u003ePar défaut, OpenBSD fournit 4 pseudo-interfaces virtuelles tap. En cas,\noù vous nécessitez de plus de VM que ces 4 disponibles par défaut, il\nest nécessaire de créer le nombre d\u0026rsquo;interface supplémentaire.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eLire la \u003ca href=\"https://man.openbsd.org/vm.conf.5#SWITCH_CONFIGURATION\" rel=\"external\"\u003enote suivante\u003c/a\u003e…\npour bien comprendre l\u0026rsquo;allocation automatique des interfaces virtuelles.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eIl faudra utiliser \u003ca href=\"https://man.openbsd.org/MAKEDEV.8\" rel=\"external\"\u003eMAKEDEV(8)\u003c/a\u003e, par\nexemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sh MAKEDEV tap5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDe même, il est possible d\u0026rsquo;assigner tel pseudo-dispositif virtuel tap, à\ntelle VM, utilisez pour cela le mot clé \u003cstrong\u003e\u003ca href=\"https://man.openbsd.org/vm.conf.5#interface\" rel=\"external\"\u003einterface\u003c/a\u003e\u003c/strong\u003e\ndans votre fichier de configuration, tel que par exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003evm \u0026#34;test\u0026#34; { \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einterface tap5 { … }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e(…)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAutre point à bien comprendre est que tant que la VM n\u0026rsquo;est pas active,\nl\u0026rsquo;interface tap correspondante ne sera pas créée ni montée au sein du\nbridge. Faites la comparaison avec la commande \u003ccode\u003eifconfig\u003c/code\u003e avant puis\naprès… et vous comprendrez ;-)\u003c/p\u003e\n\u003ch3 id=\"sysctl\"\u003esysctl\u003c/h3\u003e\n\u003cp\u003eNon, il n\u0026rsquo;y a pas besoin de configurer sysctl pour rediriger \u003cem\u003e(forward)\u003c/em\u003e le flux.\nNous ne faisons pas de la traduction d\u0026rsquo;adresses réseaux, autrement appelée\nNAT. Ce serait le cas et le besoin dans le contexte de bridge où les VM\nauraient leur propre réseau différent de celui de l\u0026rsquo;hôte.\u003c/p\u003e\n\u003cp\u003eLe rappel est fait dans la section suivante de la page de manuel \u003cstrong\u003e\u003ca href=\"https://man.openbsd.org/vmctl.8#LOCAL_INTERFACES\" rel=\"external\"\u003evmctl\u003c/a\u003e\u003c/strong\u003e :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf NAT is desired, the net.inet.ip.forwarding sysctl(8) must also be set to 1.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDonc, non, dans le contexte de bridge où l\u0026rsquo;hôte et les invités sont sur\nle même bateau, pas besoin de forwarder le flux !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMerci de lire la documentation officielle \u003cstrong\u003eFAQ Virtualisation\u003c/strong\u003e (\u003ca href=\"https://www.openbsd.org/faq/faq16.html\" rel=\"external\"\u003eEN\u003c/a\u003e)\nafin de bien comprendre le sujet, les différentes informations nécessaires\nà une meilleure préhension de celui-ci.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIl est fortement intéressant de lire les pages de manuels, en anglais, relative à :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmctl.8\" title=\"Page du Manuel OpenBSD pour : vmctl\"\u003evmctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmd.8\" title=\"Page du Manuel OpenBSD pour : vmd\"\u003evmd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vm.conf.5\" title=\"Page du Manuel OpenBSD pour : vm.conf\"\u003evm.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmm.4\" title=\"Page du Manuel OpenBSD pour : vmm\"\u003evmm(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003esans oublier \n\u003ca class=\"man\" href=\"https://man.openbsd.org/bridge.4\" title=\"Page du Manuel OpenBSD pour : bridge\"\u003ebridge(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eVoici un \u003ca href=\"http://daemonforums.org/showthread.php?t=11628\" rel=\"external\"\u003eexemple\u003c/a\u003e - \u003cem\u003een anglais\u003c/em\u003e -\nde CPU Intel patché L1TF où le média de démarrage n\u0026rsquo;était pas trouvé, avec\nmessage d\u0026rsquo;erreur dans \u003ccode\u003edmesg\u003c/code\u003e :  \u003cbr\u003e\n\u003ccode\u003evmx_fault_page: uvm_fault returns 14, GPA=0xffffca78, rip=0xfbd49\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-IT! \u003cbr\u003e\nEnjoy-ID!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour virtualiser sereinement sous OpenBSD grâce à vmd, où l'hôte et le(s) invité(s) font partie du même réseau !",
            "tags": ["OpenBSD", "Virtualisation", "vmd"],
            "date_published": "2021-02-21T19:54:31+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:b7e4d502-ea2d-452c-f63a-48a8b27d9aab",
            "url": "http://doc.huc.fr.eu.org/fr/trad/solene-rapenne/openbsd-default-security/",
            "title": "Quelle sécurité offre par défaut une installation d'OpenBSD ?",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;What security does a default OpenBSD installation offer?\u0026rdquo;, écrit par Solène Rapenne.\nIntroduction Dans ce texte, j\u0026rsquo;expliquerais ce qui rend OpenBSD sécurisé par défaut quand vous l\u0026rsquo;installez. Ce n\u0026rsquo;est pas une analyse de la sécurité, mais plutôt un guide pour vous aider à comprendre ce qui est fait pour qu\u0026rsquo;OpenBSD soit un environnement sécurisé. Le but est ce texte n\u0026rsquo;est pas de comparer OpenBSD à d\u0026rsquo;autres OS mais de vous dire ce que vous pouvez attendre honnêtement d\u0026rsquo;OpenBSD.\nIl n\u0026rsquo;y a pas de sécurité sans modèle de gestion des menaces. Je considère toujours les cas suivants : un ordinateur volé à domicile, une attaque à distance qui essaye d\u0026rsquo;exploiter les services fonctionnant, un exploit au-travers des clients réseaux.\nGestion de la Sécurité Voici une liste de fonctionnalités que je considère importante pour la sécurité du système d\u0026rsquo;exploitation. Bien que tous les éléments de la liste suivante ne sont pas à strictement parlé des fonctionnalités de sécurité, ils aident à obtenir un système strict qui empêche le logiciel de mal se comporter ou les risques inconnus.\nMon opinion relative à la sécurité n\u0026rsquo;est pas seulement de prévenir les attaques à distances de pénétrer le système, mais aussi d\u0026rsquo;empêcher les programmes ou les utilisateurs de rendre le système inutilisable.\nPledge / Unveil en espace utilisateur Pledge et unveil sont souvent cités ensembles bien qu\u0026rsquo;ils puissent être utilisés indépendamment. Pledge est un système d\u0026rsquo;appels pour restreindre les permissions d\u0026rsquo;un programme au sein de son code source, permissions qui ne peuvent pas être annulées une fois l\u0026rsquo;appel à pledge. Unveil est un système d\u0026rsquo;appels qui cache tout le système de fichiers au processus excepté les chemins qui ne sont pas surveillés ; il est possible de choisir quelles permissions sont appliquées aux chemins.\nLes deux sont de puissants outils de sécurité \u0026ldquo;chirurgicaux\u0026rdquo; mais ils requièrent quelques modifications dans le code source d\u0026rsquo;un programme, et les ajouter requiert une profonde compréhension de ce que fait le logiciel. Il n\u0026rsquo;est pas toujours possible d\u0026rsquo;interdire les appels systèmes d\u0026rsquo;un logiciel qui exige de faire presque tout ; un logiciel conçu avec la séparation des privilèges est un meilleur candidat pour l\u0026rsquo;ajout propre de pledge, ainsi chaque partie fait son travail.\nCertains logiciels parmi les paquets prennent en charge pledge et/ou unveil, tel que Chromium ou Firefox, pour les plus connus.\nOpenBSD presentation about Unveil (BSDCan2019) OpenBSD presentation of Pledge and Unveil (BSDCan2018) Séparation des privilèges La plupart des services du système de base d\u0026rsquo;OpenBSD fonctionnent selon le modèle de séparation des privilèges. Chaque part d\u0026rsquo;un démon est restreint au minimum requis. Un démon monolithique devrait lire, écrire des fichiers, accepter des connexions réseaux, envoyer des messages au système de journalisation, dans le cas d\u0026rsquo;une brèche de sécurité qui offre une énorme surface d\u0026rsquo;attaque. En séparant un service en de multiples parties, cela permet un contrôle plus fin de chacun des processus, et en utilisant les appels systèmes de pledge et unveil, il est possible de paramétrer les limites et de réduire hautement les dommages en cas où un processus est attaqué.\nSynchronisation de l\u0026rsquo;Horloge Le démon du serveur est démarré par défaut afin de synchroniser l\u0026rsquo;horloge avec des serveurs de temps. Un serveur TLS référant est utilisé pour interroger les serveurs de temps. Garder un ordinateur avec son horloge synchronisée est très important. Ce n\u0026rsquo;est pas réellement une fonctionnalité de sécurité mais vous ne pouvez pas être sérieux si vous utilisez un ordinateur sur le réseau qui n\u0026rsquo;ait pas son temps synchronisé.\nAffichage X sans droits root si vous utilisez le serveur X, il abandonne les privilèges à l\u0026rsquo;utilisateur _x11 ; le serveur est exécuté avec les droits d\u0026rsquo;un utilisateur sans privilèges au lieu de root, ainsi en cas de problèmes de sécurité cela empêche un attaquant d’accéder au-travers de bogues de X11 à plus qu\u0026rsquo;il ne devrait.\nRessources limitées Les limites de ressources par défaut empêchent un programme d\u0026rsquo;utiliser trop de mémoire, d\u0026rsquo;ouvrir trop de fichier ou trop de processus. Bien que cela puisse empêcher que certains gros programmes de s\u0026rsquo;exécuter avec les paramètres par défaut, cela aide aussi à trouver les failles de descripteurs de fichiers, prévenant ainsi une bombe dérivée ou un simple démon de capturer toute la mémoire jusqu\u0026rsquo;au crash.\nAuthentique chiffrement de disque Quand vous installez OpenBSD selon le mode de chiffrement complet de disque, tout sera verrouillé par une passphrase à l\u0026rsquo;étape du chargeur de démarrage, ainsi vous ne pouvez accéder au noyau ou à d\u0026rsquo;autres parties du système sans la passphrase.\nW^X La plupart des programmes dans OpenBSD n\u0026rsquo;ont pas l\u0026rsquo;autorisation de cartographier la mémoire avec un bit d\u0026rsquo;Exécution et d’Écriture en même temps (W^X signifie Écrire et/ou Exécuter), cela peut empêcher un interpréteur d\u0026rsquo;avoir sa mémoire et modifiée et exécutée. Certains paquets ne sont pas conformes à cela et doivent être liés à une bibliothèque spécifique qui contourne cette restriction ET doivent être utilisés depuis une partition ayant l\u0026rsquo;option de montage \u0026ldquo;wxallowed\u0026rdquo;.\nOpenBSD presentation « Kernel W^X Improvements In OpenBSD » Une seule source fiable de données aléatoires Lorsque votre système requiert un nombre de données aléatoires (et c\u0026rsquo;est souvent le cas), OpenBSD fournit seulement une seule API pour obtenir ces données aléatoires, qui sont réellement aléatoires et ne peuvent être devinées. Un bon générateur de nombres aléatoires (RNG) est important pour de nombreuses exigences en matière de cryptographie.\nOpenBSD presentation about arc4random Une documentation précise OpenBSD est fournit avec une documentation complète dans ses pages de manuels. On doit pouvoir configurer entièrement son système en utilisant seulement les pages de manuels. Les pages de manuels sont fournis parfois avec des sections CAVEATS ou BUGS ; il est important de bien faire attention à ces sections. Il est mieux de lire la documentation et de comprendre ce que cela fait avant de configurer un système au lieu de suivre un anonyme texte obsolète disponible sur Internet.\nOpenBSD man pages online EuroBSDcon 2018 about « Better documentation » IPSec et Wireguard à l\u0026rsquo;intérieur Si vous avez besoin de paramétrer un VPN, vous pouvez utiliser nativement les protocoles IPSec ou Wireguard, sans aucun autre paquet requis.\nSécurité de la mémoire OpenBSD a de nombreuses mesures de sécurités à-propos de l\u0026rsquo;allocation de la mémoire et empêchera son utilisation après libération ou un usage très agressif de mémoire non sûre, souvent sources de crash pour certains logiciels fournis en tant que paquets puisqu\u0026rsquo;OpenBSD est très strict sur l\u0026rsquo;utilisation de la mémoire que vous faites. Cela aide à trouver les utilisations abusives de la mémoire et à arrêter les mauvais comportements logiciels.\nCompte root dédié Lorsque vous installez le système, un compte root est créé et son mot de passe est demandé, puis vous créez un utilisateur qui sera membre du groupe \u0026ldquo;wheel\u0026rdquo;, permettant de basculer l\u0026rsquo;utilisateur vers root avec le mot de passe de root. doas (l\u0026rsquo;équivalent sudo d\u0026rsquo;OpenBSD) n\u0026rsquo;est pas configuré par défaut. Avec l\u0026rsquo;installation par défaut, le mot de passe root est requis pour toute interaction root. Je pense qu\u0026rsquo;un compte root dédié qui peut être journalisé sans l\u0026rsquo;usage de doas ou sudo est mieux qu\u0026rsquo;une mauvaise configuration de doas ou sudo permettant ainsi de faire des choses seulement si vous connaissez le mot de passe utilisateur.\nLa plus petite surface d\u0026rsquo;attaque réseau Les seuls services qui pourraient être activés dès l\u0026rsquo;installation, écoutant sur le réseau, sont OpenSSH (demandé lors de l\u0026rsquo;installation, avec par défaut sur yes), dhclient (si vous choisissez dhcp) et slaacd (si vous utilisez IPv6 en configuration automatique).\nSwap chiffrée Par défaut, la swap d\u0026rsquo;OpenBSD est chiffrée, ce qui signifie que si la mémoire des programmes est envoyée vers la swap, nul ne pourra la déchiffrer plus tard.\nSMT désactivé Dû fait d\u0026rsquo;un très grand nombre de failles de sécurité sur SMT (tel que l\u0026rsquo;HyperThreading), l\u0026rsquo;installation par défaut désactive les cœurs logiciels afin de prévenir toutes fuites de données.\nMeltdown: one of the first security issue related to speculative execution in the CPU Microphone et Webcam désactivés Avec l\u0026rsquo;installation par défaut, les microphones et webcam ne peuvent actuellement rien enregistrer excepté du bruit blanc à moins que vous configuriez sysctl pour cela.\nMaintenance, sorties et mises à jour fréquentes L\u0026rsquo;équipe d\u0026rsquo;OpenBSD publie une nouvelle version tous les six mois, et seules les deux dernières versions reçoivent les mises à jours de sécurité. Cela permet de mettre à jour sans douleur ; le processus de mise à jour est constitué de petites étapes deux fois par an, ce qui aide à garder l\u0026rsquo;ensemble du système à jour. Cela évite la crainte d\u0026rsquo;une mise à jour massive, de ne jamais la faire et je considère que c\u0026rsquo;est un énorme bonus de sécurité. La plupart des OpenBSD fonctionnent sur les versions les plus récentes.\nSignify : chaîne de confiance L\u0026rsquo;installateur, les archives et les paquets sont signés en utilisant les clés publiques et privées de signify. Les installations d\u0026rsquo;OpenBSD sont fournies avec les versions de clés de la version courante et n+1 afin de vérifier l’authenticité des paquets. Une clé est utilisée seulement six mois et de nouvelles clés sont reçues à chaque nouvelle sortie permettant de construire une chaîne de confiance. Les clés Signify sont très petites et sont publiées dans de nombreux médias afin de permettre une double vérification si vous avez besoin de vous assurer de cette chaîne de confiance.\nSignify at BSDCan 2015 Les Paquets Alors que la plupart des éléments précédents concernaient le système de base ou le noyau, les paquets ont également quelques astuces à offrir.\nchroot par défaut quand disponible La plupart des démons qui sont disponibles offrent une fonctionnalité de chroot qui sera activée par défaut. Dans certaines circonstances, tel que pour le serveur web Nginx, le logiciel est patché par l\u0026rsquo;équipe OpenBSD afin d\u0026rsquo;activer chroot qui n\u0026rsquo;est pas une fonctionnalité officielle.\nDes utilisateurs dédiés aux services La plupart des paquets qui fournissent un serveur crée aussi un utilisateur dédié exactement à ce service, permettant la séparation des privilèges en cas de problèmes de sécurité dans le service.\nL\u0026rsquo;installation d\u0026rsquo;un service ne l\u0026rsquo;active pas Lorsque vous installez un service, celui-ci n\u0026rsquo;est pas activé par défaut. Vous allez devoir configurer le système pour l\u0026rsquo;activer au démarrage. Il y a un unique fichier /etc/rc.conf.local qui peut être utilisé pour voir ce qui est actif au démarrage, qui peut être manipulé par l\u0026rsquo;utilisation de la commande rcctl. Forcer l\u0026rsquo;utilisateur à activer les services oblige l\u0026rsquo;administrateur système à être pleinement attentif à ce qui est exécuté dans le système, ce qui est un bon point pour la sécurité.\nrcctl man page Conclusion La plupart des \u0026ldquo;fonctionnalités de sécurité\u0026rdquo; vues devraient être considérées comme de bonnes pratiques et non pas comme des fonctionnalités. Beaucoup des bonnes pratiques suivantes pourraient être facilement mises en œuvre : Limiter les ressources utilisateurs, réduire les privilèges des démons, être strict dans l\u0026rsquo;utilisation de la mémoire, fournir une bonne documentation, démarrer le strict minimum requis de services et fournir à l\u0026rsquo;utilisateur une installation par défaut propre qui peut être personnalisé plus tard.\nIl y a aussi de nombreuses autres fonctionnalités qui ont été ajoutées, que je ne comprend pas pleinement ; je préfère laisser au lecteur le soin d\u0026rsquo;en prendre connaissance.\n« Mitigations and other real security features » by Theo De Raadt OpenBSD innovations OpenBSD events, often including slides or videos ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://dataswamp.org/~solene/2021-02-14-openbsd-default-security.html\" rel=\"external\"\u003eWhat security does a default OpenBSD installation offer?\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Solène Rapenne.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eDans ce texte, j\u0026rsquo;expliquerais ce qui rend OpenBSD sécurisé par défaut quand\nvous l\u0026rsquo;installez. Ce n\u0026rsquo;est pas une analyse de la sécurité, mais plutôt un\nguide pour vous aider à comprendre ce qui est fait pour qu\u0026rsquo;OpenBSD soit\nun environnement sécurisé. Le but est ce texte n\u0026rsquo;est pas de comparer OpenBSD\nà d\u0026rsquo;autres OS mais de vous dire ce que vous pouvez attendre honnêtement\nd\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003cp\u003eIl n\u0026rsquo;y a pas de sécurité sans modèle de gestion des menaces. Je considère\ntoujours les cas suivants : un ordinateur volé à domicile, une attaque à\ndistance qui essaye d\u0026rsquo;exploiter les services fonctionnant, un exploit\nau-travers des clients réseaux.\u003c/p\u003e\n\u003ch2 id=\"gestion-de-la-sécurité\"\u003eGestion de la Sécurité\u003c/h2\u003e\n\u003cp\u003eVoici une liste de fonctionnalités que je considère importante pour la\nsécurité du système d\u0026rsquo;exploitation. Bien que tous les éléments de la liste\nsuivante ne sont pas à strictement parlé des fonctionnalités de sécurité,\nils aident à obtenir un système strict qui empêche le logiciel de mal se\ncomporter ou les risques inconnus.\u003c/p\u003e\n\u003cp\u003eMon opinion relative à la sécurité n\u0026rsquo;est pas seulement de prévenir les\nattaques à distances de pénétrer le système, mais aussi d\u0026rsquo;empêcher les\nprogrammes ou les utilisateurs de rendre le système inutilisable.\u003c/p\u003e\n\u003ch3 id=\"pledge--unveil-en-espace-utilisateur\"\u003ePledge / Unveil en espace utilisateur\u003c/h3\u003e\n\u003cp\u003ePledge et unveil sont souvent cités ensembles bien qu\u0026rsquo;ils puissent être\nutilisés indépendamment. Pledge est un système d\u0026rsquo;appels pour restreindre\nles permissions d\u0026rsquo;un programme au sein de son code source, permissions qui\nne peuvent pas être annulées une fois l\u0026rsquo;appel à pledge. Unveil est un\nsystème d\u0026rsquo;appels qui cache tout le système de fichiers au processus\nexcepté les chemins qui ne sont pas surveillés ; il est possible de choisir\nquelles permissions sont appliquées aux chemins.\u003c/p\u003e\n\u003cp\u003eLes deux sont de puissants outils de sécurité \u0026ldquo;chirurgicaux\u0026rdquo; mais ils\nrequièrent quelques modifications dans le code source d\u0026rsquo;un programme, et\nles ajouter requiert une profonde compréhension de ce que fait le logiciel.\nIl n\u0026rsquo;est pas toujours possible d\u0026rsquo;interdire les appels systèmes d\u0026rsquo;un logiciel\nqui exige de faire presque tout ; un logiciel conçu avec la séparation\ndes privilèges est un meilleur candidat pour l\u0026rsquo;ajout propre de pledge, ainsi\nchaque partie fait son travail.\u003c/p\u003e\n\u003cp\u003eCertains logiciels parmi les paquets prennent en charge pledge et/ou unveil,\ntel que Chromium ou Firefox, pour les plus connus.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/papers/bsdcan2019-unveil/index.html\" rel=\"external\"\u003eOpenBSD presentation about Unveil (BSDCan2019)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/papers/BeckPledgeUnveilBSDCan2018.pdf\" rel=\"external\"\u003eOpenBSD presentation of Pledge and Unveil (BSDCan2018)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"séparation-des-privilèges\"\u003eSéparation des privilèges\u003c/h3\u003e\n\u003cp\u003eLa plupart des services du système de base d\u0026rsquo;OpenBSD fonctionnent selon\nle modèle de séparation des privilèges. Chaque part d\u0026rsquo;un démon est restreint\nau minimum requis. Un démon monolithique devrait lire, écrire des fichiers,\naccepter des connexions réseaux, envoyer des messages au système de journalisation,\ndans le cas d\u0026rsquo;une brèche de sécurité qui offre une énorme surface d\u0026rsquo;attaque.\nEn séparant un service en de multiples parties, cela permet un contrôle\nplus fin de chacun des processus, et en utilisant les appels systèmes de pledge\net unveil, il est possible de paramétrer les limites et de réduire hautement\nles dommages en cas où un processus est attaqué.\u003c/p\u003e\n\u003ch3 id=\"synchronisation-de-lhorloge\"\u003eSynchronisation de l\u0026rsquo;Horloge\u003c/h3\u003e\n\u003cp\u003eLe démon du serveur est démarré par défaut afin de synchroniser l\u0026rsquo;horloge\navec des serveurs de temps. Un serveur TLS référant est utilisé pour\ninterroger les serveurs de temps. Garder un ordinateur avec son horloge\nsynchronisée est très important. Ce n\u0026rsquo;est pas réellement une fonctionnalité\nde sécurité mais vous ne pouvez pas être sérieux si vous utilisez un\nordinateur sur le réseau qui n\u0026rsquo;ait pas son temps synchronisé.\u003c/p\u003e\n\u003ch3 id=\"affichage-x-sans-droits-root\"\u003eAffichage X sans droits root\u003c/h3\u003e\n\u003cp\u003esi vous utilisez le serveur X, il abandonne les privilèges à l\u0026rsquo;utilisateur\n\u003ccode\u003e_x11\u003c/code\u003e ; le serveur est exécuté avec les droits d\u0026rsquo;un utilisateur\nsans privilèges au lieu de root, ainsi en cas de problèmes de sécurité\ncela empêche un attaquant d’accéder au-travers de bogues de X11 à plus\nqu\u0026rsquo;il ne devrait.\u003c/p\u003e\n\u003ch3 id=\"ressources-limitées\"\u003eRessources limitées\u003c/h3\u003e\n\u003cp\u003eLes limites de ressources par défaut empêchent un programme d\u0026rsquo;utiliser\ntrop de mémoire, d\u0026rsquo;ouvrir trop de fichier ou trop de processus. Bien que\ncela puisse empêcher que certains gros programmes de s\u0026rsquo;exécuter avec les\nparamètres par défaut, cela aide aussi à trouver les failles de descripteurs\nde fichiers, prévenant ainsi une bombe dérivée ou un simple démon de\ncapturer toute la mémoire jusqu\u0026rsquo;au crash.\u003c/p\u003e\n\u003ch3 id=\"authentique-chiffrement-de-disque\"\u003eAuthentique chiffrement de disque\u003c/h3\u003e\n\u003cp\u003eQuand vous installez OpenBSD selon le mode de chiffrement complet de disque,\ntout sera verrouillé par une passphrase à l\u0026rsquo;étape du chargeur de démarrage,\nainsi vous ne pouvez accéder au noyau ou à d\u0026rsquo;autres parties du système sans\nla passphrase.\u003c/p\u003e\n\u003ch3 id=\"wx\"\u003eW^X\u003c/h3\u003e\n\u003cp\u003eLa plupart des programmes dans OpenBSD n\u0026rsquo;ont pas l\u0026rsquo;autorisation de cartographier\nla mémoire avec un bit d\u0026rsquo;Exécution et d’Écriture en même temps (W^X signifie\nÉcrire et/ou Exécuter), cela peut empêcher un interpréteur d\u0026rsquo;avoir sa mémoire\net modifiée et exécutée. Certains paquets ne sont pas conformes à cela et\ndoivent être liés à une bibliothèque spécifique qui contourne cette\nrestriction ET doivent être utilisés depuis une partition ayant l\u0026rsquo;option\nde montage \u0026ldquo;wxallowed\u0026rdquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/papers/hackfest2015-w-xor-x.pdf\" rel=\"external\"\u003eOpenBSD presentation « Kernel W^X Improvements In OpenBSD »\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"une-seule-source-fiable-de-données-aléatoires\"\u003eUne seule source fiable de données aléatoires\u003c/h3\u003e\n\u003cp\u003eLorsque votre système requiert un nombre de données aléatoires (et c\u0026rsquo;est\nsouvent le cas), OpenBSD fournit seulement une seule API pour obtenir ces\ndonnées aléatoires, qui sont réellement aléatoires et ne peuvent être devinées.\nUn bon générateur de nombres aléatoires (RNG) est important pour de nombreuses\nexigences en matière de cryptographie.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/papers/hackfest2014-arc4random/index.html\" rel=\"external\"\u003eOpenBSD presentation about arc4random\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"une-documentation-précise\"\u003eUne documentation précise\u003c/h3\u003e\n\u003cp\u003eOpenBSD est fournit avec une documentation complète dans ses pages de manuels.\nOn doit pouvoir configurer entièrement son système en utilisant seulement\nles pages de manuels. Les pages de manuels sont fournis parfois avec des\nsections CAVEATS ou BUGS ; il est important de bien faire attention à ces\nsections. Il est mieux de lire la documentation et de comprendre ce que\ncela fait avant de configurer un système au lieu de suivre un anonyme texte\nobsolète disponible sur Internet.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/\" rel=\"external\"\u003eOpenBSD man pages online\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/papers/eurobsdcon2018-mandoc.pdf\" rel=\"external\"\u003eEuroBSDcon 2018 about « Better documentation »\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ipsec-et-wireguard-à-lintérieur\"\u003eIPSec et Wireguard à l\u0026rsquo;intérieur\u003c/h3\u003e\n\u003cp\u003eSi vous avez besoin de paramétrer un VPN, vous pouvez utiliser nativement\nles protocoles IPSec ou Wireguard, sans aucun autre paquet requis.\u003c/p\u003e\n\u003ch3 id=\"sécurité-de-la-mémoire\"\u003eSécurité de la mémoire\u003c/h3\u003e\n\u003cp\u003eOpenBSD a de nombreuses mesures de sécurités à-propos de l\u0026rsquo;allocation de\nla mémoire et empêchera son utilisation après libération ou un usage très\nagressif de mémoire non sûre, souvent sources de crash pour certains logiciels\nfournis en tant que paquets puisqu\u0026rsquo;OpenBSD est très strict sur l\u0026rsquo;utilisation\nde la mémoire que vous faites. Cela aide à trouver les utilisations abusives\nde la mémoire et à arrêter les mauvais comportements logiciels.\u003c/p\u003e\n\u003ch3 id=\"compte-root-dédié\"\u003eCompte root dédié\u003c/h3\u003e\n\u003cp\u003eLorsque vous installez le système, un compte root est créé et son mot de\npasse est demandé, puis vous créez un utilisateur qui sera membre du groupe\n\u0026ldquo;wheel\u0026rdquo;, permettant de basculer l\u0026rsquo;utilisateur vers root avec le mot de\npasse de root. doas (l\u0026rsquo;équivalent sudo d\u0026rsquo;OpenBSD) n\u0026rsquo;est pas configuré par\ndéfaut. Avec l\u0026rsquo;installation par défaut, le mot de passe root est requis\npour toute interaction root. Je pense qu\u0026rsquo;un compte root dédié qui peut\nêtre journalisé sans l\u0026rsquo;usage de doas ou sudo est mieux qu\u0026rsquo;une mauvaise\nconfiguration de doas ou sudo permettant ainsi de faire des choses seulement\nsi vous connaissez le mot de passe utilisateur.\u003c/p\u003e\n\u003ch3 id=\"la-plus-petite-surface-dattaque-réseau\"\u003eLa plus petite surface d\u0026rsquo;attaque réseau\u003c/h3\u003e\n\u003cp\u003eLes seuls services qui pourraient être activés dès l\u0026rsquo;installation, écoutant\nsur le réseau, sont OpenSSH (demandé lors de l\u0026rsquo;installation, avec par défaut\nsur yes), dhclient (si vous choisissez dhcp) et slaacd (si vous utilisez\nIPv6 en configuration automatique).\u003c/p\u003e\n\u003ch3 id=\"swap-chiffrée\"\u003eSwap chiffrée\u003c/h3\u003e\n\u003cp\u003ePar défaut, la swap d\u0026rsquo;OpenBSD est chiffrée, ce qui signifie que si la mémoire\ndes programmes est envoyée vers la swap, nul ne pourra la déchiffrer plus tard.\u003c/p\u003e\n\u003ch3 id=\"smt-désactivé\"\u003eSMT désactivé\u003c/h3\u003e\n\u003cp\u003eDû fait d\u0026rsquo;un très grand nombre de failles de sécurité sur SMT (tel que\nl\u0026rsquo;HyperThreading), l\u0026rsquo;installation par défaut désactive les cœurs logiciels\nafin de prévenir toutes fuites de données.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Meltdown_(security_vulnerability)\" rel=\"external\"\u003eMeltdown: one of the first security issue related to speculative execution in the CPU\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"microphone-et-webcam-désactivés\"\u003eMicrophone et Webcam désactivés\u003c/h3\u003e\n\u003cp\u003eAvec l\u0026rsquo;installation par défaut, les microphones et webcam ne peuvent actuellement\nrien enregistrer excepté du bruit blanc à moins que vous configuriez\nsysctl pour cela.\u003c/p\u003e\n\u003ch3 id=\"maintenance-sorties-et-mises-à-jour-fréquentes\"\u003eMaintenance, sorties et mises à jour fréquentes\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;équipe d\u0026rsquo;OpenBSD publie une nouvelle version tous les six mois, et seules\nles deux dernières versions reçoivent les mises à jours de sécurité.\nCela permet de mettre à jour sans douleur ; le processus de mise à jour\nest constitué de petites étapes deux fois par an, ce qui aide à garder\nl\u0026rsquo;ensemble du système à jour.\nCela évite la crainte d\u0026rsquo;une mise à jour massive, de ne jamais la faire et\nje considère que c\u0026rsquo;est un énorme bonus de sécurité. La plupart des OpenBSD\nfonctionnent sur les versions les plus récentes.\u003c/p\u003e\n\u003ch3 id=\"signify--chaîne-de-confiance\"\u003eSignify : chaîne de confiance\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;installateur, les archives et les paquets sont signés en utilisant les\nclés publiques et privées de signify. Les installations d\u0026rsquo;OpenBSD sont\nfournies avec les versions de clés de la version courante et n+1 afin de\nvérifier l’authenticité des paquets. Une clé est utilisée seulement six mois\net de nouvelles clés sont reçues à chaque nouvelle sortie permettant de\nconstruire une chaîne de confiance. Les clés Signify sont très petites et\nsont publiées dans de nombreux médias afin de permettre une double vérification\nsi vous avez besoin de vous assurer de cette chaîne de confiance.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/papers/bsdcan-signify.html\" rel=\"external\"\u003eSignify at BSDCan 2015\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"les-paquets\"\u003eLes Paquets\u003c/h2\u003e\n\u003cp\u003eAlors que la plupart des éléments précédents concernaient le système de\nbase ou le noyau, les paquets ont également quelques astuces à offrir.\u003c/p\u003e\n\u003ch3 id=\"chroot-par-défaut-quand-disponible\"\u003echroot par défaut quand disponible\u003c/h3\u003e\n\u003cp\u003eLa plupart des démons qui sont disponibles offrent une fonctionnalité de\nchroot qui sera activée par défaut. Dans certaines circonstances, tel que\npour le serveur web Nginx, le logiciel est patché par l\u0026rsquo;équipe OpenBSD\nafin d\u0026rsquo;activer chroot qui n\u0026rsquo;est pas une fonctionnalité officielle.\u003c/p\u003e\n\u003ch3 id=\"des-utilisateurs-dédiés-aux-services\"\u003eDes utilisateurs dédiés aux services\u003c/h3\u003e\n\u003cp\u003eLa plupart des paquets qui fournissent un serveur crée aussi un utilisateur\ndédié exactement à ce service, permettant la séparation des privilèges en\ncas de problèmes de sécurité dans le service.\u003c/p\u003e\n\u003ch3 id=\"linstallation-dun-service-ne-lactive-pas\"\u003eL\u0026rsquo;installation d\u0026rsquo;un service ne l\u0026rsquo;active pas\u003c/h3\u003e\n\u003cp\u003eLorsque vous installez un service, celui-ci n\u0026rsquo;est pas activé par défaut.\nVous allez devoir configurer le système pour l\u0026rsquo;activer au démarrage.\nIl y a un unique fichier \u003ccode\u003e/etc/rc.conf.local\u003c/code\u003e qui peut être utilisé pour\nvoir ce qui est actif au démarrage, qui peut être manipulé par l\u0026rsquo;utilisation\nde la commande \u003ccode\u003ercctl\u003c/code\u003e.\nForcer l\u0026rsquo;utilisateur à activer les services oblige l\u0026rsquo;administrateur système\nà être pleinement attentif à ce qui est exécuté dans le système, ce qui\nest un bon point pour la sécurité.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/rcctl\" rel=\"external\"\u003ercctl man page\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eLa plupart des \u0026ldquo;fonctionnalités de sécurité\u0026rdquo; vues devraient être considérées\ncomme de bonnes pratiques et non pas comme des fonctionnalités. Beaucoup\ndes bonnes pratiques suivantes pourraient être facilement mises en œuvre :\nLimiter les ressources utilisateurs, réduire les privilèges des démons,\nêtre strict dans l\u0026rsquo;utilisation de la mémoire, fournir une bonne documentation,\ndémarrer le strict minimum requis de services et fournir à l\u0026rsquo;utilisateur\nune installation par défaut propre qui peut être personnalisé plus tard.\u003c/p\u003e\n\u003cp\u003eIl y a aussi de nombreuses autres fonctionnalités qui ont été ajoutées,\nque je ne comprend pas pleinement ; je préfère laisser au lecteur le soin\nd\u0026rsquo;en prendre connaissance.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/papers/bsdtw.pdf\" rel=\"external\"\u003e« Mitigations and other real security features » by Theo De Raadt\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/innovations.html\" rel=\"external\"\u003eOpenBSD innovations\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/events.html\" rel=\"external\"\u003eOpenBSD events, often including slides or videos\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Traduction du Tutoriel EN → FR 'What security does a default OpenBSD installation offer?' expliquant ce qu'il faut attendre de la sécurité par défaut sous OpenBSD, selon Solène Rapenne",
            "tags": ["Traduction", "OpenBSD", "Sécurité", "6.9"],
            "date_published": "2021-02-20T16:18:45+01:00",
            "date_modified": "2023-05-03T06:30:55+02:00"
        },{
            "id": "urn:uuid:c4134978-d080-03e0-cff8-2401265a85ce",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/smartmontools/",
            "title": "OpenBSD : smartmontools",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Sous OpenBSD, il est possible de surveiller l\u0026rsquo;état de son|ses disque(s) dur(s), nativement par le biais de l\u0026rsquo;outil atactl, qui reste basique, mais fait le job.\nNéanmoins concentrons-nous sur le projet smartmontools… qui est disponible en tant que paquet.\nInstallation Installez le paquet smarmontools.\nConfiguration Le fichier de configuration est /etc/smartd.conf.\nSelon l\u0026rsquo;emplacement de votre disque dur, il peut être intéressant de le paramètrer ainsi :\n/dev/sd0c -a -o on -S on -s (S/../.././02|L/../../7/03)\nQui :\nsurveillera tous les attributs activera la collection des données automatiquement effectuera un test court tous les jours à partir de 2h du matin effectuera un test long tous les dimanches dès 3h du matin. ⇒ Syntaxe :\nla syntaxe entre parenthèses est : T/MM/DD/d/HH\nOù :\nT est le type de Test : C pour un test de transmission L pour un test long O pour un test immédiat hors-ligne S pour un test court MM est le mois de l\u0026rsquo;année en format numérique, de 01 à 12 DD est le jour dans le mois, en format numérique, de 01 à 31 d est le jour dans la semaine, en format numérique, de 1 à 7 ; 1 étant Lundi… HH est l\u0026rsquo;heure, de 01 à 23 ⇒ Activation du démon logiciel :\n# rcctl enable smartd # rcctl start smartd\nUtilisation Informations ⇒ Obtenir les informations du disque dur :\n# smartcl -i /dev/sd1c\nExemple :\n$ doas smartctl -i /dev/sd1c smartctl 7.1 2019-12-30 r5022 [x86_64-unknown-openbsd6.8] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF INFORMATION SECTION === Model Family: SAMSUNG SpinPoint F1 DT Device Model: SAMSUNG HD103UJ Serial Number: S13PJ9CZ200215 LU WWN Device Id: 5 0024e9 201ee0406 Firmware Version: 1AA01118 User Capacity: 1,000,204,886,016 bytes [1.00 TB] Sector Size: 512 bytes logical/physical Device is: In smartctl database [for details use: -P show] ATA Version is: ATA/ATAPI-7, ATA8-ACS T13/1699-D revision 3b Local Time is: Fri Feb 19 12:27:52 2021 CET SMART support is: Available - device has SMART capability. SMART support is: Enabled Exécution de tests ⇒ Exécuter un test smart court :\n# smartctl -t short /dev/sd1c\nExemple :\n$ doas smartctl -t short /dev/sd1c smartctl 7.1 2019-12-30 r5022 [x86_64-unknown-openbsd6.8] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION === Sending command: \u0026#34;Execute SMART Short self-test routine immediately in off-line mode\u0026#34;. Drive command \u0026#34;Execute SMART Short self-test routine immediately in off-line mode\u0026#34; successful. Testing has begun. Please wait 2 minutes for test to complete. Test will complete after Fri Feb 19 12:30:26 2021 CET Use smartctl -X to abort test. ⇒ Exécuter un test smart long :\n# smartctl -t long /dev/sd1c\nExemple :\n$ doas smartctl -t long /dev/sd1c smartctl 7.1 2019-12-30 r5022 [x86_64-unknown-openbsd6.8] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF OFFLINE IMMEDIATE AND SELF-TEST SECTION === Sending command: \u0026#34;Execute SMART Extended self-test routine immediately in off-line mode\u0026#34;. Drive command \u0026#34;Execute SMART Extended self-test routine immediately in off-line mode\u0026#34; successful. Testing has begun. Please wait 228 minutes for test to complete. Test will complete after Fri Feb 19 17:00:35 2021 CET Use smartctl -X to abort test. Gestion des logs ⇒ Vérifier rapidement les erreurs :\n# smartctl -l error /dev/sd1c\nExemple correct :\n$ doas smartctl -l error /dev/sd1c smartctl 7.1 2019-12-30 r5022 [x86_64-unknown-openbsd6.8] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART Error Log Version: 1 No Errors Logged ⇒ Vérifier les résultats des auto-test :\n# smartctl -l selftest /dev/sd1c\nExemple correct :\n$ doas smartctl -l selftest /dev/sd1c smartctl 7.1 2019-12-30 r5022 [x86_64-unknown-openbsd6.8] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART Self-test log structure revision number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Short offline Completed without error 00% 21190 - Exemple avec erreur :\n$ doas smartctl -l selftest /dev/sd1c smartctl 7.1 2019-12-30 r5022 [x86_64-unknown-openbsd6.8] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SMART Self-test log structure revision number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Short offline Completed: read failure 20% 20826 1800697692 # 2 Short offline Completed without error 00% 20817 - Ici l\u0026rsquo;auto-test ne va pas jusqu\u0026rsquo;au bout de l\u0026rsquo;analyse.\nAffichage de la température ⇒ Afficher la température du disque :\n# smartctl -l scttemp /dev/sd1c\nExemple :\n$ doas smartctl -l scttemp /dev/sd1c smartctl 7.1 2019-12-30 r5022 [x86_64-unknown-openbsd6.8] (local build) Copyright (C) 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org === START OF READ SMART DATA SECTION === SCT Status Version: 2 SCT Version (vendor specific): 256 (0x0100) Device State: Active (0) Current Temperature: 27 Celsius Power Cycle Min/Max Temperature: --/27 Celsius Lifetime Min/Max Temperature: --/55 Celsius SCT Temperature History Version: 2 Temperature Sampling Period: 1 minute Temperature Logging Interval: 1 minute Min/Max recommended Temperature: -4/72 Celsius Min/Max Temperature Limit: -9/77 Celsius Temperature History Size (Index): 128 (29) Index Estimated Time Temperature Celsius 30 2021-02-19 10:47 24 ***** 31 2021-02-19 10:48 23 **** 32 2021-02-19 10:49 23 **** 33 2021-02-19 10:50 24 ***** 34 2021-02-19 10:51 23 **** 35 2021-02-19 10:52 23 **** 36 2021-02-19 10:53 23 **** 37 2021-02-19 10:54 24 ***** 38 2021-02-19 10:55 23 **** 39 2021-02-19 10:56 24 ***** Toutes les données ⇒ Afficher les données complètes :\n# smartctl -a /dev/sd1c\nDocumentations $ man smartd smartd.conf La documentation officielle du projet sur smartmontools.org. ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD, il est possible de surveiller l\u0026rsquo;état de son|ses disque(s)\ndur(s), nativement par le biais de l\u0026rsquo;outil \u003cstrong\u003eatactl\u003c/strong\u003e, qui reste basique,\nmais fait le job.\u003c/p\u003e\n\u003cp\u003eNéanmoins concentrons-nous sur le projet \u003cstrong\u003esmartmontools\u003c/strong\u003e… qui est\ndisponible en tant que paquet.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003cstrong\u003esmarmontools\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration est \u003ccode\u003e/etc/smartd.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSelon l\u0026rsquo;emplacement de votre disque dur, il peut être intéressant de le\nparamètrer ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e/dev/sd0c -a -o on -S on -s (S/../.././02|L/../../7/03)\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eQui :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esurveillera tous les attributs\u003c/li\u003e\n\u003cli\u003eactivera la collection des données automatiquement\u003c/li\u003e\n\u003cli\u003eeffectuera un test court tous les jours à partir de 2h du matin\u003c/li\u003e\n\u003cli\u003eeffectuera un test long tous les dimanches dès 3h du matin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Syntaxe :\u003c/p\u003e\n\u003cp\u003ela syntaxe entre parenthèses est : \u003ccode\u003eT/MM/DD/d/HH\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eOù :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eT\u003c/strong\u003e est le type de Test :\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eC\u003c/strong\u003e pour un test de transmission\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eL\u003c/strong\u003e pour un test long\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eO\u003c/strong\u003e pour un test immédiat hors-ligne\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eS\u003c/strong\u003e pour un test court\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMM\u003c/strong\u003e est le mois de l\u0026rsquo;année en format numérique, de 01 à 12\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDD\u003c/strong\u003e est le jour dans le mois, en format numérique, de 01 à 31\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ed\u003c/strong\u003e est le jour dans la semaine, en format numérique, de 1 à 7 ; 1 étant Lundi…\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHH\u003c/strong\u003e est l\u0026rsquo;heure, de 01 à 23\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Activation du démon logiciel :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# rcctl enable smartd\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e# rcctl start smartd\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"informations\"\u003eInformations\u003c/h3\u003e\n\u003cp\u003e⇒ Obtenir les informations du disque dur :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# smartcl -i /dev/sd1c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas smartctl -i /dev/sd1c                  \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmartctl 7.1 2019-12-30 r5022 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ex86_64-unknown-openbsd6.8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal build\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e START OF INFORMATION \u003cspan style=\"color:#ef6155\"\u003eSECTION\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eModel Family:     SAMSUNG SpinPoint F1 DT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDevice Model:     SAMSUNG HD103UJ\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSerial Number:    S13PJ9CZ200215\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLU WWN Device Id: \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e 0024e9 201ee0406\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFirmware Version: 1AA01118\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUser Capacity:    1,000,204,886,016 bytes \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e1.00 TB\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSector Size:      \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes logical/physical\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDevice is:        In smartctl database \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e details use: -P show\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eATA Version is:   ATA/ATAPI-7, ATA8-ACS T13/1699-D revision 3b\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLocal Time is:    Fri Feb \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e 12:27:52 \u003cspan style=\"color:#f99b15\"\u003e2021\u003c/span\u003e CET\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSMART support is: Available - device has SMART capability.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSMART support is: Enabled\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"exécution-de-tests\"\u003eExécution de tests\u003c/h3\u003e\n\u003cp\u003e⇒ Exécuter un test smart court :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# smartctl -t short /dev/sd1c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas smartctl -t short /dev/sd1c            \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmartctl 7.1 2019-12-30 r5022 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ex86_64-unknown-openbsd6.8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal build\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e START OF OFFLINE IMMEDIATE AND SELF-TEST \u003cspan style=\"color:#ef6155\"\u003eSECTION\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSending command: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Execute SMART Short self-test routine immediately in off-line mode\u0026#34;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDrive command \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Execute SMART Short self-test routine immediately in off-line mode\u0026#34;\u003c/span\u003e successful.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTesting has begun.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePlease wait \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e minutes \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test to complete.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTest will complete after Fri Feb \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e 12:30:26 \u003cspan style=\"color:#f99b15\"\u003e2021\u003c/span\u003e CET\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUse smartctl -X to abort test.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Exécuter un test smart long :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# smartctl -t long /dev/sd1c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas smartctl -t long /dev/sd1c               \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmartctl 7.1 2019-12-30 r5022 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ex86_64-unknown-openbsd6.8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal build\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e START OF OFFLINE IMMEDIATE AND SELF-TEST \u003cspan style=\"color:#ef6155\"\u003eSECTION\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSending command: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Execute SMART Extended self-test routine immediately in off-line mode\u0026#34;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDrive command \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Execute SMART Extended self-test routine immediately in off-line mode\u0026#34;\u003c/span\u003e successful.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTesting has begun.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePlease wait \u003cspan style=\"color:#f99b15\"\u003e228\u003c/span\u003e minutes \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e test to complete.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTest will complete after Fri Feb \u003cspan style=\"color:#f99b15\"\u003e19\u003c/span\u003e 17:00:35 \u003cspan style=\"color:#f99b15\"\u003e2021\u003c/span\u003e CET\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUse smartctl -X to abort test.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"gestion-des-logs\"\u003eGestion des logs\u003c/h3\u003e\n\u003cp\u003e⇒ Vérifier rapidement les erreurs :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# smartctl -l error /dev/sd1c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemple correct :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas smartctl -l error /dev/sd1c \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmartctl 7.1 2019-12-30 r5022 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ex86_64-unknown-openbsd6.8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal build\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e START OF READ SMART DATA \u003cspan style=\"color:#ef6155\"\u003eSECTION\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSMART Error Log Version: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNo Errors Logged\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Vérifier les résultats des auto-test :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# smartctl -l selftest /dev/sd1c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemple correct :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas smartctl -l selftest /dev/sd1c\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmartctl 7.1 2019-12-30 r5022 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ex86_64-unknown-openbsd6.8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal build\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e START OF READ SMART DATA \u003cspan style=\"color:#ef6155\"\u003eSECTION\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSMART Self-test log structure revision number \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNum  Test_Description    Status                  Remaining  LifeTime\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ehours\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  LBA_of_first_error\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# 1  Short offline       Completed without error       00%     21190         -\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExemple avec erreur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas smartctl -l selftest /dev/sd1c \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmartctl 7.1 2019-12-30 r5022 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ex86_64-unknown-openbsd6.8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal build\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e START OF READ SMART DATA \u003cspan style=\"color:#ef6155\"\u003eSECTION\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSMART Self-test log structure revision number \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNum  Test_Description    Status                  Remaining  LifeTime\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ehours\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e  LBA_of_first_error\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# 1  Short offline       Completed: read failure       20%     20826         1800697692\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# 2  Short offline       Completed without error       00%     20817         -\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIci l\u0026rsquo;auto-test ne va pas jusqu\u0026rsquo;au bout de l\u0026rsquo;analyse.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"affichage-de-la-température\"\u003eAffichage de la température\u003c/h3\u003e\n\u003cp\u003e⇒ Afficher la température du disque :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# smartctl -l scttemp /dev/sd1c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas smartctl -l scttemp /dev/sd1c \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esmartctl 7.1 2019-12-30 r5022 \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ex86_64-unknown-openbsd6.8\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal build\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eC\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2002-19, Bruce Allen, Christian Franke, www.smartmontools.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e START OF READ SMART DATA \u003cspan style=\"color:#ef6155\"\u003eSECTION\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e===\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSCT Status Version:                  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSCT Version \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003evendor specific\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:       \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x0100\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDevice State:                        Active \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCurrent Temperature:                    \u003cspan style=\"color:#f99b15\"\u003e27\u003c/span\u003e Celsius\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePower Cycle Min/Max Temperature:     --/27 Celsius\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLifetime    Min/Max Temperature:     --/55 Celsius\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSCT Temperature History Version:     \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTemperature Sampling Period:         \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e minute\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTemperature Logging Interval:        \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e minute\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMin/Max recommended Temperature:     -4/72 Celsius\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMin/Max Temperature Limit:           -9/77 Celsius\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTemperature History Size \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eIndex\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:    \u003cspan style=\"color:#f99b15\"\u003e128\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e29\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIndex    Estimated Time   Temperature Celsius\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e    2021-02-19 10:47    \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e  *****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e    2021-02-19 10:48    \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e  ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e    2021-02-19 10:49    \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e  ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e33\u003c/span\u003e    2021-02-19 10:50    \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e  *****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e34\u003c/span\u003e    2021-02-19 10:51    \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e  ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e35\u003c/span\u003e    2021-02-19 10:52    \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e  ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e36\u003c/span\u003e    2021-02-19 10:53    \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e  ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e37\u003c/span\u003e    2021-02-19 10:54    \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e  *****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e38\u003c/span\u003e    2021-02-19 10:55    \u003cspan style=\"color:#f99b15\"\u003e23\u003c/span\u003e  ****\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#f99b15\"\u003e39\u003c/span\u003e    2021-02-19 10:56    \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e  *****\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"toutes-les-données\"\u003eToutes les données\u003c/h3\u003e\n\u003cp\u003e⇒ Afficher les données complètes :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# smartctl -a /dev/sd1c\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e$ man smartd smartd.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLa documentation officielle du projet sur \u003ca href=\"http://smartmontools.org\" rel=\"external\"\u003esmartmontools.org\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Explications de l'outil smartmontools sous OpenBSD",
            "tags": ["OpenBSD", "smartmontools", "smartctl", "astuce"],
            "date_published": "2021-02-19T12:44:58+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:f562f2d1-f486-d125-7d09-3ee967b65a2f",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-gemini-gopher/",
            "title": "Hugo : Gemini, Gopher… 'Quoi d'autres ?!'",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Gemini et Gopher sont deux autres Internet, tout à fait légaux, dont le but est de la publication \u0026ldquo;légère\u0026rdquo; d\u0026rsquo;informations, principalement du texte. En fait, historiquement Gopher est né en 1991, en parallèle du Grand Net sur protocole HTTP ; tandis que Gemini est un protocole de communication récent, né courant juin 2019.\nTout comme le Grand Net sur HTTP(S), Gopher et Gemini ont leur propre protocole de communication, portant leur propre nom :\nGemini : gemini:// Gopher : gopher:// À savoir que le protocole gemini est basé sur TLS directement… De plus, bien que ces protocoles soient cloisonnés entre eux, en effet les protocoles Gemini, Gopher et HTTP(S) sont des réseaux différents, par des services différents, sur des ports différents, il existe des passerelles du côté de Gemini et Gopher, vers HTTP(S).\nNe cherchez pas toutes les fioritures que permet le protocole HTTP(S), exit les scripts CSS, JS, voire les images, avec Gemini et Gopher, on se concentre principalement sur la ressource importante : le texte. cf : cherchez Low Web ;-)\nComment modifier Hugo pour lui faire générer des fichiers à publier sur les protocoles Gemini, et Gopher ?\nDans les faits, vous prendrez plus de temps à lire cet article, qu\u0026rsquo;à faire vos modifications basiques, qui sont possibles d\u0026rsquo;être faites en moins de 5 minutes !!!\nIl y a(ura) certainements de petites modifications à apporter… mais l\u0026rsquo;esprit de l\u0026rsquo;article est là, et fonctionnel. ;-)\nAttentionATTENTION : les modifications ci-dessous actuellement sont fonctionnelles dans le contexte d\u0026rsquo;une configuration basique de Hugo.\nDans le cas d\u0026rsquo;un site multi-langue, ou que vous avez paramétré la variable permalinks.posts, le résultat attendu n\u0026rsquo;aura pas lieu.\nDans les faits, le repertoire géré par la variable path est lié au répertoire de sortie. Ainsi dans le contexte multilangue, vous retrouverez dans chaque répertoire de langue un répertoire nommé selon le protocole cible !\nAinsi, vous aurez dans le répertoire public/, d\u0026rsquo;abord les répertoires de langue, puis le répertoire gemini ou gopher.\nAlors que dans une configuration basique, le répertoire gemini ou gopher sera directement déposé à la racine du répertoire public/.\nGemini Concernant les modifications pour Gemini, voici le propos :\nConfiguration pour Gemini Modifions très simplement le fichier de configuration de Hugo config.toml :\nConfiguration Gemini : ajout du mimetype # Gemini [mediaTypes.\u0026#34;text/gemini\u0026#34;] suffixes = [\u0026#34;gmi\u0026#34;] Configuration Gemini : ajout du format de sortie # Gemini [outputFormats.Gemini] isPlainText = true isHTML = false mediaType = \u0026#34;text/gemini\u0026#34; name = \u0026#34;gemini\u0026#34; path = \u0026#34;gemini/\u0026#34; permalinkable = true protocol = \u0026#34;gemini://\u0026#34; Remarquons que la publication des fichiers gmi auront lieu dans un répertoire distinct, nommé gemini, dans le répertoire public/. Ce seront de purs fichiers texte, ayant l\u0026rsquo;extension .gmi.\nPuis dans la configuration de la sortie, par exemple :\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;gemini\u0026#34;, …] page = [\u0026#34;HTML\u0026#34;, \u0026#34;gemini\u0026#34;, …] Bien sûr, ne pas utiliser les \u0026lsquo;…\u0026rsquo; dans votre configuration ; ici, ils expriment les autres options de génération possible, sans les nommer !\nGemini est capable de lire des fichiers au format RSS, ce qui nous permet de générer un flux RSS ; ajoutons un nouveau format de sortie spécifique :\n[outputFormats.GeminiRSS] isHTML = false mediaType = \u0026#34;application/rss+xml\u0026#34; name = \u0026#34;GeminiRSS\u0026#34; protocol = \u0026#34;gemini://\u0026#34; path = \u0026#34;gemini/\u0026#34; et modifions la génération de sortie, tel que par exemple :\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;gemini\u0026#34;, \u0026#34;GeminiRSS\u0026#34;, …] Layouts pour Gemini index.gmi Ajoutons un fichier index.gmi dans le repertoire layouts/, qui pour l\u0026rsquo;exemple aura le code hugo basique suivant :\n{{ range .Paginator.Pages }} {{- if .OutputFormats.Get \u0026#34;gemini\u0026#34; }} ⇒ {{ replace .Permalink \u0026#34;/gemini\u0026#34; \u0026#34;\u0026#34; 1 }} {{ .Date.Format \u0026#34;January 2, 2006\u0026#34; }}: {{ .Title | safeHTML }}{{ end }}{{ end }} Libre à vous de modifier, améliorer la pertinence du code Hugo pour obtenir le contenu que vous désirez publier…\nindex.geminirss.xml Si vous désirez gérez un flux RSS pour Gemini, selon la configuration ci-dessus, ajoutons un fichier index.geminirss.xml, ayant le contenu de génération tel que :\n{{- $pctx := . -}} {{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}} {{- $pages := slice -}} {{- if or $.IsHome $.IsSection -}} {{- $pages = $pctx.RegularPages -}} {{- else -}} {{- $pages = $pctx.Pages -}} {{- end -}} {{- $limit := .Site.Config.Services.RSS.Limit -}} {{- if ge $limit 1 -}} {{- $pages = $pages | first $limit -}} {{- end -}} {{- printf \u0026#34;\u0026lt;?xml version=\\\u0026#34;1.0\\\u0026#34; encoding=\\\u0026#34;utf-8\\\u0026#34; standalone=\\\u0026#34;yes\\\u0026#34;?\u0026gt;\u0026#34; | safeHTML }} \u0026lt;rss version=\u0026#34;2.0\u0026#34; xmlns:atom=\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u0026gt; \u0026lt;channel\u0026gt; \u0026lt;title\u0026gt;{{ .Site.Title | safeHTML }}\u0026lt;/title\u0026gt; \u0026lt;link\u0026gt;{{ replace .Permalink \u0026#34;https\u0026#34; \u0026#34;gemini\u0026#34; 1 }}\u0026lt;/link\u0026gt; \u0026lt;description\u0026gt;{{ .Site.Params.siteDescription | safeHTML }}\u0026lt;/description\u0026gt; \u0026lt;generator\u0026gt;Hugo {{ hugo.Version }} gohugo.io\u0026lt;/generator\u0026gt;{{ with .Site.LanguageCode }} \u0026lt;language\u0026gt;{{.}}\u0026lt;/language\u0026gt;{{end}}{{ with .Site.Params.Author.email }} \u0026lt;managingEditor\u0026gt;{{.}}{{ with $.Site.Params.Author.name }} ({{.}}){{end}}\u0026lt;/managingEditor\u0026gt;{{end}}{{ with .Site.Params.Author.email }} \u0026lt;webMaster\u0026gt;{{.}}{{ with $.Site.Params.Author.name }} ({{.}}){{end}}\u0026lt;/webMaster\u0026gt;{{end}}{{ with .Site.Copyright }} \u0026lt;copyright\u0026gt;{{.}}\u0026lt;/copyright\u0026gt;{{end}}{{ if not .Date.IsZero }} \u0026lt;lastBuildDate\u0026gt;{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u0026lt;/lastBuildDate\u0026gt;{{ end }} {{ with .OutputFormats.Get \u0026#34;RSS\u0026#34; }} {{ printf \u0026#34;\u0026lt;atom:link href=%q rel=\\\u0026#34;self\\\u0026#34; type=%q /\u0026gt;\u0026#34; .Permalink .MediaType | safeHTML }} {{ end }} {{ range $pages }} {{- if .OutputFormats.Get \u0026#34;gemini\u0026#34; -}} \u0026lt;item\u0026gt; \u0026lt;title\u0026gt;{{ .Title | safeHTML }}\u0026lt;/title\u0026gt; {{ with .OutputFormats.Get \u0026#34;gemini\u0026#34; }} \u0026lt;link\u0026gt;{{replace .Permalink \u0026#34;/gemini\u0026#34; \u0026#34;\u0026#34; 1}}\u0026lt;/link\u0026gt; {{ end }} \u0026lt;pubDate\u0026gt;{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u0026lt;/pubDate\u0026gt; {{ with .Site.Params.Author.email }}\u0026lt;author\u0026gt;{{.}}{{ with $.Site.Params.Author.name }} ({{.}}){{end}}\u0026lt;/author\u0026gt;{{end}} {{ with .OutputFormats.Get \u0026#34;gemini\u0026#34; }} \u0026lt;guid\u0026gt;{{replace .Permalink \u0026#34;/gemini\u0026#34; \u0026#34;\u0026#34; 1}}\u0026lt;/guid\u0026gt; {{ end }} \u0026lt;/item\u0026gt; {{- end -}} {{ end }} \u0026lt;/channel\u0026gt; \u0026lt;/rss\u0026gt; single.gmi Dans le répertoire enfant _default du sous répertoire layouts/, ajoutons un simple fichier single.gmi qui s\u0026rsquo;occupera principalement de la génération des pages :\n# {{ $.Title | safeHTML }} {{ .RawContent }} C\u0026rsquo;est basique ; ca fait le boulot, simplement. Là encore libre à vous de modifier, ajouter votre code Hugo, pour générer plus proprement afin de débarrasser du code Markdown, par exemple :\n{{ $scratch := newScratch }} {{ $content := .RawContent -}} {{ $content := $content | replaceRE `#### ` \u0026#34;### \u0026#34; -}} {{ $content := $content | replaceRE `\\n- (.+?)` \u0026#34;\\n* $1\u0026#34; -}} {{ $content := $content | replaceRE `\\n(\\d+). (.+?)` \u0026#34;\\n* $2\u0026#34; -}} {{ $content := $content | replaceRE `\\[\\^(.+?)\\]:?` \u0026#34;\u0026#34; -}} {{ $content := $content | replaceRE `\u0026lt;br/??\u0026gt;` \u0026#34;\\n\u0026#34; -}} {{ $content := $content | replaceRE `\u0026lt;a .*href=\u0026#34;(.+?)\u0026#34;.*\u0026gt;(.+?)\u0026lt;/a\u0026gt;` \u0026#34;[$2]($1)\u0026#34; -}} {{ $content := $content | replaceRE `\\sgemini://(\\S*)` \u0026#34; [gemini://$1](gemini://$1)\u0026#34; -}} {{ $content := $content | replaceRE \u0026#34;([^`])\u0026lt;.*?\u0026gt;([^`])\u0026#34; \u0026#34;$1$2\u0026#34; -}} {{ $content := $content | replaceRE `\\n\\n!\\[.*\\]\\((.+?) \\\u0026#34;(.+?)\\\u0026#34;\\)` \u0026#34;\\n\\n=\u0026gt; $1 Image: $2\u0026#34; -}} {{ $content := $content | replaceRE `\\n\\n!\\[.*]\\((.+?)\\)` \u0026#34;\\n\\n=\u0026gt; $1 Embedded Image: $1\u0026#34; -}} {{ $links := findRE `\\n=\u0026gt; ` $content }}{{ $scratch.Set \u0026#34;ref\u0026#34; (add (len $links) 1) }} {{ $refs := findRE `\\[.+?\\]\\(.+?\\)` $content }} {{ $scratch.Set \u0026#34;content\u0026#34; $content }}{{ range $refs }}{{ $ref := $scratch.Get \u0026#34;ref\u0026#34; }}{{ $contentInLoop := $scratch.Get \u0026#34;content\u0026#34; }}{{ $url := (printf \u0026#34;%s #%d\u0026#34; . $ref) }}{{ $contentInLoop := replace $contentInLoop . $url -}}{{ $scratch.Set \u0026#34;content\u0026#34; $contentInLoop }}{{ $scratch.Set \u0026#34;ref\u0026#34; (add $ref 1) }}{{ end }}{{ $content := $scratch.Get \u0026#34;content\u0026#34; | replaceRE `\\[(.+?)\\]\\((.+?)\\) #(\\d+)` \u0026#34;$1 [$3]\u0026#34; -}} {{ $content | safeHTML }} Explications :\nCe code - qui fait très bien son travail - est un copié-collé du code créé par un certain Wouter Groeneveld ; les explications sont fournies en anglais. N\u0026rsquo;ayant pas l\u0026rsquo;utilité de gérer des fichiers audio, vidéo, localement ou sur d\u0026rsquo;autres plateformes, j\u0026rsquo;ai simplement supprimé les lignes correspondantes.\nVoilà (pour la partie Gemini) !\nIl ne reste plus qu\u0026rsquo;à publier…\nGopher Attaquons les modifications de configurations et de calques pour générer les fichiers textes pour Gopher. Là encore, nous générons les fichiers dans un répertoire dédié, nommé gopher dans le répertoire public/ afin de faciliter la synchronisation vers le serveur gopher…\nConfiguration pour Gopher Modifions donc le fichier de configuration de Hugo, pour ajouter les formats de génération. En effet :\nle premier va nous être utile pour la génération des pages, qui porteront le nom index, dans leur propre répertoire le second pour générer les fichiers d\u0026rsquo;indexation gophermap Tous auront l\u0026rsquo;extension de fichier .txt et seront publiés dans un sous-répertoire nommé gopher du répertoire public/.\n[outputFormats.Gopher] baseName = \u0026#34;index\u0026#34; isPlainText = true isHTML = false mediaType = \u0026#34;text/plain\u0026#34; noUgly = false path = \u0026#34;gopher/\u0026#34; protocol = \u0026#34;gopher://\u0026#34; [outputFormats.GopherMap] baseName = \u0026#34;gophermap\u0026#34; isPlainText = true isHTML = false mediaType = \u0026#34;text/plain\u0026#34; noUgly = false path = \u0026#34;gopher/\u0026#34; protocol = \u0026#34;gopher://\u0026#34; Puis modifions la génération des sorties, tel que :\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;gemini\u0026#34;, \u0026#34;GeminiRSS\u0026#34;, \u0026#34;gophermap\u0026#34;, …] page = [\u0026#34;HTML\u0026#34;, \u0026#34;gemini\u0026#34;, \u0026#34;gopher\u0026#34;] Layouts pour Gopher Attaquons la partie des fichiers à créer dans le sous-répertoire layouts/.\nindex.gophermap.txt Restons simple :\n{{ .Site.Title | safeHTML }} ⇒ Menu : {{ range .Site.Menus.main }} {{- if (or (eq .Identifier \u0026#34;search\u0026#34;) (eq .Identifier \u0026#34;lang-switcher\u0026#34;) (eq .Identifier \u0026#34;theme-switcher\u0026#34;) ) }} {{- else }} 1{{ .Name }} {{ .URL | safeURL }} 70 {{- end -}} {{ end }} ⇒ Articles les plus récents : {{ $nb := 7 }} {{ range first $nb .Paginator.Pages }} 0{{ .Title }} {{ with .OutputFormats.Get \u0026#34;gopher\u0026#34; }} {{ replaceRE \u0026#34;/gopher\u0026#34; \u0026#34;\u0026#34; .RelPermalink }} 70 {{ end }} {{- end }} Ce fichier gophermap nous permet de publier simplement l\u0026rsquo;équivalent du menu principal de Hugo, ainsi que promouvoir les x derniers articles. - ici, les 7 derniers -\nPour ceux qui n\u0026rsquo;auraient pas compris : les fichiers gophermap sont des fichiers d\u0026rsquo;indexation de contenu…\nlist.gophermap.txt Ajoutons dans le répertoire enfant _default/ du sous-répertoire layout/, un fichier de génération de liste, qui peut avoir le contenu basique suivant :\n!{{ .Title | safeHTML }} {{ .RawContent }} {{ range .Paginator.Pages }} 0{{ .Title }} {{ with .OutputFormats.Get \u0026#34;gopher\u0026#34; -}}{{ .RelPermalink }} {{ $.Site.Params.hostname}} 70 {{ end }} {{ end }} single.gopher.txt Pour la génération des pages, ajoutons dans le même sous-répertoire _default/, un fichier nommé single.gopher.txt qui peut avoir le contenu basique suivant :\n!{{ .Title | safeHTML }} {{ .Date.Format (.Site.Params.dateform | default \u0026#34;01 January 2006\u0026#34;) }} · {{ .ReadingTime }} minute(s) de lecture. {{ if .Params.tags }} Tags : {{ range .Params.tags }}{{ . }} {{ end }} {{ end }} --- {{ .RawContent }} --- Publié le : {{.Date.Format \u0026#34;2 January 2006\u0026#34;}}. 0⇒ Revenir à la page d\u0026#39;accueil : / 70 h⇒ Lire l\u0026#39;article “{{ $.Title | safeHTML }}” sur le protocole HTTP(S) : {{ .Permalink | safeURL }} 443 Le contenu de ce site est diffusé sous Licence {{ $.Site.Copyright | safeHTML }}. Encore une fois, à vous de modifier à votre convenance et autres imaginations nécessaires pour votre promotion…\nVoilà (pour la partie Gopher) !\nIl ne reste plus qu\u0026rsquo;à publier…\nDocumentations le projet Gemini : https://gemini.circumlunar.space/ Wikipedia Gemini WP Gopher WP Remerciements Drew Devault : un des premiers à modifier Hugo pour générer du contenu pour Gemini - voici son dépôt Git pour exemple ! Sylvain Durant : un parisien qui fait simple et dont je me suis inspiré pour la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo; : https://sylvaindurand.org/gemini-and-hugo/ le dépôt Git de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;, où vous retrouverez les modifications de génération pour gopher et gemini : https://tildegit.org/obsd4a/www ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eGemini et Gopher sont deux autres Internet, tout à fait légaux, dont le\nbut est de la publication \u0026ldquo;légère\u0026rdquo; d\u0026rsquo;informations, principalement du texte.\nEn fait, historiquement Gopher est né en 1991, en parallèle du Grand Net\nsur protocole HTTP ; tandis que Gemini est un protocole de communication\nrécent, né courant juin 2019.\u003c/p\u003e\n\u003cp\u003eTout comme le Grand Net sur HTTP(S), Gopher et Gemini ont leur propre\nprotocole de communication, portant leur propre nom :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGemini : \u003ccode\u003egemini://\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eGopher : \u003ccode\u003egopher://\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eÀ savoir que le protocole gemini est basé sur TLS directement… \u003cbr\u003e\nDe plus, bien que ces protocoles soient cloisonnés entre eux, en effet\nles protocoles Gemini, Gopher et HTTP(S) sont des réseaux différents,\npar des services différents, sur des ports différents, il existe des\npasserelles du côté de Gemini et Gopher, vers HTTP(S).\u003c/p\u003e\n\u003cp\u003eNe cherchez pas toutes les fioritures que permet le protocole HTTP(S),\nexit les scripts CSS, JS, voire les images, avec Gemini et Gopher, on se\nconcentre principalement sur la ressource importante : le texte. \u003cbr\u003e\n\u003cem\u003ecf : cherchez \u003cstrong\u003eLow Web\u003c/strong\u003e\u003c/em\u003e ;-)\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eComment modifier Hugo pour lui faire générer des fichiers à publier sur\nles protocoles Gemini, et Gopher ?\u003c/p\u003e\n\u003cp\u003eDans les faits, vous prendrez plus de temps à lire cet article,\nqu\u0026rsquo;à faire vos modifications basiques, qui sont possibles d\u0026rsquo;être faites\nen moins de 5 minutes !!!\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl y a(ura) certainements de petites modifications à apporter… mais l\u0026rsquo;esprit\nde l\u0026rsquo;article est là, et fonctionnel.\u003c/em\u003e ;-)\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : les modifications ci-dessous actuellement sont fonctionnelles\ndans le contexte d\u0026rsquo;une configuration basique de Hugo.\u003c/p\u003e\n\u003cp\u003eDans le cas d\u0026rsquo;un site multi-langue, ou que vous avez paramétré la variable\n\u003ccode\u003epermalinks.posts\u003c/code\u003e, le résultat attendu n\u0026rsquo;aura pas lieu.\u003c/p\u003e\n\u003cp\u003eDans les faits, le repertoire géré par la variable \u003ccode\u003epath\u003c/code\u003e est lié au répertoire\nde sortie. Ainsi dans le contexte multilangue, vous retrouverez dans chaque\nrépertoire de langue un répertoire nommé selon le protocole cible !\u003c/p\u003e\n\u003cp\u003eAinsi, vous aurez dans le répertoire \u003ccode\u003epublic/\u003c/code\u003e, d\u0026rsquo;abord les répertoires de\nlangue, puis le répertoire \u003ccode\u003egemini\u003c/code\u003e ou \u003ccode\u003egopher\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAlors que dans une configuration basique, le répertoire \u003ccode\u003egemini\u003c/code\u003e ou \u003ccode\u003egopher\u003c/code\u003e\nsera directement déposé à la racine du répertoire \u003ccode\u003epublic/\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"gemini\"\u003eGemini\u003c/h2\u003e\n\u003cp\u003eConcernant les modifications pour Gemini, voici le propos :\u003c/p\u003e\n\u003ch3 id=\"configuration-pour-gemini\"\u003eConfiguration pour Gemini\u003c/h3\u003e\n\u003cp\u003eModifions très simplement le fichier de configuration de Hugo \u003ccode\u003econfig.toml\u003c/code\u003e :\u003c/p\u003e\n\u003ch4 id=\"configuration-gemini--ajout-du-mimetype\"\u003eConfiguration Gemini : ajout du mimetype\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Gemini\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;text/gemini\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esuffixes\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;gmi\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"configuration-gemini--ajout-du-format-de-sortie\"\u003eConfiguration Gemini : ajout du format de sortie\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Gemini\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eGemini\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisPlainText\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisHTML\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediaType\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;text/gemini\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epath\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epermalinkable\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprotocol\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini://\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRemarquons que la publication des fichiers gmi auront lieu dans un répertoire\ndistinct, nommé \u003cstrong\u003egemini\u003c/strong\u003e, dans le répertoire \u003ccode\u003epublic/\u003c/code\u003e.\nCe seront de purs fichiers texte, ayant l\u0026rsquo;extension \u003ccode\u003e.gmi\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePuis dans la configuration de la sortie, par exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epage\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eBien sûr, ne pas utiliser les \u0026lsquo;…\u0026rsquo; dans votre configuration ; ici, ils\nexpriment les autres options de génération possible, sans les nommer !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eGemini est capable de lire des fichiers au format RSS, ce qui nous permet\nde générer un flux RSS ; ajoutons un nouveau format de sortie spécifique :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eGeminiRSS\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisHTML\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediaType\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/rss+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;GeminiRSS\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprotocol\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini://\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epath\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eet modifions la génération de sortie, tel que par exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;GeminiRSS\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"layouts-pour-gemini\"\u003eLayouts pour Gemini\u003c/h3\u003e\n\u003ch4 id=\"indexgmi\"\u003eindex.gmi\u003c/h4\u003e\n\u003cp\u003eAjoutons un fichier \u003ccode\u003eindex.gmi\u003c/code\u003e dans le repertoire \u003ccode\u003elayouts/\u003c/code\u003e, qui pour\nl\u0026rsquo;exemple aura le code hugo basique suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{ range .Paginator.Pages }}\n{{- if .OutputFormats.Get \u0026#34;gemini\u0026#34; }}\n⇒ {{ replace .Permalink \u0026#34;/gemini\u0026#34; \u0026#34;\u0026#34; 1 }} {{ .Date.Format \u0026#34;January 2, 2006\u0026#34; }}: {{ .Title | safeHTML }}{{ end }}{{ end }}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003eLibre à vous de modifier, améliorer la pertinence du code Hugo pour obtenir\nle contenu que vous désirez publier…\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"indexgeminirssxml\"\u003eindex.geminirss.xml\u003c/h4\u003e\n\u003cp\u003eSi vous désirez gérez un flux RSS pour Gemini, selon la configuration ci-dessus,\najoutons un fichier \u003ccode\u003eindex.geminirss.xml\u003c/code\u003e, ayant le contenu de génération\ntel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $pctx := . -}}\n{{- if .IsHome -}}{{ $pctx = .Site }}{{- end -}}\n{{- $pages := slice -}}\n{{- if or $.IsHome $.IsSection -}}\n{{- $pages = $pctx.RegularPages -}}\n{{- else -}}\n{{- $pages = $pctx.Pages -}}\n{{- end -}}\n{{- $limit := .Site.Config.Services.RSS.Limit -}}\n{{- if ge $limit 1 -}}\n{{- $pages = $pages | first $limit -}}\n{{- end -}}\n{{- printf \u0026#34;\u0026lt;?xml version=\\\u0026#34;1.0\\\u0026#34; encoding=\\\u0026#34;utf-8\\\u0026#34; standalone=\\\u0026#34;yes\\\u0026#34;?\u0026gt;\u0026#34; | safeHTML }}\n\u0026lt;rss version=\u0026#34;2.0\u0026#34; xmlns:atom=\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u0026gt;\n  \u0026lt;channel\u0026gt;\n    \u0026lt;title\u0026gt;{{ .Site.Title | safeHTML }}\u0026lt;/title\u0026gt;\n    \u0026lt;link\u0026gt;{{ replace .Permalink \u0026#34;https\u0026#34; \u0026#34;gemini\u0026#34; 1 }}\u0026lt;/link\u0026gt;\n    \u0026lt;description\u0026gt;{{ .Site.Params.siteDescription | safeHTML }}\u0026lt;/description\u0026gt;\n    \u0026lt;generator\u0026gt;Hugo {{ hugo.Version }}  gohugo.io\u0026lt;/generator\u0026gt;{{ with .Site.LanguageCode }}\n    \u0026lt;language\u0026gt;{{.}}\u0026lt;/language\u0026gt;{{end}}{{ with .Site.Params.Author.email }}\n    \u0026lt;managingEditor\u0026gt;{{.}}{{ with $.Site.Params.Author.name }} ({{.}}){{end}}\u0026lt;/managingEditor\u0026gt;{{end}}{{ with .Site.Params.Author.email }}\n    \u0026lt;webMaster\u0026gt;{{.}}{{ with $.Site.Params.Author.name }} ({{.}}){{end}}\u0026lt;/webMaster\u0026gt;{{end}}{{ with .Site.Copyright }}\n    \u0026lt;copyright\u0026gt;{{.}}\u0026lt;/copyright\u0026gt;{{end}}{{ if not .Date.IsZero }}\n    \u0026lt;lastBuildDate\u0026gt;{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u0026lt;/lastBuildDate\u0026gt;{{ end }}\n    {{ with .OutputFormats.Get \u0026#34;RSS\u0026#34; }}\n      {{ printf \u0026#34;\u0026lt;atom:link href=%q rel=\\\u0026#34;self\\\u0026#34; type=%q /\u0026gt;\u0026#34; .Permalink .MediaType | safeHTML }}\n    {{ end }}\n    {{ range $pages }}\n    {{- if .OutputFormats.Get \u0026#34;gemini\u0026#34; -}}\n    \u0026lt;item\u0026gt;\n      \u0026lt;title\u0026gt;{{ .Title | safeHTML }}\u0026lt;/title\u0026gt;\n      {{ with .OutputFormats.Get \u0026#34;gemini\u0026#34; }}\n      \u0026lt;link\u0026gt;{{replace .Permalink \u0026#34;/gemini\u0026#34; \u0026#34;\u0026#34; 1}}\u0026lt;/link\u0026gt;\n      {{ end }}\n      \u0026lt;pubDate\u0026gt;{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u0026lt;/pubDate\u0026gt;\n      {{ with .Site.Params.Author.email }}\u0026lt;author\u0026gt;{{.}}{{ with $.Site.Params.Author.name }} ({{.}}){{end}}\u0026lt;/author\u0026gt;{{end}}\n      {{ with .OutputFormats.Get \u0026#34;gemini\u0026#34; }}\n      \u0026lt;guid\u0026gt;{{replace .Permalink \u0026#34;/gemini\u0026#34; \u0026#34;\u0026#34; 1}}\u0026lt;/guid\u0026gt;\n      {{ end }}\n    \u0026lt;/item\u0026gt;\n    {{- end -}}\n    {{ end }}\n  \u0026lt;/channel\u0026gt;\n\u0026lt;/rss\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"singlegmi\"\u003esingle.gmi\u003c/h4\u003e\n\u003cp\u003eDans le répertoire enfant \u003ccode\u003e_default\u003c/code\u003e du sous répertoire \u003ccode\u003elayouts/\u003c/code\u003e, ajoutons\nun simple fichier \u003ccode\u003esingle.gmi\u003c/code\u003e qui s\u0026rsquo;occupera principalement de la génération\ndes pages :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e# {{ $.Title | safeHTML }}\n\n{{ .RawContent }}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eC\u0026rsquo;est basique ; ca fait le boulot, simplement. Là encore libre à vous de\nmodifier, ajouter votre code Hugo, pour générer plus proprement afin de\ndébarrasser du code Markdown, par exemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{ $scratch := newScratch }}\n{{ $content := .RawContent -}}\n{{ $content := $content | replaceRE `#### ` \u0026#34;### \u0026#34; -}}\n{{ $content := $content | replaceRE `\\n- (.+?)` \u0026#34;\\n* $1\u0026#34; -}}\n{{ $content := $content | replaceRE `\\n(\\d+). (.+?)` \u0026#34;\\n* $2\u0026#34; -}}\n{{ $content := $content | replaceRE `\\[\\^(.+?)\\]:?` \u0026#34;\u0026#34; -}}\n{{ $content := $content | replaceRE `\u0026lt;br/??\u0026gt;` \u0026#34;\\n\u0026#34; -}}\n{{ $content := $content | replaceRE `\u0026lt;a .*href=\u0026#34;(.+?)\u0026#34;.*\u0026gt;(.+?)\u0026lt;/a\u0026gt;` \u0026#34;[$2]($1)\u0026#34; -}}\n{{ $content := $content | replaceRE `\\sgemini://(\\S*)` \u0026#34; [gemini://$1](gemini://$1)\u0026#34; -}}\n{{ $content := $content | replaceRE \u0026#34;([^`])\u0026lt;.*?\u0026gt;([^`])\u0026#34; \u0026#34;$1$2\u0026#34; -}}\n{{ $content := $content | replaceRE `\\n\\n!\\[.*\\]\\((.+?) \\\u0026#34;(.+?)\\\u0026#34;\\)` \u0026#34;\\n\\n=\u0026gt; $1 Image: $2\u0026#34; -}}\n{{ $content := $content | replaceRE `\\n\\n!\\[.*]\\((.+?)\\)` \u0026#34;\\n\\n=\u0026gt; $1 Embedded Image: $1\u0026#34; -}}\n{{ $links := findRE `\\n=\u0026gt; ` $content }}{{ $scratch.Set \u0026#34;ref\u0026#34; (add (len $links) 1) }}\n{{ $refs := findRE `\\[.+?\\]\\(.+?\\)` $content }}\n{{ $scratch.Set \u0026#34;content\u0026#34; $content }}{{ range $refs }}{{ $ref := $scratch.Get \u0026#34;ref\u0026#34; }}{{ $contentInLoop := $scratch.Get \u0026#34;content\u0026#34; }}{{ $url := (printf \u0026#34;%s #%d\u0026#34; . $ref) }}{{ $contentInLoop := replace $contentInLoop . $url -}}{{ $scratch.Set \u0026#34;content\u0026#34; $contentInLoop }}{{ $scratch.Set \u0026#34;ref\u0026#34; (add $ref 1) }}{{ end }}{{ $content := $scratch.Get \u0026#34;content\u0026#34; | replaceRE `\\[(.+?)\\]\\((.+?)\\) #(\\d+)` \u0026#34;$1 [$3]\u0026#34; -}}\n{{ $content | safeHTML }}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExplications :\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCe code - qui fait très bien son travail - est un copié-collé du code créé par un certain\n\u003ca href=\"https://brainbaking.com/post/2021/04/using-hugo-to-launch-a-gemini-capsule/\" rel=\"external\"\u003eWouter Groeneveld\u003c/a\u003e ;\nles explications sont fournies en anglais. N\u0026rsquo;ayant pas l\u0026rsquo;utilité de gérer\ndes fichiers audio, vidéo, localement ou sur d\u0026rsquo;autres plateformes, j\u0026rsquo;ai\nsimplement supprimé les lignes correspondantes.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoilà \u003cem\u003e(pour la partie Gemini)\u003c/em\u003e !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl ne reste plus qu\u0026rsquo;à publier…\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"gopher\"\u003eGopher\u003c/h2\u003e\n\u003cp\u003eAttaquons les modifications de configurations et de calques pour générer\nles fichiers textes pour Gopher. Là encore, nous générons les fichiers\ndans un répertoire dédié, nommé \u003cstrong\u003egopher\u003c/strong\u003e dans le répertoire \u003ccode\u003epublic/\u003c/code\u003e\nafin de faciliter la synchronisation vers le serveur gopher…\u003c/p\u003e\n\u003ch3 id=\"configuration-pour-gopher\"\u003eConfiguration pour Gopher\u003c/h3\u003e\n\u003cp\u003eModifions donc le fichier de configuration de Hugo, pour ajouter les formats\nde génération. En effet :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele premier va nous être utile pour la génération des pages, qui porteront\nle nom \u003cstrong\u003eindex\u003c/strong\u003e, dans leur propre répertoire\u003c/li\u003e\n\u003cli\u003ele second pour générer les fichiers d\u0026rsquo;indexation \u003cstrong\u003egophermap\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTous auront l\u0026rsquo;extension de fichier \u003ccode\u003e.txt\u003c/code\u003e et seront publiés dans un sous-répertoire\nnommé \u003cstrong\u003egopher\u003c/strong\u003e du répertoire \u003ccode\u003epublic/\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eGopher\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebaseName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;index\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisPlainText\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisHTML\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediaType\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;text/plain\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003enoUgly\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epath\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gopher/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprotocol\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gopher://\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eGopherMap\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebaseName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gophermap\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisPlainText\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisHTML\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediaType\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;text/plain\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003enoUgly\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epath\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gopher/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprotocol\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gopher://\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis modifions la génération des sorties, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;GeminiRSS\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gophermap\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003epage\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gemini\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;gopher\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"layouts-pour-gopher\"\u003eLayouts pour Gopher\u003c/h3\u003e\n\u003cp\u003eAttaquons la partie des fichiers à créer dans le sous-répertoire \u003ccode\u003elayouts/\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"indexgophermaptxt\"\u003eindex.gophermap.txt\u003c/h4\u003e\n\u003cp\u003eRestons simple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{ .Site.Title | safeHTML }}\n\n⇒ Menu :\n\n{{ range .Site.Menus.main }}\n{{- if (or (eq .Identifier \u0026#34;search\u0026#34;) (eq .Identifier \u0026#34;lang-switcher\u0026#34;) (eq .Identifier \u0026#34;theme-switcher\u0026#34;) ) }}\n{{- else }}\n1{{ .Name }}    {{ .URL | safeURL }} 70\n{{- end -}}\n{{ end }}\n\n⇒ Articles les plus récents :\n{{ $nb := 7 }}\n{{ range first $nb .Paginator.Pages }}\n0{{ .Title }}   {{ with .OutputFormats.Get \u0026#34;gopher\u0026#34; }}  {{ replaceRE \u0026#34;/gopher\u0026#34; \u0026#34;\u0026#34; .RelPermalink }} 70 {{ end }}\n{{- end }}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCe fichier \u003cstrong\u003egophermap\u003c/strong\u003e nous permet de publier simplement l\u0026rsquo;équivalent\ndu menu principal de Hugo, ainsi que promouvoir les \u003ccode\u003ex\u003c/code\u003e derniers\narticles. - \u003cem\u003eici, les 7 derniers\u003c/em\u003e -\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePour ceux qui n\u0026rsquo;auraient pas compris : les fichiers gophermap sont des\nfichiers d\u0026rsquo;indexation de contenu…\u003c/em\u003e\u003c/p\u003e\n\u003ch4 id=\"listgophermaptxt\"\u003elist.gophermap.txt\u003c/h4\u003e\n\u003cp\u003eAjoutons dans le répertoire enfant \u003ccode\u003e_default/\u003c/code\u003e du sous-répertoire \u003ccode\u003elayout/\u003c/code\u003e,\nun fichier de génération de liste, qui peut avoir le contenu basique suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e!{{ .Title | safeHTML }}\n\n{{ .RawContent }}\n\n{{ range .Paginator.Pages }}\n0{{ .Title }}   {{ with .OutputFormats.Get \u0026#34;gopher\u0026#34; -}}{{ .RelPermalink }}  {{ $.Site.Params.hostname}} 70 {{ end }}\n{{ end }}\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"singlegophertxt\"\u003esingle.gopher.txt\u003c/h4\u003e\n\u003cp\u003ePour la génération des pages, ajoutons dans le même sous-répertoire \u003ccode\u003e_default/\u003c/code\u003e,\nun fichier nommé \u003ccode\u003esingle.gopher.txt\u003c/code\u003e qui peut avoir le contenu basique suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e!{{ .Title | safeHTML }}\n\n{{ .Date.Format (.Site.Params.dateform | default \u0026#34;01 January 2006\u0026#34;) }} · {{ .ReadingTime }} minute(s) de lecture.\n{{ if .Params.tags }}\nTags :  {{ range .Params.tags }}{{ . }} {{ end }}\n{{ end }}\n\n---\n\n{{ .RawContent }}\n\n---\n\nPublié le : {{.Date.Format \u0026#34;2 January 2006\u0026#34;}}.\n\n0⇒ Revenir à la page d\u0026#39;accueil : / 70\nh⇒ Lire l\u0026#39;article “{{ $.Title | safeHTML }}” sur le protocole HTTP(S) : {{ .Permalink | safeURL }} 443\n\nLe contenu de ce site est diffusé sous Licence {{ $.Site.Copyright | safeHTML }}.\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cem\u003eEncore une fois, à vous de modifier à votre convenance et autres imaginations\nnécessaires pour votre promotion…\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eVoilà \u003cem\u003e(pour la partie Gopher)\u003c/em\u003e !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl ne reste plus qu\u0026rsquo;à publier…\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele projet Gemini : \u003ca href=\"https://gemini.circumlunar.space/\" rel=\"external\"\u003ehttps://gemini.circumlunar.space/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"wikipedia\"\u003eWikipedia\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Gemini\" title=\"Article Wikipédia : Gemini\"\u003eGemini \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Gopher\" title=\"Article Wikipédia : Gopher\"\u003eGopher \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDrew Devault\u003c/strong\u003e : un des premiers à modifier Hugo pour générer du contenu pour Gemini - \u003cem\u003evoici son \u003ca href=\"https://git.sr.ht/~sircmpwn/drewdevault.com/tree/master\" rel=\"external\"\u003edépôt Git\u003c/a\u003e pour exemple !\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eSylvain Durant\u003c/strong\u003e : un parisien qui fait simple et dont je me suis inspiré pour la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo; : \u003ca href=\"https://sylvaindurand.org/gemini-and-hugo/\" rel=\"external\"\u003ehttps://sylvaindurand.org/gemini-and-hugo/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ele dépôt Git de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;, où vous retrouverez les modifications de génération pour gopher et gemini : \u003ca href=\"https://tildegit.org/obsd4a/www\" rel=\"external\"\u003ehttps://tildegit.org/obsd4a/www\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment modifier simplement Hugo, en 5 minutes, pour qu'il génére les fichiers afin de publier sur les protocoles Gemini, Gopher…",
            "tags": ["Hugo", "Gemini", "Gopher"],
            "date_published": "2021-01-24T17:12:08+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:f9d54c5f-f4ab-e2ff-881a-d0f8a6624826",
            "url": "http://doc.huc.fr.eu.org/fr/trad/solene-rapenne/cryptpad-openbsd/",
            "title": "Héberger votre suite web office Cryptpad sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;Host your Cryptpad web office suite with OpenBSD\u0026rdquo;, écrit par Solène Rapenne.\nHéberger votre suite web office Cryptpad sous OpenBSD Dans cet article, j\u0026rsquo;expliquerai comment déployer votre propre instance de Cryptpad sous OpenBSD. Cryptpad est une suite web office permettant de collaborer en temps réel sur des documents. Cryptpad est écrit en JavaScript et le démon agit en tant que serveur web.\nPré-requis Vous avez besoin d\u0026rsquo;installer les paquets git, node, automake et autoconfig afin d\u0026rsquo;être capable de récupèrer les sources et d\u0026rsquo;exécuter le programme.\n# pkg_add node git autoconf--%2.69 automake--%1.16 Un autre logiciel en amont est requis pour assurer les connexions TLS et sécuriser les accès réseaux à l\u0026rsquo;instance Cryptpad. Cela peut être relayd, haproxy, nginx ou lighttpd. Je couvre le paramétrage en utilisant httpd, et relayd. Notez que les développeurs de Cryptpad ne fournissent du support que seulement pour les utilisateurs de Nginx.\nInstallation Je recommande réellement l\u0026rsquo;utilisation d\u0026rsquo;utilisateur dédié au service. Nous créerons un nouvel utilisateur par la commande :\n# useradd -m _cryptpad Ensuite, nous continuerons l\u0026rsquo;installation logiciel avec l\u0026rsquo;utilisateur _cryptpad.\n# su -l _cryptpad Nous suivrons principalement le guide d\u0026rsquo;installation officiel à certaines exceptions près afin d\u0026rsquo;adapter à OpenBSD :\n$ git clone https://github.com/xwiki-labs/cryptpad $ cd cryptpad $ env AUTOMAKE_VERSION=1.16 AUTOCONF_VERSION=2.69 CC=clang CXX=clang++ npm install $ env AUTOMAKE_VERSION=1.16 AUTOCONF_VERSION=2.69 CC=clang CXX=clang++ npm install bower $ node_modules/.bin/bower install $ cp config/config.example.js config/config.js Configuration Voici les quelques variables importantes à personnaliser :\nhttpUnsafeOrigin devrait être l\u0026rsquo;adresse publique sur laquelle Cryptpad sera disponible. Cela devrait être certainement un lien HTTPS avec un nom d\u0026rsquo;hôte. J\u0026rsquo;utiliserais https://cryptpad.kongroo.eu. httpSafeOrigin devrait être une adresse publique différente de la précédente. Cryptpad requiert deux adresses différentes pour fonctionner. J\u0026rsquo;utiliserais https://api.cryptpad.kongroo.eu. adminEmail doit être une adresse de courriel valide utilisé par l\u0026rsquo;administrateur (certainement vous-même). Créer un fichier rc pour démarrer le service Nous avons besoin d\u0026rsquo;automatiser le démarrage proprement, en même temps que celui du système.\nCréez le fichier /etc/rc.d/cryptpad :\n#!/bin/ksh daemon=\u0026#34;/usr/local/bin/node\u0026#34; daemon_flags=\u0026#34;server\u0026#34; daemon_user=\u0026#34;_cryptpad\u0026#34; location=\u0026#34;/home/_cryptpad/cryptpad\u0026#34; . /etc/rc.d/rc.subr rc_start() { ${rcexec} \u0026#34;cd ${location}; ${daemon} ${daemon_flags}\u0026#34; } rc_bg=YES rc_cmd $1 Activez et démarrez le service avec le contrôleur rcctl :\n# rcctl enable cryptpad # rcctl start cryptpad Fonctionnement Création d\u0026rsquo;un compte administrateur Enregistrez-vous sur votre instance Cryptpad puis allez à la page \u0026ldquo;Settings\u0026rdquo; de votre profil : copiez votre clé public de signature.\nÉditez le fichier config.js et cherchez adminKeys ; décommentez la section en supprimant les /* et */ autour, puis supprimez la clé d\u0026rsquo;exemple pour copier la vôtre, tel ce qui suit :\nadminKeys: [ \u0026#34;[solene@cryptpad.kongroo.eu/YzfbEYwZq6Xhl7ET6AHD01w3QqOE7STYgGglgSTgWfk=]\u0026#34;, ], Redémarrez Cryptpad ; l\u0026rsquo;utilisateur est maintenant administrateur et a accès au nouveau panel d\u0026rsquo;administration depuis l\u0026rsquo;application web.\nSauvegarde Vous avez besoin de sauvegarder les répertoires data et datastore qui sont dans le répertoire de Cryptpad.\nConfiguration supplémentaire Dans cette section, j\u0026rsquo;expliquerai comment générer votre certificat TLS avec acme-client et comment configurer httpd et relayd pour publier cryptpad. Je considère cela en plus de l\u0026rsquo;actuel article, car si vous utilisez déjà nginx, et avez une installation pour générer des certificats, vous n\u0026rsquo;en avez pas besoin. Si vous démarrez de zéro, c\u0026rsquo;est la manière la plus simple pour obtenir un résultat.\nÀ partir de là, je considère que vous utilisez OpenBSD et que vos fichiers de configuration sont vierges.\nJ\u0026rsquo;utiliserai pour l\u0026rsquo;exemple le domaine kongroo.eu.\nhttpd Nous utiliserons httpd d\u0026rsquo;une manière trés simple. Il écoutera seulement sur le port 80 pour tous les domaines, permettant à acme-client de fonctionner et redirigera aussi automatiquement les requêtes HTTP vers HTTPS.\n# cp /etc/examples/httpd.conf /etc/httpd.conf # rcctl enable httpd # rcctl start httpd acme-client Nous utiliserons le fichier exemple par défaut :\n# cp /etc/examples/acme-client.conf /etc/acme-client.conf Éditez le fichier /etc/acme-client.conf et changez le dernier bloc domain ; remplacez example.com et secure.example.com par votre domaine, tels que cryptpad.kongroo.eu et api.cryptpad.kongroo.eu en tant que nom alternatif.\nPour des raisons pratiques, nous allons remplacer le chemin du certificat full chain pour avoir hostname.crt au lieu de hostname.fullchain.pem pour correspondre aux attentes de relayd.\nVoici à quoi ressemble ce paragraphe sur mon paramétrage :\ndomain kongroo.eu { alternative names { api.cryptpad.kongroo.eu cryptpad.kongroo.eu } domain key \u0026#34;/etc/ssl/private/kongroo.eu.key\u0026#34; domain full chain certificate \u0026#34;/etc/ssl/kongroo.eu.crt\u0026#34; sign with buypass } Notez qu\u0026rsquo;avec le fichier acme-client.conf par défaut, vous pouvez utiliser letsencrypt ou buypass en tant qu\u0026rsquo;autorité de certification.\nVous devriez maintenant être capable de créer vos certificats.\n# acme-client kongroo.eu C\u0026rsquo;est fait !\nVous souhaitez que le certificat soit renouvellé automatiquement et que relayd redémarre après le changement de certificat ? Comme l\u0026rsquo;indique la page de manuel d\u0026rsquo;acme-client.conf, ajoutez ce qui suit à la crontab de root en utilisant la commande crontab -e :\n~ * * * * acme-client kongroo.eu \u0026amp;\u0026amp; rcctl reload relayd relayd Cette configuration est assez simple : remplacez kongroo.eu par votre domaine.\nCréez un fichier /etc/relayd.conf avec le contenu suivant :\ntcp protocol \u0026#34;https\u0026#34; { tls keypair kongroo.eu } relay \u0026#34;https\u0026#34; { listen on egress port 443 tls protocol https forward to 127.0.0.1 port 3000 } Activez et démarrez relayd en utilisant rcctl :\n# rcctl enable relayd # rcctl start relayd Conclusion Vous devriez être capable d\u0026rsquo;atteindre votre instance Cryptpad en utilisant maintenant votre URL publique. Félicitations !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://dataswamp.org/~solene/2020-12-14-cryptpad-openbsd.html\" rel=\"external\"\u003eHost your Cryptpad web office suite with OpenBSD\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Solène Rapenne.\u003c/p\u003e\n\u003chr\u003e\n\u003ch1 id=\"héberger-votre-suite-web-office-cryptpad-sous-openbsd\"\u003eHéberger votre suite web office Cryptpad sous OpenBSD\u003c/h1\u003e\n\u003cp\u003eDans cet article, j\u0026rsquo;expliquerai comment déployer votre propre instance\nde \u003ca href=\"https://cryptpad.fr/\" rel=\"external\"\u003eCryptpad\u003c/a\u003e sous OpenBSD. Cryptpad est une suite web office permettant\nde collaborer en temps réel sur des documents. Cryptpad est écrit en\nJavaScript et le démon agit en tant que serveur web.\u003c/p\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cp\u003eVous avez besoin d\u0026rsquo;installer les paquets \u003cstrong\u003egit\u003c/strong\u003e, \u003cstrong\u003enode\u003c/strong\u003e, \u003cstrong\u003eautomake\u003c/strong\u003e\net \u003cstrong\u003eautoconfig\u003c/strong\u003e afin d\u0026rsquo;être capable de récupèrer les sources et d\u0026rsquo;exécuter\nle programme.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pkg_add node git autoconf--%2.69 automake--%1.16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUn autre logiciel en amont est requis pour assurer les connexions\nTLS et sécuriser les accès réseaux à l\u0026rsquo;instance Cryptpad. Cela peut être\n\u003cstrong\u003erelayd\u003c/strong\u003e, \u003cstrong\u003ehaproxy\u003c/strong\u003e, \u003cstrong\u003enginx\u003c/strong\u003e ou \u003cstrong\u003elighttpd\u003c/strong\u003e. Je couvre le paramétrage\nen utilisant httpd, et relayd. Notez que les développeurs de Cryptpad ne\nfournissent du support que seulement pour les utilisateurs de Nginx.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eJe recommande réellement l\u0026rsquo;utilisation d\u0026rsquo;utilisateur dédié au service.\nNous créerons un nouvel utilisateur par la commande :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# useradd -m _cryptpad\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, nous continuerons l\u0026rsquo;installation logiciel avec l\u0026rsquo;utilisateur\n\u003ccode\u003e_cryptpad\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# su -l _cryptpad\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNous suivrons principalement le \u003ca href=\"https://github.com/xwiki-labs/cryptpad/wiki/Installation-guide\" rel=\"external\"\u003eguide d\u0026rsquo;installation officiel\u003c/a\u003e à certaines\nexceptions près afin d\u0026rsquo;adapter à OpenBSD :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ git clone https://github.com/xwiki-labs/cryptpad\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd cryptpad\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ env \u003cspan style=\"color:#ef6155\"\u003eAUTOMAKE_VERSION\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.16 \u003cspan style=\"color:#ef6155\"\u003eAUTOCONF_VERSION\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e2.69 \u003cspan style=\"color:#ef6155\"\u003eCC\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eclang \u003cspan style=\"color:#ef6155\"\u003eCXX\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eclang++ npm install\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ env \u003cspan style=\"color:#ef6155\"\u003eAUTOMAKE_VERSION\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.16 \u003cspan style=\"color:#ef6155\"\u003eAUTOCONF_VERSION\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e2.69 \u003cspan style=\"color:#ef6155\"\u003eCC\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eclang \u003cspan style=\"color:#ef6155\"\u003eCXX\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eclang++ npm install bower\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ node_modules/.bin/bower install\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cp config/config.example.js config/config.js\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eVoici les quelques variables importantes à personnaliser :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ehttpUnsafeOrigin\u003c/strong\u003e devrait être l\u0026rsquo;adresse publique sur laquelle Cryptpad\nsera disponible. Cela devrait être certainement un lien HTTPS avec un\nnom d\u0026rsquo;hôte. J\u0026rsquo;utiliserais \u003ccode\u003ehttps://cryptpad.kongroo.eu\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ehttpSafeOrigin\u003c/strong\u003e devrait être une adresse publique différente de la\nprécédente. Cryptpad requiert deux adresses différentes pour fonctionner.\nJ\u0026rsquo;utiliserais \u003ccode\u003ehttps://api.cryptpad.kongroo.eu\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eadminEmail\u003c/strong\u003e doit être une adresse de courriel valide utilisé par l\u0026rsquo;administrateur\n(certainement vous-même).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"créer-un-fichier-rc-pour-démarrer-le-service\"\u003eCréer un fichier rc pour démarrer le service\u003c/h2\u003e\n\u003cp\u003eNous avons besoin d\u0026rsquo;automatiser le démarrage proprement, en même temps que\ncelui du système.\u003c/p\u003e\n\u003cp\u003eCréez le fichier \u003ccode\u003e/etc/rc.d/cryptpad\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-rc\" data-lang=\"rc\"\u003e#!/bin/ksh\n\ndaemon=\u0026#34;/usr/local/bin/node\u0026#34;\ndaemon_flags=\u0026#34;server\u0026#34;\ndaemon_user=\u0026#34;_cryptpad\u0026#34;\nlocation=\u0026#34;/home/_cryptpad/cryptpad\u0026#34;\n\n. /etc/rc.d/rc.subr\n\nrc_start() {\n    ${rcexec} \u0026#34;cd ${location}; ${daemon} ${daemon_flags}\u0026#34;\n}\n\nrc_bg=YES\nrc_cmd $1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eActivez et démarrez le service avec le contrôleur \u003ccode\u003ercctl\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl enable cryptpad\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start cryptpad\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"fonctionnement\"\u003eFonctionnement\u003c/h2\u003e\n\u003ch3 id=\"création-dun-compte-administrateur\"\u003eCréation d\u0026rsquo;un compte administrateur\u003c/h3\u003e\n\u003cp\u003eEnregistrez-vous sur votre instance Cryptpad puis allez à la page \u0026ldquo;Settings\u0026rdquo;\nde votre profil : copiez votre clé public de signature.\u003c/p\u003e\n\u003cp\u003eÉditez le fichier \u003ccode\u003econfig.js\u003c/code\u003e et cherchez \u003ccode\u003eadminKeys\u003c/code\u003e ; décommentez la section\nen supprimant les \u003ccode\u003e/*\u003c/code\u003e et \u003ccode\u003e*/\u003c/code\u003e autour, puis supprimez la clé d\u0026rsquo;exemple pour\ncopier la vôtre, tel ce qui suit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eadminKeys\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;[solene@cryptpad.kongroo.eu/YzfbEYwZq6Xhl7ET6AHD01w3QqOE7STYgGglgSTgWfk=]\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eRedémarrez Cryptpad ; l\u0026rsquo;utilisateur est maintenant administrateur et a accès\nau nouveau panel d\u0026rsquo;administration depuis l\u0026rsquo;application web.\u003c/p\u003e\n\u003ch3 id=\"sauvegarde\"\u003eSauvegarde\u003c/h3\u003e\n\u003cp\u003eVous avez besoin de sauvegarder les répertoires \u003ccode\u003edata\u003c/code\u003e et \u003ccode\u003edatastore\u003c/code\u003e qui\nsont dans le répertoire de Cryptpad.\u003c/p\u003e\n\u003ch2 id=\"configuration-supplémentaire\"\u003eConfiguration supplémentaire\u003c/h2\u003e\n\u003cp\u003eDans cette section, j\u0026rsquo;expliquerai comment générer votre certificat TLS avec\nacme-client et comment configurer httpd et relayd pour publier cryptpad.\nJe considère cela en plus de l\u0026rsquo;actuel article, car si vous utilisez déjà\nnginx, et avez une installation pour générer des certificats, vous\nn\u0026rsquo;en avez pas besoin. Si vous démarrez de zéro, c\u0026rsquo;est la manière la plus\nsimple pour obtenir un résultat.\u003c/p\u003e\n\u003cp\u003eÀ partir de là, je considère que vous utilisez OpenBSD et que vos fichiers\nde configuration sont vierges.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;utiliserai pour l\u0026rsquo;exemple le domaine \u003cstrong\u003ekongroo.eu\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003eNous utiliserons httpd d\u0026rsquo;une manière trés simple. Il écoutera seulement\nsur le port 80 pour tous les domaines, permettant à acme-client de fonctionner\net redirigera aussi automatiquement les requêtes HTTP vers HTTPS.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cp /etc/examples/httpd.conf /etc/httpd.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl enable httpd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start httpd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"acme-client\"\u003eacme-client\u003c/h3\u003e\n\u003cp\u003eNous utiliserons le fichier exemple par défaut :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cp /etc/examples/acme-client.conf /etc/acme-client.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eÉditez le fichier \u003ccode\u003e/etc/acme-client.conf\u003c/code\u003e et changez le dernier bloc \u003ccode\u003edomain\u003c/code\u003e ;\nremplacez \u003ccode\u003eexample.com\u003c/code\u003e et \u003ccode\u003esecure.example.com\u003c/code\u003e par votre domaine, tels que\n\u003ccode\u003ecryptpad.kongroo.eu\u003c/code\u003e et \u003ccode\u003eapi.cryptpad.kongroo.eu\u003c/code\u003e en tant que nom alternatif.\u003c/p\u003e\n\u003cp\u003ePour des raisons pratiques, nous allons remplacer le chemin du certificat\nfull chain pour avoir \u003ccode\u003ehostname.crt\u003c/code\u003e au lieu de \u003ccode\u003ehostname.fullchain.pem\u003c/code\u003e\npour correspondre aux attentes de relayd.\u003c/p\u003e\n\u003cp\u003eVoici à quoi ressemble ce paragraphe sur mon paramétrage :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edomain\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ekongroo.eu\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003ealternative\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003enames\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003eapi.cryptpad.kongroo.eu\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ecryptpad.kongroo.eu\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003edomain\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ekey\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/ssl/private/kongroo.eu.key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003edomain\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003efull\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003echain\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ecertificate\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/ssl/kongroo.eu.crt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003esign\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ebuypass\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNotez qu\u0026rsquo;avec le fichier \u003ca href=\"https://man.openbsd.org/acme-client.conf\" rel=\"external\"\u003eacme-client.conf\u003c/a\u003e par défaut, vous pouvez\nutiliser \u003cem\u003eletsencrypt\u003c/em\u003e ou \u003cem\u003ebuypass\u003c/em\u003e en tant qu\u0026rsquo;autorité de certification.\u003c/p\u003e\n\u003cp\u003eVous devriez maintenant être capable de créer vos certificats.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# acme-client kongroo.eu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eC\u0026rsquo;est fait !\u003c/p\u003e\n\u003cp\u003eVous souhaitez que le certificat soit renouvellé automatiquement et que\nrelayd redémarre après le changement de certificat ? Comme l\u0026rsquo;indique la\npage de manuel d\u0026rsquo;acme-client.conf, ajoutez ce qui suit à la crontab de root\nen utilisant la commande \u003ccode\u003ecrontab -e\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-cron\" data-lang=\"cron\"\u003e~ * * * * acme-client kongroo.eu \u0026amp;\u0026amp; rcctl reload relayd\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cp\u003eCette configuration est assez simple : remplacez \u003ccode\u003ekongroo.eu\u003c/code\u003e par votre\ndomaine.\u003c/p\u003e\n\u003cp\u003eCréez un fichier \u003ca href=\"https://man.openbsd.org/relayd.conf\" rel=\"external\"\u003e/etc/relayd.conf\u003c/a\u003e avec le contenu suivant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003etcp\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eprotocol\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;https\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003etls\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ekeypair\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ekongroo.eu\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003erelay\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;https\u0026#34;\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003elisten\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eon\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eegress\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eport\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e443\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etls\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003eprotocol\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ehttps\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003eforward\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eto\u003c/span\u003e 127.0.0.1 \u003cspan style=\"color:#48b685\"\u003eport\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eActivez et démarrez relayd en utilisant rcctl :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl enable relayd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start relayd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"conclusion\"\u003eConclusion\u003c/h2\u003e\n\u003cp\u003eVous devriez être capable d\u0026rsquo;atteindre votre instance Cryptpad en utilisant\nmaintenant votre URL publique. Félicitations !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Traduction du Tutoriel EN → FR 'Host your Cryptpad web office suite with OpenBSD' décrivant l'installation, la configuration de la suite web office Cryptpad pour l'utiliser sous OpenBSD",
            "tags": ["Traduction", "OpenBSD", "Cryptpad"],
            "date_published": "2020-12-22T23:31:21+01:00",
            "date_modified": "2023-05-03T06:30:55+02:00"
        },{
            "id": "urn:uuid:7039cc48-be42-da03-a6ca-d8b28bfd6bbc",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/dns-doh-proxy/",
            "title": "OpenWRT : proxy DNS DoH",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Voyons dans cet article comment paramétrer OpenWRT pour qu\u0026rsquo;il puisse communiquer avec des serveurs DNS sur le protocole DoH (DNS-over-HTTPS) .\nInfoLe protocole DoH, bien que dans l\u0026rsquo;esprit est intéressant, dans la mise en pratique semble décrié, car n\u0026rsquo;apporte pas toute la confidentialité nécessaire à laquelle on s\u0026rsquo;attend, ou a besoin. Faites des recherches pour comprendre la raison, pour laquelle il vaut mieux préférer DoT . Par exemple, vous pouvez lire la traduction suivante du problème relatif à DoH . Le but est de :\nchiffrer le trafic DNS (Domain Name Service) afin d\u0026rsquo;améliorer la confidentialité de celui-ci. prévenir d\u0026rsquo;une fuite DNS et les détournements de votre trafic DNS bypasser les restrictions régionales ou celles du FAI (Fournisseur d\u0026#39;Accès Internet) . Installation Installons les deux paquets nécessaires que sont https-dns-proxy, et luci-app-https-dns-proxy.\n# opkg update # opkg install https-dns-proxy luci-app-https-dns-proxy Puis il faut redémarrer le service rcpd.\n# /etc/init.d/rpcd restart Configuration InfoPar défaut, le service est configuré pour utiliser les services des DNS de Google et de Cloudflare. Néanmoins, il est très facile de changer ce paramétrage ; sachez qu\u0026rsquo;actuellement, plusieurs autres choix sont possibles tels que CleanBrowsing, LibreDNS, Cira CA Shield, Adguard, qui proposent plusieurs listes de protections. Le service est accessible par le menu \u0026ldquo;Services → HTTPS DNS Proxy\u0026rdquo;.\nService HTTPS DNS Proxy Paramétrez-le de manière à :\nécouter un serveur DNS choisi par la liste proposée sur l\u0026rsquo;adresse de bouclage interne localhost, soit sur le protocole IPv4 (Internet Protocol v4) , soit sur IPv6 (Internet Protocol v6) , ou les deux et affecter un port de service sur lequel écouter. Puis, appuyez sur le bouton :\n[ SAVE \u0026amp; APPLY ] en bas de page puis, dans la section Service Status, sur celui nommé [ RELOAD ] Ainsi le service sera actif, et prendra en charge la communication vers les serveurs DNS DoH configurés.\nInfoSi vous avez le service DHCP activé, sachez qu\u0026rsquo;il se répercute dans la section DNS forwardings du menu \u0026ldquo;Network → DNS and DHCP\u0026rdquo;. Configuration CLI Il est possible de configurer le service par le biais de la console shell :\nVoici l\u0026rsquo;exemple que donne la communauté OpenWRT :\n# Configure DoH provider while uci -q delete https-dns-proxy.@https-dns-proxy[0]; do :; done uci set https-dns-proxy.dns=\u0026#34;https-dns-proxy\u0026#34; uci set https-dns-proxy.dns.bootstrap_dns=\u0026#34;8.8.8.8,8.8.4.4\u0026#34; uci set https-dns-proxy.dns.resolver_url=\u0026#34;https://dns.google/dns-query\u0026#34; uci set https-dns-proxy.dns.listen_addr=\u0026#34;127.0.0.1\u0026#34; uci set https-dns-proxy.dns.listen_port=\u0026#34;5053\u0026#34; uci commit https-dns-proxy /etc/init.d/https-dns-proxy restart Le paramétrage présenté est pour les serveurs DNS de Google…\nDocumentation https://openwrt.org/docs/guide-user/services/dns/doh_dnsmasq_https-dns-proxy Mais peut-être que vous préférerez utiliser DoT (DNS-over-TCP) ; si oui, lisez : OpenWRT \u0026#43; Unbound : utiliser le protocole DoT Enjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoyons dans cet article comment paramétrer OpenWRT pour qu\u0026rsquo;il puisse\ncommuniquer avec des serveurs DNS sur le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDoH \u003cem\u003e(DNS-over-HTTPS)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eLe protocole DoH, bien que dans l\u0026rsquo;esprit est intéressant, dans la mise\nen pratique semble décrié, car n\u0026rsquo;apporte pas toute la confidentialité\nnécessaire à laquelle on s\u0026rsquo;attend, ou a besoin. \u003cbr\u003e\n\u003cem\u003eFaites des recherches pour comprendre la raison, pour laquelle il vaut\nmieux préférer \u003cabbr title=\"DNS-over-TLS\"\u003eDoT\u003c/abbr\u003e\n.\u003c/em\u003e\n\u003cem\u003ePar exemple, vous pouvez lire la \u003ca class=\"inside\" href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#le-probl%c3%a8me-avec-dns-sur-https-doh\" title=\"Lien interne vers l\u0026#39;article : 'Guide du Routeur OpenBSD'\"\u003etraduction suivante du problème relatif à DoH\u003c/a\u003e\n.\u003c/em\u003e\u003c/div\u003e\n\n\u003cp\u003eLe but est de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003echiffrer le trafic \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDNS \u003cem\u003e(Domain Name Service)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n afin d\u0026rsquo;améliorer la confidentialité de celui-ci.\u003c/li\u003e\n\u003cli\u003eprévenir d\u0026rsquo;une fuite DNS et les détournements de votre trafic \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/li\u003e\n\u003cli\u003ebypasser les restrictions régionales ou celles du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"fr\"\u003eFAI \u003cem\u003e(Fournisseur d\u0026#39;Accès Internet)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eInstallons les deux paquets nécessaires que sont \u003cstrong\u003ehttps-dns-proxy\u003c/strong\u003e, et\n\u003cstrong\u003eluci-app-https-dns-proxy\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# opkg update\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# opkg install https-dns-proxy luci-app-https-dns-proxy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis il faut redémarrer le service \u003cstrong\u003ercpd\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /etc/init.d/rpcd restart\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePar défaut, le service est configuré pour utiliser les services des DNS\nde Google et de Cloudflare. Néanmoins, il est très facile de changer ce\nparamétrage ; sachez qu\u0026rsquo;actuellement, plusieurs autres choix sont possibles\ntels que CleanBrowsing, LibreDNS, Cira CA Shield, Adguard, qui proposent\nplusieurs listes de protections.\u003c/div\u003e\n\n\u003cp\u003eLe service est accessible par le menu \u0026ldquo;\u003cstrong\u003eServices → HTTPS DNS Proxy\u003c/strong\u003e\u0026rdquo;.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openwrt/Services-DNS-HTTPS-Proxy.png\" title=\"Service HTTPS DNS Proxy\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openwrt/Services-DNS-HTTPS-Proxy_hu_1af594e727510ed0.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Service HTTPS DNS Proxy\" height=\"402\" loading=\"lazy\" src=\"/images/openwrt/Services-DNS-HTTPS-Proxy_hu_74909c94f3162d63.png\" type=\"image/png\" width=\"512\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eService HTTPS DNS Proxy\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003chr\u003e\n\u003cp\u003eParamétrez-le de manière à :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eécouter un serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n choisi par la liste proposée\u003c/li\u003e\n\u003cli\u003esur l\u0026rsquo;adresse de bouclage interne localhost, soit sur le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPv4 \u003cem\u003e(Internet Protocol v4)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\nsoit sur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPv6 \u003cem\u003e(Internet Protocol v6)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, ou les deux\u003c/li\u003e\n\u003cli\u003eet affecter un port de service sur lequel écouter.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis, appuyez sur le bouton :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e[ SAVE \u0026amp; APPLY ]\u003c/strong\u003e en bas de page\u003c/li\u003e\n\u003cli\u003epuis, dans la section \u003cstrong\u003eService Status\u003c/strong\u003e, sur celui nommé \u003cstrong\u003e[ RELOAD ]\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAinsi le service sera actif, et prendra en charge la communication vers\nles serveurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \u003cabbr lang=\"en\" title=\"DNS-over-HTTPS\"\u003eDoH\u003c/abbr\u003e\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n configurés.\u003c/p\u003e\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSi vous avez le service DHCP activé, sachez qu\u0026rsquo;il se répercute dans la\nsection \u003cstrong\u003eDNS forwardings\u003c/strong\u003e du menu \u0026ldquo;\u003cstrong\u003eNetwork → DNS and DHCP\u003c/strong\u003e\u0026rdquo;.\u003c/div\u003e\n\n\u003ch3 id=\"configuration-cli\"\u003eConfiguration CLI\u003c/h3\u003e\n\u003cp\u003eIl est possible de configurer le service par le biais de la console shell :\u003c/p\u003e\n\u003cp\u003eVoici l\u0026rsquo;exemple que donne la communauté OpenWRT :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Configure DoH provider\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003ewhile\u003c/span\u003e uci -q delete https-dns-proxy.@https-dns-proxy\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e :; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euci set https-dns-proxy.dns\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;https-dns-proxy\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euci set https-dns-proxy.dns.bootstrap_dns\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;8.8.8.8,8.8.4.4\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euci set https-dns-proxy.dns.resolver_url\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;https://dns.google/dns-query\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euci set https-dns-proxy.dns.listen_addr\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;127.0.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euci set https-dns-proxy.dns.listen_port\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;5053\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euci commit https-dns-proxy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/etc/init.d/https-dns-proxy restart\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe paramétrage présenté est pour les serveurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de Google…\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/services/dns/doh_dnsmasq_https-dns-proxy\" rel=\"external\"\u003ehttps://openwrt.org/docs/guide-user/services/dns/doh_dnsmasq_https-dns-proxy\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eMais peut-être que vous préférerez utiliser \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDoT \u003cem\u003e(DNS-over-TCP)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ; si oui, lisez :\n\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/unbound-dot/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT \u0026#43; Unbound : utiliser le protocole DoT '\"\u003eOpenWRT \u0026#43; Unbound : utiliser le protocole DoT \u003c/a\u003e\n\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID! \u003cbr\u003e\nEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment utiliser OpenWRT pour qu'il fasse proxy vers des DNS sur le protocole DoH",
            "tags": ["OpenWRT", "DNS", "DoH"],
            "date_published": "2020-12-22T10:22:49+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:41b758f6-3e50-af95-72d5-5bb90d41826a",
            "url": "http://doc.huc.fr.eu.org/fr/web/nginx/nginx-image-webp/",
            "title": "Nginx gère les images au format Webp",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Ici, il n\u0026rsquo;est pas question de demander au serveur web nginx de modifier/créer à la volée des images au format WebP.\nPour ceux qui ne savent pas ce qu\u0026rsquo;est le format WebP, sachez que c\u0026rsquo;est un conteneur d\u0026rsquo;image matricielle, développé par… Google. Il permet de faire d\u0026rsquo;obtenir des images plus légères, qu\u0026rsquo;elles ne le seraient au format JPEG. cf: la section Documentation ci-dessous !\nInstallation Bref, cela nécessite d\u0026rsquo;installer sur votre système d\u0026rsquo;exploitation la bibliothèque nécessaire :\nsous Linux : le paquet webp sous OpenBSD : le paquet libwebp InfoImageMagick est aussi capable de convertir une image au format WebP : :$ convert \u0026quot;${file}\u0026quot; \u0026quot;${file}.webp\u0026quot; Utilisation Pour transformer une image jpg, png, voire tiff au format, il suffit d\u0026rsquo;appeler la bibliothèque cwebp, très simplement :\ncwebp -m 0 -mt \u0026#34;${image}\u0026#34; -o \u0026#34;${image}.webp\u0026#34; Quant aux images gif, elles sont converties grâce à la bibliothèque gif2wepb :\ngif2webp -m 0 -mt \u0026#34;${image}\u0026#34; -o \u0026#34;${image}.webp\u0026#34; Veuillez lire le manpage correspondant pour connaître les différentes options de la bibliothèque :\n:$ man cwebp :$ man gif2webp Voici le code que j\u0026rsquo;utilise personnellement :\n_webp() { if [ ! -f \u0026#34;${file}.webp\u0026#34; ]; then case \u0026#34;$(file -b \u0026#34;${file}\u0026#34;)\u0026#34; in \u0026#39;GIF\u0026#39;*) gif2webp -m 0 -mt \u0026#34;${file}\u0026#34; -o \u0026#34;${file}.webp\u0026#34; ;; \u0026#39;JPEG\u0026#39;|\u0026#39;PNG\u0026#39;|\u0026#39;TIFF\u0026#39;*) cwebp -exact -lossless -m 0 -mt -progress \u0026#34;${file}\u0026#34; -o \u0026#34;${file}.webp\u0026#34; ;; esac fi; } Que fait ce code ?\nDans les faits, il teste :\nl\u0026rsquo;existence du fichier ayant l\u0026rsquo;extension de fichier .webp puis détermine le type du fichier et appelle la bonne bibliothèque selon le format détecté. Par soucis de simplicité et de lecture, il génére une image au format webp, portant l\u0026rsquo;extension .webp, ajouté à son nom de fichier originel, tel que image.jpg.webp, pour l\u0026rsquo;exemple.\nTu verras, toi mon lecteur, que cela nous facilite la configuration de nginx, par la suite.\nEnsuite, je parcoure un répertoire d\u0026rsquo;image par le biais de la fonction find, qui appelle la fonction _webp déclarée ci-dessus, tel que :\nfind . -type f -a \\( \\ -name \u0026#34;*.gif\u0026#34; -o -name \u0026#39;*.jpg\u0026#39; -o -name \u0026#39;*.jpeg\u0026#39; -o -name \u0026#39;*.png\u0026#39; -o -name \u0026#39;*.tiff\u0026#39; \\ \\) | while read -r file; do _webp; done Voici le script shell que j\u0026rsquo;utilise :\n#!/bin/bash #set -x clear ######################################################################## ### ## # # Author: Stéphane HUC # mail: devs@stephane-huc.net # gpg:fingerprint: CE2C CF7C AB68 0329 0D20 5F49 6135 D440 4D44 BD58 # # License: Public Domain # # Git: # # Date: 2020/10/03 # ## ### ######################################################################## ## # Convert to webp images ## ######################################################################## #ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34; ######################################################################## _webp() { if [ ! -f \u0026#34;${file}.webp\u0026#34; ]; then case \u0026#34;$(file -b \u0026#34;${file}\u0026#34;)\u0026#34; in \u0026#39;GIF\u0026#39;*) gif2webp -m 0 -mt \u0026#34;${file}\u0026#34; -o \u0026#34;${file}.webp\u0026#34; ;; \u0026#39;JPEG\u0026#39;|\u0026#39;PNG\u0026#39;|\u0026#39;TIFF\u0026#39;*) cwebp -exact -lossless -m 0 -mt -progress \u0026#34;${file}\u0026#34; -o \u0026#34;${file}.webp\u0026#34; ;; esac fi; } main() { find . -type f -a \\( \\ -name \u0026#34;*.gif\u0026#34; -o -name \u0026#39;*.jpg\u0026#39; -o -name \u0026#39;*.jpeg\u0026#39; -o -name \u0026#39;*.png\u0026#39; -o -name \u0026#39;*.tiff\u0026#39; \\ \\) | while read -r file; do _webp; done } ######################################################################## main Celui-ci est aisément modifiable pour l\u0026rsquo;utiliser sous tout autre shell.\nDe deux manières l\u0026rsquo;une, j\u0026rsquo;utilise ce script soit en l\u0026rsquo;appelant individuellement, soit par le biais de mon script de déploiement de mes fichiers vers le serveur web.\nAinsi, en sus des images aux formats originels, j\u0026rsquo;y dépose celles au format webp. ;-)\nConfiguration Modifions la configuration de nginx, afin de lui signifier que quand il est demandé des images au format jpeg|gif|png|tiff, il essaye de diffuser celles au format webp, si elles existent.\n⇒ Dans le contexte http du serveur, ajoutons une map afin de déclarer une variable $webp_suffix qui nous permettra de reconnaître une image ayant l\u0026rsquo;extension .webp.\nmap $http_accept $webp_suffix { webp_suffix \u0026#34;\u0026#34;; \u0026#34;~*webp\u0026#34; \u0026#34;.webp\u0026#34;; } ⇒ Le script suivant est à inclure dans le contexte de la déclaration server de votre configuration d\u0026rsquo;hôte virtuel.\nlocation ~ /*.(jpe?g|gif|png|tiff)$ { access_log off; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; add_header Pragma public; add_header Vary \u0026#34;Accept-Encoding\u0026#34;; expires max; log_not_found off; try_files $uri$webp_suffix $uri =404; } location ~ /*.(gif|jpe?g|png|tiff).webp { access_log off; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; add_header Content-Type image/webp; add_header Pragma public; add_header Vary \u0026#34;Accept-Encoding\u0026#34;; default_type image/webp; expires max; # normalement, non nécessaire car déclaré dans les types mimes reconnus par nginx types { image/webp webp; } } Ce que fait cette configuration ?\nLorsqu\u0026rsquo;un appel est fait vers une image, au format sus-mentionné : aucune inscription au journal n\u0026rsquo;est faite envoie des entêtes HTTP nécessaires pour une bonne \u0026ldquo;publication\u0026rdquo; par le serveur vers le client. essaie d\u0026rsquo;envoyer l\u0026rsquo;image portant l\u0026rsquo;extension .webp, suffixé au nom de l\u0026rsquo;image appelée, sinon retourne logiquement une erreur 404. remarque l\u0026rsquo;utilisation de la variable $webp_suffix à la ligne 13. L\u0026rsquo;appel à une image portant l\u0026rsquo;extension .webp : n\u0026rsquo;est pas journalisé envoie les entêtes HTTP nécessaires définit correctement le bon type mime. Et, voilà !!!\nReste plus qu\u0026rsquo;à tester votre configuration avec nginx et redémarrer le service correspondant - par exemple, pour OpenBSD :\n:# nginx -t :# rcctl restart nginx HTML Pour finir, modifiez votre code HTML à-propos de la gestion des images, tel que, par exemple pour une image jpeg, à minima :\n\u0026lt;picture\u0026gt; \u0026lt;source srcset=\u0026#34;/img/{{ $img }}.jpg.webp\u0026#34; type=\u0026#34;image/webp\u0026#34;\u0026gt; \u0026lt;img alt=\u0026#34;texte\u0026#34; src=\u0026#34;/img/{{ $img }}.jpg\u0026#34; type=\u0026#34;image/jpeg\u0026#34;\u0026gt; \u0026lt;/picture\u0026gt; Ce qui permettra aux clients web qui supportent le format webp de demander l\u0026rsquo;affichage de ce format en lieu et place…\nEssai Test avec mon Logo :\nLogo Ainsi, selon le support du client web, vous recevrez soit le format WebP, sinon le fichier \u0026ldquo;source\u0026rdquo; png…\nDocumentation WebP WP A new image format for the Web : site officiel le site caniuse.com : https://caniuse.com/webp ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIci, il n\u0026rsquo;est pas question de demander au serveur web nginx de modifier/créer\nà la volée des images au format WebP.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePour ceux qui ne savent pas ce qu\u0026rsquo;est le format WebP, sachez que c\u0026rsquo;est\nun conteneur d\u0026rsquo;image matricielle, développé par… Google. Il permet de\nfaire d\u0026rsquo;obtenir des images plus légères, qu\u0026rsquo;elles ne le seraient au\nformat JPEG. cf: la section \u003ca href=\"/fr/web/nginx/nginx-image-webp/#Documentation\"\u003eDocumentation\u003c/a\u003e ci-dessous !\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eBref, cela nécessite d\u0026rsquo;installer sur votre système d\u0026rsquo;exploitation la\nbibliothèque nécessaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esous Linux : le paquet \u003cstrong\u003ewebp\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003esous OpenBSD : le paquet \u003cstrong\u003elibwebp\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eImageMagick est aussi capable de convertir une image au format WebP :\n\u003ccode\u003e:$ convert \u0026quot;${file}\u0026quot; \u0026quot;${file}.webp\u0026quot;\u003c/code\u003e\u003c/div\u003e\n\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003ePour transformer une image jpg, png, voire tiff au format, il suffit d\u0026rsquo;appeler\nla bibliothèque \u003cstrong\u003ecwebp\u003c/strong\u003e, très simplement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecwebp -m \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -mt \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuant aux images gif, elles sont converties grâce à la bibliothèque \u003cstrong\u003egif2wepb\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egif2webp -m \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -mt \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eimage\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVeuillez lire le manpage correspondant pour connaître les différentes options\nde la bibliothèque :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e:$ man cwebp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e:$ man gif2webp\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoici le code que j\u0026rsquo;utilise personnellement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_webp\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003efile -b \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;GIF\u0026#39;\u003c/span\u003e*\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                gif2webp -m \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -mt \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;JPEG\u0026#39;\u003c/span\u003e|\u003cspan style=\"color:#48b685\"\u003e\u0026#39;PNG\u0026#39;\u003c/span\u003e|\u003cspan style=\"color:#48b685\"\u003e\u0026#39;TIFF\u0026#39;\u003c/span\u003e*\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                cwebp -exact -lossless -m \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -mt -progress \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQue fait ce code ?\u003c/p\u003e\n\u003cp\u003eDans les faits, il teste :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003el\u0026rsquo;existence du fichier ayant l\u0026rsquo;extension de fichier \u003ccode\u003e.webp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epuis détermine le type du fichier et appelle la bonne bibliothèque selon\nle format détecté.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePar soucis de simplicité et de lecture, il génére une image au format webp,\nportant l\u0026rsquo;extension \u003ccode\u003e.webp\u003c/code\u003e, ajouté à son nom de fichier originel, tel que\n\u003cstrong\u003eimage.jpg.webp\u003c/strong\u003e, pour l\u0026rsquo;exemple.\u003cbr\u003e\n\u003cem\u003eTu verras, toi mon lecteur, que cela nous facilite la configuration de\nnginx, par la suite.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite, je parcoure un répertoire d\u0026rsquo;image par le biais de la fonction\n\u003ccode\u003efind\u003c/code\u003e, qui appelle la fonction \u003ccode\u003e_webp\u003c/code\u003e déclarée ci-dessus, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003efind . -type f -a \u003cspan style=\"color:#f99b15\"\u003e\\(\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        -name \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.gif\u0026#34;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.jpg\u0026#39;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.jpeg\u0026#39;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.png\u0026#39;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.tiff\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e\\)\u003c/span\u003e | \u003cspan style=\"color:#815ba4\"\u003ewhile\u003c/span\u003e read -r file; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e _webp; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eVoici le script shell que j\u0026rsquo;utilise :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/bash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#set -x\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eclear\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Author: Stéphane HUC\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# mail: devs@stephane-huc.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# gpg:fingerprint: CE2C CF7C AB68 0329 0D20  5F49 6135 D440 4D44 BD58\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# License: Public Domain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Git:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Date: 2020/10/03\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Convert to webp images\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_webp\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003efile -b \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;GIF\u0026#39;\u003c/span\u003e*\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                gif2webp -m \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -mt \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;JPEG\u0026#39;\u003c/span\u003e|\u003cspan style=\"color:#48b685\"\u003e\u0026#39;PNG\u0026#39;\u003c/span\u003e|\u003cspan style=\"color:#48b685\"\u003e\u0026#39;TIFF\u0026#39;\u003c/span\u003e*\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                cwebp -exact -lossless -m \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -mt -progress \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -o \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.webp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emain\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    find . -type f -a \u003cspan style=\"color:#f99b15\"\u003e\\(\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        -name \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.gif\u0026#34;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.jpg\u0026#39;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.jpeg\u0026#39;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.png\u0026#39;\u003c/span\u003e -o -name \u003cspan style=\"color:#48b685\"\u003e\u0026#39;*.tiff\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#f99b15\"\u003e\\)\u003c/span\u003e | \u003cspan style=\"color:#815ba4\"\u003ewhile\u003c/span\u003e read -r file; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e _webp; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e########################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emain\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eCelui-ci est aisément modifiable pour l\u0026rsquo;utiliser sous tout autre shell.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDe deux manières l\u0026rsquo;une, j\u0026rsquo;utilise ce script soit en l\u0026rsquo;appelant individuellement,\nsoit par le biais de mon script de déploiement de mes fichiers vers le\nserveur web.\u003c/p\u003e\n\u003cp\u003eAinsi, en sus des images aux formats originels, j\u0026rsquo;y dépose celles au format\nwebp. ;-)\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eModifions la configuration de nginx, afin de lui signifier que quand il\nest demandé des images au format jpeg|gif|png|tiff, il essaye de diffuser\ncelles au format webp, si elles existent.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Dans le contexte \u003ccode\u003ehttp\u003c/code\u003e du serveur, ajoutons une \u003ccode\u003emap\u003c/code\u003e afin de déclarer\nune variable \u003ccode\u003e$webp_suffix\u003c/code\u003e qui nous permettra de reconnaître une image\nayant l\u0026rsquo;extension \u003ccode\u003e.webp\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003emap\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$http_accept\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$webp_suffix\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003ewebp_suffix\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;~*webp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.webp\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Le script suivant est à inclure dans le contexte de la déclaration \u003ccode\u003eserver\u003c/code\u003e\nde votre configuration d\u0026rsquo;hôte virtuel.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.(jpe?g|gif|png|tiff)$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eaccess_log\u003c/span\u003e        \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eCache-Control\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003emust-revalidate,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eproxy-revalidate\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ePragma\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003epublic\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eVary\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Accept-Encoding\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eexpires\u003c/span\u003e           \u003cspan style=\"color:#48b685\"\u003emax\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003elog_not_found\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003etry_files\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$uri$webp_suffix\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$uri\u003c/span\u003e =\u003cspan style=\"color:#f99b15\"\u003e404\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.(gif|jpe?g|png|tiff).webp\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eaccess_log\u003c/span\u003e        \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eCache-Control\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;public,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003emust-revalidate,\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eproxy-revalidate\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eContent-Type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eimage/webp\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ePragma\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003epublic\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eVary\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Accept-Encoding\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eimage/webp\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eexpires\u003c/span\u003e           \u003cspan style=\"color:#48b685\"\u003emax\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# normalement, non nécessaire car déclaré dans les types mimes reconnus par nginx\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003etypes\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003eimage/webp\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ewebp\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe que fait cette configuration ?\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eLorsqu\u0026rsquo;un appel est fait vers une image, au format sus-mentionné :\n\u003cul\u003e\n\u003cli\u003eaucune inscription au journal n\u0026rsquo;est faite\u003c/li\u003e\n\u003cli\u003eenvoie des entêtes HTTP nécessaires pour une bonne \u0026ldquo;publication\u0026rdquo;\npar le serveur vers le client.\u003c/li\u003e\n\u003cli\u003eessaie d\u0026rsquo;envoyer l\u0026rsquo;image portant l\u0026rsquo;extension \u003ccode\u003e.webp\u003c/code\u003e, suffixé au nom\nde l\u0026rsquo;image appelée, sinon retourne logiquement une erreur 404. \u003cbr\u003e\n\u003cem\u003eremarque l\u0026rsquo;utilisation de la variable \u003ccode\u003e$webp_suffix\u003c/code\u003e à la ligne 13\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;appel à une image portant l\u0026rsquo;extension \u003ccode\u003e.webp\u003c/code\u003e :\n\u003cul\u003e\n\u003cli\u003en\u0026rsquo;est pas journalisé\u003c/li\u003e\n\u003cli\u003eenvoie les entêtes HTTP nécessaires\u003c/li\u003e\n\u003cli\u003edéfinit correctement le bon type mime.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003cp\u003eEt, voilà !!!\u003c/p\u003e\n\u003cp\u003eReste plus qu\u0026rsquo;à tester votre configuration avec nginx et redémarrer le service\ncorrespondant - \u003cem\u003epar exemple, pour OpenBSD\u003c/em\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# nginx -t\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl restart nginx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"html\"\u003eHTML\u003c/h2\u003e\n\u003cp\u003ePour finir, modifiez votre code HTML à-propos de la gestion des images,\ntel que, par exemple pour une image jpeg, à minima :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003epicture\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003esource\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esrcset\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/img/{{ $img }}.jpg.webp\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eimg\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ealt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;texte\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esrc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/img/{{ $img }}.jpg\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/jpeg\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003epicture\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe qui permettra aux clients web qui supportent le format webp de demander\nl\u0026rsquo;affichage de ce format en lieu et place…\u003c/p\u003e\n\u003ch3 id=\"essai\"\u003eEssai\u003c/h3\u003e\n\u003cp\u003eTest avec mon Logo :\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/logo.png\" title=\"Logo\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/logo_hu_c9e055de1824af3f.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Logo\" height=\"128\" loading=\"lazy\" src=\"/images/logo.png\" type=\"image/png\" width=\"128\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eLogo\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eAinsi, selon le support du client web, vous recevrez soit le format WebP,\nsinon le fichier \u0026ldquo;source\u0026rdquo; png…\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/WebP\" title=\"Article Wikipédia : WebP\"\u003eWebP \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://developers.google.com/speed/webp\" rel=\"external\"\u003eA new image format for the Web\u003c/a\u003e : site officiel\u003c/li\u003e\n\u003cli\u003ele site caniuse.com : \u003ca href=\"https://caniuse.com/webp\" rel=\"external\"\u003ehttps://caniuse.com/webp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
            "summary": "Configurer Nginx pour qu'il diffuse les images au format WebP, au lieu de…",
            "tags": ["nginx", "image", "webp", "astuce"],
            "date_published": "2020-12-21T12:57:24+01:00",
            "date_modified": "2025-11-13T14:12:52+01:00"
        },{
            "id": "urn:uuid:8f82a0e0-3d93-22a9-7312-89c7378d1726",
            "url": "http://doc.huc.fr.eu.org/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/",
            "title": "Guide du Routeur OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Guide du Routeur OpenBSD Pare-feu segmentant un réseau, avec DHCP, DNS (Unbound), blocage de domaine et bien plus encore.\nOpenBSD: 6.9 · Publié : 2020-11-05 · Mis-à-jour : 2021-07-21 · Version : 1.9.4 Introduction Dans ce guide, nous verrons comment nous pouvons utiliser du matériel \u0026ldquo;bas de gamme\u0026rdquo; bon marché pour construire un routeur OpenBSD terrible avec des capacités de pare-feu, des réseaux locaux segmentés, du DNS avec blocage de noms de domaines, du DHCP et bien plus.\nNous commencerons par paramétrer les segments réseaux (LAN) par trois réseaux séparés, un pour les adultes à la maison, un pour les enfants et un pour les serveurs face à Internet (comme une DMZ), tel qu\u0026rsquo;un serveur web ou serveur mail privé. Nous chercherons à voir comment nous pouvons utiliser DNS pour bloquer les publicités, le porno, et d\u0026rsquo;autres sites sur Internet. Le routeur OpenBSD peut aussi être utilisé dans de petites ou moyennes entreprises.\nConventions typographiques utilisées dans ce guide La police à largeur fixe (mono-espacement) est utilisée pour les commandes en console, les noms de fichiers et leurs chemins, les paramètres de configuration, etc… Les commandes en console qui doivent être tapées en tant qu\u0026rsquo;utilisateur root sont préfixées du symbole dièse # et la commande apparaît en gras dans le texte. Les commandes en console qui doivent être tapées en tant qu\u0026rsquo;utilisateur normal sont préfixées du symbole dollar $ et la commande apparaît en gras dans le texte. Pourquoi un pare-feu ? InfoActuellement ce guide aborde IPv4, car la plupart des personnes n\u0026rsquo;utilisent pas IPv6 et beaucoup de FAI - Fournisseur d\u0026rsquo;Accès à Internet - utilisent seulement IPv4, mais IPv6 est planifié dans le contexte d\u0026rsquo;une future mise à jour de ce guide. Peu importe comment vous vous connectez à Internet depuis votre domicile ou votre bureau, vous avez besoin d\u0026rsquo;un vrai pare-feu entre vous et le modem ou routeur que vous fourni votre FAI.\nIl est très rare que les modems ou routeurs grand public reçoivent des mises à jour du micrologiciel et sont souvent vulnérables aux attaques réseau qui transforment ces appareils en Botnet, tel que le fait le logiciel malveillant Mirai. De nombreux modems et routeurs grand public sont à blâmer à propos de certaines attaques par déni de service de grande envergure (DOS)\nUn pare-feu entre vous et le modem ou routeur de votre FAI ne peut pas protéger votre dispositif modem ou routeur contre de telles attaques, mais il peut protéger vos ordinateurs et dispositifs à l\u0026rsquo;intérieur du réseau, et il peut vous aider à surveiller et contrôler le trafic qui arrive vers votre réseau local et qui en part.\nSans un pare-feu entre votre réseau local et le modem ou routeur du FAI, vous pouvez considérer basiquement que votre porte est grande ouverte, comme laisser grande ouverte la porte de votre maison, ainsi vous ne pouvez pas faire confiance en l\u0026rsquo;équipement de votre FAI.\nC\u0026rsquo;est toujours réellement une bonne idée de mettre un vrai pare-feu entre votre réseau local et Internet, et avec OpenBSD vous avez une solution très solide.\nLe Matériel Vous n\u0026rsquo;avez pas besoin d\u0026rsquo;acheter du matériel cher pour avoir un routeur et un pare-feu efficaces pour votre maison ou votre bureau. Même avec du matériel \u0026ldquo;bas de gamme\u0026rdquo; bon marché, vous pouvez avoir une solution très solide.\nJ\u0026rsquo;ai créé de multiples solutions avec la carte-mère ASRock Q1900DC-ITX qui est fournie avec un processeur Intel Celeron Quadri-Cœur.\nASRock Q1900DC-ITX Je l\u0026rsquo;admet, c\u0026rsquo;est une carte-mère assez \u0026ldquo;pourrie\u0026rdquo;, mais elle fait le boulot et j\u0026rsquo;ai de nombreuses solutions très solides qui fonctionnent depuis de nombreuses années sur des réseaux Gigabit avec saturation complète et le pare-feu, DNS, faisant des \u0026ldquo;heures supplémentaires\u0026rdquo; et où le CPU ne chauffe pas.\nLa carte-mère ASRock Q1900DC-ITX a pour avantage qu\u0026rsquo;elle est fournie avec une prise jack DC-In (entrée électrique) qui est compatible avec un adaptateur électrique 9-19V, ce qui la rend très économe en énergie. Malheureusement, la carte-mère ASRock Q1900DC-ITX n\u0026rsquo;est plus fabriquée, mais comme je l\u0026rsquo;utilise juste comme exemple ; j\u0026rsquo;ai utilisé de nombreuses autres carte-mères bon marché tout aussi bien.\nInfoBeaucoup d\u0026rsquo;autres carte-mères faites par d\u0026rsquo;autres fabricants consommant peu peuvent être aussi bien utilisées, tel le fameux APU2. J\u0026rsquo;ai aussi utilisé l\u0026rsquo;ASRock Q1900-ITX (qui est fournie sans la prise jack DC-In) combinée à un PicoPSU.\nPicoPSU Vous pouvez trouvez différentes marques et version du PicoPSU, certains sont de meilleurs qualités que d\u0026rsquo;autres. J\u0026rsquo;ai deux marques différentes, l\u0026rsquo;original et une copie moins chère, toutes deux sont très performants et permettent d\u0026rsquo;économiser par mal d\u0026rsquo;énergie contrairement à une alimentation normale.\nEnfin, j\u0026rsquo;utilise une carte réseau quadruple port Intel bon marché, trouvé sur Ebay, tel que celle-ci :\nQuad NIC Intel Je sais, il est préférable d\u0026rsquo;utiliser du matériel de qualité, spécifiquement sur un réseau dont vous avez à prendre soin, mais ce tutoriel est relatif au fait de comment vous pouvez vous en sortir en utilisant du matériel bon marché tout en ayant un produit extrêmement utile qui continue à bien vous servir pendant de nombreuses années - du moins, telle est mon expérience.\nJe vous recommande de chercher une carte mini-ITX dont le matériel est pris en charge par OpenBSD, tel qu\u0026rsquo;un CPU Intel Celeron ou Intel i3. Ces cartes-mères sont typiquement peu chères, peu gourmandes d\u0026rsquo;énergie, et ne prennent pas beaucoup de place. Je ne recommande pas l\u0026rsquo;utilisation d\u0026rsquo;un CPU Intel Atom si vous avez un réseau Gigabit, car il ne peut pas gérer la quantité de trafic.\nVous pourriez également avoir besoin de quelques commutateurs Gigabit bon marché pour segmenter votre réseau local, au moins si vous avez plus d\u0026rsquo;un ordinateur connecté sur le même LAN :)\nPourquoi OpenBSD ? En vérité, vous pouvez avoir le même paramétrage avec une autre saveur BSD ou une des différentes distributions Linux, mais OpenBSD est spécifiquement très bien adapté et conçu pour ce genre de tâche. Non seulement il est livré avec tous les logiciels nécessaires dans l\u0026rsquo;installation de base, mais il offre également une sécurité nettement supérieure, et des tonnes de mesure d\u0026rsquo;atténuation améliorées déjà intégrées dans le système d\u0026rsquo;exploitation. Je recommande chaudement OpenBSD plutôt que tout autre système d\u0026rsquo;exploitation pour ce genre de tâches.\nCe guide ne vous montre pas comment installer OpenBSD. Si vous ne savez pas faire, je vous recommande de faire fonctionner une machine virtuelle avant ou de voir si vous avez du matériel inutilisé et pris en charge avec lequel vous pourriez tester. OpenBSD est un des systèmes d\u0026rsquo;exploitations des plus faciles et rapides à installer. N\u0026rsquo;ayez pas peur de l\u0026rsquo;approche sans GUI (interface utilisateur) ; une fois que vous l\u0026rsquo;avez essayé, vous apprécierez vraiment sa simplicité. Dans le doute, utilisez les paramètres par défaut.\nAvant de commencer ce voyage, assurez-vous de consulter la documentation d\u0026rsquo;OpenBSD ! Non seulement, chaque chose est très bien documentée, mais vous trouverez très probablement toutes les réponses dont vous avez besoin. Lisez la FAQ OpenBSD, regardez les différentes pages de manuels à propos des différents logiciels que nous allons utiliser.\nUn autre endroit vraiment utile où trouver des informations générales à propos d\u0026rsquo;OpenBSD sont les archives des listes de diffusions d\u0026rsquo;OpenBSD. Aussi assurez-vous de rester à jour des informations pertinentes en souscrivant à la liste de diffusion des Annonces et avis de sécurité.\nAstuceVeuillez considérer de soutenir OpenBSD ! Même si vous n\u0026rsquo;utilisez pas quotidiennement OpenBSD, vous utilisez peut-être déjà OpenSSH sur Linux, alors vous utilisez vraiment un logiciel du projet OpenBSD. Considérez de faire un petit, mais régulier, don pour soutenir le développement de tous les excellents logiciels que les développeurs d\u0026rsquo;OpenBSD font. Le réseau Un routeur est basiquement un dispositif qui régule le trafic réseau entre deux ou plusieurs réseaux séparés. Le routeur garantira que le trafic réseau à destination du réseau local ne circule pas sur Internet, et que le trafic sur Internet, qui n\u0026rsquo;est pas à destination de votre réseau local, reste sur Internet.\nInfoUn routeur est parfois aussi appelé passerelle, ce qui est généralement le terme, mais en vérité une véritable passerelle joint des systèmes différents, alors qu\u0026rsquo;un routeur joint des réseaux similaires. Un exemple de passerelle serait un dispositif qui joint un réseau PC avec un réseau télécom. Dans ce tutoriel, nous construirons un routeur et nous avons 4 réseaux de même type à faire travailler ensemble. L\u0026rsquo;un est Internet, et les trois autres sont segmentés intentionnellement en réseaux locaux (LAN). Certaines personnes préfèrent travailler avec des LAN virtuels (VLAN), mais dans ce tutoriel nous utiliserons une interface réseau 4 ports, telle que vue sur l\u0026rsquo;illustration ci-dessus. Vous pouvez arriver au même résultat en utilisant de multiples cartes réseau à port unique, si vous préférez ; vous devez juste vous assurez d\u0026rsquo;avoir assez de place et de slot PCI libre sur la carte-mère. Vous pouvez aussi utiliser le port Ethernet de la carte-mère, mais cela dépend du pilote et de la prise en charge du dispositif. Je n\u0026rsquo;ai pas de problème à utiliser un contrôleur Ethernet Gigabit PCI Realtek qui est fourni avec beaucoup de carte-mères, bien que je recommande plutôt Intel.\nBien sûr, vous n\u0026rsquo;avez pas à segmenter le réseau en de nombreuses parties si vous n\u0026rsquo;avez pas besoin de cela, et il serait très facile de changer les paramètres de ce guide, mais j\u0026rsquo;ai décidé d\u0026rsquo;utiliser cette approche avant de vous montrer comment vous pouvez protéger vos enfants en segmentant leur réseau dans un LAN séparé qui permet non seulement de bloquer la publicité et la pornographie grâce au blocage des DNS (tous les segments en bénéficient), mais vous pouvez même mettre sur une liste blanche les partie de l\u0026rsquo;Internet auxquelles vous voulez qu\u0026rsquo;ils aient accès. La dernière partie à propos des listes blanches est difficile et n\u0026rsquo;est généralement pas recommandé à moins que vos enfants aient besoin d\u0026rsquo;un accès très limité, mais c\u0026rsquo;est faisable avec un peu de travail, et le guide va vous montrer une façon de faire.\nCeci est une illustration du réseau que nous allons paramétrer :\nInternet | xxx.xxx.xxx.xxx Modem FAI (WAN) 10.24.0.23 | OpenBSD 10.24.0.50 (routeur/parefeu) | ┌────────────────────+────────────────────┐ | | | NIC1 NIC2 NIC3 (DMZ) 192.168.1.1 192.168.2.1 192.168.3.1 LAN1 switch LAN2 switch LAN3 switch | | | └─ 192.168.1.x ├─ 192.168.2.x └─ 192.168.3.2 PC Adultes | PC1 Enfant Public web server | └─ 192.168.2.x PC2 Enfant Les adresses IP qui commencent par 10.24.0 sont n\u0026rsquo;importe quelle adresse IP que le routeur ou modem de votre FAI vous donne ; elles peuvent être très différentes. Les adresses IP commençant par 192.168 sont les adresses IP que nous allons utiliser dans ce guide pour notre réseau local (LAN).\nCe guide ne s\u0026rsquo;occupe en aucun cas de connectivité Wifi. Les micrologiciels des puces sans fil sont notoirement bogués et exploitables ; je vous recommande de n\u0026rsquo;utiliser aucun type de connectivité sans fil, si vous pouvez vous en passer. Si vous avez besoin de la connectivité sans fil, je recommande chaudement que vous désactiviez l\u0026rsquo;accès Wifi du modem ou routeur du FAI (si possible), et ensuite d\u0026rsquo;acheter le meilleur routeur Wifi que vous pouvez trouver puis de le mettre derrière le pare-feu dans un segment isolé. Ainsi, si jamais votre appareil sans fil est compromis, vous pourrez mieux contrôler le résultat et limiter les dégâts. Vous pouvez en outre configurer le routeur sans fil de telle sorte que tout appareil, qui y est connecté, dispose de ses propres adresses IP qui passent directement par le routeur sans fil, tout en bloquant le trafic provenant du routeur sans fil lui-même. De cette façon, vous pouvez empêcher le routeur sans fil de \u0026ldquo;téléphoner à la maison\u0026rdquo;. Vous pouvez aussi avoir un adaptateur Wifi supporté par OpenBSD et que votre routeur OpenBSD agisse en tant que point d\u0026rsquo;accès, toutefois je préfère de beaucoup segmenter la partie Wifi soit par un routeur sans fil séparé, soit par une autre machine OpenBSD servant de point d\u0026rsquo;accès Wifi derrière le pare-feu lui-même.\nInfoActuellement, autant que je le sache, aucun des pilotes Wifi d' OpenBSD ne posent pas encore de problèmes. Paramétrer le réseau La première chose que nous allons paramétrer sont les différentes interfaces réseaux de notre routeur OpenBSD. Sur ma machine, j\u0026rsquo;ai désactivé l\u0026rsquo;interface réseau qui est livré avec la carte-mère via le BIOS, et je n\u0026rsquo;utilise que l\u0026rsquo;interface réseau 4 ports d\u0026rsquo;Intel.\nSi vous suivez ce tutoriel et que vous souhaitez seulement un pare-feu basique alors vous avez au moins besoin de deux interfaces réseaux séparées.\nAvant de commencer, assurez-vous de lire et de comprendre les différentes options de la page de manuel hostname.if. Prenez aussi le temps de lire la section réseau de la FAQ d\u0026rsquo;OpenBSD.\nPuisque j\u0026rsquo;utilise Intel, le pilote em est celui qu\u0026rsquo;OpenBSD charge sur chacun des ports de cette interface réseau, qui sont listés comme étant des cartes séparées. Cela signifie que chaque carte est listée en tant qu\u0026rsquo;emX où X est le numéro actuel du port de la carte.\ndmesg liste ma carte réseau avec 4 ports de telle manière :\n# dmesg em0 at pci2 dev 0 function 0 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:b8 em1 at pci2 dev 0 function 1 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:b9 em2 at pci2 dev 0 function 2 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:ba em3 at pci2 dev 0 function 3 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:bb Ce qui montre que ma carte est reconnu comme étant une Intel I350-T4 PCI Express Quad Port Gigabit NIC.\nIl faut ensuite déterminer quel est le port correspondant physiquement au numéro indiqué ci-dessus. Vous pouvez le faire en connectant manuellement un câble Ethernet, connecté sur un commutateur actif, un modem ou un routeur, sur chacun des ports, un à la fois, afin de voir quel port est activé et le noter ensuite quelque part.\nVous pouvez vérifier le statuts d\u0026rsquo;activité avec la commande ifconfig. Un port sans câble Ethernet sera listé comme ayant le champ status notifié no carrier alors qu\u0026rsquo;un port avec un câble attaché sera listé en active. Tel que :\n# ifconfig em1: flags=8843\u0026lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST\u0026gt; mtu 1500 lladdr a0:36:9f:a1:66:b9 index 2 priority 0 llprio 3 media: Ethernet autoselect (none) status: active em2: flags=8843\u0026lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST\u0026gt; mtu 1500 lladdr a0:36:9f:a1:66:ba index 3 priority 0 llprio 3 media: Ethernet autoselect (none) status: no carrier Nous allons utiliser le port em0 afin de le connecter au modem ou routeur de votre FAI, vers Internet. Dans mon cas, j\u0026rsquo;ai une adresse IP publique fournie par mon FAI ; vous en aurez besoin si vous voulez faire fonctionner un serveur web depuis votre maison, mais si ce n\u0026rsquo;est pas le cas, vous n\u0026rsquo;en avez pas besoin, ainsi vous pouvez paramétrer la carte par DHCP.\nDans mon cas, j\u0026rsquo;ai besoin de spécifier une adresse IP fixe pour em0 qui recevra alors le trafic redirigé depuis mon FAI vers mon adresse IP publique. Pour faire cela, je paramètre em0 avec l\u0026rsquo;information suivante :\n# echo \u0026#39;inet 10.24.0.50 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em0 Si vous n\u0026rsquo;avez pas besoin d\u0026rsquo;une adresse IP publique et que votre adresse IP est obtenue par votre FAI via DHCP, alors écrivez juste dhcp à la place :\n# echo \u0026#39;dhcp\u0026#39; \u0026gt; /etc/hostname.em0 Ensuite, je paramètre le reste des ports de l\u0026rsquo;interface réseau avec leurs adresses IP, tel que je l\u0026rsquo;ai précédemment illustré.\n# echo \u0026#39;inet 192.168.1.1 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em1 # echo \u0026#39;inet 192.168.2.1 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em2 # echo \u0026#39;inet 192.168.3.1 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em3 Regardez la page du manuel hostname.if pour avoir plus d\u0026rsquo;informations.\nEnsuite, j\u0026rsquo;ai besoin de paramétrer l\u0026rsquo;IP de la passerelle du FAI. Selon le paramétrage de votre FAI, cela peut être une autre adresse IP que celle du modem ou routeur du FAI. Si vous n\u0026rsquo;ajoutez pas le fichier /etc/mygate alors aucune passerelle par défaut ne sera ajouté à la table de routage. Vous n\u0026rsquo;avez pas besoin de /etc/mygate si votre IP est fournie par le modem ou routeur de votre FAI via DHCP. Si vous utilisez la directive dhcp dans n\u0026rsquo;importe quel fichier hostname.ifX alors l\u0026rsquo;entrée dans le fichier /etc/mygate sera ignorée. Cela est parce que la carte obtient son adresse IP depuis un serveur DHCP qui fournira aussi l\u0026rsquo;information de routage vers la passerelle.\nEnfin, mais pas des moindres, nous avons besoin d\u0026rsquo;activer la redirection IP. La redirection IP est le processus qui dirige les paquets IP qui voyagent entre les interfaces réseaux du routeur. Par défaut, OpenBSD ne fera pas de redirection des paquets IP entre les différentes interfaces réseaux. En d\u0026rsquo;autres mots, les fonctions de routage (appelées aussi fonctions de passerelles) sont désactivées.\nNous pouvons activer la redirection d\u0026rsquo;IP en utilisant les commandes suivantes :\n# sysctl net.inet.ip.forwarding=1 # echo \u0026#39;net.inet.ip.forwarding=1\u0026#39; \u0026gt;\u0026gt; /etc/sysctl.conf Maintenant OpenBSD sera capable de rediriger les paquets IPv4 depuis une interface réseau vers une autre. Ou, tel dans notre cas avec les 4 ports, d\u0026rsquo;un port à l\u0026rsquo;autre. Regardez la page du manuel si vous avez besoin d\u0026rsquo;IPv6.\nDHCP Maintenant nous sommes prêts à paramétrer le service DHCP que nous exécuterons pour nos différents PC et dispositifs attachés aux différents LAN. Avant, assurons-nous de lire et de comprendre les différentes options de la page du manuel dhcp.conf. Prenons aussi le temps de regarder la page de manuel dhcp-options à propos des options que prend en charge dhcpd.\nNous avons une option pour cacher des adresses IP à de PC ou dispositifs spécifiques qui se connectent sur nos différents ports. Cela est nécessaire si nous voulons rediriger le trafic qui vient d\u0026rsquo;Internet vers quelque chose comme un serveur web. Nous pouvons cacher une adresse IP spécifique vers un PC spécifique via l\u0026rsquo;adresse MAC de l\u0026rsquo;interface réseau de la machine concernée.\nDans ce cas, je réserverais toutes les adresses IP dans un ensemble allant de 10 à 254 pour le DHCP, tandis que je laisserais les autres qui restent pour les éventuelles adresses fixes dont je pourrais avoir besoin.\nÉditer le fichier /etc/dhcpd.conf avec votre éditeur de texte favori et adapter le à vos besoins.\nsubnet 192.168.1.0 netmask 255.255.255.0 { option domain-name-servers 192.168.1.1; option routers 192.168.1.1; range 192.168.1.10 192.168.1.254; } subnet 192.168.2.0 netmask 255.255.255.0 { option domain-name-servers 192.168.2.1; option routers 192.168.2.1; range 192.168.2.10 192.168.2.254; } subnet 192.168.3.0 netmask 255.255.255.0 { option domain-name-servers 192.168.3.1; option routers 192.168.3.1; range 192.168.3.10 192.168.3.254; host web.example.com { fixed-address 191.168.3.2; hardware ethernet 61:20:42:39:61:AF; option host-name \u0026#34;webserver\u0026#34;; } } La ligne option domain-name-servers spécifie le serveur DNS que nous allons faire fonctionner sur notre routeur.\nDe plus l\u0026rsquo;ordinateur qui est notre serveur web sur le LAN publique a une adresse IP fixe et un nom d\u0026rsquo;hôte fixé.\nDe même, si vous ne voulez pas segmenter le réseau en différentes parties, mais que vous avez seulement besoin d\u0026rsquo;un LAN alors vous pouvez juste laisser de côté les autres sous-réseaux pour avoir juste cela :\nsubnet 192.168.1.0 netmask 255.255.255.0 { option domain-name-servers 192.168.1.1; option routers 192.168.1.1; range 192.168.1.10 192.168.1.254; } Ensuite, nous avons simplement besoin de nous assurer d\u0026rsquo;activer et de démarrer le service dhcpd :\n# rcctl enable dhcpd # rcctl start dhcpd InfoRegardez le chapitre Ajouter l\u0026rsquo;option domain-name à DHCP et utiliser un FQDN dans l\u0026rsquo;appendice pour savoir comment ajouter facilement un nom de domaine pleinement qualifié (FQDN) à votre paramétrage et comment vous pouvez utiliser l\u0026rsquo;option domain-name dans DHCP afin d\u0026rsquo;éviter à avoir à écrire le FQDN à chaque fois que vous en avez besoin. Ce chapitre vous montrera aussi comment vous pouvez éviter d\u0026rsquo;avoir à vous souvenir des adresses IP si votre LAN a de multiples ordinateurs ou dispositifs connectés. PF - un pare-feu filtrant Un pare-feu filtrant examine chaque paquet qui croise le pare-feu et décide quel paquet accepter ou refuser, selon l\u0026rsquo;examen des champs dans l\u0026rsquo;IP et les entêtes de protocole du paquet, et selon l\u0026rsquo;ensemble des règles que vous spécifiez.\nLe filtrage de paquets fonctionne par inspection des adresses IP et du port source et de destination contenus dans chaque paquet du protocole TCP/IP (Transmission Control Protocol / Internet Protocol). Les ports TCP/IP sont des numéros assignés à des services spécifiques qui identifie pour quel service chaque paquet est destiné.\nUne faiblesse commune des pare-feux simples à filtrage de paquets est que le pare-feu examine chaque paquet de manière isolée sans tenir compte des paquets qui ont déjà traversé le pare-feu et de ceux qui pourraient le suivre. Ils sont appelés pare-feu \u0026ldquo;sans état\u0026rdquo;. Exploiter un filtrage de paquets sans état est assez facile. PF d\u0026rsquo;OpenBSD n\u0026rsquo;est pas un pare-feu sans états, c\u0026rsquo;est un pare-feu à états.\nUn pare-feu à états garde trace des connexions ouvertes et permet seulement le trafic correspondant à une connexion existante ou ouvre une nouvelle connexion permise. Quand l\u0026rsquo;état est spécifié par une règle correspondante, le pare-feu génère dynamiquement des règles internes pour que chaque paquet anticipé puisse être échangé durant la session. Il a suffisamment de capacité de correspondance pour déterminer si un paquet est valide pour une session. Tout paquet qui ne correspond pas au modèle de session sera automatiquement rejeté.\nUn des avantages du filtrage à états est que c\u0026rsquo;est très rapide. Il vous permet de vous focaliser sur le fait de bloquer ou laisser passer de nouvelles sessions. Si une nouvelle session est passée, tous les paquets conséquents sont automatiquement alloués et tout paquet imposteur sera automatiquement rejeté. Si une nouvelle session est bloquée, aucun des paquets conséquents n\u0026rsquo;est autorisé. Le filtrage à états fournit aussi des capacités avancées de correspondance capables de se défendre contre le flood de différentes méthodes d\u0026rsquo;attaques employées par des attaquants.\nLa Traduction d\u0026rsquo;Adresse Réseau (NAT) permet à un réseau privé derrière le pare-feu de partager une adresse IP publique unique. La NAT permet à chaque ordinateur du réseau privé d\u0026rsquo;avoir un accès à Internet, sans avoir besoin de comptes multiples à Internet, ou de multiples adresses IP publiques. La NAT traduira automatiquement l\u0026rsquo;adresse IP du réseau privé pour les ordinateurs et dispositifs sur le réseau vers l\u0026rsquo;unique adresse IP publique lorsque les paquets sortent du pare-feu vers Internet. La NAT assume aussi la traduction inverse pour les paquets de retour. Avec la NAT, vous pouvez rediriger un trafic spécifique, couramment déterminé par un numéro de port ou un ensemble de numéros de port, entrant depuis votre adresse IP publique depuis Internet vers le ou les serveurs spécifiques localisés quelque part dans votre réseau local.\nPF - Packet Filter est le système de pare-feu d\u0026rsquo;OpenBSD pour le filtrage du trafic TCP/IP et faisant de la NAT. PF est aussi capable de normaliser ou conditionner le trafic TCP/IP, aussi bien que gérer le contrôle de la bande passante ou la priorisation de paquets.\nPF est activement maintenu et développé par l\u0026rsquo;entière équipe d\u0026rsquo;OpenBSD.\nParamétrage de PF Avant que nous commencions, je présume que vous avez lu à la fois et le Guide de l\u0026rsquo;Utilisateur de PF et la page du manuel pf.conf, spécifiquement la page du manuel qui est très importante. Même si vous ne comprenez pas toutes les différentes options, assurez-vous de lire la documentation ! Lisez la page du manuel pf pour avoir une complète compréhension en profondeur de ce que PF peut faire.\nDe plus, laissez-moi commencer par vous dire que même si la syntaxe de PF est très lisible, il est très facile de faire des erreurs lors de l\u0026rsquo;écriture des règles de pare-feu. Même des seniors et des administrateurs systèmes expérimentés font des erreurs lors de l\u0026rsquo;écriture des règles de pare-feu.\nÉcrire des règles de pare-feu requiert que vous ayez planifié vos buts avec attention, compris comment implémenter les différentes règles avant d\u0026rsquo;obtenir le résultat attendu, et en même temps de prendre vos précautions afin de vous éviter de vous tromper et de vous déconnecter accidentellement :) Je pense que nous l\u0026rsquo;avons tous fait à un moment ou l\u0026rsquo;autre, que ce soit dans la précipitation, la fatigue ou simplement par erreur. J\u0026rsquo;ai vécu cela de nombreuses fois.\nInfoVeuillez noter que j\u0026rsquo;ai fait de mon mieux pour garder les choses simples autant que possible et que j\u0026rsquo;utilise autant de commentaires afin d\u0026rsquo;expliquer ce que fait chaque règle. En même temps, j\u0026rsquo;ai testé chaque règle et surveillé l\u0026rsquo;impact et fait de mon mieux pour éviter les complications et erreurs. La partie la plus importante est de ne pas faire de suppositions. Testez toujours vos règles de manière approfondie. Si quelque chose ne fonctionne pas, essayez de supprimer autant de règles que possible pour ne garder que le strict minimum. Puis introduisez une règle à la fois jusqu\u0026rsquo;à trouver la règle qui pose problème. Enfin, continuez avec le paramétrage étape par étape.\nLa partie réellement difficile est de se souvenir de comment les paquets arrivent sur une interface, comment ils sont rediriger vers une machine sur une autre interface, et de relier correctement ce \u0026ldquo;voyage\u0026rdquo; aux termes pass in, pass out, block in, block out, from et to. Souvent, ces termes ne fonctionnent pas exactement comme nous avons tendance à le penser.\nÉclaircissements Je tiens à démarrer en clarifiant certains des paramètres communs par défaut et des mots clés dans PF.\nQuand nous parlons du traffic pass in ou pass out, une bonne manière de se rappeler ce dont il s\u0026rsquo;agit est de penser en terme de paquets de données. Nous utilisons pass in pour les paquets de données entrants qui viennent d\u0026rsquo;ordinateurs vers une interface réseau (les ordinateurs étant rattachés à ce périphérique réseau) et pass out pour les paquets de données venant de l\u0026rsquo;interface réseau vers les ordinateurs.\nLe format est soit que nous filtrons les paquets de données sur la destination :\nfrom source IP to destination IP [on] port Soit que nous filtrons les paquets de données sur la source :\nfrom source IP [on] port to destination Veuillez noter que la partie [on] n\u0026rsquo;est pas une partie de la syntaxe.\nquick\nSi un paquet correspond à une règle pass, block ou match avec le critère quick, le paquet est passé sans inspection des règles de filtrage conséquentes. La règle avec le critère quick devient la dernière règle correspondante. keep state\nVous n\u0026rsquo;avez pas besoin de spécifier le critère keep state pour des règles spécifiques pass ou block. La première fois où un paquet correspond à une règle pass ou block, un état d\u0026rsquo;entrée est créé par défaut. Seulement si aucune règle ne correspond au paquet, l\u0026rsquo;action par défaut est de passer le paquet sans créer d\u0026rsquo;état. on interface/any\nCette règle s\u0026rsquo;applique seulement aux paquets qui sont entrants, ou qui passent au-travers de cette interface en particulier ou d\u0026rsquo;un groupe d\u0026rsquo;interface. Le critère on any correspondra à toute interface existante, exceptée celles de bouclage loopback. inet/inet6\nLes critères inet et inet6 signifie que cette règle s\u0026rsquo;applique seulement aux paquets entrants, ou passant au-travers ce domaine particulier de routage, soit IPv4, soit IPv6. Vous pouvez appliquer des règles pour des domaines particuliers de routage sans spécifier l\u0026rsquo;interface réseau. Dans de ce cas, la règle correspondra à tout trafic de toute nature sur toutes les interfaces réseaux. En spécifiant inet, vous adressez explicitement le trafic IPv4 seulement. proto\nSe limiter à un protocole est faisable en utilisant le critère proto. Une règle s\u0026rsquo;applique seulement aux paquets de ce protocole, les autres protocoles ne sont pas affectés. Vous pouvez chercher les protocoles dans le fichier /etc/protocols. Les protocoles communs sont ICMP TCP et UDP. in et out\nC\u0026rsquo;est l\u0026rsquo;une des parties les plus faciles où se tromper : la direction du trafic. Un paquet entre ou sort toujours par le port sur l\u0026rsquo;interface Ethernet. in et out s\u0026rsquo;applique aux paquets entrants et sortants au-travers du port Ethernet physique auquel est attaché le câble Ethernet. Si rien n\u0026rsquo;est spécifié, la règle correspondra aux paquets dans les deux directions. in et out ne sont jamais utilisé pour gérer le trafic venant d\u0026rsquo; une interface réseau vers une autre, ce qui est fait par la NAT, en utilisant les options nat-to et rdr-to. in et out gèrent seulement le trafic entrant et sortant du port Ethernet physique d\u0026rsquo;une même carte. from et to\nLes critères from et to s\u0026rsquo;appliquent seulement aux paquets avec une adresse et des ports source et destination spécifiés. Des deux, du nom d\u0026rsquo;hôte ou de l\u0026rsquo;adresse IP, ou du port, voire les spécifications OS sont optionnels. Quand nous avons affaire avec un routeur ayant de multiples interfaces réseaux, il est facile de penser cela : Je veux passer les paquets entrants depuis l\u0026rsquo;interface externe (l\u0026rsquo;interface réseau attachée à Internet) puis qu\u0026rsquo;ils aillent sur la première interface LAN et de là vers un PC spécifique sur le LAN signifiant que nous suivront le \u0026ldquo;chemin des données\u0026rdquo; dans notre esprit, et alors nous écrivons quelque chose comme cela : pass in on $ext_if from $ext_if to $dmz port 80. Mais cela ne fait pas apparaître \u0026ldquo;par magie\u0026rdquo; le trafic HTTP sur le port 80 au PC ayant l\u0026rsquo;adresse IP spécifique sur le LAN. Il nous faudrait aussi une règle pass out spécifique et déterminer exactement sur quelle machine nous voulons que les données arrivent. À moins que vous n\u0026rsquo;ayez affaire à une exigence très spécifique, vous n\u0026rsquo;aurez jamais besoin d\u0026rsquo;une telle règle dans votre jeu de règles ! Les fonctionnalités uRPF (Unicast Reverse Path Forwardint) de PF protégeront votre réseau interne aussi bien avec un paramétrage de base de NAT, avec l\u0026rsquo;option nat-to et une redirection avec l\u0026rsquo;option rdr-to, PF gérera les paquets venant de l\u0026rsquo;intérieur vers l\u0026rsquo;extérieur et vice-versa. Le paramètre all est équivalent à l\u0026rsquo;écriture from any to any. Sans une direction explicitement déclarée, la règle par défaut est from any to any. Cette règle : pass in on $p_lan proto udp to port dns se traduit par : pass in on em3 inet proto udp from any to any port = 53. Il n\u0026rsquo;est pas non plus nécessaire d\u0026rsquo;utiliser to any port dns, la partie any étant celle par défaut. Vous avez cependant besoin de to port dns. nat-to et rdr-to\nLes options NAT modifient soit l\u0026rsquo;adresse et le port source ou destination des paquets associées à une connexion d\u0026rsquo;états. PF modifie l\u0026rsquo;adresse spécifié et/ou le port dans le paquet et recalcule les sommes de contrôle IP, TCP et UDP nécessaires. Une option nat-to spécifie que les adresses IP ont été changées car le paquet traverse l\u0026rsquo;interface donnée. Cette technique permet à une ou plusieurs adresses IP sur l\u0026rsquo;hôte traduisant (le routeur OpenBSD) de prendre en charge le trafic réseau pour un ensemble plus grand de machines sur le réseau interne, tel qu\u0026rsquo;un LAN. L\u0026rsquo;option nat-to est habituellement appliqué à la sortie, signifiant redirigé depuis le réseau interne vers Internet. nat-to vers une adresse IP locale n\u0026rsquo;est pas pris en charge. L\u0026rsquo;option rdr-to est appliquée généralement à l\u0026rsquo;entrée, signifiant redirigé depuis Internet vers le réseau interne. Liste d\u0026rsquo;éléments et d\u0026rsquo;ensemble d\u0026rsquo;adresses et de ports\nQuand vous avez besoin de spécifier de multiples éléments, e.g. de multiples numéros de ports, vous pouvez les séparer avec une espace ou une virgule. Tel que port { 53 853 } ou port { 53, 853 }. Un ensemble d\u0026rsquo;adresses est spécifié en utilisant l\u0026rsquo;opérateur -. e.g. 192.168.1.2 - 192.168.1.10 signifie toutes les adresses IP de 192.168.1.2 à 192.168.1.10, incluant les deux. Un ensemble de ports a de multiples paramètres ; regardez la page du manuel pf.conf et cherchez le texte \u0026ldquo;Ports and ranges of ports are specified using these operators\u0026rdquo;. AttentionVeuillez noter que chaque fois qu\u0026rsquo;un paquet traité par PF arrive ou part d\u0026rsquo;une interface, les règles de filtrage sont évaluées dans un ordre séquentiel, de la première à la dernière. Concernant block et pass, la dernière règle correspondante décide de quelle action prise. Si aucune règle ne correspond au paquet, l\u0026rsquo;action par défaut est de laisser passer le paquet sans créer d\u0026rsquo;état. Pour match, les règles sont évaluées chaque fois qu\u0026rsquo;elles correspondent. Résolution de nom de domaine ou d\u0026rsquo;hôte Si vous décidez d\u0026rsquo;utiliser des noms d\u0026rsquo;hôtes et/ou des noms de domaines dans votre paramétrage de PF, vous avez besoin de savoir que la résolution de tout nom de domaine ou d\u0026rsquo;hôte est faite au moment du chargement du jeu de règles. Cela signifie que quand l\u0026rsquo;adresse IP d\u0026rsquo;un hôte ou d\u0026rsquo;un nom de domaine change, le jeu de règles doit être rechargé pour que le changement soit pris en compte par le noyau. Il n\u0026rsquo;est pas possible qu\u0026rsquo;à chaque fois qu\u0026rsquo;une règle s\u0026rsquo;applique, pour un nom d\u0026rsquo;hôte ou de domaine listé, que PF fasse une nouvelle requête DNS pour ce nom d\u0026rsquo;hôte ou de domaine particulier. La requête DNS s\u0026rsquo;effectue seulement lors du chargement du jeu de règles.\nCela signifie aussi que vous devez vous assurer que le serveur DNS que vous utiliser soit actif et fonctionnel avant que PF ne démarre, autrement PF échouera à charger le jeu de règles car il ne peut résoudre le nom d' hôte ou de domaine.\nSur OpenBSD, PF démarre avant Unbound ou tout autre service DNS installé, ce qui est la bonne manière de faire d\u0026rsquo;un point de vue de la sécurité.\nJe vous conseille d\u0026rsquo;éviter l\u0026rsquo;utilisation de noms d\u0026rsquo;hôtes ou de noms de domaines lorsque vous utilisez les règles PF et de privilégier les adresses IP, si possible. Il est possible d\u0026rsquo;utiliser les noms d\u0026rsquo;hôtes et noms de domaines, mais l\u0026rsquo;adressage d\u0026rsquo;IP directement est de loin le plus facile et le plus sûr.\nUn jeu de règles C\u0026rsquo;est une bonne idée de tester votre jeu de règles sur une machine de test. Il y a presque toujours plus d\u0026rsquo;une manière de faire pour arriver au même résultat. Selon mon humble avis, la meilleure manière est celle qui vous permet d\u0026rsquo;être le plus clair (i.e. facile à comprendre).\nAttentionNe jamais écrire de nouveaux jeux de règles sur un dispositif à distance où vous êtes actif à moins de savoir ce que vous faites. Être déconnecté d\u0026rsquo;une machine à distance n\u0026rsquo;est jamais agréable. Essayez de trouver comment vous pouvez faire en sorte que vos règles soient aussi claires et simples que possible, en utilisant les valeurs par défaut, quand c\u0026rsquo;est possible. N\u0026rsquo;ayez pas peur de spécifier des critères qui rendent les règles plus claires à comprendre, quand bien même ils sont identiques aux valeurs par défaut. Une valeur par défaut peut être any to any, et vous pouvez laisser cela de côté, mais il serait plus facile de comprendre une règle particulière quand il est écrit any to any textuellement dans le fichier de configuration.\nVous pouvez toujours analyser le jeu de règles et vérifier les erreurs sans qu\u0026rsquo;il soit déployé avec la commande pfctl -nf /etc/pf.conf. Une fois que vous avez chargé le jeu de règles avec la commande pfctl -f /etc/pf.conf, vous pouvez voir comment le jeu de règles a été traduit par PF avec la commande pfctl -s rules, que je vous conseille d\u0026rsquo;utiliser régulièrement.\nJe préfère organiser mon jeu de règles par section et commentaires, je ferais ainsi dans cet exemple.\nUtilisez votre éditeur de texte favori et ouvrez le fichier /etc/pf.conf.\nEn premier, nous paramétrons quelques macros pour mieux se souvenir quelles interfaces réseaux nous utilisons. Utiliser des macros pour les interfaces réseaux rend aussi plus facile le changement du nom du pilote de la carte si vous achetez une nouvelle carte, ou de multiples nouvelles cartes.\n#---------------------------------# # Macros #---------------------------------# ext_if=\u0026#34;em0\u0026#34; # Interface externe connectée au modem du FAI (Internet). g_lan=\u0026#34;em1\u0026#34; # LAN PC Adultes c_lan=\u0026#34;em2\u0026#34; # LAN PC Enfants p_lan=\u0026#34;em3\u0026#34; # LAN Publique. Ensuite, nous paramétrons une table pour les adresses IP non routable. Nous faisons cela, car une mauvaise configuration réseau courante est celle qui permet du trafic avec des adresses non routable vers Internet. Nous utiliserons la table dans notre jeu de règles afin de bloquer tout essai d\u0026rsquo;initier un contact avec les adresses non routable au-travers de l\u0026rsquo;interface externe du routeur.\n#---------------------------------# # Tables #---------------------------------# # Ceci est une table d\u0026#39;adresses IP privées non routables. table \u0026lt;martians\u0026gt; { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 \\ 172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \\ 192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 \\ 203.0.113.0/24 } AttentionVeuillez noter que les macros et les tables sont toujours écrites en début du fichier /etc/pf.conf. Alors, commençons avec une politique de blocage par défaut et activons une série de fonctionnalités de protection.\n#---------------------------------# # Protect and block by default #---------------------------------# set skip on lo0 # Protection vs l\u0026#39;usurpation d\u0026#39;adresses sur toutes les interfaces réseaux. block in from no-route block in quick from urpf-failed # Bloquage des adresses privées non routable. # Utilisation du paramétre \u0026#34;quick\u0026#34; pour que cette règle soit la dernière traversée. block in quick on $ext_if from \u0026lt;martians\u0026gt; to any block return out quick on $ext_if from any to \u0026lt;martians\u0026gt; # Bloquage par défaut de tout trafic sur toutes les interfaces réseaux. block return in on { $g_lan $c_lan $dmz } # Bloquage par défaut de tout trafic sur l\u0026#39;interface reliée à Internet # avec journalisation block drop in log on $ext_if # Autoriser ICMP. match in on $ext_if inet proto icmp icmp-type {echoreq } tag ICMP_IN block drop in on $ext_if proto icmp pass in proto icmp tagged ICMP_IN max-pkt-rate 100/10 # Autoriser le routeur à accéder à Internet, au-travers de son interface réseau dédiée pass out inet from $ext_if Les adresses IP contenues dans la macro martians constituent les adresses référencées dans la RFC1918 qui ne doivent pas être utilisées sur Internet. Le trafic venant ou allant vers de telles adresses doit être abandonné sur l\u0026rsquo;interface externe du routeur.\nDans les précédentes versions de ce guide (avant la version 1.5.0), j\u0026rsquo;avais l\u0026rsquo;habitude d\u0026rsquo;utiliser l\u0026rsquo;instruction scrub dans le paramétrage ci-dessus, toutefois après avoir consulté l\u0026rsquo;équipe OpenBSD avec Henning Brauer (Merci à Henning !) et fais de plus amples recherches, j\u0026rsquo;ai décidé de la supprimer car elle ne traite que des cas très spécifiques (veuillez lire la documentation). Vous aurez besoin de la règle scrub seulement si un hôte sur votre réseau génére des paquets fragmentés avec le drapeau \u0026ldquo;dont-fragment\u0026rdquo;. Le comportement par défaut de PF sans la règle scrub est mieux adapté à un usage général.\nLa FAQ d\u0026rsquo;OpenBSD contient un exemple de paramétrage pour un routeur très basique, avec certaines valeurs spécifiques pour scrub, mais ma recommandation est d\u0026rsquo;utiliser seulement scrub là où vous savez en avoir besoin. Si vous n\u0026rsquo;en avez pas besoin, insérez-la dans la configuration après la règle set skip pour l\u0026rsquo;interface de bouclage locale, tel que :\nset skip on lo0 match in all scrub Et ensuite ajoutez les paramètres à la règle scrub dont vous avez besoin.\nJ\u0026rsquo;utilisais aussi la règle antispoof suivante dans la section de protection contre l\u0026rsquo;usurpation :\nantispoof quick for { $g_lan $c_lan $dmz } J\u0026rsquo;ai depuis supprimé la règle antispoof puisque la fonctionnalité uRPF (Unicast Reverse Path Forwarding) que PF fournit a la même fonctionnalité, et en tant que tel nous n\u0026rsquo;en avons plus besoin, à la place nous utilisons juste la règle block in quick from urpf-failed.\nL\u0026rsquo;information suivante à-propos du critère antispoof est gardée à des fins d\u0026rsquo;éducation.\nL\u0026rsquo;usurpation est lorsque quelqu\u0026rsquo;un fabrique une adresse IP. Le critère antispoof s\u0026rsquo;étend à un ensemble de règles de filtrage qui empêcheront tout trafic avec une adresse IP source du réseau (directement connecté à l\u0026rsquo;interface spécifiée) entrant sur le système par une autre interface. Cela est parfois appelé \u0026ldquo;bleeding over\u0026rdquo; ou \u0026ldquo;bleeding through\u0026rdquo;.\nLa directive antispoof est traduite par PF par ce qui suit :\nblock drop in quick on ! em1 inet from 192.168.1.0/24 to any block drop in quick inet from 192.168.1.1 to any block drop in quick on ! em2 inet from 192.168.2.0/24 to any block drop in quick inet from 192.168.2.1 to any block drop in quick on ! em3 inet from 192.168.3.0/24 to any block drop in quick inet from 192.168.3.1 to any Si nous prenons, e.g., la règle block drop in quick on ! em1 inet from 192.168.1.0/24 to any de l\u0026rsquo;interface réseau em1 qui signifie alors : bloque tout trafic venant du réseau ayant une adresse IP comprise entre 192.168.1.1 et 192.168.1.255, qui n\u0026rsquo;est pas originaire depuis l\u0026rsquo;interface em1 elle-même, et qui va ailleurs. Puisque l\u0026rsquo;interface em1 est l\u0026rsquo;interface réseau en charge de toutes les adresses IP dans cet ensemble spécifique, alors aucun trafic avec de telles adresses IP ne pourra être originaire de toute autre interface réseau.\nAttentionL\u0026rsquo;utilisation d\u0026rsquo;antispoof doit être restreinte aux interfaces qui ont une adresse IP assignée, ce qui signifie que si vous avez des interfaces réseaux inutilisées, ou des ports d\u0026rsquo;une interface réseau, assurez-vous d\u0026rsquo;assigner une adresse IP à chacune ou de ne pas les inclure dans l\u0026rsquo;option antispoof. Ainsi que je l\u0026rsquo;ai mentionnée, j\u0026rsquo;ai supprimé la règle antispoof et nous utiliserons à la place la vérification stricte d\u0026rsquo;uRPF. Lorsqu\u0026rsquo;un paquet passe dans la vérification d\u0026rsquo;uRPF, l\u0026rsquo;adresse IP source du paquet est recherchée dans la table de routage. Si l\u0026rsquo;interface de sortie est trouvée dans la table de routage et que l\u0026rsquo;entrée est la même que l\u0026rsquo;interface du paquet qui vient juste d\u0026rsquo;entrer, alors la vérification d\u0026rsquo;uRPF autorise. Autrement, il est possible que le paquet ait son adresse IP source usurpée ainsi il sera bloqué.\nNous allons permettre ICMP dans notre paramétrage, quand bien même des administrateurs réseaux bloquent complètement ICMP. La plupart des personnes bloquent complètement ICMP à cause d\u0026rsquo;actions injustifiées telles que les attaques par découverte de réseaux, les canaux de communication, le ping sweep, le ping flood, le tunnel d\u0026rsquo;ICMP, et la redirection d\u0026rsquo;ICMP. Toutefois, ICMP est bien plus que répondre à des ping. Si nous bloquons complètement ICMP, les diagnostics, la fiabilité, et la performance réseau peuvent être défectueuses puisque des mécanismes importants sont désactivés lorsque le protocole ICMP est restreint.\nVoici certaines raisons pour lesquelles ICMP ne devrait pas être bloqué :\nLa découverte Path MTU (PMTUD) est utilisée pour déterminer la taille maximale de l\u0026rsquo;unité de transmission pour les dispositifs réseau qui relient la source et la destination afin d\u0026rsquo;éviter la fragmentation IP. TCP dépend des paquets ICMP de type 3 code 4 pour \u0026ldquo;Path MTU Discovery\u0026rdquo;. ICMP type 3 code 4 et la taille maximale des paquets sont retournés quand un paquet excède la taille MTU d\u0026rsquo;un dispositif réseau connecté. Quand les messages ICMP sont bloqués, le système de destination requête continuellement des paquets non délivrés et le système source continue à les renvoyer indéfiniment mais en vain. Ce comportement peut avoir pour résultat un trou noir ICMP (des connexions IP congestionnées et des transmissions cassées). Time to live (TTL) définit le temps de vie d\u0026rsquo;un paquet de données. Un réseau où ICMP est bloqué ne recevra pas le message de type 11, temps écoulé, code 0, temps écoulé dans le transit des messages d\u0026rsquo;erreur. Cela signifie que l\u0026rsquo;hôte source ne sera pas notifié pour augmenter le temps de vie des données afin d\u0026rsquo;atteindre l\u0026rsquo;hôte de destination, si le datagram échoue à atteindre l\u0026rsquo;hôte de destination. Une mauvaise performance du fait de bloquer la redirection ICMP. La redirection ICMP est utilisée par un routeur pour informer un hôte d\u0026rsquo;un chemin direct entre l\u0026rsquo;hôte source et celui de destination. Cela réduit le nombre de saut que les données ont à faire pour atteindre la destination. Avec ICMP bloqué, l\u0026rsquo;hôte ne fera jamais attention à la route la plus optimale vers la destination. Dans le paramétrage ci-dessus, nous permettons ICMP, mais nous mettons une \u0026ldquo;limite de taux\u0026rdquo; du nombre de requêtes ping auxquelles le routeur répondra. Avec le critère max-pkt-rate 100/10, le routeur arrêtera de répondre aux ping si nous en avons plus de 100 en 10 secondes.\nInfoSi vous souhaitez toujours bloquer complètement ICMP pour une raison quelconque, il suffit de supprimer les 3 règles après le commentaire \u0026ldquo;Allow ICMP\u0026rdquo;. Maintenant paramétrons le segment LAN pour les adultes de la maison.\n#---------------------------------# # Paramétrage du réseau LAN adulte #---------------------------------# # Autoriser tout ordinateur ou dispositif sur le LAN adulte à envoyer des # paquets de données entrants dans l\u0026#39;interface réseau. Cela signifie que # tout ordinateur attaché à cette interface réseau peut envoyer des données # partout, i.e. sur Internet ou tout ordinateur attaché au routeur. pass in on $g_lan # Toujours bloquer les requêtes DNS non adressées à notre serveur DNS. block return in quick on $g_lan proto { udp tcp } to ! $g_lan port { 53 853 } # J\u0026#39;ai une imprimante réseau et je ne veux pas qu\u0026#39;elle \u0026#34;téléphone maison\u0026#34;. # L\u0026#39;imprimange réseau à l\u0026#39;adresse IP 192.168.1.8. block in quick on $g_lan from 192.168.1.8 # Autoriser les paquets de données venant du routeur à sortir par l\u0026#39;interface # réseau vers les ordinateurs et dispositifs attachés à l\u0026#39;interface du # réseau Adultes. # Sans cela nous ne pouvons même pas pingués les ordinateurs attachés à # l\u0026#39;interface du réseau Adultes depuis le routeur lui-même. pass out on $g_lan inet keep state Dans cet exemple, j\u0026rsquo;ai une imprimante réseau attachée au réseau des adultes et je ne veux pas qu\u0026rsquo;elle accéde à Internet ou ailleurs (juste en cas où il y aurait une sorte de micrologiciel espion). Nous le faisons en disant : bloque toutes les données entrantes sur em1 venant de l\u0026rsquo;adresse IP 192.168.1.8 allant vers toute adresse IP.\nDe plus, nous nous assurons que toutes les requêtes DNS sur les ports 53 (DNS régulier) et 853 (DNS sur TLS) soient toujours bloquées si elles ne viennent pas de notre serveur DNS.\nInfoAvant, j\u0026rsquo;utilisais la redirection du trafic sur le port 53 non adressé à notre serveur DNS vers notre serveur DNS. Je faisais cela parce que nous bloquions toute requête DNS sur le port 53, soit avec return ou drop, la requête prenant un délai sur le client, ce qui avait pour conséquence que beaucoup de clients obtenaient un délai sur la réponse. Depuis j\u0026rsquo;ai changé cela en block parce que je crois que c\u0026rsquo;est une meilleure approche. Tous les clients DNS ont besoin de réaliser que la communication sur le port 53 est bloqué, à moins qu\u0026rsquo;elle ne soit adressée à notre serveur DNS. C\u0026rsquo;est aussi important quand nous avons des problèmes sur notre réseau. Si nous avons une réponse redirigée vers notre serveur DNS, nous pourrions ne pas être averti que nous avons été redirigé. InfoDNS utilise en premier UDP (User Datagram Protocol) sur le port 53 pour servir les requêtes, mais quand la longueur de la réponse excède 512 bits et que le client et le serveur prennent en charge EDNS, des paquets UDP plus grands sont utilisés. Toutefois, la requête est envoyée en utilisant TCP (Transmission Control Protocol). Certaines implémentations de résolveurs DNS utilisent TCP pour toutes les requêtes. Ainsi nous avons besoin des deux protocoles UDP et TCP dans la règle pour le port 53. Le réseau LAN pour les enfants est très similaire.\n#---------------------------------# # Paramétrage LAN enfants #---------------------------------# # Autoriser tout PC du LAN Enfant à envoyer des données au-travers du port # de l\u0026#39;interface réseau pass in on $c_lan # Toujours bloquer les requêtes DNS qui ne sont pas adressées à notre # serveur DNS. block return in quick on $c_lan proto { udp tcp} to ! $c_lan port { 53 853 } # Autorise les paquets de données à passer venant du routeur au-travers # l\u0026#39;interface réseau vers les ordinateurs ou dispositifs attachés au # LAN Enfants. # Sans cela, nous ne pourrions même pas pingués les ordinateurs depuis # le routeur lui-même pass out on $c_lan inet keep state Actuellement les deux réseaux Adultes et Enfants ont le même accès à Internet. Un paramétrage plus restrictif est mentionné dans le chapitre \u0026ldquo;Liste Blanche pour enfants\u0026rdquo;.\nOccupons nous alors de la DMZ, i.e. de l\u0026rsquo;interface réseau qui répond publiquement au serveur web. Puisque nous avons un serveur web publique, nous allons définir un certain nombre de restrictions. Si le serveur web est compromis, l\u0026rsquo;intrus aura du mal à trouver ce qui est localisé dans notre réseau interne.\nNous bloquons tous les accès excepté le DHCP, afin que le serveur web ait une adresse IP depuis notre routeur, et alors d\u0026rsquo;ouvrir seulement manuellement certaines choses pour quand nous avons besoin de mettre à jour la machine ou quoi que ce soit d\u0026rsquo;autres. J\u0026rsquo;ai commenté les options dont nous avons besoins, quand nous avons besoin de telles choses, laissant les parties restreintes actives. Quand vous aurez besoin de mettre à jour le serveur, ouvrez l\u0026rsquo;accès DNS et l\u0026rsquo;accès général à Internet.\nInfoPlutôt que changer manuellement le jeu de règles à chaque fois où nous avons besoin de mettre à jour le serveur web, nous pouvons aussi utiliser une ancre, mais par esprit de simplification, nous ne ferons pas cela ici. #---------------------------------# # Paramétrage DMZ #---------------------------------# # Autorise tout ordinateur ou dispositif attaché à l\u0026#39;interface réseau DMZ # à obtenir une adresse IP venant du DHCP depuis le routeur pass in on $dmz inet proto udp from any port 67 # Autorise tout ordinateur ou dispositif attaché à l\u0026#39;interface réseau DMZ # à faire des requêtes DNS. (décommentez si besoin) #pass in on $dmz inet proto udp from any port 53 # Toujours bloquer les requêtes DNS non adressées à notre serveur DNS. block return in quick on $dmz proto { udp tcp} to ! $dmz port { 53 853 } # Pour autoriser tout ordinateur attaché à l\u0026#39;interface réseau DMZ à accéder # à Internet, décommentez la ligne ci-dessous. # (Cela est pertinent pour les màj) #pass in on $dmz inet # No matter what, we do not want the DMZ segment to reach any of the other # network segments so we explicitly use a block last. # # We have several options. If we use this: # # block drop in on $dmz to 192.168/16 # # Then we block for all subnets, but this also means that the computers # attached to the DMZ NIC cannot do DNS queries when they need to be upgraded. # # In my opinion it is much better to be explicit and block the specific # segments we want blocked. # # Bloque les ordinateurs depuis l\u0026#39;interface réseau DMZ essayant d\u0026#39;atteindre # les autres sur les deux autres segments réseaux block drop in on $dmz to { $g_lan:network $c_lan:network } # En dernier, autorisons les paquets à sortir s\u0026#39;ils viennent de l\u0026#39;interface # réseau DMZ vers les ordinateurs attachés, autrement pas de \u0026#34;discussion\u0026#34;. # Sans cela nous ne pouvons même pas pinguer les ordinateurs attachés à # l\u0026#39;interface réseau DMZ depuis le routeur lui-même pass out on $dmz inet keep state Maintenant, occupons nous de la NAT. C\u0026rsquo;est là où le routeur route les paquets venant d\u0026rsquo;un segment du réseau vers un autre, dans le cas spécifique venant de notre réseau interne vers Internet, et alors toute réponse venant d\u0026rsquo;Internet, à destination de l\u0026rsquo;initiateur de la transmission. Je préfère le paramètre :network qui traduit le(s) réseau(x) attaché(s) à l\u0026rsquo;interface, et je préfère être spécifique avec une règle pour chaque segment concerné.\n#---------------------------------# # NAT #---------------------------------# pass out on $ext_if inet from $g_lan:network to any nat-to ($ext_if) pass out on $ext_if inet from $c_lan:network to any nat-to ($ext_if) pass out on $ext_if inet from $dmz:network to any nat-to ($ext_if) PF gardera une trace de tout le trafic, et quand, e.g. un navigateur web sur le LAN Adultes demandera une page web de certains sites sur Internet, la réponse venant du serveur web depuis Internet sera routé au-travers de l\u0026rsquo;interface externe vers l\u0026rsquo;interface interne du LAN Adultes, et alors directement vers le PC qui a initié la requête.\nEnfin, occupons-nous de la partie relative à la redirection dans notre jeu de règles. C\u0026rsquo;est là où nous permettons le trafic venant d\u0026rsquo;Internet vers notre serveur web publique sur l\u0026rsquo;interface réseau DMZ. Vous devriez, bien sûr, laisser cette partie si vous n\u0026rsquo;avez pas de serveurs publiques qui nécessitent de redirection. Dans cet exemple, j\u0026rsquo;ai seulement permis le trafic IPv4.\n#---------------------------------# # Redirects #---------------------------------# # Our web server - let the Internet access it. pass in on $ext_if inet proto tcp to $ext_if port { 80 443 } rdr-to 192.168.3.2 AttentionLa redirection arrive toujours en dernier dans le jeu de règles ! C\u0026rsquo;est tout concernant le paramétrage basique de nos règles filtrantes.\nUne liste blanche pour les enfants Si vous voulez bloquer tout Internet pour les enfants, exceptés peut être quelques sites web ou certains serveurs de jeux, vous avez besoin de connaître quelles adresses IP ces services ont et de créer une liste blanche utilisant ces adresses IP.\nSi c\u0026rsquo;est un simple site web avec une adresse IP unique, c\u0026rsquo;est très facile et vous pouvez le faire avec cette règle placée en dernier dans le bloc pour enfants (vous devez remplacer la partie x.x.x.x avec l\u0026rsquo;adresse IP pertinente) :\n#---------------------------------# # Childrens LAN Setup #---------------------------------# # Allow any computer or device attached to the childrens NIC to get an IP # address from DHCP on the router. pass in on $c_lan inet proto udp from any port 67 # Allow any computer or device attached to the childrens NIC to make DNS # queries. pass in on $c_lan inet proto udp from any port 53 # Always block DNS queries not addressed to our DNS server. block return in quick on $c_lan proto { udp tcp} to ! $c_lan port { 53 853 } # Then allow any computer or device attached on the childrens LAN to reach # the IP address x.x.x.x only. pass in on $c_lan to x.x.x.x Si le site web a de multiples adresses IP, nous devons comprendre lesquelles. Parfois une requête de nom de domaine peut révéler toutes les adresses IP concernées en une fois. D\u0026rsquo;autres fois, nous avons besoin de répéter de multiples fois les requêtes à différentes intervalles de la journée avant d\u0026rsquo;obtenir l\u0026rsquo;ensemble complet des adresses IP. Vous pouvez faire cela en mettant en place un script automatisé.\nParfois, nous aurons besoin de contacter l\u0026rsquo;entreprise en question et de demander si nous pouvons avec l\u0026rsquo;ensemble des adresses IP pour notre liste blanche (certaines compagnies publient publiquement l\u0026rsquo;information, d\u0026rsquo;autres refusent de livrer l\u0026rsquo;information par peur d\u0026rsquo;un usage malicieux). Une fois que vous avez déterminé quel est l\u0026rsquo;ensemble d\u0026rsquo;adresses IP, vous pouvez faire une table PF pour l\u0026rsquo;utiliser.\nDans cet exemple, nous ajoutons une nouvelle table dans la section table des règles et nous changeons les paramètres des règles pour enfants.\n#---------------------------------# # Tables #---------------------------------# … # Whitelist for the children. table \u0026lt;whitelist\u0026gt; { x.x.x.x y.y.y.y z.z.z.z } Et ensuite dans la section pour enfants, changez :\npass in on $c_lan to x.x.x.x en :\npass in on $c_lan to \u0026lt;whitelist\u0026gt; Il n\u0026rsquo;est pas toujours possible d\u0026rsquo;avoir toutes les adresses IP dans une liste blanche en une fois, mais en surveillant le réseau, en utilisant e.g. tcpdump, quand le jeu essaye d’accéder au serveur, vous pouvez établir une liste, bit après bit. J\u0026rsquo;ai fait cela avec les serveurs de connexion Mojan et Minecraft et de multiples autres serveurs de jeux.\nUtilisation d\u0026rsquo;une table persistante Une autre approche pour collecter les IP est d\u0026rsquo;utiliser une table persistante en combinaison avec /etc/rc.local et les requêtes de noms de domaine. /etc/rc.local est seulement exécuté après que PF soit démarré ainsi les problèmes de résolution de DNS n\u0026rsquo;entraîneront pas des problèmes pour PF.\nSi vous souhaitez utiliser la solution des tables persistantes, vous pouvez le faire en ajoutant une table persistante dans la section des tables dans /etc/pf.conf :\ntable \u0026lt;whitelist\u0026gt; persist Dans la section pour enfants, nous avons besoin de passer les données qui viennent de la liste blanche ci-dessus :\npass in on $c_lan to \u0026lt;whitelist\u0026gt; Alors, dans /etc/rc.local, nous pouvons ajouter la commande suivante :\npfctl -t whitelist -T add example.com Où example.com est le domaine que PF doit chercher.\nQuand vos enfants ne peuvent pas avoir accès parce que l\u0026rsquo;adresse IP valide pourrait avoir changé, vous pouvez vous connecter au pare-feu et alors mettre à jour manuellement la table avec plus d\u0026rsquo;adresses IP en exécutant la commande :\npfctl -t whitelist -T add examples.com Si vous voulez voir ce qui a été ajouté à cette liste, vous pouvez faire ceci :\n# pfctl -t whitelist -T show 74.6.143.25 74.6.143.26 74.6.231.20 74.6.231.21 98.137.11.163 98.137.11.164 216.58.208.110 2001:4998:24:120d::1:0 2001:4998:24:120d::1:1 2001:4998:44:3507::8000 2001:4998:44:3507::8001 2001:4998:124:1507::f000 2001:4998:124:1507::f001 2a00:1450:400e:80e::200e Éventuellement, vous pouvez ajouter toutes les adresses IP que vous collectez (avant qu\u0026rsquo;elles ne soient purgées) dans un fichier physique afin que l\u0026rsquo;option persist prenne en entrée ce fichier, tel que :\ntable \u0026lt;whitelist\u0026gt; persist file \u0026#34;/etc/pf-whitelist.txt\u0026#34; InfoLe fichier ne devra pas avoir d\u0026rsquo;adresses IP ajoutées en utilisant l\u0026rsquo;option add à pfctl. Une table persistante réside soit en mémoire, soit dans un fichier, mais l\u0026rsquo;option add ne peut écrire sur le disque, seulement dans la mémoire. Une table persistante depuis un fichier est ce dont vous avez besoin afin de l\u0026rsquo;éditer manuellement depuis un éditeur de texte. Chargement des règles Une fois que vous avez fini de paramétrer votre jeu de règles, vous pouvez le tester avec :\n# pfctl -nf /etc/pf.conf Si tout est bon, chargez votre jeu de règles en supprimant l\u0026rsquo;option -n :\n# pfctl -f /etc/pf.conf Regardez le résultat traduit avec :\n# pfctl -s rules Journalisation et Monitoring Ceci est un exemple de sortie venant du journal de PF des essais bloqués accédant à l\u0026rsquo;interface externe, selon mon paramétrage. J\u0026rsquo;ai nettoyé la sortie et supprimé quelques données spécifiques, et bien sûr 0.0.0.0 n\u0026rsquo;est pas mon adresse IP publique, mais vous savez déjà cela ;)\n# tcpdump -n -e -ttt -r /var/log/pflog 23:11:12 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3422: S 1501043655:1501043655(0) win 1024 23:11:12 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3481: S 311078394:311078394(0) win 1024 23:11:31 rule 14/(match) block in on em0: 176.214.44.229.25197 \u0026gt; 0.0.0.0.23: S 2084440900:2084440900(0) win 33620 23:11:33 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3431: S 2774981044:2774981044(0) win 1024 23:11:43 rule 14/(match) block in on em0: 81.68.114.52.17191 \u0026gt; 0.0.0.0.23: S 1346864438:1346864438(0) win 26375 23:12:08 rule 14/(match) block in on em0: 193.27.229.26.53865 \u0026gt; 0.0.0.0.443: S 1057596009:1057596009(0) win 1024 23:12:31 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4186: S 1233742605:1233742605(0) win 1024 23:12:44 rule 14/(match) block in on em0: 74.120.14.70.65509 \u0026gt; 0.0.0.0.9125: S 1836577847:1836577847(0) win 1024 \u0026lt;mss 1460\u0026gt; [tos 0x20] 23:12:44 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4128: S 2112968453:2112968453(0) win 1024 23:13:15 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3669: S 3627248539:3627248539(0) win 1024 23:13:19 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3654: S 3889665614:3889665614(0) win 1024 23:13:29 rule 14/(match) block in on em0: 45.129.33.129.42239 \u0026gt; 0.0.0.0.4997: S 2249816896:2249816896(0) win 1024 23:13:37 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3612: S 3797528151:3797528151(0) win 1024 23:14:03 rule 14/(match) block in on em0: 190.207.89.17.64372 \u0026gt; 0.0.0.0.445: S 1097568353:1097568353(0) win 8192 \u0026lt;mss 1460,nop,wscale 2,nop,nop,sackOK\u0026gt; (DF) 23:14:15 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4219: S 2834775769:2834775769(0) win 1024 23:14:39 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3702: S 1855726637:1855726637(0) win 1024 23:14:39 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4210: S 3052103070:3052103070(0) win 1024 Comme vous pouvez le voir, il est un peu occupé, d\u0026rsquo;autant que je n\u0026rsquo;ai rien en cours d\u0026rsquo;exécution qui soit publiquement sur Internet dans ce paramétrage.\nVous pouvez aussi monitorer PF en temps réel avec :\n# tcpdump -n -e -ttt -i pflog0 DNS DNS (Domain Name Service) est utilisé pour traduire un nom de domaine dans une adresse IP ou vice-versa. Par exemple, quand vous écrivez wikipedia.org dans la barre d\u0026rsquo;adresse de votre navigateur web, un serveur DNS faisant autorité traduit le nom de domaine \u0026ldquo;wikipedia.org\u0026rdquo; en une adresse IPv4, telle que 91.198.174.192, et/ou une adresse IPv6, telle que 2620:0:862:ed1a::1.\nDNS est aussi utilisé, en plus d\u0026rsquo;autres choses, pour stocker des informations sur les serveurs de messagerie appartenant à un nom de domaine particulier, le cas échéant.\nSi vous utilisez un système d\u0026rsquo;exploitation de type UNIX, vous pouvez démarrer un terminal et essayer de faire une recherche manuelle de nom de domaine avec host :\n$ host wikipedia.org wikipedia.org has address 91.198.174.192 wikipedia.org has IPv6 address 2620:0:862:ed1a::1 wikipedia.org mail is handled by 10 mx1001.wikimedia.org. wikipedia.org mail is handled by 50 mx2001.wikimedia.org. InfoSi host n\u0026rsquo;est pas installé, ce qui dépend de votre plateforme, vous aurez besoin d\u0026rsquo;installer bind ou dnsutils. Vous pouvez aussi utiliser quelque chose comme dig, qui vient de bind, ou drill venant de ldns. La liste qui suit décrit certains des termes associés à DNS :\nForward DNS\nCorrespondance des noms d\u0026rsquo;hôtes ou de domaines avec les adresses IP. Reverse DNS\nCorrespondance des adresses IP avec les noms d\u0026rsquo;hôtes ou de domaines. Resolver\nUn système par lequel une machine requiert un serveur de nom pour la zone d\u0026rsquo;information, i.e. un autre nom pour \u0026ldquo;Serveur DNS\u0026rdquo;. Root zone\nLe début de la hiérarchie des zones Internet. Toutes les zones sont sous la zone racine, similaire à ce que sont tous les fichiers dans un système de fichier sous la hiérarchie racine /. Ceci est un exemple de zone :\n. (un point) est la manière dont la zone racine est habituellement référée dans la documentation. org. est le TLD (Top-Level Domain) sous la zone root. wikipedia.org. est la zone sous le TLD org.. 1.168.192.in-addr.arpa est la zone référençant toutes les adresses IP qui sont dans l\u0026rsquo;espace d\u0026rsquo;adresse IP 192.168.1.*. Quand un ordinateur sur Internet a besoin de résoudre un nom de domaine, le résolveur découpe le nom dans ses labels de la droite vers la gauche. Le premier composant, le TLD, est demandé en utilisant un serveur racine pour obtenir le serveur faisant autorité responsable. Les requêtes pour chaque label retournent des serveurs de noms plus spécifiques jusqu\u0026rsquo;à ce qu\u0026rsquo;un serveur de noms renvoie la réponse à la requête originale.\nMême si un serveur DNS local peut implémenter ses propres serveurs de noms racines privés, le terme \u0026ldquo;serveur racine de noms\u0026rdquo; est utilisé pour décrire les 13 serveur racines de noms bien connus qui mettent en œuvre le domaine de l\u0026rsquo;espace racine des noms pour la mise en œuvre mondiale officielle du système de noms de domaine d\u0026rsquo;Internet. Les résolveurs utilisent un petit fichier nommé root.hints de 3 Ko, publié par Internic pour amorcer cette liste initiale d\u0026rsquo;adresses des serveurs racines. Pour beaucoup de logiciels, incluant Unbound, cette liste est intégrée à l\u0026rsquo;intérieur du logiciel.\nSur la base de données de la zone racine, vous pouvez chercher les détails de délégation des domaines TLD, incluant des TLD tels que .com, .org, et des TLD ayant des codes de pays, tels que .uk, .de.\nInfoPuisque vous pouvez chercher les détails de délégation des domaines TLD, vous pourriez vous attendre à ce qu\u0026rsquo;il soit possible d\u0026rsquo;aller en profondeur et de chercher actuellement pour chaque domaine un serveur de domaine en particulier qui a enregistré dans sa base de données. Puisque nous avons, pour l\u0026rsquo;exemple, pris une liste des serveurs de noms TLD responsables pour le TLD .dk, nous pourrions nous attendre à ce qu\u0026rsquo;il soit possible d\u0026rsquo;interroger l\u0026rsquo;un de ces serveurs de noms listés pour l\u0026rsquo;ensemble de la base de données des serveurs faisant autorité, puis d\u0026rsquo;interroger l\u0026rsquo;un d\u0026rsquo;entre eux pour tous les domaines enregistrés dans sa base de données. Mais ce n\u0026rsquo;est pas comme cela que fonctionne DNS. Il y a seulement deux manières pour obtenir la cartographie complète des serveurs DNS. Soit vous avez accès aux fichiers de la zone concernée, soit vous avez besoin de construire physiquement une base de donnée en examinant le trafic DNS au-travers un serveur DNS récursif et alors de reconstituer les données de la zone à partir des données recueillies, jusqu\u0026rsquo;à ce que vous obteniez tout, ce qui est très peu probable. Il y a deux types de configuration de serveur DNS :\nAutorité\n[Les serveurs de noms faisant autorité] publie les adresses pour les domaines sous leur contrôle. Ces serveurs sont listés au début de la chaîne d\u0026rsquo;autorité pour leurs domaines respectifs, et sont capables de fournir une réponse définitive. Les serveurs de noms faisant autorité peuvent être les serveurs de noms primaires, connus aussi en tant que serveurs maîtres, i.e. ils contiennent le jeu original des données, ou être des serveurs de noms secondaires ou esclaves, contenant des copies des données habituellement obtenues par synchronisation directe avec le serveur primaire. Un serveur de nom faisant autorité est un serveur de nom qui donne seulement des réponses aux requêtes DNS venant de données qui ont été configurées par une source originale, par exemple, l\u0026rsquo;administrateur de domaine. Chaque zone DNS doit être assignée à un ensemble de serveurs de noms faisant autorité. Cet ensemble de serveurs est enregistré dans la zone de domaine parente des enregistrements du serveur de noms (NS). Un serveur faisant autorité indique son statut de fournisseur de réponses définitives, considérées comme faisant autorité, en posant un drapeau de protocole, appelé bit \u0026ldquo;Authoritative Answer\u0026rdquo; (AA), dans ses réponses. Vous pouvez utiliser un outil réseau, tel que dig ou drill pour interroger un nom de domaine ; l\u0026rsquo;outil répondra avec un drapeau faisant autorité qui révèle si le serveur DNS vous avez interrogé est celui qui fait autorité. Récursif\nLes serveurs récursifs parfois appelés \u0026ldquo;DNS caches\u0026rdquo; ou \u0026ldquo;serveurs de noms de cache seulement\u0026rdquo; fournissent la résolution de noms DNS pour les applications, en relayant les requêtes de l\u0026rsquo;application cliente vers la chaîne des serveurs de noms faisant autorité afin de résoudre pleinement un nom de domaine. (Typiquement) ils mettent en cache le résultat pour répondre a de futures requêtes potentielles dans une certaine période de temps avant expiration. La plupart des utilisateurs d\u0026rsquo;Internet accèdent à un serveur DNS récursif publique fournit par leur FAI ou un fournisseur de service DNS publique. En théorie, les serveurs de noms faisant autorité sont suffisant pour opérer sur Internet. Toutefois, avec seulement les serveurs de noms faisant autorité opérant, chaque requête DNS doit démarrer avec des requêtes successives à la zone racine du système de nom de domaine et chaque utilisateur système devrait avoir à implémenter un logiciel résolveur capable d\u0026rsquo;opérations de résolution. Pour améliorer l\u0026rsquo;efficacité, réduire le trafic DNS sur Internet, et augmenter la performance des applications utilisateurs, le système de noms de domaine prend en charge les résolveurs récursifs. Une requête d\u0026rsquo;un DNS récursif est celle pour laquelle un serveur DNS répond complètement à la requête en interrogeant d\u0026rsquo;autres serveurs de noms, selon ses besoins. Un serveur de noms peut être à la fois faisant autorité et récursif, mais il n\u0026rsquo;est pas recommandé de combiner la configuration des deux types. Pour être en mesure d\u0026rsquo;effectuer leur travail, les serveurs faisant autorité doivent être disponibles à tous les clients, tout le temps. D\u0026rsquo;un autre côté, étant donné que la requête récursive prend plus de temps qu\u0026rsquo;une réponse faisant autorité, les serveurs récursifs devraient être restreints à un nombre de clients seulement, car ils sont enclins à des attaques par déni de service distribué (DDoS).\nInfoSi besoin, je vous recommande de lire \u0026ldquo;How DNS Works\u0026rdquo; du chapitre 6 du Guide de l\u0026rsquo;Administrateur Réseau Linux. Je recommande aussi de lire l\u0026rsquo;article DNS sur Wikipédia. Je vous présente Unbound Unbound est un résolveur DNS Open Source récursif, cache et validant avec les fonctionnalités suivantes :\nCache avec possibilité de récupèrer des éléments populaires avant qu\u0026rsquo;ils expirent. Serveur et Redirection DoT (DNS over TLS), avec validation de domaine DoH (DNS over HTTPS) Minimisation du nom de la requête Utilisation aggressive du cache validé par DNSSEC. Zones faisant autorité, pour une copie locale de la zone racine. DNS64 DNSCrypt Validation DNSSEC Client de sous-réseau EDNS Unbound est conçu pour être rapide et sécurisé et incorpore des fonctionnalités modernes basées sur des normes ouvertes. Fin 2019, Unbound a été rigoureusement audité.\nAstuceUne des principales raisons d\u0026rsquo;utiliser Unbound plutôt que de nombreux autres résolveurs cache seulement, tel que dnsmasq par exemple, est que si vous n\u0026rsquo;utilisez pas l\u0026rsquo;option forward dans la configuration d\u0026rsquo;Unbound, Unbound fera des requêtes directement aux serveurs racines en utilisant leurs adresses IP enregistrées et listées dans le fichier Root Hints. Ceci vous libèrera des serveurs DNS de votre FAI, et de tout serveur DNS publique, tel que Google ou Cloudflare, et tout enregistrement, vente et manipulation de données, tels qu\u0026rsquo;ils le font sera évité. Un simple serveur cache tel que dnsmasq devra toujours rediriger ses requêtes vers un autre serveur, là où Unbound interrogera les serveurs racines directement et suivra la chaîne des domaines jusqu\u0026rsquo;à ce qu\u0026rsquo;il obtienne l\u0026rsquo;enregistrement pertinent depuis le serveur DNS faisant autorité pour le domaine concerné. Cela signifie que le serveur DNS qui sait spécifiquement ce que vous recherchez soit aussi celui qui fait autorité pour répondre à la question. AttentionSi votre FAI fait du détournement de trafic DNS, Unbound ne vous aidera en aucune manière. Lisez la section Détournement de DNS concernant l\u0026rsquo;information afin que vous puissiez déterminer sir le trafic de votre DNS est détourné. Dans notre paramétrage avec Unbound, une requête pour un domaine tel que \u0026ldquo;wikipedia.org\u0026rdquo; ressemblera à ceci :\nVotre navigateur envoie une requête au système d\u0026rsquo;exploitation, avec la question \u0026ldquo;Quelle est l\u0026rsquo;adresse IP de wikipedia.org ?\u0026rdquo; Le système d\u0026rsquo;exploitation, plus spécifiquement les routines du résolveur dans la bibliothèque C, qui fournit l\u0026rsquo;accès au Système de Noms de Domaines sur Internet, redirigera la requête DNS vers le(s) serveur(s) de noms de domaine listé dans /etc/resolv.conf (sur des systèmes d\u0026rsquo;exploitation de type UNIX) Unbound reçoit la requête et en premier cherche \u0026ldquo;wikipedia.org\u0026rdquo; dans son cache et s\u0026rsquo;il ne le trouve pas, interroge un des serveurs racines listés dans son fichier Root Hints pour le domaine TLD \u0026ldquo;.org\u0026rdquo;. Le serveur racine répond par une référence aux serveurs concernés du domaine TLD \u0026ldquo;.org\u0026rdquo;. Unbound envoie alors une requête à l\u0026rsquo;un des serveurs concernés demandant quels sont les serveurs DNS faisant autorité pour \u0026ldquo;wikipedia.org\u0026rdquo;. Le serveur répond avec une référence aux serveurs de noms faisant autorité enregistrés pour \u0026ldquo;wikipedia.org\u0026rdquo;. Unbound envoie alors une requête à l\u0026rsquo;un des serveurs de noms faisant autorité et demande l\u0026rsquo;adresse IP pour \u0026ldquo;wikipedia.org\u0026rdquo;. Le serveur de noms faisant autorité répond par l\u0026rsquo;envoi de l\u0026rsquo;adresse IP listée dans les enregistrements \u0026ldquo;A\u0026rdquo; et/ou \u0026ldquo;AAAA\u0026rdquo; pour le domaine \u0026ldquo;wikipedia.org\u0026rdquo;. Unbound reçoit l\u0026rsquo;adresse IP du serveur de noms faisant autorité et retourne la réponse au client. Si cela est activé, Unbound met en cache alors l\u0026rsquo;information pour une longueur de temps prédéterminée pour de futures requêtes pour le même nom de domaine. Vous pouvez essayer de faire une trace DNS par vous-mêmes pour voir le propos ci-dessus. J\u0026rsquo;utilise drill dans cet exemple avec l\u0026rsquo;option trace activée.\n# drill -T wikipedia.org . 518400 IN NS l.root-servers.net. . 518400 IN NS k.root-servers.net. . 518400 IN NS e.root-servers.net. . 518400 IN NS a.root-servers.net. . 518400 IN NS m.root-servers.net. . 518400 IN NS h.root-servers.net. . 518400 IN NS i.root-servers.net. . 518400 IN NS f.root-servers.net. . 518400 IN NS c.root-servers.net. . 518400 IN NS b.root-servers.net. . 518400 IN NS g.root-servers.net. . 518400 IN NS d.root-servers.net. . 518400 IN NS j.root-servers.net. org. 172800 IN NS a0.org.afilias-nst.info. org. 172800 IN NS a2.org.afilias-nst.info. org. 172800 IN NS b0.org.afilias-nst.org. org. 172800 IN NS b2.org.afilias-nst.org. org. 172800 IN NS c0.org.afilias-nst.info. org. 172800 IN NS d0.org.afilias-nst.org. wikipedia.org. 86400 IN NS ns0.wikimedia.org. wikipedia.org. 86400 IN NS ns1.wikimedia.org. wikipedia.org. 86400 IN NS ns2.wikimedia.org. wikipedia.org. 600 IN A 91.198.174.192 InfoUnbound a la capacité de valider les réponses qu\u0026rsquo;il reçoit comme correctes. C\u0026rsquo;est habituellement accompli par l\u0026rsquo;utilisation de DNSSEC ou l\u0026rsquo;utilisation de bits aléatoires encodés 0x20 dans la requête pour déjouer les tentatives d\u0026rsquo;usurpation d\u0026rsquo;identité. À l\u0026rsquo;exception des bits aléatoires encodés 0x20, tous les autres paramétres de validation tel que harden-glue et hardened dnssec-stripped data sont tous activés par défaut dans Unbound pour OpenBSD. Blocage par DNS Le blocage par DNS, appelé aussi filtrage ou usurpation DNS, est le processus qui vous permet de fournir une \u0026ldquo;fausse\u0026rdquo; réponse au client qui effectue la requête. Nous bloquons une requête pour une adresse IP valide soit en répondant avec un NXDOMAIN, signifiant nom de domaine inexistant, ou soit en redirigeant vers une autre adresse IP que celle prévue par le propriétaire du domaine.\nCela nous oblige à créer une liste, ou des listes multiples, de domaines que nous voulons bloquer et plutôt que de fournir à l\u0026rsquo;utilisateur l\u0026rsquo;adresse IP correcte pour un certain domaine, nous renvoyons le message que le domaine est \u0026ldquo;inexistant\u0026rdquo;, ce qui bloquera toute communication vers la destination prévue pour l\u0026rsquo;application.\nNormalement, toutes les requêtes DNS sont envoyés vers le port 53 soit sur le protocole UDP, soit TCP, lors de la mise en place du serveur DNS, ce que nous faisons avec Unbound, et en s\u0026rsquo;assurant que tout le trafic du port 53 atteigne notre serveur DNS ou autrement soit bloqué ; nous pouvons nous assurer que toutes les réponses DNS viennent de notre serveur Unbound interne à notre routeur OpenBSD.\nInfoVous ne pouvez pas pleinement faire confiance au blocage par DNS car le blocage par DNS peut être contourné. Même en ayant une solide approche en place, il est toujours possible pour quelqu\u0026rsquo;un d\u0026rsquo;utiliser un service VPN pour contourner cela. Nous n\u0026rsquo;essayons pas de construire un système 100% infaillible - même si nous y reviendrons un peu plus loin dans ce guide - nous essayons juste de protéger nos familles de la meilleure manière. Il y a toujours aussi les autres points d\u0026rsquo;accès à Internet que nous devons considérer, tels que les téléphones, ceux des amis ou leur maison, les accès publique à Internet, etc. NXDOMAIN vs redirection Quand nous voulons bloquer un domaine en utilisant DNS, nous pouvons choisir entre différentes méthodes, mais les deux plus populaires sont soit de rediriger la requête DNS vers une adresse IP locale, tel que 127.0.0.1 ou 0.0.0.0, ou de répondre par une définition NXDOMAIN. NXDOMAIN est une norme de réponse pour un \u0026ldquo;nom de domaine Intranet ou Internet non existant\u0026rdquo;. Si le nom de domaine est incapable d\u0026rsquo;être résolu en utilisant DNS, une condition appellée NXDOMAIN est obtenue.\nNous pouvons essayer de résoudre un domaine non existant avec la commande host :\n$ host a1b7c3n9m3b0.com Host a1b7c3n9m3b0.com not found: 3(NXDOMAIN) Puisque le nom de domaine \u0026ldquo;a1b7c3n9m3b0.com\u0026rdquo; n\u0026rsquo;est enregistré par personne (au moins pas durant le temps où j\u0026rsquo;écris cela), nous obtenons une réponse \u0026ldquo;NXDOMAIN\u0026rdquo;.\nNous pouvons aussi utiliser drill. L\u0026rsquo;information pertinente depuis la sortie de drill est le champ rcode dans la section \u0026ldquo;HEADER\u0026rdquo; :\n$ drill a1b7c3n9m3b0.com ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NXDOMAIN, id: 39710 … Ou si vous préférez dig, alors l\u0026rsquo;information pertinente est localisée dans le champ status dans la section \u0026ldquo;HEADER\u0026rdquo; :\n$ dig a1b7c3n9m3b0.com ; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.16.8 \u0026lt;\u0026lt;\u0026gt;\u0026gt; +search a1b7c3n9m3b0.com ;; global options: +cmd ;; Got answer: ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NXDOMAIN, id: 48858 … Utiliser une réponse NXDOMAIN n\u0026rsquo;est pas seulement la manière correcte de bloquer un domaine, en accord avec la RFC8020, mais c\u0026rsquo;est aussi la meilleure manière de le faire puisque une redirection vers une adresse IP, telle que 127.0.0.1 ou 0.0.0.0 fera simplement que le client qui initie la requête DNS se parlera à lui-même.\nIl se peut que le navigateur réponde avec quelque chose comme : Firefox can't establish a connection to the server at 0.0.0.0.. Toutefois, puisque l\u0026rsquo;adresse IP 0.0.0.0 se traduit simplement par notre machine locale, nous pouvons toujours envoyé un ping à cette adresse, car elle est synonyme d\u0026rsquo;un ping à 127.0.0.1 :\n$ ping 0.0.0.0 PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.019 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.049 ms Et puisque je recommande que vous utilisiez une réponse NXDOMAIN, c\u0026rsquo;est ce que nous allons utiliser dans ce tutoriel.\nAstuceUnbound peut gérer des listes énormes de domaines bloqués avec une réponse NXDOMAIN, mais il ne peut pas gérer de grandes listes de domaines qui ont besoin d\u0026rsquo;être redirigés aussi bien. Si pour certaines raisons, vous devriez insister sur la redirection plutôt que d\u0026rsquo;utiliser NXDOMAIN, je vous recommande de paramétrer dnsmasq avec l\u0026rsquo;option \u0026ndash;addn-hosts=\u0026lt;file\u0026gt;, pour qu\u0026rsquo;il écoute le port 53 et qu\u0026rsquo;il redirige tous les domaines bloqués, pendant qu\u0026rsquo;il redirige les requêtes DNS normales vers Unbound. Cela demande de paramétrer Unbound afin d\u0026rsquo;écouter sur un port non standard, tel que le port 5353. Contrairement à Unbound, dnsmasq peut gérer d\u0026rsquo;énormes listes de redirection très bien, mais il ne peut gérer de grandes liste de domaines NXDOMAIN aussi bien, devenant extrêmement lent. Le problème avec DNS sur HTTPS (DOH) Avec l\u0026rsquo;introduction de DoH (DNS over HTTPS), le blocage par DNS est devenu beaucoup plus difficile, et, bien que j\u0026rsquo;ai un certain respect pour l\u0026rsquo;idée originale derrière la promotion de DoH du point de vue de la confidentialité, DoH est mal construit d\u0026rsquo;un point de vue de la sécurité, et c\u0026rsquo;est une MAUVAISE approche.\nAvec le nombre déjà croissant de serveurs DNS publiques capable de servir du DNS sur HTTPs, toute application peut maintenant utiliser DoH et contourner complétement le blocage par DNS au niveau privé et entreprise. Non seulement cela, mais DoH a ouvert une large porte pour les dévelopeurs d\u0026rsquo;application afin de paramétrer leurs propres serveurs DoH et de les utiliser dans leurs applications au lieu du serveur DNS régulier attaché au réseau interne. C\u0026rsquo;est spécifiquement un problème pour le logiciel propriétaire dont nous ne pouvons pas voir le code source, mais dont nous ne pouvons pas aussi changer les paramétres DoH.\nÀ cause de DoH, nous ne pouvons plus bloquer simplement des domaines, tels que les publicitaires ou le porno, nous devons aussi commencer à bloquer les serveurs DoH publiques via le pare-feu. Toutefois, bien que garder une liste croissante d\u0026rsquo;un nombre d\u0026rsquo;adresses IP de serveurs DoH publique soit assez problèmatique, garder une liste de serveurs DoH publiques inconnus, qui peuvent être utilisé par du logiciel propriétaire, tel que du micro-logiciel dans des dispositifs IoT, est impossible.\nDoH est aussi un complet cauchemard pour les entreprises car il rend basiquement possible de surpasser les paramétres DNS imposés centralement. Cela rend impossible de fournir des solutions de filtrage, telle que celle que nous faisons, pour bloquer la publicité et le porno, et rend impossible pour les administrateurs systèmes de surveiller les paramétres DNS du système d\u0026rsquo;exploitation afin de prévenir les attaques de manipulation DNS. Avoir de multiples applications qui ont leur unique paramétre DoH est un cauchemar.\nDoH gène complétement l\u0026rsquo;analyse réseau et la surveillance du trafic DNS à des fins de sécurité. En 2019, Godlua, un bot Linux DDoS, était le premier logiciel malveillant vu à utiliser DoH pour cacher son trafic DNS.\nDe plus, et c\u0026rsquo;est peut-être l\u0026rsquo;aspect le plus important, DoH n\u0026rsquo;empêche aucunément le suivi des utilisateurs. Certaines parties de la connection HTTPS ne sont pas chiffrées, tels que les champs SNI (mais on y arrive lentement), les connexions OCSP, et bien sûr les adresses IP de destination, ce qui à mon humble avis est le point le plus crucial de la communication qui a besoin d\u0026rsquo;être caché !\nLes personnes qui ont vraiment besoin de confidentialité, tels que les journalistes dans des pays ayant une politique de confidentialité compromise, ne peuvent faire confiance à DoH ! L\u0026rsquo;adresse IP du serveur de destination ne peut pas être caché avec DoH, même si tout le trafic est lui-même chiffré. Si quelqu\u0026rsquo;un a vraiment besoin de chiffrer la communication, il a besoin d\u0026rsquo;une stratégie complétement différente de DoH.\nCela me fait me demander qui a pensé que DoH était une bonne idée au départ ?! Ne comprennent-ils pas les bases derrière les communications avec HTTPS, ou peut-être est-ce l\u0026rsquo;agenda poussé par quelques entreprises privées de service DNS, tel que Cloudflare, qui tire profit en collectant davantage de données utilisateurs ?\nCertains fournisseurs de service DNS publique status que d\u0026rsquo;un point de vue de la confidentialité, DoH est meilleur que d\u0026rsquo;autres alternatives, telle DoT (DNS over TLS), puisque les requêtes DNS sont cachées dans le large flux du trafic HTTPS. Cela donne aux administrateurs réseaux moins de visibilité mais fournit aux utilisateurs plus de confidentialité.\nCe message est problématique. Bien qu\u0026rsquo;il soit vrai que la recherche initiale d\u0026rsquo;un nom de domaine soit caché dans le trafic HTTPS, l\u0026rsquo;adresse IP de destination fournit par le serveur DoH ne l\u0026rsquo;est pas. Quand l\u0026rsquo;application cliente visite l\u0026rsquo;adresse IP de destination, les deux adresses IP, celle de source et celle de destination, sont journalisées au niveau du FAI (et possiblement à de multiples autres niveaux, aussi bien).\nBien qu\u0026rsquo;il ne soit pas immédiatement possible de déterminer exactement quel nom de domaine l\u0026rsquo;utilisateur essaye d\u0026rsquo;atteindre, spécifiquement si le serveur web fait fonctionner de multiples domaines sur la même adresse IP, ce n\u0026rsquo;est définitivement pas impossible voire n\u0026rsquo;est même pas difficile.\nInfoDans l\u0026rsquo;appendice, vous pouvez trouver un chapitre appellé Inspecter DNS sur HTTPS (DOH), dans laquelle nous ferons une démonstration de comment l\u0026rsquo;adresse IP de destination est révélée dans la communication DoH. Vous pouvez aussi trouver un chapitre appellé Bloquer DNS sur HTTPS (DOH) dans laquelle nous utilisons le pare-feu PF pour bloquer les serveurs DoH publiques. Paramétrage d\u0026rsquo;Unbound Paramétrages de base Paramètrer Unbound est très facile, car Unbound est fourni avec les meilleurs paramètres par défaut, mais est aussi très bien documenté. Avant que nous commencions, je vous recommande de regarder les pages des manuels OpenBSD pour unbound, unbound-checkconf et unbound.conf.\nDu fait qu\u0026rsquo;Unbound soit chrooté sur OpenBSD, le fichier de configuration unbound.conf ne réside pas dans /etc, là où il devrait être normalement, mais à la place réside dans /var/unbound/etc/.\nCopiez le fichier de configuration existant d\u0026rsquo;Unbound :\n# mv /var/unbound/etc/unbound.conf /var/unbound/etc/unbound.conf.backup Ensuite, utilisez votre éditeur texte favori et créer un nouveau fichier /var/unbound/etc/unbound.conf et remplissez-le avec le contenu suivant :\nserver: # Logging (default is no). # Uncomment this section if you want to enable logging. # Note enabling logging makes the server (significantly) slower. # verbosity: 2 # log-queries: yes # log-replies: yes # log-tag-queryreply: yes # log-local-actions: yes interface: 127.0.0.1 interface: 192.168.1.1 interface: 192.168.2.1 interface: 192.168.3.1 # In case you need Unbound to listen on an alternative port, this is the # syntax: # interface: 127.0.0.1@5353 # Control who has access. access-control: 0.0.0.0/0 refuse access-control: ::0/0 refuse access-control: 127.0.0.0/8 allow access-control: ::1 allow access-control: 192.168.1.0/24 allow access-control: 192.168.2.0/24 allow access-control: 192.168.3.0/24 allow # \u0026#34;id.server\u0026#34; and \u0026#34;hostname.bind\u0026#34; queries are refused. hide-identity: yes # \u0026#34;version.server\u0026#34; and \u0026#34;version.bind\u0026#34; queries are refused. hide-version: yes # Cache elements are prefetched before they expire to keep the cache up to date. prefetch: yes # Our LAN segments. private-address: 192.168.0.0/16 # We want DNSSEC validation. auto-trust-anchor-file: \u0026#34;/var/unbound/db/root.key\u0026#34; # Enable the usage of the unbound-control command. remote-control: control-enable: yes control-interface: /var/run/unbound.sock J\u0026rsquo;ai commenté les options ci-dessus, mais si vous avez besoin d\u0026rsquo;explications plus profondes concernant la configuration, regardez la page du manuel unbound.conf.\nLa journalisation est faite par défaut vers syslog. Si vous voulez changer cela, vous pouvez créer un fichier log dans le chroot d\u0026rsquo;Unbound et ainsi avoir le journal d\u0026rsquo;Unbound :\n# mkdir /var/unbound/log # touch /var/unbound/log/unbound.log # chown -R root._unbound /var/unbound/log # chmod -R 774 /var/unbound/log Et, dans le fichier unbound.conf, ajoutez les options suivantes vers la section de journalisation :\nlogfile: \u0026#34;/log/unbound.log\u0026#34; use-syslog: no log-time-ascii: yes InfoNous n\u0026rsquo;utilisons pas le chemin complet du fichier de log parce qu\u0026rsquo;Unbound est chrooté. Avec l\u0026rsquo;option logfile ci-dessus, le fichier log se retrouve dans /var/unbound/log/unbound.log. Puis, redémarrez Unbound :\n# rcctl restart unbound Dans les paramétres ci-dessus, j\u0026rsquo;ai autorisé Unbound à écouter l\u0026rsquo;interface loopback (127.0.0.1) en premier afin que les applications réseaux locales soient capables de faire des recherches si besoin. Dans le fichier etc/resolv.conf de notre routeur OpenBSD, j\u0026rsquo;ai listé notre serveur DNS Unbound, car je ne veux rien sur le routeur qui interroge les serveurs DNS du FAI :\nnameserver 127.0.0.1 Si vous utilisez DHCP sur l\u0026rsquo;interface externe (l\u0026rsquo;interface connecté au modem ou routeur de votre FAI), vous devez vous assurez que dhclient ne change pas la configuration du fichier /etc/resolv.conf. Éditez le fichier /etc/dhclient.conf et ajoutez :\nsupersede domain-name-servers 127.0.0.1; Cela permettra de s\u0026rsquo;assurer que nous avons notre serveur DNS local listé.\nActivez Unbound avec :\n# rcctl enable unbound Lorsque vous changez la configuration d\u0026rsquo;Unbound, vous pouvez soit juste redémarrer Unbound avec :\n# rcctl restart unbound ou simplement recharger les options de configuration (ce qui purge aussi le cache) :\n# unbound-control reload Vous pouvez lister avec quels paramétres Unbound est démarré par la commande suivante (qui est fourni pour tout service sous OpenBSD) :\n# rcctl get unbound Si vous voulez avec certaines statitiques des données, vous pouvez exécuter :\n# unbound-control stats_noreset thread0.num.queries=2056 thread0.num.queries_ip_ratelimited=0 thread0.num.cachehits=678 thread0.num.cachemiss=1378 thread0.num.prefetch=15 thread0.num.expired=0 … Vous pouvez aussi avoir un dump du cache :\n# unbound-control dump_cache|less Si vous voulez voir quelles sont les requêtes du serveur de nom Unbound fait pour un domaine spécifique, vous pouvez faire cela avec :\n# unbound-control lookup wikipedia.org Si vous voulez purger le cache pour un domaine spécifique, vous pouvez faire cela avec :\n# unbound-control flush example.com Prenez le temps de regarder la page du manuel d\u0026rsquo;unbound-control pour les autres options et commandes.\nIgnorer les réglages TTL ridiculeusement bas Une chose qui crée une grande nuisance est le paramétrage de certaines personnes sur des valeurs TTL ridiculeusement basses pour leurs domaines. Pour certaines raisons, il est presque tendance d\u0026rsquo;avoir une valeur par défaut de 60 secondes.\nLe problème avec un TTL très bas est que cela rend complétement inutile le DNS cache. Une requête utilisera seulement la réponse en cache aussi longtemps que le TTL ne soit pas expiré. Même au-travers des RFC qui disent qu\u0026rsquo;un TTL doit être respecté, de telles valeurs basses rend le DNS extrêmement inefficace. Je recommande toutefois que vous surchargiez le paramétrage TTL par celui d\u0026rsquo;une heure par défaut. Une autre amélioration dans la vitesse de requête de DNS est de réduire la latence en se servant des enregistrements périmés avant de les mettre à jour d\u0026rsquo;une autre manière au lieu de faire l\u0026rsquo;inverse.\ncache-min-ttl: 3600 serve-expired: yes Un problème théorique avec l\u0026rsquo;augmentation du TTL est que le domaine pourrait obtenir une nouvelle adresse IP qui ne peut pas être résolu puisque l\u0026rsquo;ancienne entrée est dans le cache. Toutefois, dans la pratique le risque de fonctionner sur un domaine périmé est minime et ça vaut la peine d\u0026rsquo;améliorer l\u0026rsquo;utilisation du cache en fixant un TTL d\u0026rsquo;une heure minimum par défaut.\nBloquons certains domaines ! Maintenant, intéressons-nous à la partie du blocage de domaines.\nJ\u0026rsquo;ai créé un simple script shell appelé DNSBlockBuster qui télécharge automatiquement un jeu de fichiers hosts depuis diverses sources en-ligne, les concaténant ensemble en une seule, la nettoyant, et convertissant le résultat en une liste de blocage de domaines pour Unbound et dnsmasq. Elle bloque principalement les publicités, les sites de porno et de pistage.\nAvec DNSBlockBuster, vous avez l\u0026rsquo;option de créer une liste blanche, si pour vous l\u0026rsquo;un des domaines listés dans les fichiers hosts est un faux positif, et vous pouvez ajouter votre propre liste de blocage dans le cas où vous voulez bloquer manuellement certains domaines qui ne sont pas listés dans les fichiers hosts. Vous pouvez facilement ajouter de nouvelles listes de blocage ou supprimer l\u0026rsquo;une des listes de blocage fournies.\nBien sûr, vous n\u0026rsquo;avez pas besoin d\u0026rsquo;utiliser mon script, mais je l\u0026rsquo;utiliserais dans ce tutoriel.\nActuellement le script créé une énorme liste de domaines avec plus de deux millions de domaines listés et Unbound prend près de 705 Mo de mémoire au total quand la liste de blocage est chargée en entier.\nAfin d\u0026rsquo;éviter qu\u0026rsquo;Unbound tombe en panne lors du chargement de la liste, éditez /etc/rc.conf.local et ajoutez ce qui suit :\nunbound_timeout=240 Puis redémarrez Unbound :\n# rcctl restart unbound Regardez la section Usage dans la documentation de DNSBlockBuster pour savoir comment l\u0026rsquo;utiliser. C\u0026rsquo;est simple et facile.\nUne fois que vous avez créé votre liste de blocage pour Unbound, placez la dans /var/unbound/etc/ et éditez le fichier de configuration d\u0026rsquo;Unbound /var/unbound/etc/unbound.conf pour insérer quelque chose comme :\ninclude: \u0026#34;/var/unbound/etc/unbound-blocked-hosts.conf\u0026#34; Maintenant rechargez Unbound avec :\n# unbound-control reload Si vous exécutez la commande top dans un autre terminal, vous remarquerez qu\u0026rsquo;Unbound consomme pas mal de ressources CPU lors du chargement initial de la liste. Remarquez aussi la consommation mémoire.\nVous pouvez maintenant tester notre blocage DNS en faisant une requête vers un domaine bloqué de la liste :\n$ drill 3lift.com ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NXDOMAIN, id: 55906 … Essayez le même avec le serveur DNS de Cloudflare :\n$ drill 3lift.com @1.1.1.1 ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 48771 … Comme nous pouvons le voir, notre serveur DNS bloque l\u0026rsquo;accès au domaine 3lift.com en répondant avec un NXDOMAIN, alors que le serveur DNS de Cloudflare répond avec l\u0026rsquo;adresse IP correcte.\nSécurité DNS La sécurité DNS est un vaste sujet. Dans cette section, nous allons discuter de certains des sujets qui nous concernent plus particulièrement à propos de notre propre serveur DNS.\nLe protocole DNS n\u0026rsquo;est pas chiffré et ne tient, par défaut, aucun compte de la confidentialité, de l\u0026rsquo;intégrité ou de l\u0026rsquo;authentification. Si vous utilisez un réseau non fiable, ou un FAI malveillant, vos requêtes DNS peuvent être écoutées et les réponses manipulées. En outre, les FAI peuvent procéder à des détournements de DNS.\nDétournement de DNS Le détournement de DNS signifie que les requêtes DNS que vous faites sont redirigées vers un autre serveur DNS. C\u0026rsquo;est typiquement fait en redirigeant tout le trafic sur le port 53 à destination d\u0026rsquo;un autre.\nUn des manières les plus simples pour déterminer si votre FAI détourne votre trafic DNS est d\u0026rsquo;interroger directement un serveur DNS faisant autorité.\nNous pouvons utiliser de multiples outils pour cela. Dans cet exemple, nous utiliserons en premier drill. Ces options, dans cet exemple, sont les mêmes pour dig. Nous utiliserons encore le domaine \u0026ldquo;wikipedia.org\u0026rdquo;.\nEn premier, nous avons besoin d\u0026rsquo;avoir les serveurs faisant autorité. Ils apparaîtront dans la section \u0026ldquo;ANSWER SECTION\u0026rdquo; :\n$ drill NS wikipedia.org ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 28789 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; wikipedia.org. IN NS ;; ANSWER SECTION: wikipedia.org. 85948 IN NS ns2.wikimedia.org. wikipedia.org. 85948 IN NS ns0.wikimedia.org. wikipedia.org. 85948 IN NS ns1.wikimedia.org. ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 1 msec ;; SERVER: 127.0.0.1 ;; WHEN: Thu Nov 5 07:53:19 2020 ;; MSG SIZE rcvd: 95 Alors nous devons interroger l\u0026rsquo;un de ses serveurs faisant autorité directement. Le champ important auquel nous devons faire attention est flags dans le champ \u0026ldquo;HEADER\u0026rdquo;. Pour que la réponse fasse autorité, le drapeau aa doit être listé.\n$ drill @ns1.wikimedia.org wikipedia.org ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 57611 ;; flags: qr aa rd ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; wikipedia.org. IN A ;; ANSWER SECTION: wikipedia.org. 600 IN A 91.198.174.192 ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 127 msec ;; SERVER: 208.80.153.231 ;; WHEN: Thu Nov 5 07:56:10 2020 ;; MSG SIZE rcvd: 47 Cela montre que la réponse que nous avons n\u0026rsquo;a pas été détournée puisque la réponse fait autorité. Essayons de l\u0026rsquo;obtenir depuis le serveur DNS publique de Cloudflare avec la même requête :\n$ drill @1.1.1.1 wikipedia.org ;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 40562 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;; wikipedia.org. IN A ;; ANSWER SECTION: wikipedia.org. 555 IN A 91.198.174.192 ;; AUTHORITY SECTION: ;; ADDITIONAL SECTION: ;; Query time: 3 msec ;; SERVER: 1.1.1.1 ;; WHEN: Thu Nov 5 08:02:58 2020 ;; MSG SIZE rcvd: 47 Notez que le drapeau aa est manquant dans le champ \u0026ldquo;HEADER\u0026rdquo;. Cela signifie que la réponse ne fait pas autorité.\nUn autre outil simple est nslookup. En premier interrogeons les serveurs de noms faisant autorité :\nnslookup -querytype=NS wikipedia.org Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: wikipedia.org nameserver = ns1.wikimedia.org. wikipedia.org nameserver = ns2.wikimedia.org. wikipedia.org nameserver = ns0.wikimedia.org. Essayons alors d\u0026rsquo;interroger notre propre serveur DNS pour le domaine :\n$ nslookup wikipedia.org Server: 127.0.0.1 Address: 127.0.0.1#53 Non-authoritative answer: Name: wikipedia.org Address: 91.198.174.192 Server: ns2.wikimedia.org Address: 91.198.174.239#53 Name: wikipedia.org Address: 91.198.174.192 Le message Non-authoritative montre clairement que la réponse n\u0026rsquo;est pas faite depuis un serveur DNS faisant autorité. C\u0026rsquo;est très bien, puisque nous avons interrogé notre propre serveur DNS. Essayons d\u0026rsquo;interroger un des serveurs faisant autorité directement :\n$ nslookup wikipedia.org ns0.wikimedia.org Server: ns0.wikimedia.org Address: 208.80.154.238#53 Name: wikipedia.org Address: 91.198.174.192 Le message Non-authoritative n\u0026rsquo;est plus là, la réponse que nous avons obtenu faisait autorité, ce qui signifie que notre requête DNS n\u0026rsquo;a pas été détournée.\nJ\u0026rsquo;ai maintenant activé un service VPN que je connais pour intercepter les requêtes DNS afin de protéger les clients contre la fuite DNS puis je fais une requête à nouveau vers les serveurs faisant autorité :\n$ nslookup wikipedia.org ns0.wikimedia.org Server: ns0.wikimedia.org Address: 208.80.154.238#53 Non-authoritative answer: Name: wikipedia.org Address: 91.198.174.192 Name: wikipedia.org Address: 2620:0:862:ed1a::1 Comme attendu la réponse ne fait pas autorité quand bien même j\u0026rsquo;ai interrogé directement le serveur faisant autorité. Le trafic DNS a été détourné et la réponse a été redirigé depuis un autre serveur DNS inconnu.\nLe détournement DNS, qu\u0026rsquo;il soit effectué par un FAI ou par quelqu\u0026rsquo;un d\u0026rsquo;autre, est hautement problèmatique. Tout d\u0026rsquo;abord, nous ne pouvons avoir pleinement confiance aux réponses que nous obtenons depuis le serveur DNS. En second, même si la réponse DNS fournit des données non falsifiées, le trafic DNS a été détourné pour une raison inconnue, qui peut être de la collecte et de l\u0026rsquo;enregistrement de données, ou pour une raison complètement différente.\nInfoCertains FAI, tels qu\u0026rsquo;Optimum Online, Comcast, Time Warner, Cox Communications, RCN, Rogers, Charter Communications, Verizon, Virgin Media, Frontier Communications, Bell Sympatico, Airtel, OpenDNS et d\u0026rsquo;autres ont commencé leurs pratiques de détournement de DNS sur des noms de domaines inexistants (NXDOMAIN) pour monétiser l\u0026rsquo;affichage de publicités. Le serveur DNS redirigait une requête pour un nom de domaine non existant vers une fausse adresse IP qui contenait un site web avec publicités. Je ne sais pas combien de FAI et fournisseurs de service DNS publique le font encore. Prévention contre le détournement de DNS Si vous avez découvert que votre trafic DNS sur le port 53 est détourné, vous avez basiquement seulement trois options afin de vous protéger :\nSi cela vous est possible, changez de FAI ! Votre FAI ne devrait pas détourner votre trafic DNS. Paramétrez votre propre serveur DNS à distance dans un centre d\u0026rsquo;hébergement qui ne fait pas de détournement ou ne bloque pas le port 53. Ensuite, que votre serveur DNS à distance écoute vos connexions DNS sur un port non standard et rediriger toutes vos requêtes DNS vers votre serveur DNS à distance. Utilisez un VPN de confiance qui ne détourne pas le trafic DNS, ou s\u0026rsquo;il le fait, assurez-vous que vous pouvez faire confiance à leur politique de non journalisation. Usurpation de DNS L\u0026rsquo;usurpation de DNS, aussi appelé empoisonnement du cache DNS, est différent du détournement de DNS. Alors que le trafic est redirigé d\u0026rsquo;une destination vers une autre dans une attaque de détournement de DNS, c\u0026rsquo;est la donnée elle-même qui est manipulée dans une attaque d\u0026rsquo;usurpation DNS. Souvent ces deux stratégies d\u0026rsquo;attaques sont combinées.\nDans une attaque d\u0026rsquo;usurpation de DNS, la donnée manipulée est introduite dans le cache du résolveur DNS, résultant que le serveur de nom retourne un résultat incorrect, e.g. une mauvaise adresse IP.\nPrévention contre l\u0026rsquo;usurpation de DNS Ce type d\u0026rsquo;attaque peut être atténuée au niveau de la couche transport ou de la couche application en effectuant une validation de bout en bout une fois qu\u0026rsquo;une connexion est établie. Un exemple courant de cela est l\u0026rsquo;utilisation de TLS et des signatures digitales.\nDNSSEC utilise des signatures digitales cryptographiques avec un certificat de clé publique de confiance pour déterminer l\u0026rsquo;authenticité des données. DNSSEC peut protéger contre l\u0026rsquo;usurpation de DNS, toutefois beaucoup d\u0026rsquo;administrateurs DNS ne l\u0026rsquo;ont pas encore implémenté.\nÀ partir de 2020, tous les TLD originaux prennent en charge DNSSEC, comme le font les TLD de code de pays, mais de nombreux TLD de code de pays ne le font toujours pas.\nAppendices Inspecter DNS sur HTTPS (DOH) Je veux illustrer le fait que DoH ne fournit pas réellement une véritable confidentialité autant de l\u0026rsquo;adresse IP source que celle de destination, qui peuvent être vues clairement dans la communication HTTPS.\nEn premier, je m\u0026rsquo;assure que DoH soit désactivé dans Firefox, sur un des ordinateurs du LAN pour adultes, et je surveille le trafic sur l\u0026rsquo;interface em1 par l\u0026rsquo;utilisation de tcdump. J\u0026rsquo;ai aussi activé la journalisation dans Unbound, juste pour éviter de remplir inutilement syslog avec trop de bruits DNS, et j\u0026rsquo;ai utilisé tail pour surveiller le journal.\nJ\u0026rsquo;irais sur \u0026ldquo;wikipedia.org\u0026rdquo; dans le navigateur et voir ce que révèle la surveillance sur le routeur.\n# tcpdump -n -i em1 src host 192.168.1.5 and not arp tcpdump: listening on em1, link-type EN10MB 23:30:33.494352 192.168.1.5.55724 \u0026gt; 192.168.1.1.53: 58136+ A? wikipedia.org.(31) (DF) 23:30:33.774439 192.168.1.5.58372 \u0026gt; 192.168.1.1.53: 58448+ A? www.wikipedia.org.(35) (DF) 23:30:34.184287 192.168.1.5.46639 \u0026gt; 192.168.1.1.53: 15167+ A? www.wikipedia.org.(35) (DF) … # tail -f /var/unbound/log/unbound.log Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 wikipedia.org. A IN Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 wikipedia.org. A IN NOERROR 0.097209 0 47 Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.154989 0 80 Nov 05 23:30:34 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN Nov 05 23:30:34 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.000000 1 80 … Naturellement nous avons vu la requête autant dans le trafic de l\u0026rsquo;interface que dans le journal d\u0026rsquo;Unbound.\nJ\u0026rsquo;ai activé alors DoH et désactivé le DNS régulier dans Firefox, en paramétrant la valeur de network.trr.mode à 4. J\u0026rsquo;ai alors changé les paramétres réseaux et paramétré Cloudflare en tant que fournisseur DoH.\nAstuceSi vous activez juste DoH via les préférences, Firefox utilisera toujours le DNS régulier comme solution de repli. Avant de forcer Firefox à utiliser seulement DoH, vous devez paramétrer la value de network.trr.mode.\nÉcrivez about:config dans la barre d\u0026rsquo;adresses et pressez la touche Entrée pour accéder au panneau de configuration caché de Firefox.\nÉtape 2 : Cherchez le paramétre network.trr.mode. Il contrôle la prise en charge de DoH. Ce paramétre a 4 valeurs :\nDoH est désactivé, par défaut DoH est actif, mais Firefox utilise à la fois DoH et le DNS régulier selon la rapidité de la réponse retournée. DoH est actif, et le DNS régulier fonctionne en repli. DoH est actif, et le DNS régulier est désactivé DoH est désactivé, par choix. Étape 3 : Cherchez le paramétre network.trr.bootstrapAddress. Il contrôle l\u0026rsquo;adresse IP numérique de votre serveur DoH. Entrez la valeur 1.1.1.1 et appuyez sur la touche Entrée.\nCette fois, je visiterais \u0026ldquo;freebsd.org\u0026rdquo;.\n# tcpdump -n -i em1 src 192.168.1.5 and not arp tcpdump: listening on em1, link-type EN10MB 00:21:10.944243 192.168.1.5.32856 \u0026gt; 1.1.1.1.443: P 2223446146:2223446202(56) ack 157857007 win 501 (DF) 00:21:10.948719 192.168.1.5.46584 \u0026gt; 96.47.72.84.80: S 922508523:922508523(0) win 64240 \u0026lt;mss 1460,sackOK,timestamp 1673624773 0,nop,wscale 7\u0026gt; (DF) 00:21:11.133801 192.168.1.5.33298 \u0026gt; 96.47.72.84.443: S 3275123911:3275123911(0) win 64240 \u0026lt;mss 1460,sackOK,timestamp 1673624958 0,nop,wscale 7\u0026gt; (DF) … # tail -f /var/unbound/log/unbound.log Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 wikipedia.org. A IN Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 wikipedia.org. A IN NOERROR 0.097209 0 47 Nov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN Nov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.154989 0 80 Nov 05 23:30:34 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN Nov 05 23:30:34 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.000000 1 80 … Cela révèle, depuis la surveillance de l\u0026rsquo;interface réseau, qu\u0026rsquo;une connexion a été faite vers le serveur DNS de Cloudflare à l\u0026rsquo;adresse 1.1.1.1 sur le port 443 (HTTPS) et que nous avons visité l\u0026rsquo;adresse IP de destination 96.47.72.84 juste après. Dans le même temps, rien n\u0026rsquo;est arrivé dans le journal d\u0026rsquo;Unbound, tail nous montrant juste toujours la requête précédente.\nSi nous faisons une requête au DNS régulier sur le serveur, nous pouvons vérifier que l\u0026rsquo;adresse IP 96.47.72.84 est bien l\u0026rsquo;adresse IP de \u0026ldquo;freebsd.org\u0026rdquo;.\nDe plus, dans cet exemple spécifique, nous pouvons même accéder au site web de \u0026ldquo;freebsd.org\u0026rdquo; en écrivant juste l\u0026rsquo;adresse IP de destination 96.47.72.84 dans le champ de la barre d\u0026rsquo;adresse du navigateur.\nCela démontre que même si DoH bypasse la requête d\u0026rsquo;un DNS régulier, il n\u0026rsquo;est pas capable de cacher l\u0026rsquo;adresse IP de destination qui est toujours présente en clair dans le trafic de la communication.\nBloquer DNS sur HTTPS (DOH) Auparavant, le script DNSBlockBuster comportait certains noms de domaines DoH dans la liste, que j\u0026rsquo;avais ajouté aléatoirement, mais j\u0026rsquo;ai depuis supprimé le blocage DoH du serveur DNS, car il faut vraiment que cela soit géré au niveau du pare-feu.\nBloquer DoH via les noms de domaine n\u0026rsquo;a pas beaucoup de sens à mon humble opinion car un nom de domaine peut être cherché en premier lieu. La plupart des clients qui utilisent DoH ont l\u0026rsquo;adresse IP de l\u0026rsquo;hôte du serveur DoH encodé directement dans leur code source.\nJ\u0026rsquo;ai cherché sur de multiples sites sur Internet, mais aucun n\u0026rsquo;a trouvé une simple manière de mettre à jour la liste des serveurs publiques DoH, ainsi j\u0026rsquo;ai décidé de faire ma propre liste appelée DoHBlockBuster. Toutefois c\u0026rsquo;est une tâche énorme, dont je sais que je n\u0026rsquo;aurais pas le temps de tenir à jour à l\u0026rsquo;avenir, à moins que d\u0026rsquo;autres personnnes ne s\u0026rsquo;y mettent ; alors si vous avez du temps libre, aidez à tenir à jour les listes (en faisant une demande de retrait ou en m\u0026rsquo;envoyant un courriel). En outre, cette liste n\u0026rsquo;est en aucun cas exhaustive.\nSi vous n\u0026rsquo;utilisez pas IPv6, vous pouvez bloquer tout le trafic IPv6, et utilisez alors seulement la liste IPv4 de DoHBlockBuster. Changez le paramétre pass out, dans la section \u0026ldquo;Default protect and block\u0026rdquo; de /etc/pf.conf en pass out inet. C\u0026rsquo;est la manière pour permettre seulement le trafic IPv4 sortant, sans avoir à bloquer spécifiquement les adresses IPv6 relatives à DoH.\nTéléchargez les listes depuis DoHBlockBuster et éditez les selon vos besoins et enregistrez les quelque part sur le disque.\nJ\u0026rsquo;ai fait un sous-répertoire à /etc/pf-block-lists où j\u0026rsquo;ai placé toutes les listes de blocage dont j\u0026rsquo;ai besoin pour PF.\nCréez alors un fichier persistant pour PF dans la section \u0026ldquo;Tables\u0026rdquo; de /etc/pf.conf :\n# Public DoH servers. table \u0026lt;block_doh\u0026gt; persist file \u0026#34;/etc/pf-block-lists/dohblockbuster-ipv4.txt\u0026#34; Si vous avez besoin d\u0026rsquo;IPv6, ajoutez alors cela aussi :\ntable \u0026lt;block_doh\u0026gt; persist file \u0026#34;/etc/pf-block-lists/dohblockbuster-ipv4.txt\u0026#34; file \u0026#34;/etc/pf-block-lists/dohblockbuster-ipv6.txt\u0026#34; Et, alors ajoutez un block à la section \u0026ldquo;Protect and block by default\u0026rdquo; du pare-feu :\n# Let\u0026#39;s block DoH. block in quick on { $g_lan $c_lan $dmz } to \u0026lt;block_doh\u0026gt; Rechargez PF :\n# pfctl -f /etc/pf.conf Vérifiez la liste avec :\n# pfctl -vvt block_doh -T show Si - après quelques temps - vous voulez voir quelles adresses IP sont actuellement bloquées, vous pouvez filtrer la sortie :\n# pfctl -vvt block_doh -T show | awk \u0026#39;/\\[/ {p+=$4; b+=$6} END {print p, b}\u0026#39; Comme mentionné précédemment, cette solution ne prend pas en considération les serveurs DoH inconnus. De plus afin que la liste soit efficace, elle a besoin d\u0026rsquo;être tenue à jour.\nAjouter l\u0026rsquo;option domain-name à DHCP et utiliser un FQDN Si nous paramétrons notre réseau de telle manière que tous les ordinateurs et dispositifs aient leurs adresses IP fixes et noms d\u0026rsquo;hôtes, beaucoup d\u0026rsquo;outils ne fonctionneront pas nativement avec ces noms d\u0026rsquo;hôtes sans ajouter un nom de domaine au serveur DNS. Cela est dû à des outils tel que host qui s\u0026rsquo;attend à ce que la recherche vers un nom d\u0026rsquo;hôte soit un nom de domaine pleinement qualifié (FQDN).\nDisons que j\u0026rsquo;ai paramétré un ordinateur sur mon LAN ayant pour nom d\u0026rsquo;hôte \u0026ldquo;foo\u0026rdquo; et l\u0026rsquo;adresse IP fixée à 192.168.1.7. Je ne me souviens peut être pas que \u0026ldquo;foo\u0026rdquo; est l\u0026rsquo;ordinateur avec telle adresse, ou je ne me souviens pas quel hôte a l\u0026rsquo;adresse IP 192.168.1.7 associée.\nAvec un FQDN, nous pouvons faire une recherche telle que :\n$ host foo.example.com foo.example.com has address 192.168.1.7 Alors nous pouvons faire :\n# host 192.168.1.7 7.1.168.192.in-addr.arpa domain name pointer foo.example.com Toutefois, il est ennuyeux de devoir écrire le nom de domaine complet à chaque fois. Si nous ajoutons l\u0026rsquo;option domain-name à /etc/resolv.conf le nom de domaine sera automatiquement ajouté. Ainsi, nous pouvons faire juste cela :\n$ host foo foo.example.com has address 192.168.1.7 Certaines personnes recommandent d\u0026rsquo;enregistrer un nom de domaine et de l\u0026rsquo;utiliser en interne sur votre LAN, et bien que ce soit certainement fonctionnel, ce n\u0026rsquo;est pas intéressant du tout. Pour l\u0026rsquo;utilisation à la maison, vous pouvez utilisez les TLD .intranet, .home ou .lan, en accord avec la RFC 6762 sans aucun problème. Toutefois, n\u0026rsquo;utilisez pas .local.\nDémarrons en faisant quelques changements dans la configuration de /etc/dhcpd.conf. Juste pour faire simple, j\u0026rsquo;utiliserais le serveur web de notre LAN publique en exemple, mais vous pouvez étendre cela à tout segment où vous le désirez, et vous pouvez aussi l\u0026rsquo;utiliser sur plusieurs segments si besoin.\nDans notre paramétrage actuel, nous avons déjà le domaine example.com attaché à notre serveur web ainsi nous pouvons juste l\u0026rsquo;utiliser. Mais si vous n\u0026rsquo;avez pas de serveur publique qui a un réel nom de domaine, changez-le juste par quelque chose comme net.home. J\u0026rsquo;ai changé le nom de notre serveur web par \u0026ldquo;lilo\u0026rdquo; (oui, de Lilo \u0026amp; Stitch, parce que c\u0026rsquo;est plus cool que \u0026ldquo;Luke\u0026rdquo; ou \u0026ldquo;Yoda\u0026rdquo; !).\nsubnet 192.168.1.0 netmask 255.255.255.0 { option domain-name-servers 192.168.1.1; option domain-name \u0026#34;example.com\u0026#34;; option routers 192.168.1.1; range 192.168.1.10 192.168.1.254; } subnet 192.168.2.0 netmask 255.255.255.0 { option domain-name-servers 192.168.2.1; option domain-name \u0026#34;example.com\u0026#34;; option routers 192.168.2.1; range 192.168.2.10 192.168.2.254; } subnet 192.168.3.0 netmask 255.255.255.0 { option domain-name-servers 192.168.3.1; option domain-name \u0026#34;example.com\u0026#34;; option routers 192.168.3.1; range 192.168.3.10 192.168.3.254; host lilo.example.com { fixed-address 191.168.3.2; hardware ethernet 61:20:42:39:61:AF; option host-name \u0026#34;lilo\u0026#34;; } } Si vous préférez utiliser de multiples domaines plutôt qu\u0026rsquo;un seul, dites-vous que example.com est pour votre développement web professionnel, et que net.home pour votre LAN privé, vous pouvez faire une recherche de domaine avec l\u0026rsquo;option domain-search dans /etc/dhcpd.conf au lieu de l\u0026rsquo;option domain-name. La différence entre les deux est qu\u0026rsquo;avec domain-name, seulement un seul domaine est ajouté, alors qu\u0026rsquo;avec l\u0026rsquo;option domain-search, de multiples domaines peuvent être ajoutés et sont alors \u0026ldquo;cherchés\u0026rdquo; un par un jusqu\u0026rsquo;à ce que l\u0026rsquo;hôte soit trouvé.\nL\u0026rsquo;option domain-search ressemble à ceci :\noption domain-search \u0026#34;example.com\u0026#34;, \u0026#34;net.home\u0026#34; Alors nous avons besoin de paramétrer Unbound pour gérer nos adresses IP fixes. Dans cet exemple, nous avons seulement le serveur web, mais nous pouvons utiliser autant d\u0026rsquo;hôtes que nécessaires. Vous pouvez juste éditer le fichier de configuration principale d\u0026rsquo;Unbound, mais je préfére mettre cela dans un fichier séparé et l\u0026rsquo;inclure dans le fichier principal. Créez un nouveau fichier appelé tel que /var/unbound/etc/unbound-local.conf, par exemple, et paramétrez vos hôtes :\nlocal-data: \u0026#34;lilo.example.com IN A 192.168.3.2\u0026#34; local-data-ptr: \u0026#34;192.168.3.2 lilo.example.com\u0026#34; Ou, si vous utilisez la version net.home :\nlocal-data: \u0026#34;lilo.net.home IN A 192.168.3.2\u0026#34; local-data-ptr: \u0026#34;192.168.3.2 lilo.net.home\u0026#34; Notez comment l\u0026rsquo;adresse IP dans le champ local-data-ptr est retourné, ce qui n\u0026rsquo;est pas une erreur.\nAjoutez alors ce qui suit à notre /var/unbound/etc/unbound.conf :\nprivate-address: 192.168.0.0/16 private-domain: example.com # Use net.home instead if you need that. include: \u0026#34;/var/unbound/etc/unbound-local.conf\u0026#34; Redémarrez dhcpd et Unbound :\n# rcctl restart dhcpd # rcctl restart unbound Si vous retirez le câble Ethernet de l\u0026rsquo;un des ordinateurs connectés à l\u0026rsquo;un des LAN et le connectez à nouveau, vous serez notifié que /etc/resolv.conf a ajouté l\u0026rsquo;option domain :\ndomain example.com nameserver 192.168.1.1 Vous pouvez étendre cet exemple ci-dessus à de multiples domaines et de multiples dans tous les segments.\nAjouter pf-badhost Lorsque vous avez paramétré votre routeur OpenBSD, je vous encourage fortement à paramétrer pf-badhost !\npf-badhost est un script de sécurité léger fait par Jordan Geoghegan qui bloque les plus grandes choses irritantes d\u0026rsquo;Internet. Les désagréments tels les brute-forceurs SSH et SMTP sont largement éliminés par ce script.\npf-badhost ajoute périodiqument des addresses IP depuis des bases de données de spammeurs d\u0026rsquo;IP bien connus, tel Spamhaus, Firehol, Emerging Threats and Binary Defense, où ces mauvaises adressses IP sont fréquemment journalisées. pf-badhost les ajoute alors aux adresses IP collectées vers le pare-feu PF dans une table qui est bloquée par défaut.\nLectures recommandées OpenBSD PF - User\u0026rsquo;s Guide de la FAQ d\u0026rsquo;OpenBSD (et sa version FR : Guide de l\u0026rsquo;Utilisateur PF officieuse) Absolute OpenBSD, 2nd edition de Michael Warren Lucas. Certaines syntaxes de PF ont déjà changées depuis que Michael a écrit le livre, mais il est toujours très utile. Networking for System Administrators de Michael Warren Lucas. OpenBSD and You Stop using ridiculously low DNS TTLs Comment contribuer à ce guide ? Veuillez considérer de contribuer si vous avez n\u0026rsquo;importe quel commentaire, correction, ou changement que vous considéré comme approprié.\nFaites un clone sur Github Soumettez un PR pour examen Vous pouvez aussi juste envoyer un courriel.\nTraductions de ce guide Veuillez noter que les traductions listées ici sont commitées par d\u0026rsquo;autres personnes contribuant généreusement à ce guide. De fait, je ne suis pas responsable de garder à jour ces traductions.\nFrançais Créé et maintenu par\nUnix Sheikh\nLe Guide du Routeur OpenBSD est sous licence Creative Commons Attribution 4.0 International.\nSi vous trouvez ce contenu utile, soutenez-moi sur Patreon.\nContribuer à la version FR Cette version traduite du Guide du Routeur OpenBSD est faite par mes soins.\nVous pouvez contribuer au-travers de mon dépôt Framagit.org.\nPar facilité, cette traduction est placée aussi sous licence Creative Commons Attribution 4.0 International.\nVous pouvez soutenir mon effort de traduction en me payant un bon café à l\u0026#39;italienne comme je les \u0026lt;3 … :D\n",
            "content_html": "\u003ch1 id=\"guide-du-routeur-openbsd\"\u003eGuide du Routeur OpenBSD\u003c/h1\u003e\n\u003cp\u003ePare-feu segmentant un réseau, avec DHCP, DNS (Unbound), blocage de domaine\net bien plus encore.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD: 6.9 · Publié : 2020-11-05 · Mis-à-jour : 2021-07-21 · Version : 1.9.4\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eDans ce guide, nous verrons comment nous pouvons utiliser du matériel\n\u0026ldquo;bas de gamme\u0026rdquo; bon marché pour construire un routeur OpenBSD terrible\navec des capacités de pare-feu, des réseaux locaux segmentés, du DNS\navec blocage de noms de domaines, du DHCP et bien plus.\u003c/p\u003e\n\u003cp\u003eNous commencerons par paramétrer les segments réseaux (LAN) par trois\nréseaux séparés, un pour les adultes à la maison, un pour les enfants\net un pour les serveurs face à Internet (comme une \u003ca href=\"https://fr.wikipedia.org/wiki/Zone_d%C3%A9militaris%C3%A9e_(informatique)\" rel=\"external\"\u003eDMZ\u003c/a\u003e),\ntel qu\u0026rsquo;un serveur web ou serveur mail privé.\nNous chercherons à voir comment nous pouvons utiliser DNS pour bloquer\nles publicités, le porno, et d\u0026rsquo;autres sites sur Internet. Le routeur OpenBSD\npeut aussi être utilisé dans de petites ou moyennes entreprises.\u003c/p\u003e\n\u003ch2 id=\"conventions-typographiques-utilisées-dans-ce-guide\"\u003eConventions typographiques utilisées dans ce guide\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa police à \u003ccode\u003elargeur fixe\u003c/code\u003e (mono-espacement) est utilisée pour les commandes\nen console, les noms de fichiers et leurs chemins, les paramètres de\nconfiguration, etc…\u003c/li\u003e\n\u003cli\u003eLes commandes en console qui doivent être tapées en tant qu\u0026rsquo;utilisateur\n\u003ccode\u003eroot\u003c/code\u003e sont préfixées du symbole dièse \u003ccode\u003e#\u003c/code\u003e et la commande apparaît en\n\u003cstrong\u003egras\u003c/strong\u003e dans le texte.\u003c/li\u003e\n\u003cli\u003eLes commandes en console qui doivent être tapées en tant qu\u0026rsquo;utilisateur\nnormal sont préfixées du symbole dollar \u003ccode\u003e$\u003c/code\u003e et la commande apparaît en\n\u003cstrong\u003egras\u003c/strong\u003e dans le texte.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"pourquoi-un-pare-feu-\"\u003ePourquoi un pare-feu ?\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eActuellement ce guide aborde IPv4, car la plupart des personnes\nn\u0026rsquo;utilisent pas IPv6 et beaucoup de FAI - \u003cem\u003eFournisseur d\u0026rsquo;Accès à Internet\u003c/em\u003e -\nutilisent seulement IPv4, mais IPv6 est planifié dans le contexte d\u0026rsquo;une\nfuture mise à jour de ce guide.\u003c/div\u003e\n\n\u003cp\u003ePeu importe comment vous vous connectez à Internet depuis votre domicile\nou votre bureau, vous avez besoin d\u0026rsquo;un vrai pare-feu entre vous et le modem\nou routeur que vous fourni votre FAI.\u003c/p\u003e\n\u003cp\u003eIl est très rare que les modems ou routeurs grand public reçoivent des\nmises à jour du micrologiciel et sont souvent vulnérables aux attaques\nréseau qui transforment ces appareils en \u003ca href=\"https://fr.wikipedia.org/wiki/Botnet\" rel=\"external\"\u003eBotnet\u003c/a\u003e,\ntel que le fait le \u003ca href=\"https://fr.wikipedia.org/wiki/Mirai_(logiciel_malveillant)\" rel=\"external\"\u003elogiciel malveillant Mirai\u003c/a\u003e.\nDe nombreux modems et routeurs grand public sont à blâmer à propos de\ncertaines \u003ca href=\"https://fr.wikipedia.org/wiki/Attaque_par_d%C3%A9ni_de_service\" rel=\"external\"\u003eattaques par déni de service de grande envergure (DOS)\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eUn pare-feu entre vous et le modem ou routeur de votre FAI ne peut pas\nprotéger votre dispositif modem ou routeur contre de telles attaques,\nmais il peut protéger vos ordinateurs et dispositifs à l\u0026rsquo;intérieur du\nréseau, et il peut vous aider à surveiller et contrôler le trafic qui\narrive vers votre réseau local et qui en part.\u003c/p\u003e\n\u003cp\u003eSans un pare-feu entre votre réseau local et le modem ou routeur du FAI,\nvous pouvez considérer basiquement que votre porte est grande ouverte,\ncomme laisser grande ouverte la porte de votre maison, ainsi vous ne pouvez\npas faire confiance en l\u0026rsquo;équipement de votre FAI.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est toujours réellement une bonne idée de mettre un vrai pare-feu entre\nvotre réseau local et Internet, et avec OpenBSD vous avez une solution très\nsolide.\u003c/p\u003e\n\u003ch2 id=\"le-matériel\"\u003eLe Matériel\u003c/h2\u003e\n\u003cp\u003eVous n\u0026rsquo;avez pas besoin d\u0026rsquo;acheter du matériel cher pour avoir un routeur\net un pare-feu efficaces pour votre maison ou votre bureau.\nMême avec du matériel \u0026ldquo;bas de gamme\u0026rdquo; bon marché, vous pouvez avoir une\nsolution très solide.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai créé de multiples solutions avec la carte-mère\n\u003ca href=\"https://www.asrock.com/mb/Intel/Q1900DC-ITX/\" rel=\"external\"\u003eASRock Q1900DC-ITX\u003c/a\u003e qui est\nfournie avec un processeur Intel Celeron Quadri-Cœur.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/unixsheikh.com/asrock-q1900dc-itx.png\" title=\"ASRock Q1900DC-ITX\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/unixsheikh.com/asrock-q1900dc-itx_hu_f0044d031839a37e.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"ASRock Q1900DC-ITX\" height=\"407\" loading=\"lazy\" src=\"/images/unixsheikh.com/asrock-q1900dc-itx.png\" type=\"image/png\" width=\"600\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eASRock Q1900DC-ITX\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eJe l\u0026rsquo;admet, c\u0026rsquo;est une carte-mère assez \u0026ldquo;pourrie\u0026rdquo;, mais elle fait le boulot\net j\u0026rsquo;ai de nombreuses solutions très solides qui fonctionnent depuis de\nnombreuses années sur des réseaux Gigabit avec saturation complète et le\npare-feu, DNS, faisant des \u0026ldquo;heures supplémentaires\u0026rdquo; et où le CPU ne chauffe\npas.\u003c/p\u003e\n\u003cp\u003eLa carte-mère ASRock Q1900DC-ITX a pour avantage qu\u0026rsquo;elle est fournie\navec une prise jack DC-In (entrée électrique) qui est compatible avec\nun adaptateur électrique 9-19V, ce qui la rend très économe en énergie.\nMalheureusement, la carte-mère ASRock Q1900DC-ITX n\u0026rsquo;est plus fabriquée,\nmais comme je l\u0026rsquo;utilise juste comme exemple ;\nj\u0026rsquo;ai utilisé de nombreuses autres carte-mères bon marché tout aussi bien.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eBeaucoup d\u0026rsquo;autres carte-mères faites par d\u0026rsquo;autres fabricants\nconsommant peu peuvent être aussi bien utilisées, tel le fameux \u003ca href=\"https://www.pcengines.ch/apu2.htm\" rel=\"external\"\u003eAPU2\u003c/a\u003e.\u003c/div\u003e\n\n\u003cp\u003eJ\u0026rsquo;ai aussi utilisé l\u0026rsquo;ASRock Q1900-ITX (qui est fournie sans la prise jack\nDC-In) combinée à un PicoPSU.\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/unixsheikh.com/picopsu.png\" title=\"PicoPSU\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/unixsheikh.com/picopsu_hu_609d0d0705dd62f6.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"PicoPSU\" height=\"284\" loading=\"lazy\" src=\"/images/unixsheikh.com/picopsu.png\" type=\"image/png\" width=\"314\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003ePicoPSU\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eVous pouvez trouvez différentes marques et version du PicoPSU, certains\nsont de meilleurs qualités que d\u0026rsquo;autres. J\u0026rsquo;ai deux marques différentes,\nl\u0026rsquo;original et une copie moins chère, toutes deux sont très performants et\npermettent d\u0026rsquo;économiser par mal d\u0026rsquo;énergie contrairement à une alimentation\nnormale.\u003c/p\u003e\n\u003cp\u003eEnfin, j\u0026rsquo;utilise une carte réseau quadruple port Intel bon marché, trouvé\nsur Ebay, tel que celle-ci :\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/unixsheikh.com/intel-quad-nic.png\" title=\"Quad NIC Intel\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/unixsheikh.com/intel-quad-nic_hu_b0883f95cbee7a05.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Quad NIC Intel\" height=\"215\" loading=\"lazy\" src=\"/images/unixsheikh.com/intel-quad-nic.png\" type=\"image/png\" width=\"368\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eQuad NIC Intel\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eJe sais, il est préférable d\u0026rsquo;utiliser du matériel de qualité, spécifiquement\nsur un réseau dont vous avez à prendre soin, mais ce tutoriel est relatif\nau fait de comment vous pouvez vous en sortir en utilisant du matériel\nbon marché tout en ayant un produit extrêmement utile qui continue à bien\nvous servir pendant de nombreuses années - du moins, telle est mon expérience.\u003c/p\u003e\n\u003cp\u003eJe vous recommande de chercher une carte mini-ITX dont le matériel est\n\u003ca href=\"https://www.openbsd.org/amd64.html\" rel=\"external\"\u003epris en charge par OpenBSD\u003c/a\u003e, tel qu\u0026rsquo;un\nCPU Intel Celeron ou Intel i3. Ces cartes-mères sont typiquement peu chères,\npeu gourmandes d\u0026rsquo;énergie, et ne prennent pas beaucoup de place.\nJe ne recommande pas l\u0026rsquo;utilisation d\u0026rsquo;un CPU Intel Atom si vous avez un réseau\nGigabit, car il ne peut pas gérer la quantité de trafic.\u003c/p\u003e\n\u003cp\u003eVous pourriez également avoir besoin de quelques commutateurs Gigabit\nbon marché pour segmenter votre réseau local, au moins si vous avez plus\nd\u0026rsquo;un ordinateur connecté sur le même LAN :)\u003c/p\u003e\n\u003ch2 id=\"pourquoi-openbsd-\"\u003ePourquoi OpenBSD ?\u003c/h2\u003e\n\u003cp\u003eEn vérité, vous pouvez avoir le même paramétrage avec une autre saveur\nBSD ou une des différentes \u003ca href=\"https://fr.wikipedia.org/wiki/Distribution_Linux\" rel=\"external\"\u003edistributions Linux\u003c/a\u003e,\nmais \u003ca href=\"https://www.openbsd.org/\" rel=\"external\"\u003eOpenBSD\u003c/a\u003e est spécifiquement très bien\nadapté et conçu pour ce genre de tâche.\nNon seulement il est livré avec tous les logiciels nécessaires dans\nl\u0026rsquo;installation de base, mais il offre également une sécurité nettement\nsupérieure, et des tonnes de mesure d\u0026rsquo;atténuation améliorées déjà intégrées\ndans le système d\u0026rsquo;exploitation.\nJe \u003ca href=\"https://www.unixsheikh.com/articles/openbsd-is-fantastic.html\" rel=\"external\"\u003erecommande chaudement\u003c/a\u003e\nOpenBSD plutôt que tout autre système d\u0026rsquo;exploitation pour ce genre de\ntâches.\u003c/p\u003e\n\u003cp\u003eCe guide ne vous montre pas comment installer OpenBSD.\nSi vous ne savez pas faire, je vous recommande de faire fonctionner une\nmachine virtuelle avant ou de voir si vous avez du matériel inutilisé et\npris en charge avec lequel vous pourriez tester.\nOpenBSD est un des systèmes d\u0026rsquo;exploitations des plus faciles et rapides à\ninstaller.\nN\u0026rsquo;ayez pas peur de l\u0026rsquo;approche sans GUI (interface utilisateur) ; une fois\nque vous l\u0026rsquo;avez essayé, vous apprécierez vraiment sa simplicité.\nDans le doute, utilisez les paramètres par défaut.\u003c/p\u003e\n\u003cp\u003eAvant de commencer ce voyage, assurez-vous de consulter la documentation\nd\u0026rsquo;OpenBSD !\nNon seulement, chaque chose est très bien documentée, mais vous trouverez\ntrès probablement toutes les réponses dont vous avez besoin.\nLisez la \u003ca href=\"https://www.openbsd.org/faq/index.html\" rel=\"external\"\u003eFAQ OpenBSD\u003c/a\u003e,\nregardez les différentes \u003ca href=\"https://man.openbsd.org/\" rel=\"external\"\u003epages de manuels\u003c/a\u003e à\npropos des différents logiciels que nous allons utiliser.\u003c/p\u003e\n\u003cp\u003eUn autre endroit vraiment utile où trouver des informations générales à\npropos d\u0026rsquo;OpenBSD sont les \u003ca href=\"https://marc.info/?l=openbsd-misc\" rel=\"external\"\u003earchives des listes de diffusions d\u0026rsquo;OpenBSD\u003c/a\u003e.\nAussi assurez-vous de rester à jour des informations pertinentes en\nsouscrivant à la liste de diffusion des \u003ca href=\"https://www.openbsd.org/mail.html\" rel=\"external\"\u003eAnnonces et avis de sécurité\u003c/a\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eVeuillez considérer de \u003ca href=\"https://www.openbsd.org/donations.html\" rel=\"external\"\u003esoutenir OpenBSD\u003c/a\u003e !\nMême si vous n\u0026rsquo;utilisez pas quotidiennement OpenBSD, vous\nutilisez peut-être déjà \u003ca href=\"https://www.openssh.com/\" rel=\"external\"\u003eOpenSSH\u003c/a\u003e sur Linux,\nalors vous utilisez vraiment un logiciel du projet OpenBSD.\nConsidérez de faire un petit, mais régulier, don pour soutenir le développement\nde tous les excellents logiciels que les développeurs d\u0026rsquo;OpenBSD font.\u003c/div\u003e\n\n\u003ch2 id=\"le-réseau\"\u003eLe réseau\u003c/h2\u003e\n\u003cp\u003eUn routeur est basiquement un dispositif qui régule le trafic réseau entre\ndeux ou plusieurs réseaux séparés.\nLe routeur garantira que le trafic réseau à destination du réseau local\nne circule pas sur Internet, et que le trafic sur Internet, qui n\u0026rsquo;est pas\nà destination de votre réseau local, reste sur Internet.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eUn routeur est parfois aussi appelé passerelle, ce qui est généralement\nle terme, mais en vérité une véritable passerelle joint des systèmes\ndifférents, alors qu\u0026rsquo;un routeur joint des réseaux similaires.\nUn exemple de passerelle serait un dispositif qui joint un réseau PC avec\nun réseau télécom.\u003c/div\u003e\n\n\u003cp\u003eDans ce tutoriel, nous construirons un routeur et nous avons 4 réseaux\nde même type à faire travailler ensemble.\nL\u0026rsquo;un est Internet, et les trois autres sont segmentés intentionnellement\nen réseaux locaux (LAN).\nCertaines personnes préfèrent travailler avec des LAN virtuels (VLAN),\nmais dans ce tutoriel nous utiliserons une interface réseau 4 ports,\ntelle que vue sur l\u0026rsquo;illustration ci-dessus.\nVous pouvez arriver au même résultat en utilisant de multiples cartes réseau\nà port unique, si vous préférez ; vous devez juste vous assurez d\u0026rsquo;avoir\nassez de place et de slot PCI libre sur la carte-mère.\nVous pouvez aussi utiliser le port Ethernet de la carte-mère, mais cela\ndépend du pilote et de la prise en charge du dispositif.\nJe n\u0026rsquo;ai pas de problème à utiliser un contrôleur Ethernet Gigabit PCI Realtek\nqui est fourni avec beaucoup de carte-mères, bien que je recommande plutôt Intel.\u003c/p\u003e\n\u003cp\u003eBien sûr, vous n\u0026rsquo;avez pas à segmenter le réseau en de nombreuses parties\nsi vous n\u0026rsquo;avez pas besoin de cela, et il serait très facile de changer les\nparamètres de ce guide, mais j\u0026rsquo;ai décidé d\u0026rsquo;utiliser cette approche avant\nde vous montrer comment vous pouvez protéger vos enfants en segmentant\nleur réseau dans un LAN séparé qui permet non seulement de bloquer la\npublicité et la pornographie grâce au blocage des DNS (tous les segments\nen bénéficient), mais vous pouvez même mettre sur une liste blanche les\npartie de l\u0026rsquo;Internet auxquelles vous voulez qu\u0026rsquo;ils aient accès.\nLa dernière partie à propos des listes blanches est difficile et n\u0026rsquo;est\ngénéralement pas recommandé à moins que vos enfants aient besoin d\u0026rsquo;un\naccès très limité, mais c\u0026rsquo;est faisable avec un peu de travail, et le guide\nva vous montrer une façon de faire.\u003c/p\u003e\n\u003cp\u003eCeci est une illustration du réseau que nous allons paramétrer :\u003c/p\u003e\n\u003cpre\u003e\n                       Internet\n                          |\n                    xxx.xxx.xxx.xxx\n                    Modem FAI (WAN)\n                      10.24.0.23\n                          |\n                       OpenBSD\n                      10.24.0.50\n                  (routeur/parefeu)\n                          |\n     ┌────────────────────+────────────────────┐\n     |                    |                    |\n    NIC1                 NIC2                 NIC3 (DMZ)\n192.168.1.1          192.168.2.1          192.168.3.1\nLAN1 switch          LAN2 switch          LAN3 switch\n     |                    |                    |\n     └─ 192.168.1.x       ├─ 192.168.2.x       └─ 192.168.3.2\n        PC Adultes        |  PC1 Enfant            Public web server\n                          |\n                          └─ 192.168.2.x\n                             PC2 Enfant\n\u003c/pre\u003e\n\u003cp\u003eLes adresses IP qui commencent par 10.24.0 sont n\u0026rsquo;importe quelle adresse\nIP que le routeur ou modem de votre FAI vous donne ; elles peuvent être\ntrès différentes. Les adresses IP commençant par 192.168 sont les adresses\nIP que nous allons utiliser dans ce guide pour notre réseau local (LAN).\u003c/p\u003e\n\u003cp\u003eCe guide ne s\u0026rsquo;occupe en aucun cas de connectivité Wifi.\nLes micrologiciels des puces sans fil sont notoirement bogués et exploitables ;\nje vous recommande de n\u0026rsquo;utiliser aucun type de connectivité sans fil, si\nvous pouvez vous en passer.\nSi vous avez besoin de la connectivité sans fil, je recommande chaudement\nque vous désactiviez l\u0026rsquo;accès Wifi du modem ou routeur du FAI (si possible),\net ensuite d\u0026rsquo;acheter le meilleur routeur Wifi que vous pouvez trouver puis\nde le mettre derrière le pare-feu dans un segment isolé.\nAinsi, si jamais votre appareil sans fil est compromis, vous pourrez mieux\ncontrôler le résultat et limiter les dégâts.\nVous pouvez en outre configurer le routeur sans fil de telle sorte que\ntout appareil, qui y est connecté, dispose de ses propres adresses IP\nqui passent directement par le routeur sans fil, tout en bloquant le\ntrafic provenant du routeur sans fil lui-même.\nDe cette façon, vous pouvez empêcher le routeur sans fil de \u0026ldquo;téléphoner à la maison\u0026rdquo;.\nVous pouvez aussi avoir un adaptateur Wifi supporté par OpenBSD et que\nvotre routeur OpenBSD agisse en tant que point d\u0026rsquo;accès, toutefois je préfère\nde beaucoup segmenter la partie Wifi soit par un routeur sans fil séparé,\nsoit par une autre machine OpenBSD servant de point d\u0026rsquo;accès Wifi derrière\nle pare-feu lui-même.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eActuellement, autant que je le sache, aucun des pilotes Wifi d'\nOpenBSD ne posent pas encore de problèmes.\u003c/div\u003e\n\n\u003ch3 id=\"paramétrer-le-réseau\"\u003eParamétrer le réseau\u003c/h3\u003e\n\u003cp\u003eLa première chose que nous allons paramétrer sont les différentes interfaces\nréseaux de notre routeur OpenBSD.\nSur ma machine, j\u0026rsquo;ai désactivé l\u0026rsquo;interface réseau qui est livré avec la\ncarte-mère via le BIOS, et je n\u0026rsquo;utilise que l\u0026rsquo;interface réseau 4 ports d\u0026rsquo;Intel.\u003c/p\u003e\n\u003cp\u003eSi vous suivez ce tutoriel et que vous souhaitez seulement un pare-feu\nbasique alors vous avez au moins besoin de deux interfaces réseaux séparées.\u003c/p\u003e\n\u003cp\u003eAvant de commencer, assurez-vous de lire et de comprendre les différentes\noptions de la page de manuel \u003ca href=\"https://man.openbsd.org/hostname.if\" rel=\"external\"\u003ehostname.if\u003c/a\u003e.\nPrenez aussi le temps de lire la section réseau de la \u003ca href=\"https://www.openbsd.org/faq/faq6.html\" rel=\"external\"\u003eFAQ d\u0026rsquo;OpenBSD\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003ePuisque j\u0026rsquo;utilise Intel, le pilote \u003ca href=\"https://man.openbsd.org/em\" rel=\"external\"\u003eem\u003c/a\u003e est\ncelui qu\u0026rsquo;OpenBSD charge sur chacun des ports de cette interface réseau,\nqui sont listés comme étant des cartes séparées.\nCela signifie que chaque carte est listée en tant qu\u0026rsquo;\u003ccode\u003eemX\u003c/code\u003e où X est le\nnuméro actuel du port de la carte.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003edmesg\u003c/code\u003e liste ma carte réseau avec 4 ports de telle manière :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# dmesg\nem0 at pci2 dev 0 function 0 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:b8\nem1 at pci2 dev 0 function 1 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:b9\nem2 at pci2 dev 0 function 2 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:ba\nem3 at pci2 dev 0 function 3 \u0026#34;Intel I350\u0026#34; rev 0x01: msi, address a0:36:9f:a1:66:bb\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCe qui montre que ma carte est reconnu comme étant une Intel I350-T4 PCI Express Quad Port Gigabit NIC.\u003c/p\u003e\n\u003cp\u003eIl faut ensuite déterminer quel est le port correspondant physiquement au\nnuméro indiqué ci-dessus.\nVous pouvez le faire en connectant manuellement un câble Ethernet, connecté\nsur un commutateur actif, un modem ou un routeur, sur chacun des ports,\nun à la fois, afin de voir quel port est activé et le noter ensuite quelque part.\u003c/p\u003e\n\u003cp\u003eVous pouvez vérifier le statuts d\u0026rsquo;activité avec la commande \u003ccode\u003eifconfig\u003c/code\u003e.\nUn port sans câble Ethernet sera listé comme ayant le champ \u003ccode\u003estatus\u003c/code\u003e notifié\n\u003ccode\u003eno carrier\u003c/code\u003e alors qu\u0026rsquo;un port avec un câble attaché sera listé en \u003ccode\u003eactive\u003c/code\u003e.\nTel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# ifconfig\nem1: flags=8843\u0026lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST\u0026gt; mtu 1500\n        lladdr a0:36:9f:a1:66:b9\n        index 2 priority 0 llprio 3\n        media: Ethernet autoselect (none)\n        status: active\nem2: flags=8843\u0026lt;UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST\u0026gt; mtu 1500\n        lladdr a0:36:9f:a1:66:ba\n        index 3 priority 0 llprio 3\n        media: Ethernet autoselect (none)\n        status: no carrier\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNous allons utiliser le port \u003ccode\u003eem0\u003c/code\u003e afin de le connecter au modem ou routeur\nde votre FAI, vers Internet.\nDans mon cas, j\u0026rsquo;ai une adresse IP publique fournie par mon FAI ; vous en\naurez besoin si vous voulez faire fonctionner un serveur web depuis votre\nmaison, mais si ce n\u0026rsquo;est pas le cas, vous n\u0026rsquo;en avez pas besoin, ainsi vous\npouvez paramétrer la carte par DHCP.\u003c/p\u003e\n\u003cp\u003eDans mon cas, j\u0026rsquo;ai besoin de spécifier une adresse IP fixe pour \u003ccode\u003eem0\u003c/code\u003e qui\nrecevra alors le trafic redirigé depuis mon FAI vers mon adresse IP publique.\nPour faire cela, je paramètre \u003ccode\u003eem0\u003c/code\u003e avec l\u0026rsquo;information suivante :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# echo \u0026#39;inet 10.24.0.50 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em0\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous n\u0026rsquo;avez pas besoin d\u0026rsquo;une adresse IP publique et que votre adresse\nIP est obtenue par votre FAI via DHCP, alors écrivez juste \u003ccode\u003edhcp\u003c/code\u003e à la place :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# echo \u0026#39;dhcp\u0026#39; \u0026gt; /etc/hostname.em0\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnsuite, je paramètre le reste des ports de l\u0026rsquo;interface réseau avec leurs\nadresses IP, tel que je l\u0026rsquo;ai précédemment illustré.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# echo \u0026#39;inet 192.168.1.1 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em1\n# echo \u0026#39;inet 192.168.2.1 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em2\n# echo \u0026#39;inet 192.168.3.1 255.255.254.0 NONE\u0026#39; \u0026gt; /etc/hostname.em3\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRegardez la page du manuel \u003ca href=\"https://man.openbsd.org/hostname.if\" rel=\"external\"\u003ehostname.if\u003c/a\u003e\npour avoir plus d\u0026rsquo;informations.\u003c/p\u003e\n\u003cp\u003eEnsuite, j\u0026rsquo;ai besoin de paramétrer l\u0026rsquo;IP de la passerelle du FAI.\nSelon le paramétrage de votre FAI, cela peut être une autre adresse IP que\ncelle du modem ou routeur du FAI.\nSi vous n\u0026rsquo;ajoutez pas le fichier \u003ccode\u003e/etc/mygate\u003c/code\u003e alors aucune passerelle par\ndéfaut ne sera ajouté à la \u003ca href=\"https://fr.wikipedia.org/wiki/Table_de_routage\" rel=\"external\"\u003etable de routage\u003c/a\u003e.\nVous n\u0026rsquo;avez pas besoin de \u003ccode\u003e/etc/mygate\u003c/code\u003e si votre IP est fournie par le\nmodem ou routeur de votre FAI via DHCP.\nSi vous utilisez la directive \u003ccode\u003edhcp\u003c/code\u003e dans n\u0026rsquo;importe quel fichier \u003ccode\u003ehostname.ifX\u003c/code\u003e\nalors l\u0026rsquo;entrée dans le fichier \u003ccode\u003e/etc/mygate\u003c/code\u003e sera ignorée.\nCela est parce que la carte obtient son adresse IP depuis un serveur DHCP\nqui fournira aussi l\u0026rsquo;information de routage vers la passerelle.\u003c/p\u003e\n\u003cp\u003eEnfin, mais pas des moindres, nous avons besoin d\u0026rsquo;activer la redirection IP.\nLa redirection IP est le processus qui dirige les paquets IP qui voyagent\nentre les interfaces réseaux du routeur.\nPar défaut, OpenBSD ne fera pas de redirection des paquets IP entre les\ndifférentes interfaces réseaux.\nEn d\u0026rsquo;autres mots, les fonctions de routage (appelées aussi fonctions de\npasserelles) sont désactivées.\u003c/p\u003e\n\u003cp\u003eNous pouvons activer la redirection d\u0026rsquo;IP en utilisant les commandes suivantes :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# sysctl net.inet.ip.forwarding=1\n# echo \u0026#39;net.inet.ip.forwarding=1\u0026#39; \u0026gt;\u0026gt; /etc/sysctl.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMaintenant OpenBSD sera capable de rediriger les paquets IPv4 depuis une\ninterface réseau vers une autre.\nOu, tel dans notre cas avec les 4 ports, d\u0026rsquo;un port à l\u0026rsquo;autre.\nRegardez la page du manuel si vous avez besoin d\u0026rsquo;IPv6.\u003c/p\u003e\n\u003ch2 id=\"dhcp\"\u003eDHCP\u003c/h2\u003e\n\u003cp\u003eMaintenant nous sommes prêts à paramétrer le service \u003ca href=\"https://fr.wikipedia.org/wiki/Dynamic_Host_Configuration_Protocol\" rel=\"external\"\u003eDHCP\u003c/a\u003e\nque nous exécuterons pour nos différents PC et dispositifs attachés aux\ndifférents LAN.\nAvant, assurons-nous de lire et de comprendre les différentes options de\nla page du manuel \u003ca href=\"https://man.openbsd.org/dhcpd.conf\" rel=\"external\"\u003edhcp.conf\u003c/a\u003e.\nPrenons aussi le temps de regarder la page de manuel \u003ca href=\"https://man.openbsd.org/dhcp-options\" rel=\"external\"\u003edhcp-options\u003c/a\u003e\nà propos des options que prend en charge dhcpd.\u003c/p\u003e\n\u003cp\u003eNous avons une option pour cacher des adresses IP à de PC ou dispositifs\nspécifiques qui se connectent sur nos différents ports.\nCela est nécessaire si nous voulons rediriger le trafic qui vient d\u0026rsquo;Internet\nvers quelque chose comme un serveur web.\nNous pouvons cacher une adresse IP spécifique vers un PC spécifique via\nl\u0026rsquo;adresse \u003ca href=\"https://en.wikipedia.org/wiki/MAC_address\" rel=\"external\"\u003eMAC\u003c/a\u003e de l\u0026rsquo;interface\nréseau de la machine concernée.\u003c/p\u003e\n\u003cp\u003eDans ce cas, je réserverais toutes les adresses IP dans un ensemble allant\nde 10 à 254 pour le DHCP, tandis que je laisserais les autres qui restent\npour les éventuelles adresses fixes dont je pourrais avoir besoin.\u003c/p\u003e\n\u003cp\u003eÉditer le fichier \u003ccode\u003e/etc/dhcpd.conf\u003c/code\u003e avec votre éditeur de texte favori et\nadapter le à vos besoins.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esubnet 192.168.1.0 netmask 255.255.255.0 {\n    option domain-name-servers 192.168.1.1;\n    option routers 192.168.1.1;\n    range 192.168.1.10 192.168.1.254;\n}\nsubnet 192.168.2.0 netmask 255.255.255.0 {\n    option domain-name-servers 192.168.2.1;\n    option routers 192.168.2.1;\n    range 192.168.2.10 192.168.2.254;\n}\nsubnet 192.168.3.0 netmask 255.255.255.0 {\n    option domain-name-servers 192.168.3.1;\n    option routers 192.168.3.1;\n    range 192.168.3.10 192.168.3.254;\n    host web.example.com {\n        fixed-address 191.168.3.2;\n        hardware ethernet 61:20:42:39:61:AF;\n        option host-name \u0026#34;webserver\u0026#34;;\n    }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLa ligne \u003ccode\u003eoption domain-name-servers\u003c/code\u003e spécifie le serveur DNS que nous allons\nfaire fonctionner sur notre routeur.\u003c/p\u003e\n\u003cp\u003eDe plus l\u0026rsquo;ordinateur qui est notre serveur web sur le LAN publique\na une adresse IP fixe et un nom d\u0026rsquo;hôte fixé.\u003c/p\u003e\n\u003cp\u003eDe même, si vous ne voulez pas segmenter le réseau en différentes parties,\nmais que vous avez seulement besoin d\u0026rsquo;un LAN alors vous pouvez juste laisser\nde côté les autres sous-réseaux pour avoir juste cela :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esubnet 192.168.1.0 netmask 255.255.255.0 {\n    option domain-name-servers 192.168.1.1;\n    option routers 192.168.1.1;\n    range 192.168.1.10 192.168.1.254;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnsuite, nous avons simplement besoin de nous assurer d\u0026rsquo;activer et de démarrer\nle service \u003ccode\u003edhcpd\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rcctl enable dhcpd\n# rcctl start dhcpd\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eRegardez le chapitre\n\u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#ajouter-l\u0026#39;option-domain-name-à-dhcp-et-utiliser-un-fqdn\"\u003eAjouter l\u0026rsquo;option domain-name à DHCP et utiliser un FQDN\u003c/a\u003e dans\nl\u0026rsquo;appendice pour savoir comment ajouter facilement un\n\u003ca href=\"https://fr.wikipedia.org/wiki/Fully_qualified_domain_name\" rel=\"external\"\u003enom de domaine pleinement qualifié (FQDN)\u003c/a\u003e\nà votre paramétrage et comment vous pouvez utiliser l\u0026rsquo;option \u003ccode\u003edomain-name\u003c/code\u003e\ndans DHCP afin d\u0026rsquo;éviter à avoir à écrire le FQDN à chaque fois que vous\nen avez besoin.\nCe chapitre vous montrera aussi comment vous pouvez éviter d\u0026rsquo;avoir à vous\nsouvenir des adresses IP si votre LAN a de multiples ordinateurs ou\ndispositifs connectés.\u003c/div\u003e\n\n\u003ch2 id=\"pf---un-pare-feu-filtrant\"\u003ePF - un pare-feu filtrant\u003c/h2\u003e\n\u003cp\u003eUn pare-feu filtrant examine chaque paquet qui croise le pare-feu et décide\nquel paquet accepter ou refuser, selon l\u0026rsquo;examen des champs dans l\u0026rsquo;IP et\nles entêtes de protocole du paquet, et selon l\u0026rsquo;ensemble des règles que\nvous spécifiez.\u003c/p\u003e\n\u003cp\u003eLe filtrage de paquets fonctionne par inspection des adresses IP et du\nport source et de destination contenus dans chaque paquet du protocole\nTCP/IP (Transmission Control Protocol / Internet Protocol).\nLes ports TCP/IP sont des numéros assignés à des services spécifiques\nqui identifie pour quel service chaque paquet est destiné.\u003c/p\u003e\n\u003cp\u003eUne faiblesse commune des pare-feux simples à filtrage de paquets est que\nle pare-feu examine chaque paquet de manière isolée sans tenir compte des\npaquets qui ont déjà traversé le pare-feu et de ceux qui pourraient le\nsuivre.\nIls sont appelés pare-feu \u0026ldquo;sans état\u0026rdquo;.\nExploiter un filtrage de paquets sans état est assez facile.\nPF d\u0026rsquo;OpenBSD \u003cstrong\u003en\u0026rsquo;est pas\u003c/strong\u003e un pare-feu sans états, c\u0026rsquo;est un\n\u003ca href=\"https://fr.wikipedia.org/wiki/Pare-feu_%C3%A0_%C3%A9tats\" rel=\"external\"\u003epare-feu à états\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUn pare-feu à états garde trace des connexions ouvertes et permet seulement\nle trafic correspondant à une connexion existante ou ouvre une nouvelle\nconnexion permise.\nQuand l\u0026rsquo;état est spécifié par une règle correspondante, le pare-feu génère\ndynamiquement des règles internes pour que chaque paquet anticipé puisse\nêtre échangé durant la session.\nIl a suffisamment de capacité de correspondance pour déterminer si un paquet\nest valide pour une session.\nTout paquet qui ne correspond pas au modèle de session sera automatiquement\nrejeté.\u003c/p\u003e\n\u003cp\u003eUn des avantages du filtrage à états est que c\u0026rsquo;est très rapide.\nIl vous permet de vous focaliser sur le fait de bloquer ou laisser passer\nde nouvelles sessions.\nSi une nouvelle session est passée, tous les paquets conséquents sont\nautomatiquement alloués et tout paquet imposteur sera automatiquement\nrejeté.\nSi une nouvelle session est bloquée, aucun des paquets conséquents n\u0026rsquo;est\nautorisé.\nLe filtrage à états fournit aussi des capacités avancées de correspondance\ncapables de se défendre contre le flood de différentes méthodes d\u0026rsquo;attaques\nemployées par des attaquants.\u003c/p\u003e\n\u003cp\u003eLa Traduction d\u0026rsquo;Adresse Réseau (NAT) permet à un réseau privé derrière le\npare-feu de partager une adresse IP publique unique.\nLa NAT permet à chaque ordinateur du réseau privé d\u0026rsquo;avoir un accès à Internet,\nsans avoir besoin de comptes multiples à Internet, ou de multiples adresses\nIP publiques.\nLa NAT traduira automatiquement l\u0026rsquo;adresse IP du réseau privé pour les\nordinateurs et dispositifs sur le réseau vers l\u0026rsquo;unique adresse IP publique\nlorsque les paquets sortent du pare-feu vers Internet.\nLa NAT assume aussi la traduction inverse pour les paquets de retour.\nAvec la NAT, vous pouvez rediriger un trafic spécifique, couramment déterminé\npar un numéro de port ou un ensemble de numéros de port, entrant depuis\nvotre adresse IP publique depuis Internet vers le ou les serveurs spécifiques\nlocalisés quelque part dans votre réseau local.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://man.openbsd.org/pf\" rel=\"external\"\u003ePF - Packet Filter\u003c/a\u003e est le système de pare-feu\nd\u0026rsquo;OpenBSD pour le filtrage du trafic TCP/IP et faisant de la NAT.\nPF est aussi capable de normaliser ou conditionner le trafic TCP/IP, aussi\nbien que gérer le contrôle de la bande passante ou la priorisation de paquets.\u003c/p\u003e\n\u003cp\u003ePF est activement maintenu et développé par l\u0026rsquo;entière équipe d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003ch3 id=\"paramétrage-de-pf\"\u003eParamétrage de PF\u003c/h3\u003e\n\u003cp\u003eAvant que nous commencions, je présume que vous avez lu à la fois et le\n\u003ca href=\"https://www.openbsd.org/faq/pf/index.html\" rel=\"external\"\u003eGuide de l\u0026rsquo;Utilisateur de PF\u003c/a\u003e\net la page du manuel \u003ca href=\"https://man.openbsd.org/pf.conf\" rel=\"external\"\u003epf.conf\u003c/a\u003e, spécifiquement\nla page du manuel qui est très importante.\nMême si vous ne comprenez pas toutes les différentes options, assurez-vous\nde lire la documentation !\nLisez la page du manuel \u003ca href=\"https://man.openbsd.org/pf\" rel=\"external\"\u003epf\u003c/a\u003e pour avoir une\ncomplète compréhension en profondeur de ce que PF peut faire.\u003c/p\u003e\n\u003cp\u003eDe plus, laissez-moi commencer par vous dire que même si la syntaxe de PF\nest très lisible, il est \u003cstrong\u003etrès facile\u003c/strong\u003e de faire des erreurs lors de l\u0026rsquo;écriture\ndes règles de pare-feu.\nMême des seniors et des administrateurs systèmes expérimentés font des\nerreurs lors de l\u0026rsquo;écriture des règles de pare-feu.\u003c/p\u003e\n\u003cp\u003eÉcrire des règles de pare-feu requiert que vous ayez planifié vos buts\navec attention, compris comment implémenter les différentes règles avant\nd\u0026rsquo;obtenir le résultat attendu, et en même temps de prendre vos précautions\nafin de vous éviter de vous tromper et de vous déconnecter accidentellement :)\nJe pense que nous l\u0026rsquo;avons tous fait à un moment ou l\u0026rsquo;autre, que ce soit\ndans la précipitation, la fatigue ou simplement par erreur.\nJ\u0026rsquo;ai vécu cela de nombreuses fois.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eVeuillez noter que j\u0026rsquo;ai fait de mon mieux pour garder les choses simples\nautant que possible et que j\u0026rsquo;utilise autant de commentaires afin d\u0026rsquo;expliquer\nce que fait chaque règle. En même temps, j\u0026rsquo;ai testé chaque règle et surveillé\nl\u0026rsquo;impact et fait de mon mieux pour éviter les complications et erreurs.\u003c/div\u003e\n\n\u003cp\u003eLa partie la plus importante est de ne pas faire de suppositions.\nTestez toujours vos règles de manière approfondie.\nSi quelque chose ne fonctionne pas, essayez de supprimer autant de règles\nque possible pour ne garder que le strict minimum. Puis introduisez une\nrègle à la fois jusqu\u0026rsquo;à trouver la règle qui pose problème.\nEnfin, continuez avec le paramétrage étape par étape.\u003c/p\u003e\n\u003cp\u003eLa partie réellement difficile est de se souvenir de comment les paquets\narrivent sur une interface, comment ils sont rediriger vers une machine\nsur une autre interface, et de relier correctement ce \u0026ldquo;voyage\u0026rdquo; aux termes\n\u003cstrong\u003epass in\u003c/strong\u003e, \u003cstrong\u003epass out\u003c/strong\u003e, \u003cstrong\u003eblock in\u003c/strong\u003e, \u003cstrong\u003eblock out\u003c/strong\u003e, \u003cstrong\u003efrom\u003c/strong\u003e et \u003cstrong\u003eto\u003c/strong\u003e.\nSouvent, ces termes ne fonctionnent pas exactement comme nous avons tendance\nà le penser.\u003c/p\u003e\n\u003ch3 id=\"éclaircissements\"\u003eÉclaircissements\u003c/h3\u003e\n\u003cp\u003eJe tiens à démarrer en clarifiant certains des paramètres communs par défaut\net des mots clés dans PF.\u003c/p\u003e\n\u003cp\u003eQuand nous parlons du traffic \u003cstrong\u003epass in\u003c/strong\u003e ou \u003cstrong\u003epass out\u003c/strong\u003e, une bonne manière\nde se rappeler ce dont il s\u0026rsquo;agit est de penser en terme de paquets de données.\nNous utilisons \u003cstrong\u003epass in\u003c/strong\u003e pour les paquets de données entrants qui viennent\nd\u0026rsquo;ordinateurs vers une interface réseau (les ordinateurs étant rattachés\nà ce périphérique réseau) et \u003cstrong\u003epass out\u003c/strong\u003e pour les paquets de données venant\nde l\u0026rsquo;interface réseau vers les ordinateurs.\u003c/p\u003e\n\u003cp\u003eLe format est soit que nous filtrons les paquets de données sur la destination :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efrom source IP to destination IP [on]  port\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSoit que nous filtrons les paquets de données sur la source :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003efrom source IP [on] port to destination\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVeuillez noter que la partie \u003ccode\u003e[on]\u003c/code\u003e n\u0026rsquo;est pas une partie de la syntaxe.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003equick\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi un paquet correspond à une règle \u003ccode\u003epass\u003c/code\u003e, \u003ccode\u003eblock\u003c/code\u003e ou \u003ccode\u003ematch\u003c/code\u003e avec\nle critère \u003ccode\u003equick\u003c/code\u003e, le paquet \u003cstrong\u003eest passé sans inspection des règles de\nfiltrage conséquentes\u003c/strong\u003e.\nLa règle avec le critère \u003ccode\u003equick\u003c/code\u003e devient la dernière règle correspondante.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ekeep state\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVous n\u0026rsquo;avez pas besoin de spécifier le critère \u003ccode\u003ekeep state\u003c/code\u003e pour des\nrègles spécifiques \u003ccode\u003epass\u003c/code\u003e ou \u003ccode\u003eblock\u003c/code\u003e.\nLa première fois où un paquet correspond à une règle \u003ccode\u003epass\u003c/code\u003e ou \u003ccode\u003eblock\u003c/code\u003e,\n\u003cstrong\u003eun état d\u0026rsquo;entrée est créé par défaut\u003c/strong\u003e. \u003cbr\u003e\nSeulement si aucune règle ne correspond au paquet, l\u0026rsquo;action par défaut\nest \u003cstrong\u003ede passer le paquet sans créer d\u0026rsquo;état\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eon\u003c/code\u003e interface/\u003ccode\u003eany\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCette règle s\u0026rsquo;applique seulement aux paquets \u003cstrong\u003equi sont entrants\u003c/strong\u003e,\nou \u003cstrong\u003equi passent au-travers\u003c/strong\u003e de cette interface en particulier ou d\u0026rsquo;un\ngroupe d\u0026rsquo;interface. \u003cbr\u003e\nLe critère \u003ccode\u003eon any\u003c/code\u003e correspondra à toute interface existante, exceptée\ncelles de bouclage loopback.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einet\u003c/code\u003e/\u003ccode\u003einet6\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLes critères \u003ccode\u003einet\u003c/code\u003e et \u003ccode\u003einet6\u003c/code\u003e signifie que cette règle s\u0026rsquo;applique\nseulement aux paquets \u003cstrong\u003eentrants\u003c/strong\u003e, ou \u003cstrong\u003epassant au-travers\u003c/strong\u003e ce domaine\nparticulier de routage, soit IPv4, soit IPv6. \u003cbr\u003e\nVous pouvez appliquer des règles pour des domaines particuliers de routage\nsans spécifier l\u0026rsquo;interface réseau. Dans de ce cas, la règle correspondra\nà tout trafic de toute nature sur toutes les interfaces réseaux. En\nspécifiant \u003ccode\u003einet\u003c/code\u003e, vous adressez explicitement le trafic IPv4 seulement.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eproto\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSe limiter à un protocole est faisable en utilisant le critère \u003ccode\u003eproto\u003c/code\u003e.\nUne règle s\u0026rsquo;applique \u003cstrong\u003eseulement aux paquets de ce protocole\u003c/strong\u003e, les autres\nprotocoles ne sont pas affectés. Vous pouvez chercher les protocoles\ndans le fichier \u003ccode\u003e/etc/protocols\u003c/code\u003e. Les protocoles communs sont \u003ca href=\"https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol\" rel=\"external\"\u003eICMP\u003c/a\u003e\n\u003ca href=\"https://fr.wikipedia.org/wiki/Transmission_Control_Protocol\" rel=\"external\"\u003eTCP\u003c/a\u003e et\n\u003ca href=\"https://fr.wikipedia.org/wiki/User_Datagram_Protocol\" rel=\"external\"\u003eUDP\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ein\u003c/code\u003e et \u003ccode\u003eout\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eC\u0026rsquo;est l\u0026rsquo;une des parties les plus faciles où se tromper : la direction\ndu trafic. Un paquet \u003cstrong\u003eentre\u003c/strong\u003e ou \u003cstrong\u003esort\u003c/strong\u003e toujours par le port sur\nl\u0026rsquo;interface Ethernet. \u003ccode\u003ein\u003c/code\u003e et \u003ccode\u003eout\u003c/code\u003e s\u0026rsquo;applique aux paquets entrants\net sortants au-travers du port Ethernet physique auquel est attaché\nle câble Ethernet. \u003cstrong\u003eSi rien n\u0026rsquo;est spécifié, la règle correspondra\naux paquets dans les deux directions\u003c/strong\u003e. \u003cbr\u003e\n\u003ccode\u003ein\u003c/code\u003e et \u003ccode\u003eout\u003c/code\u003e ne sont \u003cstrong\u003ejamais\u003c/strong\u003e utilisé pour gérer le trafic venant\nd\u0026rsquo; une interface réseau vers une autre, ce qui est fait par la NAT, en\nutilisant les options \u003ccode\u003enat-to\u003c/code\u003e et \u003ccode\u003erdr-to\u003c/code\u003e. \u003ccode\u003ein\u003c/code\u003e et \u003ccode\u003eout\u003c/code\u003e gèrent\nseulement le trafic \u003cstrong\u003eentrant\u003c/strong\u003e et \u003cstrong\u003esortant\u003c/strong\u003e du port Ethernet physique\nd\u0026rsquo;une même carte.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efrom\u003c/code\u003e et \u003ccode\u003eto\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLes critères \u003ccode\u003efrom\u003c/code\u003e et \u003ccode\u003eto\u003c/code\u003e s\u0026rsquo;appliquent \u003cstrong\u003eseulement aux paquets avec\nune adresse et des ports source et destination spécifiés\u003c/strong\u003e.\nDes deux, du nom d\u0026rsquo;hôte ou de l\u0026rsquo;adresse IP, ou du port, voire les\nspécifications OS sont optionnels. \u003cbr\u003e\nQuand nous avons affaire avec un routeur ayant de multiples interfaces\nréseaux, il est facile de penser cela :\n\u003cem\u003eJe veux passer les paquets entrants depuis l\u0026rsquo;interface externe\n(l\u0026rsquo;interface réseau attachée à Internet) puis qu\u0026rsquo;ils aillent sur la\npremière interface LAN et de là vers un PC spécifique sur le LAN\u003c/em\u003e\nsignifiant que nous suivront le \u0026ldquo;chemin des données\u0026rdquo; dans notre esprit,\net alors nous écrivons quelque chose comme cela :\n\u003ccode\u003epass in on $ext_if from $ext_if to $dmz port 80\u003c/code\u003e.\nMais cela ne fait pas apparaître \u0026ldquo;par magie\u0026rdquo; le trafic HTTP sur le port 80\nau PC ayant l\u0026rsquo;adresse IP spécifique sur le LAN. Il nous faudrait aussi une\nrègle \u003ccode\u003epass out\u003c/code\u003e spécifique et déterminer exactement sur quelle machine\nnous voulons que les données arrivent.\nÀ moins que vous n\u0026rsquo;ayez affaire à une exigence très spécifique, vous\nn\u0026rsquo;aurez jamais besoin d\u0026rsquo;une telle règle dans votre jeu de règles !\nLes fonctionnalités \u003ca href=\"https://www.openbsd.org/faq/pf/filter.html#urpf\" rel=\"external\"\u003euRPF (Unicast Reverse Path Forwardint)\u003c/a\u003e\nde PF protégeront votre réseau interne aussi bien avec un paramétrage\nde base de NAT, avec l\u0026rsquo;option \u003ccode\u003enat-to\u003c/code\u003e et une redirection avec l\u0026rsquo;option\n\u003ccode\u003erdr-to\u003c/code\u003e, PF gérera les paquets venant de l\u0026rsquo;intérieur vers l\u0026rsquo;extérieur\net vice-versa. \u003cbr\u003e\nLe paramètre \u003ccode\u003eall\u003c/code\u003e est équivalent à l\u0026rsquo;écriture \u003ccode\u003efrom any to any\u003c/code\u003e.\n\u003cstrong\u003eSans une direction explicitement déclarée, la règle par défaut est\n\u003ccode\u003efrom any to any\u003c/code\u003e\u003c/strong\u003e. Cette règle : \u003ccode\u003epass in on $p_lan proto udp to port dns\u003c/code\u003e\nse traduit par : \u003ccode\u003epass in on em3 inet proto udp from any to any port = 53\u003c/code\u003e. \u003cbr\u003e\nIl n\u0026rsquo;est pas non plus nécessaire d\u0026rsquo;utiliser \u003ccode\u003eto any port dns\u003c/code\u003e, la\npartie \u003ccode\u003eany\u003c/code\u003e étant celle par défaut. Vous avez cependant besoin de\n\u003ccode\u003eto port dns\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003enat-to\u003c/code\u003e et \u003ccode\u003erdr-to\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLes options NAT \u003cstrong\u003emodifient soit l\u0026rsquo;adresse et le port source ou destination\ndes paquets associées à une connexion d\u0026rsquo;états\u003c/strong\u003e.\nPF modifie l\u0026rsquo;adresse spécifié et/ou le port dans le paquet et recalcule\nles sommes de contrôle IP, TCP et UDP nécessaires. \u003cbr\u003e\nUne option \u003ccode\u003enat-to\u003c/code\u003e spécifie \u003cstrong\u003eque les adresses IP ont été changées car\nle paquet traverse l\u0026rsquo;interface donnée\u003c/strong\u003e.\nCette technique permet à une ou plusieurs adresses IP sur l\u0026rsquo;hôte traduisant\n(le routeur OpenBSD) de prendre en charge le trafic réseau pour un ensemble\nplus grand de machines sur le réseau \u003cstrong\u003einterne\u003c/strong\u003e, tel qu\u0026rsquo;un LAN. \u003cbr\u003e\nL\u0026rsquo;option \u003ccode\u003enat-to\u003c/code\u003e est habituellement appliqué à la sortie, signifiant\n\u003cstrong\u003eredirigé depuis le réseau interne vers Internet\u003c/strong\u003e.\n\u003ccode\u003enat-to\u003c/code\u003e vers une adresse IP locale \u003cstrong\u003en\u0026rsquo;est pas pris en charge\u003c/strong\u003e. \u003cbr\u003e\nL\u0026rsquo;option \u003ccode\u003erdr-to\u003c/code\u003e est appliquée généralement à l\u0026rsquo;entrée, signifiant\n\u003cstrong\u003eredirigé depuis Internet vers le réseau interne\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eListe d\u0026rsquo;éléments et d\u0026rsquo;ensemble d\u0026rsquo;adresses et de ports\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eQuand vous avez besoin de spécifier de multiples éléments, e.g. de\nmultiples numéros de ports, vous pouvez les séparer avec une espace\nou une virgule.\nTel que \u003ccode\u003eport { 53 853 }\u003c/code\u003e ou \u003ccode\u003eport { 53, 853 }\u003c/code\u003e. \u003cbr\u003e\nUn ensemble d\u0026rsquo;adresses est spécifié en utilisant l\u0026rsquo;opérateur \u003ccode\u003e-\u003c/code\u003e.\ne.g. \u003ccode\u003e192.168.1.2 - 192.168.1.10\u003c/code\u003e signifie toutes les adresses IP\nde 192.168.1.2 à 192.168.1.10, incluant les deux. \u003cbr\u003e\nUn ensemble de ports a de multiples paramètres ; regardez la page du\nmanuel \u003ca href=\"https://man.openbsd.org/pf.conf\" rel=\"external\"\u003epf.conf\u003c/a\u003e et cherchez le texte\n\u003cem\u003e\u0026ldquo;Ports and ranges of ports are specified using these operators\u0026rdquo;\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVeuillez noter que chaque fois qu\u0026rsquo;un paquet traité par PF arrive ou part\nd\u0026rsquo;une interface, les règles de filtrage sont évaluées dans un ordre séquentiel,\nde la première à la dernière.\nConcernant \u003ccode\u003eblock\u003c/code\u003e et \u003ccode\u003epass\u003c/code\u003e, \u003cstrong\u003ela dernière règle correspondante décide\nde quelle action prise\u003c/strong\u003e.\nSi aucune règle ne correspond au paquet, l\u0026rsquo;action par défaut est de laisser\npasser le paquet sans créer d\u0026rsquo;état.\nPour \u003ccode\u003ematch\u003c/code\u003e, les règles sont évaluées \u003cstrong\u003echaque fois qu\u0026rsquo;elles correspondent\u003c/strong\u003e.\u003c/div\u003e\n\n\u003ch3 id=\"résolution-de-nom-de-domaine-ou-dhôte\"\u003eRésolution de nom de domaine ou d\u0026rsquo;hôte\u003c/h3\u003e\n\u003cp\u003eSi vous décidez d\u0026rsquo;utiliser des noms d\u0026rsquo;hôtes et/ou des noms de domaines\ndans votre paramétrage de PF, vous avez besoin de savoir que \u003cstrong\u003ela résolution\nde tout nom de domaine ou d\u0026rsquo;hôte est faite au moment du chargement du jeu\nde règles\u003c/strong\u003e.\nCela signifie que quand l\u0026rsquo;adresse IP d\u0026rsquo;un hôte ou d\u0026rsquo;un nom de domaine change,\nle jeu de règles \u003cstrong\u003edoit être rechargé pour que le changement soit pris en\ncompte par le noyau\u003c/strong\u003e.\nIl n\u0026rsquo;est pas possible qu\u0026rsquo;à chaque fois qu\u0026rsquo;une règle s\u0026rsquo;applique, pour un\nnom d\u0026rsquo;hôte ou de domaine listé, que PF fasse une nouvelle requête DNS pour\nce nom d\u0026rsquo;hôte ou de domaine particulier.\nLa requête DNS s\u0026rsquo;effectue seulement lors du chargement du jeu de règles.\u003c/p\u003e\n\u003cp\u003eCela signifie aussi que vous devez vous assurer que le serveur DNS que vous\nutiliser soit actif et fonctionnel \u003cstrong\u003eavant\u003c/strong\u003e que PF ne démarre, autrement\nPF échouera à charger le jeu de règles car il ne peut résoudre le nom d'\nhôte ou de domaine.\u003c/p\u003e\n\u003cp\u003eSur OpenBSD, PF démarre \u003cstrong\u003eavant\u003c/strong\u003e Unbound ou tout autre service DNS installé,\nce qui est la bonne manière de faire d\u0026rsquo;un point de vue de la sécurité.\u003c/p\u003e\n\u003cp\u003eJe vous conseille d\u0026rsquo;éviter l\u0026rsquo;utilisation de noms d\u0026rsquo;hôtes ou de noms de\ndomaines lorsque vous utilisez les règles PF et de privilégier les adresses\nIP, si possible.\nIl est possible d\u0026rsquo;utiliser les noms d\u0026rsquo;hôtes et noms de domaines, mais\nl\u0026rsquo;adressage d\u0026rsquo;IP directement est de loin le plus facile et le plus sûr.\u003c/p\u003e\n\u003ch3 id=\"un-jeu-de-règles\"\u003eUn jeu de règles\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est une bonne idée de tester votre jeu de règles sur une machine de test.\nIl y a presque toujours plus d\u0026rsquo;une manière de faire pour arriver au même\nrésultat. Selon mon humble avis, la meilleure manière est celle qui vous\npermet d\u0026rsquo;être le plus clair (i.e. facile à comprendre).\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNe jamais écrire de nouveaux jeux de règles sur un dispositif à\ndistance où vous êtes actif à moins de savoir ce que vous faites.\nÊtre déconnecté d\u0026rsquo;une machine à distance n\u0026rsquo;est jamais agréable.\u003c/div\u003e\n\n\u003cp\u003eEssayez de trouver comment vous pouvez faire en sorte que vos règles soient\naussi claires et simples que possible, en utilisant les valeurs par\ndéfaut, quand c\u0026rsquo;est possible.\nN\u0026rsquo;ayez pas peur de spécifier des critères qui rendent les règles plus\nclaires à comprendre, quand bien même ils sont identiques aux valeurs par\ndéfaut.\nUne valeur par défaut peut être \u003ccode\u003eany to any\u003c/code\u003e, et vous pouvez laisser cela\nde côté, mais il serait plus facile de comprendre une règle particulière\nquand il est écrit \u003ccode\u003eany to any\u003c/code\u003e textuellement dans le fichier de configuration.\u003c/p\u003e\n\u003cp\u003eVous pouvez toujours analyser le jeu de règles et vérifier les erreurs\nsans qu\u0026rsquo;il soit déployé avec la commande \u003ccode\u003epfctl -nf /etc/pf.conf\u003c/code\u003e.\nUne fois que vous avez chargé le jeu de règles avec la commande \u003ccode\u003epfctl -f /etc/pf.conf\u003c/code\u003e,\nvous pouvez voir comment le jeu de règles a été traduit par PF avec la\ncommande \u003ccode\u003epfctl -s rules\u003c/code\u003e, que je vous conseille d\u0026rsquo;utiliser régulièrement.\u003c/p\u003e\n\u003cp\u003eJe préfère organiser mon jeu de règles par section et commentaires, je\nferais ainsi dans cet exemple.\u003c/p\u003e\n\u003cp\u003eUtilisez votre éditeur de texte favori et ouvrez le fichier \u003ccode\u003e/etc/pf.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEn premier, nous paramétrons quelques macros pour mieux se souvenir quelles\ninterfaces réseaux nous utilisons.\nUtiliser des macros pour les interfaces réseaux rend aussi plus facile le\nchangement du nom du pilote de la carte si vous achetez une nouvelle carte,\nou de multiples nouvelles cartes.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Macros\n#---------------------------------#\n\next_if=\u0026#34;em0\u0026#34; # Interface externe connectée au modem du FAI (Internet).\ng_lan=\u0026#34;em1\u0026#34;  # LAN PC Adultes\nc_lan=\u0026#34;em2\u0026#34;  # LAN PC Enfants\np_lan=\u0026#34;em3\u0026#34;  # LAN Publique.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnsuite, nous paramétrons une table pour les adresses IP non routable.\nNous faisons cela, car une mauvaise configuration réseau courante est\ncelle qui permet du trafic avec des adresses non routable vers Internet.\nNous utiliserons la table dans notre jeu de règles afin de bloquer\ntout essai d\u0026rsquo;initier un contact avec les adresses non routable au-travers\nde l\u0026rsquo;interface externe du routeur.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Tables\n#---------------------------------#\n\n# Ceci est une table d\u0026#39;adresses IP privées non routables.\ntable \u0026lt;martians\u0026gt; { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16     \\\n                   172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \\\n                   192.168.0.0/16 198.18.0.0/15 198.51.100.0/24        \\\n                   203.0.113.0/24 }\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVeuillez noter que les macros et les tables sont toujours écrites en début\ndu fichier \u003ccode\u003e/etc/pf.conf\u003c/code\u003e.\u003c/div\u003e\n\n\u003cp\u003eAlors, commençons avec une \u003cstrong\u003epolitique de blocage par défaut\u003c/strong\u003e et\nactivons une série de fonctionnalités de protection.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Protect and block by default\n#---------------------------------#\nset skip on lo0\n\n# Protection vs l\u0026#39;usurpation d\u0026#39;adresses sur toutes les interfaces réseaux.\nblock in from no-route\nblock in quick from urpf-failed\n\n# Bloquage des adresses privées non routable.\n# Utilisation du paramétre \u0026#34;quick\u0026#34; pour que cette règle soit la dernière traversée.\nblock in quick on $ext_if from \u0026lt;martians\u0026gt; to any\nblock return out quick on $ext_if from any to \u0026lt;martians\u0026gt;\n\n# Bloquage par défaut de tout trafic sur toutes les interfaces réseaux.\nblock return in on { $g_lan $c_lan $dmz }\n\n# Bloquage par défaut de tout trafic sur l\u0026#39;interface reliée à Internet\n# avec journalisation\nblock drop in log on $ext_if\n\n# Autoriser ICMP.\nmatch in on $ext_if inet proto icmp icmp-type {echoreq } tag ICMP_IN\nblock drop in on $ext_if proto icmp\npass in proto icmp tagged ICMP_IN max-pkt-rate 100/10\n\n# Autoriser le routeur à accéder à Internet, au-travers de son interface réseau dédiée\npass out inet from $ext_if\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLes adresses IP contenues dans la macro \u003ccode\u003emartians\u003c/code\u003e constituent les adresses\nréférencées dans la \u003ca href=\"https://tools.ietf.org/html/rfc1918\" rel=\"external\"\u003eRFC1918\u003c/a\u003e qui ne\ndoivent pas être utilisées sur Internet.\nLe trafic venant ou allant vers de telles adresses doit être abandonné\nsur l\u0026rsquo;interface externe du routeur.\u003c/p\u003e\n\u003cp\u003eDans les précédentes versions de ce guide (avant la version 1.5.0), j\u0026rsquo;avais\nl\u0026rsquo;habitude d\u0026rsquo;utiliser l\u0026rsquo;instruction \u003ca href=\"https://man.openbsd.org/pf.conf#Scrub\" rel=\"external\"\u003escrub\u003c/a\u003e\ndans le paramétrage ci-dessus, toutefois après avoir consulté l\u0026rsquo;équipe\nOpenBSD avec \u003ca href=\"http://henningbrauer.com/\" rel=\"external\"\u003eHenning Brauer\u003c/a\u003e (Merci à Henning !)\net fais de plus amples recherches, j\u0026rsquo;ai décidé de la supprimer car elle\nne traite que des cas très spécifiques (veuillez lire la documentation).\nVous aurez besoin de la règle \u003ccode\u003escrub\u003c/code\u003e seulement si un hôte sur votre réseau\ngénére des paquets fragmentés avec le drapeau \u0026ldquo;dont-fragment\u0026rdquo;.\nLe comportement par défaut de PF sans la règle \u003ccode\u003escrub\u003c/code\u003e est mieux adapté\nà un usage général.\u003c/p\u003e\n\u003cp\u003eLa \u003ca href=\"https://www.openbsd.org/faq/pf/example1.html\" rel=\"external\"\u003eFAQ\u003c/a\u003e d\u0026rsquo;OpenBSD contient\nun exemple de paramétrage pour un routeur très basique, avec certaines\nvaleurs spécifiques pour \u003ccode\u003escrub\u003c/code\u003e, mais ma recommandation est d\u0026rsquo;utiliser\nseulement \u003ccode\u003escrub\u003c/code\u003e là où vous savez en avoir besoin.\nSi vous n\u0026rsquo;en avez pas besoin, insérez-la dans la configuration après la\nrègle \u003ccode\u003eset skip\u003c/code\u003e pour l\u0026rsquo;interface de bouclage locale, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eset skip on lo0\nmatch in all scrub\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt ensuite ajoutez les paramètres à la règle \u003ccode\u003escrub\u003c/code\u003e dont vous avez besoin.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;utilisais aussi la règle \u003ca href=\"https://man.openbsd.org/pf.conf#Blocking_Spoofed_Traffic\" rel=\"external\"\u003eantispoof\u003c/a\u003e\nsuivante dans la section de protection contre l\u0026rsquo;usurpation :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eantispoof quick for { $g_lan $c_lan $dmz }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eJ\u0026rsquo;ai depuis supprimé la règle \u003ccode\u003eantispoof\u003c/code\u003e puisque la fonctionnalité\n\u003ca href=\"https://www.openbsd.org/faq/pf/filter.html#urpf\" rel=\"external\"\u003euRPF (Unicast Reverse Path Forwarding)\u003c/a\u003e\nque PF fournit a la même fonctionnalité, et en tant que tel nous n\u0026rsquo;en avons\nplus besoin, à la place nous utilisons juste la règle \u003ccode\u003eblock in quick from urpf-failed\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;information suivante à-propos du critère \u003ccode\u003eantispoof\u003c/code\u003e est gardée à des\nfins d\u0026rsquo;éducation.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;usurpation est lorsque quelqu\u0026rsquo;un fabrique une adresse IP. Le critère\n\u003ccode\u003eantispoof\u003c/code\u003e s\u0026rsquo;étend à un ensemble de règles de filtrage qui empêcheront\ntout trafic avec une adresse IP source du réseau (directement connecté\nà l\u0026rsquo;interface spécifiée) entrant sur le système par une autre interface.\nCela est parfois appelé \u0026ldquo;bleeding over\u0026rdquo; ou \u0026ldquo;bleeding through\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eLa directive \u003ccode\u003eantispoof\u003c/code\u003e est traduite par PF par ce qui suit :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eblock drop in quick on ! em1 inet from 192.168.1.0/24 to any\nblock drop in quick inet from 192.168.1.1 to any\nblock drop in quick on ! em2 inet from 192.168.2.0/24 to any\nblock drop in quick inet from 192.168.2.1 to any\nblock drop in quick on ! em3 inet from 192.168.3.0/24 to any\nblock drop in quick inet from 192.168.3.1 to any\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi nous prenons, e.g., la règle \u003ccode\u003eblock drop in quick on ! em1 inet from 192.168.1.0/24 to any\u003c/code\u003e\nde l\u0026rsquo;interface réseau \u003ccode\u003eem1\u003c/code\u003e qui signifie alors : \u003cem\u003ebloque tout trafic venant\ndu réseau ayant une adresse IP comprise entre 192.168.1.1 et 192.168.1.255,\nqui n\u0026rsquo;est pas originaire depuis l\u0026rsquo;interface em1 elle-même, et qui va ailleurs\u003c/em\u003e.\nPuisque l\u0026rsquo;interface \u003ccode\u003eem1\u003c/code\u003e est l\u0026rsquo;interface réseau en charge de toutes les\nadresses IP dans cet ensemble spécifique, alors aucun trafic avec de telles\nadresses IP ne pourra être originaire de toute autre interface réseau.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eL\u0026rsquo;utilisation d\u0026rsquo;\u003ccode\u003eantispoof\u003c/code\u003e doit être \u003cstrong\u003erestreinte\u003c/strong\u003e aux interfaces qui\nont une adresse IP assignée, ce qui signifie que si vous avez des interfaces\nréseaux inutilisées, ou des ports d\u0026rsquo;une interface réseau, assurez-vous\nd\u0026rsquo;assigner une adresse IP à chacune ou de ne pas les inclure dans l\u0026rsquo;option\n\u003ccode\u003eantispoof\u003c/code\u003e.\u003c/div\u003e\n\n\u003cp\u003eAinsi que je l\u0026rsquo;ai mentionnée, j\u0026rsquo;ai supprimé la règle \u003ccode\u003eantispoof\u003c/code\u003e et nous\nutiliserons à la place la vérification stricte d\u0026rsquo;uRPF.\nLorsqu\u0026rsquo;un paquet passe dans la vérification d\u0026rsquo;uRPF, l\u0026rsquo;adresse IP source\ndu paquet est recherchée dans la table de routage.\nSi l\u0026rsquo;interface de sortie est trouvée dans la table de routage et que l\u0026rsquo;entrée\nest la même que l\u0026rsquo;interface du paquet qui vient juste d\u0026rsquo;entrer, alors la\nvérification d\u0026rsquo;uRPF autorise.\nAutrement, il est possible que le paquet ait son adresse IP source usurpée\nainsi il sera bloqué.\u003c/p\u003e\n\u003cp\u003eNous allons permettre \u003ca href=\"https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol\" rel=\"external\"\u003eICMP\u003c/a\u003e\ndans notre paramétrage, quand bien même des administrateurs réseaux bloquent\ncomplètement ICMP.\nLa plupart des personnes bloquent complètement ICMP à cause d\u0026rsquo;actions\ninjustifiées telles que les attaques par découverte de réseaux, les canaux\nde communication, le \u003ca href=\"https://en.wikipedia.org/wiki/Ping_sweep\" rel=\"external\"\u003eping sweep\u003c/a\u003e,\nle \u003ca href=\"https://fr.wikipedia.org/wiki/Ping_flood\" rel=\"external\"\u003eping flood\u003c/a\u003e, le \u003ca href=\"https://en.wikipedia.org/wiki/ICMP_tunnel\" rel=\"external\"\u003etunnel d\u0026rsquo;ICMP\u003c/a\u003e,\net la \u003ca href=\"https://fr.wikipedia.org/wiki/Internet_Control_Message_Protocol#Signification_du_type_5_(redirection)\" rel=\"external\"\u003eredirection d\u0026rsquo;ICMP\u003c/a\u003e.\nToutefois, ICMP est bien plus que répondre à des ping.\nSi nous bloquons complètement ICMP, les diagnostics, la fiabilité, et la\nperformance réseau peuvent être défectueuses puisque des mécanismes importants\nsont désactivés lorsque le protocole ICMP est restreint.\u003c/p\u003e\n\u003cp\u003eVoici certaines raisons pour lesquelles ICMP ne devrait pas être bloqué :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa découverte Path MTU (PMTUD) est utilisée pour déterminer la taille\nmaximale de l\u0026rsquo;unité de transmission pour les dispositifs réseau qui relient\nla source et la destination afin d\u0026rsquo;éviter la fragmentation IP.\nTCP dépend des paquets ICMP de type 3 code 4 pour \u0026ldquo;Path MTU Discovery\u0026rdquo;.\nICMP type 3 code 4 et la taille maximale des paquets sont retournés quand\nun paquet excède la taille MTU d\u0026rsquo;un dispositif réseau connecté.\nQuand les messages ICMP sont bloqués, le système de destination requête\ncontinuellement des paquets non délivrés et le système source continue à\nles renvoyer indéfiniment mais en vain.\nCe comportement peut avoir pour résultat un \u003ca href=\"https://fr.wikipedia.org/wiki/Black_hole_(informatique)\" rel=\"external\"\u003etrou noir\u003c/a\u003e\nICMP (des connexions IP congestionnées et des transmissions cassées).\u003c/li\u003e\n\u003cli\u003eTime to live (TTL) définit le temps de vie d\u0026rsquo;un paquet de données.\nUn réseau où ICMP est bloqué ne recevra pas le message de type 11, temps\nécoulé, code 0, temps écoulé dans le transit des messages d\u0026rsquo;erreur.\nCela signifie que l\u0026rsquo;hôte source ne sera pas notifié pour augmenter le temps\nde vie des données afin d\u0026rsquo;atteindre l\u0026rsquo;hôte de destination, si le datagram\néchoue à atteindre l\u0026rsquo;hôte de destination.\u003c/li\u003e\n\u003cli\u003eUne mauvaise performance du fait de bloquer la redirection ICMP.\nLa redirection ICMP est utilisée par un routeur pour informer un hôte d\u0026rsquo;un\nchemin direct entre l\u0026rsquo;hôte source et celui de destination.\nCela réduit le nombre de saut que les données ont à faire pour atteindre\nla destination.\nAvec ICMP bloqué, l\u0026rsquo;hôte ne fera jamais attention à la route la plus optimale\nvers la destination.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans le paramétrage ci-dessus, nous permettons ICMP, mais nous mettons une\n\u0026ldquo;limite de taux\u0026rdquo; du nombre de requêtes ping auxquelles le routeur répondra.\nAvec le critère \u003ccode\u003emax-pkt-rate 100/10\u003c/code\u003e, le routeur arrêtera de répondre aux\nping si nous en avons plus de 100 en 10 secondes.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSi vous souhaitez toujours bloquer complètement ICMP pour une raison quelconque,\nil suffit de supprimer les 3 règles après le commentaire \u0026ldquo;Allow ICMP\u0026rdquo;.\u003c/div\u003e\n\n\u003cp\u003eMaintenant paramétrons le segment LAN pour les adultes de la maison.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Paramétrage du réseau LAN adulte\n#---------------------------------#\n\n# Autoriser tout ordinateur ou dispositif sur le LAN adulte à envoyer des\n# paquets de données entrants dans l\u0026#39;interface réseau. Cela signifie que\n# tout ordinateur attaché à cette interface réseau peut envoyer des données\n# partout, i.e. sur Internet ou tout ordinateur attaché au routeur.\npass in on $g_lan\n\n# Toujours bloquer les requêtes DNS non adressées à notre serveur DNS.\nblock return in quick on $g_lan proto { udp tcp } to ! $g_lan port { 53 853 }\n\n# J\u0026#39;ai une imprimante réseau et je ne veux pas qu\u0026#39;elle \u0026#34;téléphone maison\u0026#34;.\n# L\u0026#39;imprimange réseau à l\u0026#39;adresse IP  192.168.1.8.\nblock in quick on $g_lan from 192.168.1.8\n\n# Autoriser les paquets de données venant du routeur à sortir par l\u0026#39;interface\n# réseau vers les ordinateurs et dispositifs attachés à l\u0026#39;interface du\n# réseau Adultes.\n# Sans cela nous ne pouvons même pas pingués les ordinateurs attachés à\n# l\u0026#39;interface du réseau Adultes depuis le routeur lui-même.\npass out on $g_lan inet keep state\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans cet exemple, j\u0026rsquo;ai une imprimante réseau attachée au réseau des adultes\net je ne veux pas qu\u0026rsquo;elle accéde à Internet ou ailleurs (juste en cas où\nil y aurait une sorte de micrologiciel espion).\nNous le faisons en disant : \u003cem\u003ebloque toutes les données entrantes sur em1\nvenant de l\u0026rsquo;adresse IP 192.168.1.8 allant vers toute adresse IP\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eDe plus, nous nous assurons que toutes les requêtes DNS sur les ports 53\n(DNS régulier) et 853 (DNS sur TLS) soient toujours bloquées si elles ne\nviennent pas de notre serveur DNS.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eAvant, j\u0026rsquo;utilisais la redirection du trafic sur le port 53 non adressé à\nnotre serveur DNS vers notre serveur DNS.\nJe faisais cela parce que nous bloquions toute requête DNS sur le port 53,\nsoit avec \u003ccode\u003ereturn\u003c/code\u003e ou \u003ccode\u003edrop\u003c/code\u003e, la requête prenant un délai sur le client,\nce qui avait pour conséquence que beaucoup de clients obtenaient un délai\nsur la réponse.\nDepuis j\u0026rsquo;ai changé cela en block parce que je crois que c\u0026rsquo;est une meilleure\napproche.\nTous les clients DNS ont besoin de réaliser que la communication sur le\nport 53 est bloqué, à moins qu\u0026rsquo;elle ne soit adressée à notre serveur DNS.\nC\u0026rsquo;est aussi important quand nous avons des problèmes sur notre réseau.\nSi nous avons une réponse redirigée vers notre serveur DNS, nous pourrions\nne pas être averti que nous avons été redirigé.\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eDNS utilise en premier UDP (User Datagram Protocol) sur le port 53 pour\nservir les requêtes, mais quand la longueur de la réponse excède 512 bits\net que le client et le serveur prennent en charge EDNS, des paquets UDP\nplus grands sont utilisés.\nToutefois, la requête est envoyée en utilisant TCP (Transmission Control Protocol).\nCertaines implémentations de résolveurs DNS utilisent TCP pour toutes les\nrequêtes.\nAinsi nous avons besoin des deux protocoles UDP et TCP dans la règle pour\nle port 53.\u003c/div\u003e\n\n\u003cp\u003eLe réseau LAN pour les enfants est très similaire.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Paramétrage LAN enfants\n#---------------------------------#\n\n# Autoriser tout PC du LAN Enfant à envoyer des données au-travers du port\n# de l\u0026#39;interface réseau\npass in on $c_lan\n\n# Toujours bloquer les requêtes DNS qui ne sont pas adressées à notre\n# serveur DNS.\nblock return in quick on $c_lan proto { udp tcp} to ! $c_lan port { 53 853 }\n\n# Autorise les paquets de données à passer venant du routeur au-travers\n# l\u0026#39;interface réseau vers les ordinateurs ou dispositifs attachés au\n# LAN Enfants.\n# Sans cela, nous ne pourrions même pas pingués les ordinateurs depuis\n# le routeur lui-même\npass out on $c_lan inet keep state\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eActuellement les deux réseaux Adultes et Enfants ont le même accès à Internet.\nUn paramétrage plus restrictif est mentionné dans le chapitre\n\u0026ldquo;\u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#une-liste-blanche-pour-les-enfants\"\u003eListe Blanche pour enfants\u003c/a\u003e\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eOccupons nous alors de la DMZ, i.e. de l\u0026rsquo;interface réseau qui répond publiquement\nau serveur web.\nPuisque nous avons un serveur web publique, nous allons définir un certain\nnombre de restrictions.\nSi le serveur web est compromis, l\u0026rsquo;intrus aura du mal à trouver ce qui est\nlocalisé dans notre réseau interne.\u003c/p\u003e\n\u003cp\u003eNous bloquons tous les accès excepté le DHCP, afin que le serveur web\nait une adresse IP depuis notre routeur, et alors d\u0026rsquo;ouvrir \u003cstrong\u003eseulement\nmanuellement\u003c/strong\u003e certaines choses pour quand nous avons besoin de mettre à\njour la machine ou quoi que ce soit d\u0026rsquo;autres.\nJ\u0026rsquo;ai commenté les options dont nous avons besoins, quand nous avons besoin\nde telles choses, laissant les parties restreintes actives.\nQuand vous aurez besoin de mettre à jour le serveur, ouvrez l\u0026rsquo;accès DNS\net l\u0026rsquo;accès général à Internet.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePlutôt que changer manuellement le jeu de règles à chaque fois où nous avons\nbesoin de mettre à jour le serveur web, nous pouvons aussi utiliser une\n\u003ca href=\"https://man.openbsd.org/pf.conf#ANCHORS\" rel=\"external\"\u003eancre\u003c/a\u003e, mais par esprit de\nsimplification, nous ne ferons pas cela ici.\u003c/div\u003e\n\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Paramétrage DMZ\n#---------------------------------#\n\n# Autorise tout ordinateur ou dispositif attaché à l\u0026#39;interface réseau DMZ\n# à obtenir une adresse IP venant du DHCP depuis le routeur\npass in on $dmz inet proto udp from any port 67\n\n# Autorise tout ordinateur ou dispositif attaché à l\u0026#39;interface réseau DMZ\n# à faire des requêtes DNS. (décommentez si besoin)\n#pass in on $dmz inet proto udp from any port 53\n\n# Toujours bloquer les requêtes DNS non adressées à notre serveur DNS.\nblock return in quick on $dmz proto { udp tcp} to ! $dmz port { 53 853 }\n\n# Pour autoriser tout ordinateur attaché à l\u0026#39;interface réseau DMZ à accéder\n# à Internet, décommentez la ligne ci-dessous.\n# (Cela est pertinent pour les màj)\n#pass in on $dmz inet\n\n# No matter what, we do not want the DMZ segment to reach any of the other\n# network segments so we explicitly use a block last.\n#\n# We have several options. If we use this:\n#\n#   block drop in on $dmz to 192.168/16\n#\n# Then we block for all subnets, but this also means that the computers\n# attached to the DMZ NIC cannot do DNS queries when they need to be upgraded.\n#\n# In my opinion it is much better to be explicit and block the specific\n# segments we want blocked.\n#\n# Bloque les ordinateurs depuis l\u0026#39;interface réseau DMZ essayant d\u0026#39;atteindre\n# les autres sur les deux autres segments réseaux\nblock drop in on $dmz to { $g_lan:network $c_lan:network }\n\n# En dernier, autorisons les paquets à sortir s\u0026#39;ils viennent de l\u0026#39;interface\n# réseau DMZ vers les ordinateurs attachés, autrement pas de \u0026#34;discussion\u0026#34;.\n# Sans cela nous ne pouvons même pas pinguer les ordinateurs attachés à\n# l\u0026#39;interface réseau DMZ depuis le routeur lui-même\npass out on $dmz inet keep state\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMaintenant, occupons nous de la NAT.\nC\u0026rsquo;est là où le routeur route les paquets venant d\u0026rsquo;un segment du réseau\nvers un autre, dans le cas spécifique venant de notre réseau interne vers\nInternet, et alors toute réponse venant d\u0026rsquo;Internet, à destination de\nl\u0026rsquo;initiateur de la transmission.\nJe préfère le paramètre \u003ccode\u003e:network\u003c/code\u003e qui traduit le(s) réseau(x)\nattaché(s) à l\u0026rsquo;interface, et je préfère être spécifique avec une règle\npour chaque segment concerné.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# NAT\n#---------------------------------#\n\npass out on $ext_if inet from $g_lan:network to any nat-to ($ext_if)\npass out on $ext_if inet from $c_lan:network to any nat-to ($ext_if)\npass out on $ext_if inet from $dmz:network to any nat-to ($ext_if)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePF gardera une trace de tout le trafic, et quand, e.g. un navigateur web sur\nle LAN Adultes demandera une page web de certains sites sur Internet,\nla réponse venant du serveur web depuis Internet sera routé au-travers de\nl\u0026rsquo;interface externe vers l\u0026rsquo;interface interne du LAN Adultes, et alors\ndirectement vers le PC qui a initié la requête.\u003c/p\u003e\n\u003cp\u003eEnfin, occupons-nous de la partie relative à la redirection dans notre\njeu de règles.\nC\u0026rsquo;est là où nous permettons le trafic venant d\u0026rsquo;Internet vers notre serveur\nweb publique sur l\u0026rsquo;interface réseau DMZ.\nVous devriez, bien sûr, laisser cette partie si vous n\u0026rsquo;avez pas de serveurs\npubliques qui nécessitent de redirection.\nDans cet exemple, j\u0026rsquo;ai seulement permis le trafic IPv4.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Redirects\n#---------------------------------#\n\n# Our web server - let the Internet access it.\npass in on $ext_if inet proto tcp to $ext_if port { 80 443 } rdr-to 192.168.3.2\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eLa redirection arrive toujours en dernier dans le jeu de règles !\u003c/div\u003e\n\n\u003cp\u003eC\u0026rsquo;est tout concernant le paramétrage basique de nos règles filtrantes.\u003c/p\u003e\n\u003ch4 id=\"une-liste-blanche-pour-les-enfants\"\u003eUne liste blanche pour les enfants\u003c/h4\u003e\n\u003cp\u003eSi vous voulez bloquer tout Internet pour les enfants, exceptés peut être\nquelques sites web ou certains serveurs de jeux, vous avez besoin de\nconnaître quelles adresses IP ces services ont et de créer une liste\nblanche utilisant ces adresses IP.\u003c/p\u003e\n\u003cp\u003eSi c\u0026rsquo;est un simple site web avec une adresse IP unique, c\u0026rsquo;est très facile\net vous pouvez le faire avec cette règle placée en dernier dans le bloc\npour enfants (vous devez remplacer la partie x.x.x.x avec l\u0026rsquo;adresse IP\npertinente) :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Childrens LAN Setup\n#---------------------------------#\n\n# Allow any computer or device attached to the childrens NIC to get an IP\n# address from DHCP on the router.\npass in on $c_lan inet proto udp from any port 67\n\n# Allow any computer or device attached to the childrens NIC to make DNS\n# queries.\npass in on $c_lan inet proto udp from any port 53\n\n# Always block DNS queries not addressed to our DNS server.\nblock return in quick on $c_lan proto { udp tcp} to ! $c_lan port { 53 853 }\n\n# Then allow any computer or device attached on the childrens LAN to reach\n# the IP address x.x.x.x only.\npass in on $c_lan to x.x.x.x\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi le site web a de multiples adresses IP, nous devons comprendre lesquelles.\nParfois une requête de nom de domaine peut révéler toutes les adresses IP\nconcernées en une fois.\nD\u0026rsquo;autres fois, nous avons besoin de répéter de multiples fois les requêtes\nà différentes intervalles de la journée avant d\u0026rsquo;obtenir l\u0026rsquo;ensemble complet\ndes adresses IP.\nVous pouvez faire cela en mettant en place un script automatisé.\u003c/p\u003e\n\u003cp\u003eParfois, nous aurons besoin de contacter l\u0026rsquo;entreprise en question et de\ndemander si nous pouvons avec l\u0026rsquo;ensemble des adresses IP pour notre liste\nblanche (certaines compagnies publient publiquement l\u0026rsquo;information, d\u0026rsquo;autres\nrefusent de livrer l\u0026rsquo;information par peur d\u0026rsquo;un usage malicieux).\nUne fois que vous avez déterminé quel est l\u0026rsquo;ensemble d\u0026rsquo;adresses IP, vous\npouvez faire une \u003ccode\u003etable\u003c/code\u003e PF pour l\u0026rsquo;utiliser.\u003c/p\u003e\n\u003cp\u003eDans cet exemple, nous ajoutons une nouvelle table dans la section table\ndes règles et nous changeons les paramètres des règles pour enfants.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e#---------------------------------#\n# Tables\n#---------------------------------#\n\n…\n\n# Whitelist for the children.\ntable \u0026lt;whitelist\u0026gt; { x.x.x.x y.y.y.y z.z.z.z }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt ensuite dans la section pour enfants, changez :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass in on $c_lan to x.x.x.x\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003een :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass in on $c_lan to \u0026lt;whitelist\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl n\u0026rsquo;est pas toujours possible d\u0026rsquo;avoir toutes les adresses IP dans une\nliste blanche en une fois, mais en surveillant le réseau, en utilisant e.g.\n\u003ca href=\"https://man.openbsd.org/tcpdump\" rel=\"external\"\u003etcpdump\u003c/a\u003e, quand le jeu essaye d’accéder\nau serveur, vous pouvez établir une liste, bit après bit.\nJ\u0026rsquo;ai fait cela avec les serveurs de connexion Mojan et Minecraft et de\nmultiples autres serveurs de jeux.\u003c/p\u003e\n\u003ch5 id=\"utilisation-dune-table-persistante\"\u003eUtilisation d\u0026rsquo;une table persistante\u003c/h5\u003e\n\u003cp\u003eUne autre approche pour collecter les IP est d\u0026rsquo;utiliser une \u003ca href=\"https://man.openbsd.org/pf.conf#TABLES\" rel=\"external\"\u003etable persistante\u003c/a\u003e\nen combinaison avec \u003ccode\u003e/etc/rc.local\u003c/code\u003e et les requêtes de noms de domaine.\n\u003ccode\u003e/etc/rc.local\u003c/code\u003e est seulement exécuté \u003cstrong\u003eaprès\u003c/strong\u003e que PF soit démarré ainsi\nles problèmes de résolution de DNS n\u0026rsquo;entraîneront pas des problèmes pour\nPF.\u003c/p\u003e\n\u003cp\u003eSi vous souhaitez utiliser la solution des tables persistantes, vous pouvez\nle faire en ajoutant une table persistante dans la section des tables\ndans \u003ccode\u003e/etc/pf.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etable \u0026lt;whitelist\u0026gt; persist\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans la section pour enfants, nous avons besoin de passer les données\nqui viennent de la liste blanche ci-dessus :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass in on $c_lan to \u0026lt;whitelist\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAlors, dans \u003ccode\u003e/etc/rc.local\u003c/code\u003e, nous pouvons ajouter la commande suivante :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epfctl -t whitelist -T add example.com\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOù \u003ccode\u003eexample.com\u003c/code\u003e est le domaine que PF doit chercher.\u003c/p\u003e\n\u003cp\u003eQuand vos enfants ne peuvent pas avoir accès parce que l\u0026rsquo;adresse IP valide\npourrait avoir changé, vous pouvez vous connecter au pare-feu et alors\nmettre à jour manuellement la table avec plus d\u0026rsquo;adresses IP en exécutant\nla commande :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epfctl -t whitelist -T add examples.com\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous voulez voir ce qui a été ajouté à cette liste, vous pouvez faire\nceci :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pfctl -t whitelist -T show\n74.6.143.25\n74.6.143.26\n74.6.231.20\n74.6.231.21\n98.137.11.163\n98.137.11.164\n216.58.208.110\n2001:4998:24:120d::1:0\n2001:4998:24:120d::1:1\n2001:4998:44:3507::8000\n2001:4998:44:3507::8001\n2001:4998:124:1507::f000\n2001:4998:124:1507::f001\n2a00:1450:400e:80e::200e\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eÉventuellement, vous pouvez ajouter toutes les adresses IP que vous collectez\n(avant qu\u0026rsquo;elles ne soient purgées) dans un fichier physique afin que l\u0026rsquo;option\n\u003ccode\u003epersist\u003c/code\u003e prenne en entrée ce fichier, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etable \u0026lt;whitelist\u0026gt; persist file \u0026#34;/etc/pf-whitelist.txt\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eLe fichier ne devra pas avoir d\u0026rsquo;adresses IP ajoutées en utilisant\nl\u0026rsquo;option \u003ccode\u003eadd\u003c/code\u003e à \u003ccode\u003epfctl\u003c/code\u003e.\nUne table persistante réside soit en mémoire, soit dans un fichier, mais\nl\u0026rsquo;option \u003ccode\u003eadd\u003c/code\u003e ne peut écrire sur le disque, seulement dans la mémoire.\nUne table persistante depuis un fichier est ce dont vous avez besoin afin\nde l\u0026rsquo;éditer manuellement depuis un éditeur de texte.\u003c/div\u003e\n\n\u003ch3 id=\"chargement-des-règles\"\u003eChargement des règles\u003c/h3\u003e\n\u003cp\u003eUne fois que vous avez fini de paramétrer votre jeu de règles, vous pouvez\nle tester avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pfctl -nf /etc/pf.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi tout est bon, chargez votre jeu de règles en supprimant l\u0026rsquo;option \u003ccode\u003e-n\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pfctl -f /etc/pf.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRegardez le résultat traduit avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pfctl -s rules\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"journalisation-et-monitoring\"\u003eJournalisation et Monitoring\u003c/h3\u003e\n\u003cp\u003eCeci est un exemple de sortie venant du journal de PF des essais bloqués\naccédant à l\u0026rsquo;interface externe, selon mon paramétrage. J\u0026rsquo;ai nettoyé la\nsortie et supprimé quelques données spécifiques, et bien sûr 0.0.0.0 n\u0026rsquo;est\npas mon adresse IP publique, mais vous savez déjà cela ;)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# tcpdump -n -e -ttt -r /var/log/pflog\n23:11:12 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3422: S 1501043655:1501043655(0) win 1024\n23:11:12 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3481: S 311078394:311078394(0) win 1024\n23:11:31 rule 14/(match) block in on em0: 176.214.44.229.25197 \u0026gt; 0.0.0.0.23: S 2084440900:2084440900(0) win 33620\n23:11:33 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3431: S 2774981044:2774981044(0) win 1024\n23:11:43 rule 14/(match) block in on em0: 81.68.114.52.17191 \u0026gt; 0.0.0.0.23: S 1346864438:1346864438(0) win 26375\n23:12:08 rule 14/(match) block in on em0: 193.27.229.26.53865 \u0026gt; 0.0.0.0.443: S 1057596009:1057596009(0) win 1024\n23:12:31 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4186: S 1233742605:1233742605(0) win 1024\n23:12:44 rule 14/(match) block in on em0: 74.120.14.70.65509 \u0026gt; 0.0.0.0.9125: S 1836577847:1836577847(0) win 1024 \u0026lt;mss 1460\u0026gt; [tos 0x20]\n23:12:44 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4128: S 2112968453:2112968453(0) win 1024\n23:13:15 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3669: S 3627248539:3627248539(0) win 1024\n23:13:19 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3654: S 3889665614:3889665614(0) win 1024\n23:13:29 rule 14/(match) block in on em0: 45.129.33.129.42239 \u0026gt; 0.0.0.0.4997: S 2249816896:2249816896(0) win 1024\n23:13:37 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3612: S 3797528151:3797528151(0) win 1024\n23:14:03 rule 14/(match) block in on em0: 190.207.89.17.64372 \u0026gt; 0.0.0.0.445: S 1097568353:1097568353(0) win 8192 \u0026lt;mss 1460,nop,wscale 2,nop,nop,sackOK\u0026gt; (DF)\n23:14:15 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4219: S 2834775769:2834775769(0) win 1024\n23:14:39 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.3702: S 1855726637:1855726637(0) win 1024\n23:14:39 rule 14/(match) block in on em0: 45.129.33.4.45980 \u0026gt; 0.0.0.0.4210: S 3052103070:3052103070(0) win 1024\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eComme vous pouvez le voir, il est un peu occupé, d\u0026rsquo;autant que je n\u0026rsquo;ai rien\nen cours d\u0026rsquo;exécution qui soit publiquement sur Internet dans ce paramétrage.\u003c/p\u003e\n\u003cp\u003eVous pouvez aussi monitorer PF en temps réel avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# tcpdump -n -e -ttt -i pflog0\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"dns\"\u003eDNS\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Domain_Name_System\" rel=\"external\"\u003eDNS (Domain Name Service)\u003c/a\u003e\nest utilisé pour traduire un nom de domaine dans une adresse IP ou vice-versa.\nPar exemple, quand vous écrivez \u003ca href=\"https://wikipedia.org/\" rel=\"external\"\u003ewikipedia.org\u003c/a\u003e\ndans la barre d\u0026rsquo;adresse de votre navigateur web, un serveur DNS faisant\nautorité traduit le nom de domaine \u0026ldquo;wikipedia.org\u0026rdquo; en une adresse IPv4,\ntelle que 91.198.174.192, et/ou une adresse IPv6, telle que 2620:0:862:ed1a::1.\u003c/p\u003e\n\u003cp\u003eDNS est aussi utilisé, en plus d\u0026rsquo;autres choses, pour stocker des informations\nsur les serveurs de messagerie appartenant à un nom de domaine particulier,\nle cas échéant.\u003c/p\u003e\n\u003cp\u003eSi vous utilisez un système d\u0026rsquo;exploitation de type UNIX, vous pouvez\ndémarrer un terminal et essayer de faire une recherche manuelle de nom\nde domaine avec \u003ccode\u003ehost\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ host wikipedia.org\nwikipedia.org has address 91.198.174.192\nwikipedia.org has IPv6 address 2620:0:862:ed1a::1\nwikipedia.org mail is handled by 10 mx1001.wikimedia.org.\nwikipedia.org mail is handled by 50 mx2001.wikimedia.org.\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSi \u003ccode\u003ehost\u003c/code\u003e n\u0026rsquo;est pas installé, ce qui dépend de votre plateforme, vous aurez\nbesoin d\u0026rsquo;installer \u003ca href=\"https://www.isc.org/bind/\" rel=\"external\"\u003ebind\u003c/a\u003e ou \u003ccode\u003ednsutils\u003c/code\u003e.\nVous pouvez aussi utiliser quelque chose comme \u003ca href=\"https://man.openbsd.org/dig\" rel=\"external\"\u003edig\u003c/a\u003e,\nqui vient de \u003ca href=\"https://www.isc.org/bind/\" rel=\"external\"\u003ebind\u003c/a\u003e, ou \u003ca href=\"https://linux.die.net/man/1/drill\" rel=\"external\"\u003edrill\u003c/a\u003e\nvenant de \u003ca href=\"https://nlnetlabs.nl/projects/ldns/about/\" rel=\"external\"\u003eldns\u003c/a\u003e.\u003c/div\u003e\n\n\u003cp\u003eLa liste qui suit décrit certains des termes associés à DNS :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eForward DNS\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCorrespondance des noms d\u0026rsquo;hôtes ou de domaines avec les adresses IP.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eReverse DNS\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCorrespondance des adresses IP avec les noms d\u0026rsquo;hôtes ou de domaines.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eResolver\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUn système par lequel une machine requiert un serveur de nom pour\nla zone d\u0026rsquo;information, i.e. un autre nom pour \u0026ldquo;Serveur DNS\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eRoot zone\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLe début de la hiérarchie des zones Internet. Toutes les zones sont\nsous la \u003ca href=\"https://en.wikipedia.org/wiki/DNS_root_zone\" rel=\"external\"\u003ezone racine\u003c/a\u003e,\nsimilaire à ce que sont tous les fichiers dans un système de fichier\nsous la hiérarchie racine /.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCeci est un exemple de zone :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e.\u003c/code\u003e (un point) est la manière dont la zone racine est habituellement\nréférée dans la documentation.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eorg.\u003c/code\u003e est le \u003ca href=\"https://fr.wikipedia.org/wiki/Domaine_de_premier_niveau\" rel=\"external\"\u003eTLD (Top-Level Domain)\u003c/a\u003e\nsous la zone root.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewikipedia.org.\u003c/code\u003e est la zone sous le TLD \u003ccode\u003eorg.\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e1.168.192.in-addr.arpa\u003c/code\u003e est la zone référençant toutes les adresses IP\nqui sont dans l\u0026rsquo;espace d\u0026rsquo;adresse IP \u003ccode\u003e192.168.1.*\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQuand un ordinateur sur Internet a besoin de résoudre un nom de domaine,\nle résolveur découpe le nom dans ses labels de la droite vers la gauche.\nLe premier composant, le TLD, est demandé en utilisant un serveur racine\npour obtenir le serveur faisant autorité responsable.\nLes requêtes pour chaque label retournent des serveurs de noms plus\nspécifiques jusqu\u0026rsquo;à ce qu\u0026rsquo;un serveur de noms renvoie la réponse à la\nrequête originale.\u003c/p\u003e\n\u003cp\u003eMême si un serveur DNS local peut implémenter ses propres serveurs de noms\nracines privés, le terme \u0026ldquo;serveur racine de noms\u0026rdquo; est utilisé pour décrire\n\u003ca href=\"https://fr.wikipedia.org/wiki/Serveur_racine_du_DNS#Les_serveurs_racine_du_DNS\" rel=\"external\"\u003eles 13 serveur racines de noms bien connus\u003c/a\u003e\nqui mettent en œuvre le domaine de l\u0026rsquo;espace racine des noms pour la mise\nen œuvre mondiale officielle du système de noms de domaine d\u0026rsquo;Internet.\nLes résolveurs utilisent un petit fichier nommé \u003ccode\u003eroot.hints\u003c/code\u003e de 3 Ko,\npublié par \u003ca href=\"https://fr.wikipedia.org/wiki/InterNIC\" rel=\"external\"\u003eInternic\u003c/a\u003e pour amorcer\ncette liste initiale d\u0026rsquo;adresses des serveurs racines.\nPour beaucoup de logiciels, incluant Unbound, cette liste est intégrée à\nl\u0026rsquo;intérieur du logiciel.\u003c/p\u003e\n\u003cp\u003eSur la \u003ca href=\"https://www.iana.org/domains/root/db\" rel=\"external\"\u003ebase de données de la zone racine\u003c/a\u003e,\nvous pouvez chercher les détails de délégation des domaines TLD, incluant\ndes TLD tels que .com, .org, et des TLD ayant des codes de pays, tels que\n.uk, .de.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePuisque vous pouvez chercher les détails de délégation des domaines TLD,\nvous pourriez vous attendre à ce qu\u0026rsquo;il soit possible d\u0026rsquo;aller en profondeur\net de chercher actuellement pour chaque domaine un serveur de domaine\nen particulier qui a enregistré dans sa base de données.\nPuisque nous avons, pour l\u0026rsquo;exemple, pris une liste des serveurs de noms\nTLD responsables pour le TLD \u003ca href=\"https://www.iana.org/domains/root/db/dk.html\" rel=\"external\"\u003e.dk\u003c/a\u003e,\nnous pourrions nous attendre à ce qu\u0026rsquo;il soit possible d\u0026rsquo;interroger l\u0026rsquo;un de\nces serveurs de noms listés pour l\u0026rsquo;ensemble de la base de données des\nserveurs faisant autorité, puis d\u0026rsquo;interroger l\u0026rsquo;un d\u0026rsquo;entre eux pour tous\nles domaines enregistrés dans sa base de données.\nMais ce n\u0026rsquo;est pas comme cela que fonctionne DNS.\nIl y a seulement deux manières pour obtenir la cartographie complète des\nserveurs DNS.\nSoit vous avez accès aux fichiers de la zone concernée, soit vous avez\nbesoin de construire physiquement une base de donnée en examinant le trafic\nDNS au-travers un serveur DNS récursif et alors de reconstituer les données\nde la zone à partir des données recueillies, jusqu\u0026rsquo;à ce que vous obteniez\ntout, ce qui est très peu probable.\u003c/div\u003e\n\n\u003cp\u003eIl y a deux types de configuration de serveur DNS :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eAutorité\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[Les serveurs de noms faisant autorité] publie les adresses pour les\ndomaines sous leur contrôle. Ces serveurs sont listés au début de la\nchaîne d\u0026rsquo;autorité pour leurs domaines respectifs, et sont capables de\nfournir une réponse définitive. \u003cbr\u003e\nLes serveurs de noms faisant autorité peuvent être les serveurs de noms\nprimaires, connus aussi en tant que serveurs maîtres, i.e. ils contiennent\nle jeu original des données, ou être des serveurs de noms secondaires\nou esclaves, contenant des copies des données habituellement obtenues\npar synchronisation directe avec le serveur primaire. \u003cbr\u003e\nUn serveur de nom faisant autorité est un serveur de nom qui donne\nseulement des réponses aux requêtes DNS venant de données qui ont été\nconfigurées par une source originale, par exemple, l\u0026rsquo;administrateur\nde domaine. \u003cbr\u003e\nChaque zone DNS doit être assignée à un ensemble de serveurs de noms\nfaisant autorité.\nCet ensemble de serveurs est enregistré dans la zone de domaine parente\ndes enregistrements du serveur de noms (NS).\nUn serveur faisant autorité indique son statut de fournisseur de\nréponses définitives, considérées comme faisant autorité, en posant\nun drapeau de protocole, appelé bit \u0026ldquo;Authoritative Answer\u0026rdquo; (AA), dans\nses réponses. \u003cbr\u003e\nVous pouvez utiliser un outil réseau, tel que \u003ca href=\"https://man.openbsd.org/dig\" rel=\"external\"\u003edig\u003c/a\u003e\nou \u003ca href=\"https://linux.die.net/man/1/drill\" rel=\"external\"\u003edrill\u003c/a\u003e pour interroger un nom\nde domaine ; l\u0026rsquo;outil répondra avec un drapeau faisant autorité qui\nrévèle si le serveur DNS vous avez interrogé est celui qui fait autorité.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eRécursif\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Domain_Name_System\" rel=\"external\"\u003eLes serveurs récursifs\u003c/a\u003e\nparfois appelés \u0026ldquo;DNS caches\u0026rdquo; ou \u0026ldquo;serveurs de noms de cache seulement\u0026rdquo;\nfournissent la résolution de noms DNS pour les applications, en relayant\nles requêtes de l\u0026rsquo;application cliente vers la chaîne des serveurs de\nnoms faisant autorité afin de résoudre pleinement un nom de domaine.\n(Typiquement) ils mettent en cache le résultat pour répondre a de\nfutures requêtes potentielles dans une certaine période de temps avant\nexpiration. \u003cbr\u003e\nLa plupart des utilisateurs d\u0026rsquo;Internet accèdent à un serveur DNS récursif\npublique fournit par leur FAI ou un fournisseur de service DNS publique. \u003cbr\u003e\nEn théorie, les serveurs de noms faisant autorité sont suffisant pour\nopérer sur Internet.\nToutefois, avec seulement les serveurs de noms faisant autorité opérant,\nchaque requête DNS doit démarrer avec des requêtes successives à la\nzone racine du système de nom de domaine et chaque utilisateur système\ndevrait avoir à implémenter un logiciel résolveur capable d\u0026rsquo;opérations\nde résolution.\nPour améliorer l\u0026rsquo;efficacité, réduire le trafic DNS sur Internet, et\naugmenter la performance des applications utilisateurs, le système de\nnoms de domaine prend en charge les résolveurs récursifs. \u003cbr\u003e\nUne requête d\u0026rsquo;un DNS récursif est celle pour laquelle un serveur DNS\nrépond complètement à la requête en interrogeant d\u0026rsquo;autres serveurs\nde noms, selon ses besoins.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUn serveur de noms peut être à la fois faisant autorité et récursif, mais\nil n\u0026rsquo;est pas recommandé de combiner la configuration des deux types.\nPour être en mesure d\u0026rsquo;effectuer leur travail, les serveurs faisant autorité\ndoivent être disponibles à tous les clients, tout le temps.\nD\u0026rsquo;un autre côté, étant donné que la requête récursive prend plus de temps\nqu\u0026rsquo;une réponse faisant autorité, les serveurs récursifs devraient être\nrestreints à un nombre de clients seulement, car ils sont enclins à des\n\u003ca href=\"https://fr.wikipedia.org/wiki/Attaque_par_d%C3%A9ni_de_service\" rel=\"external\"\u003eattaques par déni de service distribué (DDoS)\u003c/a\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSi besoin, je vous recommande de lire \u0026ldquo;How DNS Works\u0026rdquo; du\n\u003ca href=\"https://tldp.org/LDP/nag2/x-087-2-resolv.howdnsworks.html\" rel=\"external\"\u003echapitre 6 du Guide de l\u0026rsquo;Administrateur Réseau Linux\u003c/a\u003e.\nJe recommande aussi de lire l\u0026rsquo;article \u003ca href=\"https://fr.wikipedia.org/wiki/Domain_Name_System\" rel=\"external\"\u003eDNS\u003c/a\u003e sur Wikipédia.\u003c/div\u003e\n\n\u003ch3 id=\"je-vous-présente-unbound\"\u003eJe vous présente Unbound\u003c/h3\u003e\n\u003cp\u003e\u003ca href=\"https://nlnetlabs.nl/projects/unbound/about/\" rel=\"external\"\u003eUnbound\u003c/a\u003e est un résolveur\nDNS Open Source récursif, cache et validant avec les fonctionnalités\nsuivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCache avec possibilité de récupèrer des éléments populaires avant qu\u0026rsquo;ils\nexpirent.\u003c/li\u003e\n\u003cli\u003eServeur et Redirection DoT (DNS over TLS), avec validation de domaine\u003c/li\u003e\n\u003cli\u003eDoH (DNS over HTTPS)\u003c/li\u003e\n\u003cli\u003eMinimisation du nom de la requête\u003c/li\u003e\n\u003cli\u003eUtilisation aggressive du cache validé par DNSSEC.\u003c/li\u003e\n\u003cli\u003eZones faisant autorité, pour une copie locale de la zone racine.\u003c/li\u003e\n\u003cli\u003eDNS64\u003c/li\u003e\n\u003cli\u003eDNSCrypt\u003c/li\u003e\n\u003cli\u003eValidation DNSSEC\u003c/li\u003e\n\u003cli\u003eClient de sous-réseau EDNS\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUnbound est conçu pour être rapide et sécurisé et incorpore des fonctionnalités\nmodernes basées sur des normes ouvertes. Fin 2019, Unbound a été\n\u003ca href=\"https://ostif.org/wp-content/uploads/2019/12/X41-Unbound-Security-Audit-2019-Final-Report.pdf\" rel=\"external\"\u003erigoureusement audité\u003c/a\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eUne des principales raisons d\u0026rsquo;utiliser Unbound plutôt que de nombreux autres\nrésolveurs cache seulement, tel que \u003ca href=\"https://fr.wikipedia.org/wiki/Dnsmasq\" rel=\"external\"\u003ednsmasq\u003c/a\u003e\npar exemple, est que si vous n\u0026rsquo;utilisez pas l\u0026rsquo;option \u003cstrong\u003eforward\u003c/strong\u003e dans la\nconfiguration d\u0026rsquo;Unbound, Unbound \u003cstrong\u003efera des requêtes directement aux serveurs\nracines\u003c/strong\u003e en utilisant leurs adresses IP enregistrées et listées dans le\n\u003ca href=\"https://www.iana.org/domains/root/files\" rel=\"external\"\u003efichier Root Hints\u003c/a\u003e.\nCeci vous libèrera des serveurs DNS de votre FAI, et de tout serveur DNS\npublique, tel que Google ou Cloudflare, et tout enregistrement, vente et\nmanipulation de données, tels qu\u0026rsquo;ils le font sera évité.\nUn simple serveur cache tel que dnsmasq devra toujours rediriger ses requêtes\nvers un autre serveur, là où Unbound interrogera les serveurs racines\ndirectement et suivra la chaîne des domaines jusqu\u0026rsquo;à ce qu\u0026rsquo;il obtienne\nl\u0026rsquo;enregistrement pertinent depuis le serveur DNS faisant autorité pour le\ndomaine concerné.\nCela signifie que le serveur DNS qui sait spécifiquement ce que vous\nrecherchez soit aussi celui qui fait autorité pour répondre à la question.\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eSi votre FAI fait du détournement de trafic DNS, Unbound ne vous aidera\nen aucune manière.\nLisez la section \u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#détournement-de-dns\"\u003eDétournement de DNS\u003c/a\u003e concernant\nl\u0026rsquo;information afin que vous puissiez déterminer sir le trafic\nde votre DNS est détourné.\u003c/div\u003e\n\n\u003cp\u003eDans notre paramétrage avec Unbound, une requête pour un domaine tel que\n\u0026ldquo;wikipedia.org\u0026rdquo; ressemblera à ceci :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eVotre navigateur envoie une requête au système d\u0026rsquo;exploitation, avec\nla question \u0026ldquo;Quelle est l\u0026rsquo;adresse IP de wikipedia.org ?\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eLe système d\u0026rsquo;exploitation, plus spécifiquement les routines du résolveur\ndans la bibliothèque C, qui fournit l\u0026rsquo;accès au Système de Noms de Domaines\nsur Internet, redirigera la requête DNS vers le(s) serveur(s) de noms de\ndomaine listé dans \u003ca href=\"https://man.openbsd.org/resolv.conf\" rel=\"external\"\u003e/etc/resolv.conf\u003c/a\u003e\n(sur des systèmes d\u0026rsquo;exploitation de type UNIX)\u003c/li\u003e\n\u003cli\u003eUnbound reçoit la requête et en premier cherche \u0026ldquo;wikipedia.org\u0026rdquo; dans son\ncache et s\u0026rsquo;il ne le trouve pas, interroge un des serveurs racines listés\ndans son fichier Root Hints pour le domaine TLD \u0026ldquo;.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eLe serveur racine répond par une référence aux serveurs concernés du\ndomaine TLD \u0026ldquo;.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eUnbound envoie alors une requête à l\u0026rsquo;un des serveurs concernés demandant\nquels sont les serveurs DNS faisant autorité pour \u0026ldquo;wikipedia.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eLe serveur répond avec une référence aux serveurs de noms faisant autorité\nenregistrés pour \u0026ldquo;wikipedia.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eUnbound envoie alors une requête à l\u0026rsquo;un des serveurs de noms faisant\nautorité et demande l\u0026rsquo;adresse IP pour \u0026ldquo;wikipedia.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eLe serveur de noms faisant autorité répond par l\u0026rsquo;envoi de l\u0026rsquo;adresse IP\nlistée dans les enregistrements \u0026ldquo;A\u0026rdquo; et/ou \u0026ldquo;AAAA\u0026rdquo; pour le domaine\n\u0026ldquo;wikipedia.org\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eUnbound reçoit l\u0026rsquo;adresse IP du serveur de noms faisant autorité et\nretourne la réponse au client.\u003c/li\u003e\n\u003cli\u003eSi cela est activé, Unbound met en cache alors l\u0026rsquo;information pour une\nlongueur de temps prédéterminée pour de futures requêtes pour le même nom\nde domaine.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eVous pouvez essayer de faire une \u003ccode\u003etrace\u003c/code\u003e DNS par vous-mêmes pour voir le\npropos ci-dessus. J\u0026rsquo;utilise \u003ca href=\"https://linux.die.net/man/1/drill\" rel=\"external\"\u003edrill\u003c/a\u003e\ndans cet exemple avec l\u0026rsquo;option \u003ccode\u003etrace\u003c/code\u003e activée.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# drill -T wikipedia.org\n.       518400  IN      NS      l.root-servers.net.\n.       518400  IN      NS      k.root-servers.net.\n.       518400  IN      NS      e.root-servers.net.\n.       518400  IN      NS      a.root-servers.net.\n.       518400  IN      NS      m.root-servers.net.\n.       518400  IN      NS      h.root-servers.net.\n.       518400  IN      NS      i.root-servers.net.\n.       518400  IN      NS      f.root-servers.net.\n.       518400  IN      NS      c.root-servers.net.\n.       518400  IN      NS      b.root-servers.net.\n.       518400  IN      NS      g.root-servers.net.\n.       518400  IN      NS      d.root-servers.net.\n.       518400  IN      NS      j.root-servers.net.\norg.    172800  IN      NS      a0.org.afilias-nst.info.\norg.    172800  IN      NS      a2.org.afilias-nst.info.\norg.    172800  IN      NS      b0.org.afilias-nst.org.\norg.    172800  IN      NS      b2.org.afilias-nst.org.\norg.    172800  IN      NS      c0.org.afilias-nst.info.\norg.    172800  IN      NS      d0.org.afilias-nst.org.\nwikipedia.org.  86400   IN      NS      ns0.wikimedia.org.\nwikipedia.org.  86400   IN      NS      ns1.wikimedia.org.\nwikipedia.org.  86400   IN      NS      ns2.wikimedia.org.\nwikipedia.org.  600     IN      A       91.198.174.192\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eUnbound a la capacité de valider les réponses qu\u0026rsquo;il reçoit comme correctes.\nC\u0026rsquo;est habituellement accompli par l\u0026rsquo;utilisation de\n\u003ca href=\"https://fr.wikipedia.org/wiki/Domain_Name_System_Security_Extensions\" rel=\"external\"\u003eDNSSEC\u003c/a\u003e\nou l\u0026rsquo;utilisation de bits aléatoires encodés 0x20 dans la requête pour\ndéjouer les tentatives d\u0026rsquo;usurpation d\u0026rsquo;identité.\nÀ l\u0026rsquo;exception des \u003ca href=\"https://man.openbsd.org/unbound.conf#use~3\" rel=\"external\"\u003ebits aléatoires encodés 0x20\u003c/a\u003e,\ntous les autres paramétres de validation tel que \u003ca href=\"https://man.openbsd.org/unbound.conf#harden~3\" rel=\"external\"\u003eharden-glue\u003c/a\u003e\net \u003ca href=\"https://man.openbsd.org/unbound.conf#harden~4\" rel=\"external\"\u003ehardened dnssec-stripped data\u003c/a\u003e\nsont tous activés par défaut dans Unbound pour OpenBSD.\u003c/div\u003e\n\n\u003ch3 id=\"blocage-par-dns\"\u003eBlocage par DNS\u003c/h3\u003e\n\u003cp\u003eLe blocage par DNS, appelé aussi filtrage ou usurpation DNS, est le processus\nqui vous permet de fournir une \u0026ldquo;fausse\u0026rdquo; réponse au client qui effectue\nla requête.\nNous bloquons une requête pour une adresse IP valide soit en répondant avec\nun \u003ca href=\"https://tools.ietf.org/html/rfc8020\" rel=\"external\"\u003eNXDOMAIN\u003c/a\u003e, signifiant nom de domaine\ninexistant, ou soit en redirigeant vers une autre adresse IP que celle prévue\npar le propriétaire du domaine.\u003c/p\u003e\n\u003cp\u003eCela nous oblige à créer une liste, ou des listes multiples, de domaines\nque nous voulons bloquer et plutôt que de fournir à l\u0026rsquo;utilisateur l\u0026rsquo;adresse\nIP correcte pour un certain domaine, nous renvoyons le message que le\ndomaine est \u0026ldquo;inexistant\u0026rdquo;, ce qui bloquera toute communication vers la\ndestination prévue pour l\u0026rsquo;application.\u003c/p\u003e\n\u003cp\u003eNormalement, toutes les requêtes DNS sont envoyés vers le port 53 soit sur\nle protocole UDP, soit TCP, lors de la mise en place du serveur DNS, ce que\nnous faisons avec Unbound, et en s\u0026rsquo;assurant que tout le trafic du port 53\natteigne notre serveur DNS ou autrement soit bloqué ; nous pouvons nous\nassurer que toutes les réponses DNS viennent de notre serveur Unbound interne\nà notre routeur OpenBSD.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eVous ne pouvez pas pleinement faire confiance au blocage par DNS car le\nblocage par DNS peut être contourné.\nMême en ayant une solide approche en place, il est toujours possible pour\nquelqu\u0026rsquo;un d\u0026rsquo;utiliser un \u003ca href=\"https://fr.wikipedia.org/wiki/R%C3%A9seau_priv%C3%A9_virtuel\" rel=\"external\"\u003eservice VPN\u003c/a\u003e\npour contourner cela.\nNous n\u0026rsquo;essayons pas de construire un système 100% infaillible - même si\nnous y reviendrons un peu plus loin dans ce guide - nous essayons juste\nde protéger nos familles de la meilleure manière.\nIl y a toujours aussi les autres points d\u0026rsquo;accès à Internet que nous devons\nconsidérer, tels que les téléphones, ceux des amis ou leur maison, les\naccès publique à Internet, etc.\u003c/div\u003e\n\n\u003ch4 id=\"nxdomain-vs-redirection\"\u003eNXDOMAIN vs redirection\u003c/h4\u003e\n\u003cp\u003eQuand nous voulons bloquer un domaine en utilisant DNS, nous pouvons choisir\nentre différentes méthodes, mais les deux plus populaires sont soit de\nrediriger la requête DNS vers une adresse IP locale, tel que 127.0.0.1 ou\n0.0.0.0, ou de répondre par une définition NXDOMAIN.\nNXDOMAIN est une norme de réponse pour un \u0026ldquo;nom de domaine Intranet ou\nInternet non existant\u0026rdquo;.\nSi le nom de domaine est incapable d\u0026rsquo;être résolu en utilisant DNS, une\ncondition appellée NXDOMAIN est obtenue.\u003c/p\u003e\n\u003cp\u003eNous pouvons essayer de résoudre un domaine non existant avec la commande\n\u003ccode\u003ehost\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ host a1b7c3n9m3b0.com\nHost a1b7c3n9m3b0.com not found: 3(NXDOMAIN)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuisque le nom de domaine \u0026ldquo;a1b7c3n9m3b0.com\u0026rdquo; n\u0026rsquo;est enregistré par personne\n(au moins pas durant le temps où j\u0026rsquo;écris cela), nous obtenons une réponse\n\u0026ldquo;NXDOMAIN\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eNous pouvons aussi utiliser \u003ccode\u003edrill\u003c/code\u003e. L\u0026rsquo;information pertinente depuis la\nsortie de \u003ccode\u003edrill\u003c/code\u003e est le champ \u003ccode\u003ercode\u003c/code\u003e dans la section \u0026ldquo;HEADER\u0026rdquo; :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ drill a1b7c3n9m3b0.com\n;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NXDOMAIN, id: 39710\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOu si vous préférez \u003ccode\u003edig\u003c/code\u003e, alors l\u0026rsquo;information pertinente est localisée\ndans le champ \u003ccode\u003estatus\u003c/code\u003e dans la section \u0026ldquo;HEADER\u0026rdquo; :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ dig a1b7c3n9m3b0.com\n\n; \u0026lt;\u0026lt;\u0026gt;\u0026gt; DiG 9.16.8 \u0026lt;\u0026lt;\u0026gt;\u0026gt; +search a1b7c3n9m3b0.com\n;; global options: +cmd\n;; Got answer:\n;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, status: NXDOMAIN, id: 48858\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUtiliser une réponse NXDOMAIN n\u0026rsquo;est pas seulement la manière correcte de\nbloquer un domaine, en accord avec la \u003ca href=\"https://tools.ietf.org/html/rfc8020\" rel=\"external\"\u003eRFC8020\u003c/a\u003e,\nmais c\u0026rsquo;est aussi la meilleure manière de le faire puisque une redirection\nvers une adresse IP, telle que 127.0.0.1 ou 0.0.0.0 fera simplement que\nle client qui initie la requête DNS se parlera à lui-même.\u003c/p\u003e\n\u003cp\u003eIl se peut que le navigateur réponde avec quelque chose comme :\n\u003ccode\u003eFirefox can't establish a connection to the server at 0.0.0.0.\u003c/code\u003e.\nToutefois, puisque l\u0026rsquo;adresse IP 0.0.0.0 se traduit simplement  par notre\nmachine locale, nous pouvons toujours envoyé un ping à cette adresse, car\nelle est synonyme d\u0026rsquo;un ping à 127.0.0.1 :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ ping 0.0.0.0\nPING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.\n64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.019 ms\n64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.049 ms\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt puisque je recommande que vous utilisiez une réponse NXDOMAIN, c\u0026rsquo;est\nce que nous allons utiliser dans ce tutoriel.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eUnbound peut gérer des listes énormes de domaines bloqués avec une réponse\nNXDOMAIN, mais il ne peut pas gérer de grandes listes de domaines qui ont\nbesoin d\u0026rsquo;être redirigés aussi bien.\nSi pour certaines raisons, vous devriez insister sur la redirection plutôt\nque d\u0026rsquo;utiliser NXDOMAIN, je vous recommande de paramétrer\n\u003ca href=\"http://www.thekelleys.org.uk/dnsmasq/doc.html\" rel=\"external\"\u003ednsmasq\u003c/a\u003e\navec l\u0026rsquo;option \u003cstrong\u003e\u0026ndash;addn-hosts=\u0026lt;file\u0026gt;\u003c/strong\u003e, pour qu\u0026rsquo;il écoute le port 53 et\nqu\u0026rsquo;il redirige tous les domaines bloqués, pendant qu\u0026rsquo;il redirige les requêtes\nDNS normales vers Unbound. Cela demande de paramétrer Unbound afin d\u0026rsquo;écouter\nsur un port non standard, tel que le port 5353.\nContrairement à Unbound, dnsmasq peut gérer d\u0026rsquo;énormes listes de redirection\ntrès bien, mais il ne peut gérer de grandes liste de domaines NXDOMAIN\naussi bien, devenant extrêmement lent.\u003c/div\u003e\n\n\u003ch3 id=\"le-problème-avec-dns-sur-https-doh\"\u003eLe problème avec DNS sur HTTPS (DOH)\u003c/h3\u003e\n\u003cp\u003eAvec l\u0026rsquo;introduction de \u003ca href=\"https://fr.wikipedia.org/wiki/DNS_over_HTTPS\" rel=\"external\"\u003eDoH (DNS over HTTPS)\u003c/a\u003e,\nle blocage par DNS est devenu beaucoup plus difficile, et, bien que j\u0026rsquo;ai\nun certain respect pour l\u0026rsquo;idée originale derrière la promotion de DoH du\npoint de vue de la confidentialité, DoH est mal construit d\u0026rsquo;un point de\nvue de la sécurité, et c\u0026rsquo;est une \u003cstrong\u003eMAUVAISE\u003c/strong\u003e approche.\u003c/p\u003e\n\u003cp\u003eAvec le nombre déjà croissant de serveurs DNS publiques capable de servir\ndu DNS sur HTTPs, toute application peut maintenant utiliser DoH et\ncontourner complétement le blocage par DNS au niveau privé et entreprise.\nNon seulement cela, mais DoH a ouvert une large porte pour les dévelopeurs\nd\u0026rsquo;application afin de paramétrer leurs propres serveurs DoH et de les\nutiliser dans leurs applications au lieu du serveur DNS régulier attaché\nau réseau interne.\nC\u0026rsquo;est spécifiquement un problème pour le\n\u003ca href=\"https://fr.wikipedia.org/wiki/Logiciel_propri%C3%A9taire\" rel=\"external\"\u003elogiciel propriétaire\u003c/a\u003e\ndont nous ne pouvons pas voir le code source, mais dont nous ne pouvons\npas aussi changer les paramétres DoH.\u003c/p\u003e\n\u003cp\u003eÀ cause de DoH, nous ne pouvons plus bloquer simplement des domaines, tels\nque les publicitaires ou le porno, nous devons aussi commencer à bloquer\nles serveurs DoH publiques via le pare-feu.\nToutefois, bien que garder une liste croissante d\u0026rsquo;un nombre d\u0026rsquo;adresses IP\nde serveurs DoH publique soit assez problèmatique, garder une liste de\nserveurs DoH publiques inconnus, qui peuvent être utilisé par du logiciel\npropriétaire, tel que du micro-logiciel dans des dispositifs\n\u003ca href=\"https://fr.wikipedia.org/wiki/Internet_des_objets\" rel=\"external\"\u003eIoT\u003c/a\u003e, est impossible.\u003c/p\u003e\n\u003cp\u003eDoH est aussi un complet cauchemard pour les entreprises car il rend\nbasiquement possible de surpasser les paramétres DNS imposés centralement.\nCela rend impossible de fournir des solutions de filtrage, telle que\ncelle que nous faisons, pour bloquer la publicité et le porno, et rend\nimpossible pour les administrateurs systèmes de surveiller les paramétres\nDNS du système d\u0026rsquo;exploitation afin de prévenir les attaques de\n\u003ca href=\"https://fr.wikipedia.org/wiki/Manipulation_de_l%27espace_des_noms_de_domaine\" rel=\"external\"\u003emanipulation DNS\u003c/a\u003e.\nAvoir de multiples applications qui ont leur unique paramétre DoH est un\ncauchemar.\u003c/p\u003e\n\u003cp\u003eDoH gène complétement l\u0026rsquo;analyse réseau et la surveillance du trafic DNS\nà des fins de sécurité.\nEn 2019, Godlua, un bot Linux DDoS, était le premier\n\u003ca href=\"https://fr.wikipedia.org/wiki/Logiciel_malveillant\" rel=\"external\"\u003elogiciel malveillant\u003c/a\u003e\nvu à \u003ca href=\"https://www.zdnet.com/article/first-ever-malware-strain-spotted-abusing-new-doh-dns-over-https-protocol/\" rel=\"external\"\u003eutiliser DoH pour cacher son trafic DNS\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eDe plus, et c\u0026rsquo;est peut-être l\u0026rsquo;aspect le plus important, DoH \u003cstrong\u003en\u0026rsquo;empêche\naucunément le suivi des utilisateurs\u003c/strong\u003e.\nCertaines parties de la connection HTTPS ne sont pas chiffrées, tels que\nles \u003ca href=\"https://fr.wikipedia.org/wiki/Server_Name_Indication\" rel=\"external\"\u003echamps SNI\u003c/a\u003e\n(mais on y arrive lentement), les \u003ca href=\"https://fr.wikipedia.org/wiki/Online_Certificate_Status_Protocol\" rel=\"external\"\u003econnexions OCSP\u003c/a\u003e,\net bien sûr \u003cstrong\u003eles adresses IP de destination\u003c/strong\u003e, ce qui à mon humble avis\nest le point le plus crucial de la communication qui a besoin d\u0026rsquo;être caché !\u003c/p\u003e\n\u003cp\u003eLes personnes qui ont vraiment besoin de confidentialité, tels que les\njournalistes dans des pays ayant une politique de confidentialité compromise,\nne peuvent faire confiance à DoH !\nL\u0026rsquo;adresse IP du serveur de destination ne peut pas être caché avec DoH,\nmême si tout le trafic est lui-même chiffré.\nSi quelqu\u0026rsquo;un a vraiment besoin de chiffrer la communication, il a besoin\nd\u0026rsquo;une stratégie complétement différente de DoH.\u003c/p\u003e\n\u003cp\u003eCela me fait me demander qui a pensé que DoH était une bonne idée au départ ?!\nNe comprennent-ils pas les bases derrière les communications avec HTTPS,\nou peut-être est-ce l\u0026rsquo;agenda poussé par quelques entreprises privées de\nservice DNS, tel que Cloudflare, qui tire profit en collectant davantage\nde données utilisateurs ?\u003c/p\u003e\n\u003cp\u003eCertains fournisseurs de service DNS publique status que d\u0026rsquo;un point de vue\nde la confidentialité, DoH est meilleur que d\u0026rsquo;autres alternatives, telle\n\u003ca href=\"https://en.wikipedia.org/wiki/DNS_over_TLS\" rel=\"external\"\u003eDoT (DNS over TLS)\u003c/a\u003e, puisque\nles requêtes DNS sont cachées dans le large flux du trafic HTTPS.\nCela donne aux administrateurs réseaux moins de visibilité mais fournit\naux utilisateurs plus de confidentialité.\u003c/p\u003e\n\u003cp\u003eCe message est problématique.\nBien qu\u0026rsquo;il soit vrai que la recherche initiale d\u0026rsquo;un nom de domaine soit\ncaché dans le trafic HTTPS, l\u0026rsquo;adresse IP de destination fournit par le\nserveur DoH ne l\u0026rsquo;est pas.\nQuand l\u0026rsquo;application cliente visite l\u0026rsquo;adresse IP de destination, les deux\nadresses IP, celle de source et celle de destination, sont journalisées\nau niveau du FAI (et possiblement à de multiples autres niveaux, aussi bien).\u003c/p\u003e\n\u003cp\u003eBien qu\u0026rsquo;il ne soit pas immédiatement possible de déterminer exactement\nquel nom de domaine l\u0026rsquo;utilisateur essaye d\u0026rsquo;atteindre, spécifiquement si\nle serveur web fait fonctionner de multiples domaines sur la même adresse\nIP, ce n\u0026rsquo;est définitivement pas impossible voire n\u0026rsquo;est même pas difficile.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eDans l\u0026rsquo;appendice, vous pouvez trouver un chapitre appellé\n\u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#inspecter-dns-sur-https-doh\"\u003eInspecter DNS sur HTTPS (DOH)\u003c/a\u003e,\ndans laquelle nous ferons une démonstration de comment l\u0026rsquo;adresse IP de\ndestination est révélée dans la communication DoH.\nVous pouvez aussi trouver un chapitre appellé\n\u003ca href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/#bloquer-dns-sur-https-doh\"\u003eBloquer DNS sur HTTPS (DOH)\u003c/a\u003e dans\nlaquelle nous utilisons le pare-feu PF pour bloquer les serveurs DoH publiques.\u003c/div\u003e\n\n\u003ch3 id=\"paramétrage-dunbound\"\u003eParamétrage d\u0026rsquo;Unbound\u003c/h3\u003e\n\u003ch4 id=\"paramétrages-de-base\"\u003eParamétrages de base\u003c/h4\u003e\n\u003cp\u003eParamètrer Unbound est très facile, car Unbound est fourni avec les meilleurs\nparamètres par défaut, mais est aussi très bien documenté.\nAvant que nous commencions, je vous recommande de regarder les pages des\nmanuels OpenBSD pour \u003ca href=\"https://man.openbsd.org/unbound\" rel=\"external\"\u003eunbound\u003c/a\u003e,\n\u003ca href=\"https://man.openbsd.org/unbound-checkconf\" rel=\"external\"\u003eunbound-checkconf\u003c/a\u003e\net \u003ca href=\"https://man.openbsd.org/unbound.conf\" rel=\"external\"\u003eunbound.conf\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eDu fait qu\u0026rsquo;Unbound soit \u003ca href=\"https://fr.wikipedia.org/wiki/Chroot\" rel=\"external\"\u003echrooté\u003c/a\u003e\nsur OpenBSD, le fichier de configuration \u003ccode\u003eunbound.conf\u003c/code\u003e ne réside pas\ndans \u003ccode\u003e/etc\u003c/code\u003e, là où il devrait être normalement, mais à la place réside\ndans \u003ccode\u003e/var/unbound/etc/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCopiez le fichier de configuration existant d\u0026rsquo;Unbound :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# mv /var/unbound/etc/unbound.conf /var/unbound/etc/unbound.conf.backup\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnsuite, utilisez votre éditeur texte favori et créer un nouveau fichier\n\u003ccode\u003e/var/unbound/etc/unbound.conf\u003c/code\u003e et remplissez-le avec le contenu suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eserver:\n\n    # Logging (default is no).\n    # Uncomment this section if you want to enable logging.\n    # Note enabling logging makes the server (significantly) slower.\n    # verbosity: 2\n    # log-queries: yes\n    # log-replies: yes\n    # log-tag-queryreply: yes\n    # log-local-actions: yes\n\n    interface: 127.0.0.1\n    interface: 192.168.1.1\n    interface: 192.168.2.1\n    interface: 192.168.3.1\n\n    # In case you need Unbound to listen on an alternative port, this is the\n    # syntax:\n    # interface: 127.0.0.1@5353\n\n    # Control who has access.\n    access-control: 0.0.0.0/0 refuse\n    access-control: ::0/0 refuse\n    access-control: 127.0.0.0/8 allow\n    access-control: ::1 allow\n    access-control: 192.168.1.0/24 allow\n    access-control: 192.168.2.0/24 allow\n    access-control: 192.168.3.0/24 allow\n\n    # \u0026#34;id.server\u0026#34; and \u0026#34;hostname.bind\u0026#34; queries are refused.\n    hide-identity: yes\n\n    # \u0026#34;version.server\u0026#34; and \u0026#34;version.bind\u0026#34; queries are refused.\n    hide-version: yes\n\n    # Cache elements are prefetched before they expire to keep the cache up to date.\n    prefetch: yes\n\n    # Our LAN segments.\n    private-address: 192.168.0.0/16\n\n    # We want DNSSEC validation.\n    auto-trust-anchor-file: \u0026#34;/var/unbound/db/root.key\u0026#34;\n\n# Enable the usage of the unbound-control command.\nremote-control:\n    control-enable: yes\n    control-interface: /var/run/unbound.sock\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eJ\u0026rsquo;ai commenté les options ci-dessus, mais si vous avez besoin d\u0026rsquo;explications\nplus profondes concernant la configuration, regardez la page du manuel\n\u003ca href=\"https://man.openbsd.org/unbound.conf\" rel=\"external\"\u003eunbound.conf\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLa journalisation est faite par défaut vers syslog.\nSi vous voulez changer cela, vous pouvez créer un fichier log dans le\nchroot d\u0026rsquo;Unbound et ainsi avoir le journal d\u0026rsquo;Unbound :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# mkdir /var/unbound/log\n# touch /var/unbound/log/unbound.log\n# chown -R root._unbound /var/unbound/log\n# chmod -R 774 /var/unbound/log\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt, dans le fichier \u003ccode\u003eunbound.conf\u003c/code\u003e, ajoutez les options suivantes vers la\nsection de journalisation :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elogfile: \u0026#34;/log/unbound.log\u0026#34;\nuse-syslog: no\nlog-time-ascii: yes\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eNous n\u0026rsquo;utilisons pas le chemin complet du fichier de log parce qu\u0026rsquo;Unbound\nest chrooté.\nAvec l\u0026rsquo;option \u003ccode\u003elogfile\u003c/code\u003e ci-dessus, le fichier log se retrouve dans\n\u003ccode\u003e/var/unbound/log/unbound.log\u003c/code\u003e.\u003c/div\u003e\n\n\u003cp\u003ePuis, redémarrez Unbound :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rcctl restart unbound\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans les paramétres ci-dessus, j\u0026rsquo;ai autorisé Unbound à écouter l\u0026rsquo;interface\nloopback (127.0.0.1) en premier afin que les applications réseaux locales\nsoient capables de faire des recherches si besoin.\nDans le fichier \u003ccode\u003eetc/resolv.conf\u003c/code\u003e de notre routeur OpenBSD, j\u0026rsquo;ai listé\nnotre serveur DNS Unbound, car je ne veux rien sur le routeur qui interroge\nles serveurs DNS du FAI :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enameserver 127.0.0.1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous utilisez DHCP sur l\u0026rsquo;interface externe (l\u0026rsquo;interface connecté au\nmodem ou routeur de votre FAI), vous devez vous assurez que \u003ca href=\"https://man.openbsd.org/dhclient\" rel=\"external\"\u003edhclient\u003c/a\u003e\nne change pas la configuration du fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e.\nÉditez le fichier \u003ccode\u003e/etc/dhclient.conf\u003c/code\u003e et ajoutez :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esupersede domain-name-servers 127.0.0.1;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCela permettra de s\u0026rsquo;assurer que nous avons notre serveur DNS local listé.\u003c/p\u003e\n\u003cp\u003eActivez Unbound avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rcctl enable unbound\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLorsque vous changez la configuration d\u0026rsquo;Unbound, vous pouvez soit juste\nredémarrer Unbound avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rcctl restart unbound\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eou simplement recharger les options de configuration (ce qui purge aussi\nle cache) :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# unbound-control reload\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVous pouvez lister avec quels paramétres Unbound est démarré par la commande\nsuivante (qui est fourni pour tout service sous OpenBSD) :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rcctl get unbound\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous voulez avec certaines statitiques des données, vous pouvez exécuter :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# unbound-control stats_noreset\nthread0.num.queries=2056\nthread0.num.queries_ip_ratelimited=0\nthread0.num.cachehits=678\nthread0.num.cachemiss=1378\nthread0.num.prefetch=15\nthread0.num.expired=0\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVous pouvez aussi avoir un dump du cache :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# unbound-control dump_cache|less\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous voulez voir quelles sont les requêtes du serveur de nom Unbound\nfait pour un domaine spécifique, vous pouvez faire cela avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# unbound-control lookup wikipedia.org\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous voulez purger le cache pour un domaine spécifique, vous pouvez\nfaire cela avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# unbound-control flush example.com\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePrenez le temps de regarder la page du manuel d\u0026rsquo;\u003ca href=\"https://man.openbsd.org/unbound-control\" rel=\"external\"\u003eunbound-control\u003c/a\u003e\npour les autres options et commandes.\u003c/p\u003e\n\u003ch4 id=\"ignorer-les-réglages-ttl-ridiculeusement-bas\"\u003eIgnorer les réglages TTL ridiculeusement bas\u003c/h4\u003e\n\u003cp\u003eUne chose qui crée une grande nuisance est le paramétrage de certaines\npersonnes sur des valeurs TTL ridiculeusement basses pour leurs domaines.\nPour certaines raisons, il est presque tendance d\u0026rsquo;avoir une valeur par\ndéfaut de 60 secondes.\u003c/p\u003e\n\u003cp\u003eLe problème avec un TTL très bas est que cela rend complétement inutile\nle DNS cache.\nUne requête utilisera seulement la réponse en cache aussi longtemps que\nle TTL ne soit pas expiré.\nMême au-travers des RFC qui disent qu\u0026rsquo;un TTL doit être respecté, de telles\nvaleurs basses rend le DNS extrêmement inefficace.\nJe recommande toutefois que vous surchargiez le paramétrage TTL par celui\nd\u0026rsquo;une heure par défaut.\nUne autre amélioration dans la vitesse de requête de DNS est de réduire\nla latence en se servant des enregistrements périmés avant de les mettre\nà jour d\u0026rsquo;une autre manière au lieu de faire l\u0026rsquo;inverse.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ecache-min-ttl: 3600\nserve-expired: yes\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eUn problème théorique avec l\u0026rsquo;augmentation du TTL est que le domaine pourrait\nobtenir une nouvelle adresse IP qui ne peut pas être résolu puisque\nl\u0026rsquo;ancienne entrée est dans le cache.\nToutefois, dans la pratique le risque de fonctionner sur un domaine périmé\nest minime et ça vaut la peine d\u0026rsquo;améliorer l\u0026rsquo;utilisation du cache en fixant\nun TTL d\u0026rsquo;une heure minimum par défaut.\u003c/p\u003e\n\u003ch4 id=\"bloquons-certains-domaines-\"\u003eBloquons certains domaines !\u003c/h4\u003e\n\u003cp\u003eMaintenant, intéressons-nous à la partie du blocage de domaines.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai créé un simple script shell appelé \u003ca href=\"https://codeberg.org/unixsheikh/dnsblockbuster\" rel=\"external\"\u003eDNSBlockBuster\u003c/a\u003e\nqui télécharge automatiquement un jeu de fichiers hosts depuis diverses\nsources en-ligne, les concaténant ensemble en une seule, la nettoyant,\net convertissant le résultat en une liste de blocage de domaines pour\nUnbound et dnsmasq.\nElle bloque principalement les publicités, les sites de porno et de pistage.\u003c/p\u003e\n\u003cp\u003eAvec DNSBlockBuster, vous avez l\u0026rsquo;option de créer une liste blanche, si pour\nvous l\u0026rsquo;un des domaines listés dans les fichiers hosts est un faux positif,\net vous pouvez ajouter votre propre liste de blocage dans le cas où vous\nvoulez bloquer manuellement certains domaines qui ne sont pas listés dans\nles fichiers hosts.\nVous pouvez facilement ajouter de nouvelles listes de blocage ou supprimer\nl\u0026rsquo;une des listes de blocage fournies.\u003c/p\u003e\n\u003cp\u003eBien sûr, vous n\u0026rsquo;avez pas besoin d\u0026rsquo;utiliser mon script, mais je l\u0026rsquo;utiliserais\ndans ce tutoriel.\u003c/p\u003e\n\u003cp\u003eActuellement le script créé une énorme liste de domaines avec plus de deux\nmillions de domaines listés et Unbound prend près de 705 Mo de mémoire au\ntotal quand la liste de blocage est chargée en entier.\u003c/p\u003e\n\u003cp\u003eAfin d\u0026rsquo;éviter qu\u0026rsquo;Unbound tombe en panne lors du chargement de la liste,\néditez \u003ccode\u003e/etc/rc.conf.local\u003c/code\u003e et ajoutez ce qui suit :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eunbound_timeout=240\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis redémarrez Unbound :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rcctl restart unbound\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRegardez la section \u003ca href=\"https://codeberg.org/unixsheikh/dnsblockbuster#user-content-usage\" rel=\"external\"\u003eUsage\u003c/a\u003e\ndans la documentation de DNSBlockBuster pour savoir comment l\u0026rsquo;utiliser.\nC\u0026rsquo;est simple et facile.\u003c/p\u003e\n\u003cp\u003eUne fois que vous avez créé votre liste de blocage pour Unbound, placez\nla dans \u003ccode\u003e/var/unbound/etc/\u003c/code\u003e et éditez le fichier de configuration d\u0026rsquo;Unbound\n\u003ccode\u003e/var/unbound/etc/unbound.conf\u003c/code\u003e pour insérer quelque chose comme :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003einclude: \u0026#34;/var/unbound/etc/unbound-blocked-hosts.conf\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMaintenant rechargez Unbound avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# unbound-control reload\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous exécutez la commande \u003ccode\u003etop\u003c/code\u003e dans un autre terminal, vous remarquerez\nqu\u0026rsquo;Unbound consomme pas mal de ressources CPU lors du chargement initial\nde la liste.\nRemarquez aussi la consommation mémoire.\u003c/p\u003e\n\u003cp\u003eVous pouvez maintenant tester notre blocage DNS en faisant une requête\nvers un domaine bloqué de la liste :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ drill 3lift.com\n;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NXDOMAIN, id: 55906\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEssayez le même avec le serveur DNS de Cloudflare :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ drill 3lift.com @1.1.1.1\n;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 48771\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eComme nous pouvons le voir, notre serveur DNS bloque l\u0026rsquo;accès au domaine\n3lift.com en répondant avec un NXDOMAIN, alors que le serveur DNS de\nCloudflare répond avec l\u0026rsquo;adresse IP correcte.\u003c/p\u003e\n\u003ch3 id=\"sécurité-dns\"\u003eSécurité DNS\u003c/h3\u003e\n\u003cp\u003eLa sécurité DNS est un vaste sujet.\nDans cette section, nous allons discuter de certains des sujets qui nous\nconcernent plus particulièrement à propos de notre propre serveur DNS.\u003c/p\u003e\n\u003cp\u003eLe protocole DNS n\u0026rsquo;est pas chiffré et ne tient, par défaut, aucun compte\nde la confidentialité, de l\u0026rsquo;intégrité ou de l\u0026rsquo;authentification.\nSi vous utilisez un réseau non fiable, ou un FAI malveillant, vos requêtes\nDNS peuvent être écoutées et les réponses manipulées.\nEn outre, les FAI peuvent procéder à des détournements de DNS.\u003c/p\u003e\n\u003ch4 id=\"détournement-de-dns\"\u003eDétournement de DNS\u003c/h4\u003e\n\u003cp\u003eLe détournement de DNS signifie que les requêtes DNS que vous faites sont\nredirigées vers un autre serveur DNS.\nC\u0026rsquo;est typiquement fait en redirigeant tout le trafic sur le port 53 à\ndestination d\u0026rsquo;un autre.\u003c/p\u003e\n\u003cp\u003eUn des manières les plus simples pour déterminer si votre FAI détourne\nvotre trafic DNS est d\u0026rsquo;interroger directement un serveur DNS faisant autorité.\u003c/p\u003e\n\u003cp\u003eNous pouvons utiliser de multiples outils pour cela.\nDans cet exemple, nous utiliserons en premier \u003ccode\u003edrill\u003c/code\u003e.\nCes options, dans cet exemple, sont les mêmes pour \u003ccode\u003edig\u003c/code\u003e.\nNous utiliserons encore le domaine \u0026ldquo;wikipedia.org\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eEn premier, nous avons besoin d\u0026rsquo;avoir les serveurs faisant autorité.\nIls apparaîtront dans la section \u0026ldquo;ANSWER SECTION\u0026rdquo; :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ drill NS wikipedia.org\n;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 28789\n;; flags: qr rd ra ; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0\n;; QUESTION SECTION:\n;; wikipedia.org.       IN      NS\n\n;; ANSWER SECTION:\nwikipedia.org.  85948   IN      NS      ns2.wikimedia.org.\nwikipedia.org.  85948   IN      NS      ns0.wikimedia.org.\nwikipedia.org.  85948   IN      NS      ns1.wikimedia.org.\n\n;; AUTHORITY SECTION:\n\n;; ADDITIONAL SECTION:\n\n;; Query time: 1 msec\n;; SERVER: 127.0.0.1\n;; WHEN: Thu Nov  5 07:53:19 2020\n;; MSG SIZE  rcvd: 95\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAlors nous devons interroger l\u0026rsquo;un de ses serveurs faisant autorité directement.\nLe champ important auquel nous devons faire attention est flags dans le\nchamp \u0026ldquo;HEADER\u0026rdquo;.\nPour que la réponse fasse autorité, le drapeau \u003ccode\u003eaa\u003c/code\u003e doit être listé.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ drill @ns1.wikimedia.org wikipedia.org\n;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 57611\n;; flags: qr aa rd ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0\n;; QUESTION SECTION:\n;; wikipedia.org.       IN      A\n\n;; ANSWER SECTION:\nwikipedia.org.  600     IN      A       91.198.174.192\n\n;; AUTHORITY SECTION:\n\n;; ADDITIONAL SECTION:\n\n;; Query time: 127 msec\n;; SERVER: 208.80.153.231\n;; WHEN: Thu Nov  5 07:56:10 2020\n;; MSG SIZE  rcvd: 47\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCela montre que la réponse que nous avons n\u0026rsquo;a pas été détournée puisque\nla réponse fait autorité.\nEssayons de l\u0026rsquo;obtenir depuis le serveur DNS publique de Cloudflare avec\nla même requête :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ drill @1.1.1.1 wikipedia.org\n;; -\u0026gt;\u0026gt;HEADER\u0026lt;\u0026lt;- opcode: QUERY, rcode: NOERROR, id: 40562\n;; flags: qr rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0\n;; QUESTION SECTION:\n;; wikipedia.org.       IN      A\n\n;; ANSWER SECTION:\nwikipedia.org.  555     IN      A       91.198.174.192\n\n;; AUTHORITY SECTION:\n\n;; ADDITIONAL SECTION:\n\n;; Query time: 3 msec\n;; SERVER: 1.1.1.1\n;; WHEN: Thu Nov  5 08:02:58 2020\n;; MSG SIZE  rcvd: 47\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotez que le drapeau \u003ccode\u003eaa\u003c/code\u003e est manquant dans le champ \u0026ldquo;HEADER\u0026rdquo;.\nCela signifie que la réponse ne fait pas autorité.\u003c/p\u003e\n\u003cp\u003eUn autre outil simple est \u003ca href=\"https://man.openbsd.org/nslookup\" rel=\"external\"\u003enslookup\u003c/a\u003e.\nEn premier interrogeons les serveurs de noms faisant autorité :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enslookup -querytype=NS wikipedia.org\nServer:         127.0.0.1\nAddress:        127.0.0.1#53\n\nNon-authoritative answer:\nwikipedia.org   nameserver = ns1.wikimedia.org.\nwikipedia.org   nameserver = ns2.wikimedia.org.\nwikipedia.org   nameserver = ns0.wikimedia.org.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEssayons alors d\u0026rsquo;interroger notre propre serveur DNS pour le domaine :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ nslookup wikipedia.org\nServer:         127.0.0.1\nAddress:        127.0.0.1#53\n\nNon-authoritative answer:\nName:   wikipedia.org\nAddress: 91.198.174.192\n\nServer:         ns2.wikimedia.org\nAddress:        91.198.174.239#53\n\nName:   wikipedia.org\nAddress: 91.198.174.192\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLe message \u003ccode\u003eNon-authoritative\u003c/code\u003e montre clairement que la réponse n\u0026rsquo;est pas\nfaite depuis un serveur DNS faisant autorité.\nC\u0026rsquo;est très bien, puisque nous avons interrogé notre propre serveur DNS.\nEssayons d\u0026rsquo;interroger un des serveurs faisant autorité directement :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ nslookup wikipedia.org ns0.wikimedia.org\nServer:         ns0.wikimedia.org\nAddress:        208.80.154.238#53\n\nName:   wikipedia.org\nAddress: 91.198.174.192\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLe message \u003ccode\u003eNon-authoritative\u003c/code\u003e n\u0026rsquo;est plus là, la réponse que nous avons\nobtenu \u003cstrong\u003efaisait autorité\u003c/strong\u003e, ce qui signifie que notre requête DNS n\u0026rsquo;a pas\nété détournée.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai maintenant activé un service VPN que je connais pour intercepter les\nrequêtes DNS afin de protéger les clients contre la \u003ca href=\"https://en.wikipedia.org/wiki/DNS_leak\" rel=\"external\"\u003efuite DNS\u003c/a\u003e\npuis je fais une requête à nouveau vers les serveurs faisant autorité :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ nslookup wikipedia.org ns0.wikimedia.org\nServer:         ns0.wikimedia.org\nAddress:        208.80.154.238#53\n\nNon-authoritative answer:\nName:   wikipedia.org\nAddress: 91.198.174.192\nName:   wikipedia.org\nAddress: 2620:0:862:ed1a::1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eComme attendu la réponse ne fait pas autorité quand bien même j\u0026rsquo;ai interrogé\ndirectement le serveur faisant autorité.\nLe trafic DNS \u003cstrong\u003ea été détourné\u003c/strong\u003e et la réponse a été redirigé depuis un\nautre serveur DNS inconnu.\u003c/p\u003e\n\u003cp\u003eLe détournement DNS, qu\u0026rsquo;il soit effectué par un FAI ou par quelqu\u0026rsquo;un d\u0026rsquo;autre,\nest hautement problèmatique.\nTout d\u0026rsquo;abord, nous ne pouvons avoir pleinement confiance aux réponses que\nnous obtenons depuis le serveur DNS.\nEn second, même si la réponse DNS fournit des données non falsifiées,\nle trafic DNS a été détourné pour une raison inconnue, qui peut être de\nla collecte et de l\u0026rsquo;enregistrement de données, ou pour une raison\ncomplètement différente.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCertains FAI, tels qu\u0026rsquo;Optimum Online, Comcast, Time Warner, Cox Communications,\nRCN, Rogers, Charter Communications, Verizon, Virgin Media, Frontier Communications,\nBell Sympatico, Airtel, OpenDNS et d\u0026rsquo;autres ont commencé leurs pratiques\nde détournement de DNS sur des noms de domaines inexistants (NXDOMAIN)\npour monétiser l\u0026rsquo;affichage de publicités.\nLe serveur DNS redirigait une requête pour un nom de domaine non existant\nvers une fausse adresse IP qui contenait un site web avec publicités.\nJe ne sais pas combien de FAI et fournisseurs de service DNS publique le\nfont encore.\u003c/div\u003e\n\n\u003ch5 id=\"prévention-contre-le-détournement-de-dns\"\u003ePrévention contre le détournement de DNS\u003c/h5\u003e\n\u003cp\u003eSi vous avez découvert que votre trafic DNS sur le port 53 est détourné,\nvous avez basiquement seulement trois options afin de vous protéger :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eSi cela vous est possible, changez de FAI !\nVotre FAI ne devrait pas détourner votre trafic DNS.\u003c/li\u003e\n\u003cli\u003eParamétrez votre propre serveur DNS à distance dans un centre d\u0026rsquo;hébergement\nqui ne fait pas de détournement ou ne bloque pas le port 53.\nEnsuite, que votre serveur DNS à distance écoute vos connexions DNS sur\nun port non standard et rediriger toutes vos requêtes DNS vers votre\nserveur DNS à distance.\u003c/li\u003e\n\u003cli\u003eUtilisez un VPN de confiance qui ne détourne pas le trafic DNS, ou s\u0026rsquo;il\nle fait, assurez-vous que vous pouvez faire confiance à leur politique\nde non journalisation.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"usurpation-de-dns\"\u003eUsurpation de DNS\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;usurpation de DNS, aussi appelé empoisonnement du cache DNS, est différent\ndu détournement de DNS.\nAlors que le trafic est redirigé d\u0026rsquo;une destination vers une autre dans\nune attaque de détournement de DNS, c\u0026rsquo;est la donnée elle-même qui est\nmanipulée dans une attaque d\u0026rsquo;usurpation DNS.\nSouvent ces deux stratégies d\u0026rsquo;attaques sont combinées.\u003c/p\u003e\n\u003cp\u003eDans une attaque d\u0026rsquo;usurpation de DNS, la donnée manipulée est introduite\ndans le cache du résolveur DNS, résultant que le serveur de nom retourne\nun résultat incorrect, e.g. une mauvaise adresse IP.\u003c/p\u003e\n\u003ch5 id=\"prévention-contre-lusurpation-de-dns\"\u003ePrévention contre l\u0026rsquo;usurpation de DNS\u003c/h5\u003e\n\u003cp\u003eCe type d\u0026rsquo;attaque peut être atténuée au niveau de la couche transport ou\nde la couche application en effectuant une validation de bout en bout une\nfois qu\u0026rsquo;une connexion est établie.\nUn exemple courant de cela est l\u0026rsquo;utilisation de TLS et des signatures digitales.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Domain_Name_System_Security_Extensions\" rel=\"external\"\u003eDNSSEC\u003c/a\u003e\nutilise des signatures digitales cryptographiques avec un certificat de clé\npublique de confiance pour déterminer l\u0026rsquo;authenticité des données.\nDNSSEC peut protéger contre l\u0026rsquo;usurpation de DNS, toutefois beaucoup\nd\u0026rsquo;administrateurs DNS ne l\u0026rsquo;ont pas encore implémenté.\u003c/p\u003e\n\u003cp\u003eÀ partir de 2020, tous les TLD originaux prennent en charge DNSSEC, comme\nle font les TLD de code de pays, mais de nombreux TLD de code de pays ne\nle font toujours pas.\u003c/p\u003e\n\u003ch2 id=\"appendices\"\u003eAppendices\u003c/h2\u003e\n\u003ch3 id=\"inspecter-dns-sur-https-doh\"\u003eInspecter DNS sur HTTPS (DOH)\u003c/h3\u003e\n\u003cp\u003eJe veux illustrer le fait que DoH ne fournit pas réellement une véritable\nconfidentialité autant de l\u0026rsquo;adresse IP source que celle de destination,\nqui peuvent être vues clairement dans la communication HTTPS.\u003c/p\u003e\n\u003cp\u003eEn premier, je m\u0026rsquo;assure que DoH soit désactivé dans Firefox, sur un des\nordinateurs du LAN pour adultes, et je surveille le trafic sur l\u0026rsquo;interface\n\u003ccode\u003eem1\u003c/code\u003e par l\u0026rsquo;utilisation de \u003ca href=\"https://man.openbsd.org/tcpdump\" rel=\"external\"\u003etcdump\u003c/a\u003e.\nJ\u0026rsquo;ai aussi activé la journalisation dans Unbound, juste pour éviter de\nremplir inutilement syslog avec trop de bruits DNS, et j\u0026rsquo;ai utilisé\n\u003ca href=\"https://man.openbsd.org/tail\" rel=\"external\"\u003etail\u003c/a\u003e pour surveiller le journal.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;irais sur \u0026ldquo;wikipedia.org\u0026rdquo; dans le navigateur et voir ce que révèle la\nsurveillance sur le routeur.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# tcpdump -n -i em1 src host 192.168.1.5 and not arp\ntcpdump: listening on em1, link-type EN10MB\n23:30:33.494352 192.168.1.5.55724 \u0026gt; 192.168.1.1.53: 58136+ A? wikipedia.org.(31) (DF)\n23:30:33.774439 192.168.1.5.58372 \u0026gt; 192.168.1.1.53: 58448+ A? www.wikipedia.org.(35) (DF)\n23:30:34.184287 192.168.1.5.46639 \u0026gt; 192.168.1.1.53: 15167+ A? www.wikipedia.org.(35) (DF)\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# tail -f /var/unbound/log/unbound.log\nNov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 wikipedia.org. A IN\nNov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 wikipedia.org. A IN NOERROR 0.097209 0 47\nNov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN\nNov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.154989 0 80\nNov 05 23:30:34 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN\nNov 05 23:30:34 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.000000 1 80\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNaturellement nous avons vu la requête autant dans le trafic de l\u0026rsquo;interface\nque dans le journal d\u0026rsquo;Unbound.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai activé alors DoH et désactivé le DNS régulier dans Firefox, en\nparamétrant la valeur de \u003ccode\u003enetwork.trr.mode\u003c/code\u003e à \u003ccode\u003e4\u003c/code\u003e.\nJ\u0026rsquo;ai alors changé les \u003ccode\u003eparamétres réseaux\u003c/code\u003e et paramétré Cloudflare en\ntant que fournisseur DoH.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eSi vous activez juste DoH via les préférences, Firefox utilisera toujours\nle DNS régulier comme solution de repli.\nAvant de forcer Firefox à utiliser seulement DoH, vous devez paramétrer\nla value de \u003ccode\u003enetwork.trr.mode\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eÉcrivez \u003ccode\u003eabout:config\u003c/code\u003e dans la barre d\u0026rsquo;adresses et pressez la touche\n\u003ckbd\u003eEntrée\u003c/kbd\u003e pour accéder au panneau de configuration caché de Firefox.\u003c/p\u003e\n\u003cp\u003eÉtape 2 : Cherchez le paramétre \u003ccode\u003enetwork.trr.mode\u003c/code\u003e.\nIl contrôle la prise en charge de DoH.\nCe paramétre a 4 valeurs :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDoH est désactivé, par défaut\u003c/li\u003e\n\u003cli\u003eDoH est actif, mais Firefox utilise à la fois DoH et le DNS régulier\nselon la rapidité de la réponse retournée.\u003c/li\u003e\n\u003cli\u003eDoH est actif, et le DNS régulier fonctionne en repli.\u003c/li\u003e\n\u003cli\u003eDoH est actif, et le DNS régulier est désactivé\u003c/li\u003e\n\u003cli\u003eDoH est désactivé, par choix.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eÉtape 3 : Cherchez le paramétre \u003ccode\u003enetwork.trr.bootstrapAddress\u003c/code\u003e.\nIl contrôle l\u0026rsquo;adresse IP numérique de votre serveur DoH.\nEntrez la valeur \u003ccode\u003e1.1.1.1\u003c/code\u003e et appuyez sur la touche \u003ckbd\u003eEntrée\u003c/kbd\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eCette fois, je visiterais \u0026ldquo;freebsd.org\u0026rdquo;.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# tcpdump -n -i em1 src 192.168.1.5 and not arp\ntcpdump: listening on em1, link-type EN10MB\n00:21:10.944243 192.168.1.5.32856 \u0026gt; 1.1.1.1.443: P 2223446146:2223446202(56) ack 157857007 win 501 (DF)\n00:21:10.948719 192.168.1.5.46584 \u0026gt; 96.47.72.84.80: S 922508523:922508523(0) win 64240 \u0026lt;mss 1460,sackOK,timestamp 1673624773 0,nop,wscale 7\u0026gt; (DF)\n00:21:11.133801 192.168.1.5.33298 \u0026gt; 96.47.72.84.443: S 3275123911:3275123911(0) win 64240 \u0026lt;mss 1460,sackOK,timestamp 1673624958 0,nop,wscale 7\u0026gt; (DF)\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# tail -f /var/unbound/log/unbound.log\nNov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 wikipedia.org. A IN\nNov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 wikipedia.org. A IN NOERROR 0.097209 0 47\nNov 05 23:30:33 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN\nNov 05 23:30:33 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.154989 0 80\nNov 05 23:30:34 unbound[12636:0] query: 192.168.1.5 www.wikipedia.org. A IN\nNov 05 23:30:34 unbound[12636:0] reply: 192.168.1.5 www.wikipedia.org. A IN NOERROR 0.000000 1 80\n…\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCela révèle, depuis la surveillance de l\u0026rsquo;interface réseau, qu\u0026rsquo;une connexion\na été faite vers le serveur DNS de Cloudflare à l\u0026rsquo;adresse 1.1.1.1 sur le\nport 443 (HTTPS) et que nous avons visité l\u0026rsquo;adresse IP de destination\n96.47.72.84 juste après.\nDans le même temps, rien n\u0026rsquo;est arrivé dans le journal d\u0026rsquo;Unbound, \u003ccode\u003etail\u003c/code\u003e\nnous montrant juste toujours la requête précédente.\u003c/p\u003e\n\u003cp\u003eSi nous faisons une requête au DNS régulier sur le serveur, nous pouvons\nvérifier que l\u0026rsquo;adresse IP 96.47.72.84 est bien l\u0026rsquo;adresse IP de \u0026ldquo;freebsd.org\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eDe plus, dans cet exemple spécifique, nous pouvons même accéder au site\nweb de \u0026ldquo;freebsd.org\u0026rdquo; en écrivant juste l\u0026rsquo;adresse IP de destination\n96.47.72.84 dans le champ de la barre d\u0026rsquo;adresse du navigateur.\u003c/p\u003e\n\u003cp\u003eCela démontre que même si DoH bypasse la requête d\u0026rsquo;un DNS régulier, il\nn\u0026rsquo;est pas capable de cacher l\u0026rsquo;adresse IP de destination qui est toujours\nprésente en clair dans le trafic de la communication.\u003c/p\u003e\n\u003ch3 id=\"bloquer-dns-sur-https-doh\"\u003eBloquer DNS sur HTTPS (DOH)\u003c/h3\u003e\n\u003cp\u003eAuparavant, le script \u003ca href=\"https://codeberg.org/unixsheikh/dnsblockbuster\" rel=\"external\"\u003eDNSBlockBuster\u003c/a\u003e\ncomportait certains noms de domaines DoH dans la liste, que j\u0026rsquo;avais ajouté\naléatoirement, mais j\u0026rsquo;ai depuis supprimé le blocage DoH du serveur DNS, car\nil faut vraiment que cela soit géré au niveau du pare-feu.\u003c/p\u003e\n\u003cp\u003eBloquer DoH via les noms de domaine n\u0026rsquo;a pas beaucoup de sens à mon humble\nopinion car un nom de domaine peut être cherché en premier lieu.\nLa plupart des clients qui utilisent DoH ont l\u0026rsquo;adresse IP de l\u0026rsquo;hôte du\nserveur DoH encodé directement dans leur code source.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai cherché sur de multiples sites sur Internet, mais aucun n\u0026rsquo;a trouvé\nune simple manière de mettre à jour la liste des serveurs publiques DoH,\nainsi j\u0026rsquo;ai décidé de faire ma propre liste appelée \u003ca href=\"https://codeberg.org/unixsheikh/dohblockbuster\" rel=\"external\"\u003eDoHBlockBuster\u003c/a\u003e.\nToutefois c\u0026rsquo;est une tâche énorme, dont je sais que je n\u0026rsquo;aurais pas le\ntemps de tenir à jour à l\u0026rsquo;avenir, à moins que d\u0026rsquo;autres personnnes ne s\u0026rsquo;y\nmettent ; alors si vous avez du temps libre, aidez à tenir à jour les\nlistes (en faisant une demande de retrait ou en m\u0026rsquo;envoyant un courriel).\nEn outre, cette liste n\u0026rsquo;est en aucun cas exhaustive.\u003c/p\u003e\n\u003cp\u003eSi vous n\u0026rsquo;utilisez pas IPv6, vous pouvez bloquer tout le trafic IPv6, et\nutilisez alors seulement la liste IPv4 de DoHBlockBuster.\nChangez le paramétre \u003ccode\u003epass out\u003c/code\u003e, dans la section \u0026ldquo;Default protect and block\u0026rdquo;\nde \u003ccode\u003e/etc/pf.conf\u003c/code\u003e en \u003ccode\u003epass out inet\u003c/code\u003e.\nC\u0026rsquo;est la manière pour permettre seulement le trafic IPv4 sortant, sans\navoir à bloquer spécifiquement les adresses IPv6 relatives à DoH.\u003c/p\u003e\n\u003cp\u003eTéléchargez les listes depuis \u003ca href=\"https://codeberg.org/unixsheikh/dohblockbuster\" rel=\"external\"\u003eDoHBlockBuster\u003c/a\u003e\net éditez les selon vos besoins et enregistrez les quelque part sur le\ndisque.\u003c/p\u003e\n\u003cp\u003eJ\u0026rsquo;ai fait un sous-répertoire à \u003ccode\u003e/etc/pf-block-lists\u003c/code\u003e où j\u0026rsquo;ai placé toutes\nles listes de blocage dont j\u0026rsquo;ai besoin pour PF.\u003c/p\u003e\n\u003cp\u003eCréez alors un fichier persistant pour PF dans la section \u0026ldquo;Tables\u0026rdquo; de\n\u003ccode\u003e/etc/pf.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# Public DoH servers.\ntable \u0026lt;block_doh\u0026gt; persist file \u0026#34;/etc/pf-block-lists/dohblockbuster-ipv4.txt\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous avez besoin d\u0026rsquo;IPv6, ajoutez alors cela aussi :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etable \u0026lt;block_doh\u0026gt; persist file \u0026#34;/etc/pf-block-lists/dohblockbuster-ipv4.txt\u0026#34; file \u0026#34;/etc/pf-block-lists/dohblockbuster-ipv6.txt\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt, alors ajoutez un \u003ccode\u003eblock\u003c/code\u003e à la section \u0026ldquo;Protect and block by default\u0026rdquo;\ndu pare-feu :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# Let\u0026#39;s block DoH.\nblock in quick on { $g_lan $c_lan $dmz } to \u0026lt;block_doh\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRechargez PF :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pfctl -f /etc/pf.conf\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVérifiez la liste avec :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pfctl -vvt block_doh -T show\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi - après quelques temps - vous voulez voir quelles adresses IP sont\nactuellement bloquées, vous pouvez filtrer la sortie :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# pfctl -vvt block_doh -T show | awk \u0026#39;/\\[/ {p+=$4; b+=$6} END {print p, b}\u0026#39;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eComme mentionné précédemment, cette solution ne prend pas en considération\nles serveurs DoH inconnus.\nDe plus afin que la liste soit efficace, elle a besoin d\u0026rsquo;être tenue à jour.\u003c/p\u003e\n\u003ch3 id=\"ajouter-loption-domain-name-à-dhcp-et-utiliser-un-fqdn\"\u003eAjouter l\u0026rsquo;option domain-name à DHCP et utiliser un FQDN\u003c/h3\u003e\n\u003cp\u003eSi nous paramétrons notre réseau de telle manière que tous les ordinateurs\net dispositifs aient leurs adresses IP fixes et noms d\u0026rsquo;hôtes, beaucoup\nd\u0026rsquo;outils ne fonctionneront pas nativement avec ces noms d\u0026rsquo;hôtes sans ajouter\nun nom de domaine au serveur DNS.\nCela est dû à des outils tel que \u003ccode\u003ehost\u003c/code\u003e qui s\u0026rsquo;attend à ce que la recherche\nvers un nom d\u0026rsquo;hôte soit\n\u003ca href=\"https://fr.wikipedia.org/wiki/Fully_qualified_domain_name\" rel=\"external\"\u003eun nom de domaine pleinement qualifié (FQDN)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eDisons que j\u0026rsquo;ai paramétré un ordinateur sur mon LAN ayant pour nom d\u0026rsquo;hôte\n\u0026ldquo;foo\u0026rdquo; et l\u0026rsquo;adresse IP fixée à 192.168.1.7.\nJe ne me souviens peut être pas que \u0026ldquo;foo\u0026rdquo; est l\u0026rsquo;ordinateur avec telle\nadresse, ou je ne me souviens pas quel hôte a l\u0026rsquo;adresse IP 192.168.1.7\nassociée.\u003c/p\u003e\n\u003cp\u003eAvec un FQDN, nous pouvons faire une recherche telle que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ host foo.example.com\nfoo.example.com has address 192.168.1.7\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAlors nous pouvons faire :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# host 192.168.1.7\n7.1.168.192.in-addr.arpa domain name pointer foo.example.com\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eToutefois, il est ennuyeux de devoir écrire le nom de domaine complet à\nchaque fois.\nSi nous ajoutons l\u0026rsquo;option \u003ca href=\"https://man.openbsd.org/dhcp-options#option~24\" rel=\"external\"\u003edomain-name\u003c/a\u003e\nà \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e le nom de domaine sera automatiquement ajouté.\nAinsi, nous pouvons faire juste cela :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e$ host foo\nfoo.example.com has address 192.168.1.7\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eCertaines personnes recommandent d\u0026rsquo;enregistrer un nom de domaine et de\nl\u0026rsquo;utiliser en interne sur votre LAN, et bien que ce soit certainement\nfonctionnel, ce n\u0026rsquo;est pas intéressant du tout.\nPour l\u0026rsquo;utilisation à la maison, vous pouvez utilisez les TLD \u003ccode\u003e.intranet\u003c/code\u003e,\n\u003ccode\u003e.home\u003c/code\u003e ou \u003ccode\u003e.lan\u003c/code\u003e, en accord avec la\n\u003ca href=\"https://tools.ietf.org/html/rfc6762#appendix-G\" rel=\"external\"\u003eRFC 6762\u003c/a\u003e sans aucun\nproblème.\nToutefois, n\u0026rsquo;utilisez pas \u003ccode\u003e.local\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDémarrons en faisant quelques changements dans la configuration de \u003ccode\u003e/etc/dhcpd.conf\u003c/code\u003e.\nJuste pour faire simple, j\u0026rsquo;utiliserais le serveur web de notre LAN publique\nen exemple, mais vous pouvez étendre cela à tout segment où vous le désirez,\net vous pouvez aussi l\u0026rsquo;utiliser sur plusieurs segments si besoin.\u003c/p\u003e\n\u003cp\u003eDans notre paramétrage actuel, nous avons déjà le domaine \u003ccode\u003eexample.com\u003c/code\u003e\nattaché à notre serveur web ainsi nous pouvons juste l\u0026rsquo;utiliser.\nMais si vous n\u0026rsquo;avez pas de serveur publique qui a un réel nom de domaine,\nchangez-le juste par quelque chose comme \u003ccode\u003enet.home\u003c/code\u003e.\nJ\u0026rsquo;ai changé le nom de notre serveur web par \u0026ldquo;lilo\u0026rdquo; (oui, de Lilo \u0026amp; Stitch,\nparce que c\u0026rsquo;est plus cool que \u0026ldquo;Luke\u0026rdquo; ou \u0026ldquo;Yoda\u0026rdquo; !).\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esubnet 192.168.1.0 netmask 255.255.255.0 {\n    option domain-name-servers 192.168.1.1;\n    option domain-name \u0026#34;example.com\u0026#34;;\n    option routers 192.168.1.1;\n    range 192.168.1.10 192.168.1.254;\n}\nsubnet 192.168.2.0 netmask 255.255.255.0 {\n    option domain-name-servers 192.168.2.1;\n    option domain-name \u0026#34;example.com\u0026#34;;\n    option routers 192.168.2.1;\n    range 192.168.2.10 192.168.2.254;\n}\nsubnet 192.168.3.0 netmask 255.255.255.0 {\n    option domain-name-servers 192.168.3.1;\n    option domain-name \u0026#34;example.com\u0026#34;;\n    option routers 192.168.3.1;\n    range 192.168.3.10 192.168.3.254;\n    host lilo.example.com {\n        fixed-address 191.168.3.2;\n        hardware ethernet 61:20:42:39:61:AF;\n        option host-name \u0026#34;lilo\u0026#34;;\n    }\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous préférez utiliser de multiples domaines plutôt qu\u0026rsquo;un seul, dites-vous\nque \u003ccode\u003eexample.com\u003c/code\u003e est pour votre développement web professionnel, et que\n\u003ccode\u003enet.home\u003c/code\u003e pour votre LAN privé, vous pouvez faire une \u003ca href=\"https://en.wikipedia.org/wiki/Search_domain\" rel=\"external\"\u003erecherche de domaine\u003c/a\u003e\navec l\u0026rsquo;option \u003ccode\u003edomain-search\u003c/code\u003e dans \u003ccode\u003e/etc/dhcpd.conf\u003c/code\u003e au lieu de l\u0026rsquo;option\n\u003ccode\u003edomain-name\u003c/code\u003e.\nLa différence entre les deux est qu\u0026rsquo;avec \u003ccode\u003edomain-name\u003c/code\u003e, seulement un seul\ndomaine est ajouté, alors qu\u0026rsquo;avec l\u0026rsquo;option \u003ccode\u003edomain-search\u003c/code\u003e, de multiples\ndomaines peuvent être ajoutés et sont alors \u0026ldquo;cherchés\u0026rdquo; un par un jusqu\u0026rsquo;à\nce que l\u0026rsquo;hôte soit trouvé.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003edomain-search\u003c/code\u003e ressemble à ceci :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eoption domain-search \u0026#34;example.com\u0026#34;, \u0026#34;net.home\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAlors nous avons besoin de paramétrer Unbound pour gérer nos adresses IP\nfixes.\nDans cet exemple, nous avons seulement le serveur web, mais nous pouvons\nutiliser autant d\u0026rsquo;hôtes que nécessaires.\nVous pouvez juste éditer le fichier de configuration principale d\u0026rsquo;Unbound,\nmais je préfére mettre cela dans un fichier séparé et l\u0026rsquo;inclure dans le\nfichier principal.\nCréez un nouveau fichier appelé tel que \u003ccode\u003e/var/unbound/etc/unbound-local.conf\u003c/code\u003e,\npar exemple, et paramétrez vos hôtes :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elocal-data: \u0026#34;lilo.example.com IN A 192.168.3.2\u0026#34;\nlocal-data-ptr: \u0026#34;192.168.3.2 lilo.example.com\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eOu, si vous utilisez la version \u003ccode\u003enet.home\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elocal-data: \u0026#34;lilo.net.home IN A 192.168.3.2\u0026#34;\nlocal-data-ptr: \u0026#34;192.168.3.2 lilo.net.home\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNotez comment l\u0026rsquo;adresse IP dans le champ \u003ccode\u003elocal-data-ptr\u003c/code\u003e est retourné,\nce qui n\u0026rsquo;est pas une erreur.\u003c/p\u003e\n\u003cp\u003eAjoutez alors ce qui suit à notre \u003ccode\u003e/var/unbound/etc/unbound.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eprivate-address: 192.168.0.0/16\nprivate-domain: example.com # Use net.home instead if you need that.\ninclude: \u0026#34;/var/unbound/etc/unbound-local.conf\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eRedémarrez dhcpd et Unbound :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# rcctl restart dhcpd\n# rcctl restart unbound\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi vous retirez le câble Ethernet de l\u0026rsquo;un des ordinateurs connectés à l\u0026rsquo;un\ndes LAN et le connectez à nouveau, vous serez notifié que \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e\na ajouté l\u0026rsquo;option \u003ccode\u003edomain\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edomain example.com\nnameserver 192.168.1.1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eVous pouvez étendre cet exemple ci-dessus à de multiples domaines et de\nmultiples dans tous les segments.\u003c/p\u003e\n\u003ch3 id=\"ajouter-pf-badhost\"\u003eAjouter pf-badhost\u003c/h3\u003e\n\u003cp\u003eLorsque vous avez paramétré votre routeur OpenBSD, je vous encourage\nfortement à paramétrer \u003ca href=\"https://www.geoghegan.ca/pfbadhost.html\" rel=\"external\"\u003epf-badhost\u003c/a\u003e !\u003c/p\u003e\n\u003cp\u003epf-badhost est un script de sécurité léger fait par \u003ca href=\"https://www.geoghegan.ca/about.html\" rel=\"external\"\u003eJordan Geoghegan\u003c/a\u003e\nqui bloque les plus grandes choses irritantes d\u0026rsquo;Internet.\nLes désagréments tels les brute-forceurs SSH et SMTP sont largement éliminés\npar ce script.\u003c/p\u003e\n\u003cp\u003epf-badhost ajoute périodiqument des addresses IP depuis des bases de données\nde spammeurs d\u0026rsquo;IP bien connus, tel Spamhaus, Firehol, Emerging Threats\nand Binary Defense, où ces mauvaises adressses IP sont fréquemment\njournalisées.\npf-badhost les ajoute alors aux adresses IP collectées vers le pare-feu\nPF dans une table qui est bloquée par défaut.\u003c/p\u003e\n\u003ch3 id=\"lectures-recommandées\"\u003eLectures recommandées\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/pf/index.html\" rel=\"external\"\u003eOpenBSD PF - User\u0026rsquo;s Guide\u003c/a\u003e\nde la FAQ d\u0026rsquo;OpenBSD \u003cem\u003e(et sa version FR : \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/pf/start\" rel=\"external\"\u003eGuide de l\u0026rsquo;Utilisateur PF\u003c/a\u003e officieuse)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mwl.io/nonfiction/os#ao2e\" rel=\"external\"\u003eAbsolute OpenBSD, 2nd edition\u003c/a\u003e de\nMichael Warren Lucas.\nCertaines syntaxes de PF ont déjà changées depuis que Michael a écrit le\nlivre, mais il est toujours très utile.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mwl.io/nonfiction/networking#n4sa\" rel=\"external\"\u003eNetworking for System Administrators\u003c/a\u003e\nde Michael Warren Lucas.\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mwl.io/nonfiction/networking#n4sa\" rel=\"external\"\u003eOpenBSD and You\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://blog.apnic.net/2019/11/12/stop-using-ridiculously-low-dns-ttls/\" rel=\"external\"\u003eStop using ridiculously low DNS TTLs\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"comment-contribuer-à-ce-guide-\"\u003eComment contribuer à ce guide ?\u003c/h3\u003e\n\u003cp\u003eVeuillez considérer de contribuer si vous avez n\u0026rsquo;importe quel commentaire,\ncorrection, ou changement que vous considéré comme approprié.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFaites un clone sur \u003ca href=\"https://github.com/unixsheikh/openbsd-router-guide\" rel=\"external\"\u003eGithub\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSoumettez un PR pour examen\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous pouvez aussi juste envoyer un \u003ca href=\"https://www.unixsheikh.com/contact.html\" rel=\"external\"\u003ecourriel\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"traductions-de-ce-guide\"\u003eTraductions de ce guide\u003c/h3\u003e\n\u003cp\u003eVeuillez noter que les traductions listées ici sont commitées par d\u0026rsquo;autres\npersonnes contribuant généreusement à ce guide. De fait, je ne suis pas\nresponsable de garder à jour ces traductions.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://doc.huc.fr.eu.org/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/\" rel=\"external\"\u003eFrançais\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eCréé et maintenu par\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://unixsheikh.com/\" rel=\"external\"\u003eUnix Sheikh\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eLe \u003ca href=\"https://openbsdrouterguide.net/\" rel=\"external\"\u003eGuide du Routeur OpenBSD\u003c/a\u003e\nest sous licence \u003ca href=\"https://creativecommons.org/licenses/by/4.0/\" rel=\"external\"\u003eCreative Commons Attribution 4.0 International\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSi vous trouvez ce contenu utile, soutenez-moi sur \u003ca href=\"https://patreon.com/unixsheikh\" rel=\"external\"\u003ePatreon\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"contribuer-à-la-version-fr\"\u003eContribuer à la version FR\u003c/h4\u003e\n\u003cp\u003eCette version traduite du Guide du Routeur OpenBSD est faite par \u003ca href=\"https://huc.fr.eu.org\" rel=\"external\"\u003emes soins\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eVous pouvez contribuer au-travers de mon dépôt \u003ca href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/raw/master/content/fr/trad/unixsheikh.com/Guide-du-Routeur-OpenBSD.md\" rel=\"external\"\u003eFramagit.org\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003ePar facilité, cette traduction est placée aussi sous licence \u003ca href=\"https://creativecommons.org/licenses/by/4.0/\" rel=\"external\"\u003eCreative Commons Attribution 4.0 International\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eVous pouvez soutenir mon effort de traduction en me payant un \n\u003ca class=\"inside\" href=\"/fr/don/\" title=\"Lien interne vers l\u0026#39;article : 'Page de dons'\"\u003ebon café à l\u0026#39;italienne comme je les \u0026lt;3\u003c/a\u003e\n… :D\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Traduction du 'Guide du Routeur OpenBSD' du site unixsheikh.com",
            "tags": ["Traduction", "OpenBSD", "Guide", "Routeur"],
            "date_published": "2020-11-23T12:00:01+01:00",
            "date_modified": "2025-11-18T16:07:44+01:00"
        },{
            "id": "urn:uuid:4268a8f1-2f4c-88d7-7e3c-e9a04b10980f",
            "url": "http://doc.huc.fr.eu.org/fr/trad/revues/",
            "title": "Carnet de Revues (traductions, relectures)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Retrouvez sur cette page mes différentes participations et autres traductions que j\u0026rsquo;ai faites, soit par mes propres soins, soit en collaborant avec des équipes :\nDiverses La plupart de ces traductions diverses sont hébergés sur le wiki de la communauté \u0026ldquo;OpenBSD pour Tous\u0026rdquo; !\n⇒ Date inconnue : l\u0026rsquo;article \u0026ldquo;Comprendre Unix en 10 Minutes\u0026rdquo; de feu site Freeenginer.org\n⇒ 2017\nTraduction du site feu LibertyBSD ⇒ 2018\nTraduction : En Mai : \u0026ldquo;Fausses croyances des développeurs à-propos du temps\u0026rdquo; et \u0026ldquo;D\u0026#39;autres fausses croyances des développeurs à-propos du temps\u0026rdquo; En Juin : de l\u0026rsquo;article \u0026ldquo;Monitorer OpenBSD en utilisant CollectD, InfluxDB et Grafana\u0026rdquo; du site Tum\u0026rsquo;fatig En Septembre : de l\u0026rsquo;article \u0026ldquo;Exécuter Telegraf sur OpenBSD\u0026rdquo; du site Tum\u0026rsquo;fatig de l\u0026rsquo;article \u0026ldquo;OpenBSD sur la Surface Go de Microsoft\u0026rdquo; du site de Joshua Stein En Octobre : de l\u0026rsquo;article \u0026ldquo;Faire fonctionner OpenBSD sur le Raspberry Pi 3\u0026rdquo; du site Tum\u0026rsquo;fatig ⇒ 2019\nEn Mars, traduction du site Why OpenBSD Rocks !\nEn Décembre, relecture pour le site de Gilles Chehade, de deux articles - cf PR #30 et #32\n⇒ 2020\nEn Février, différentes relectures pour le site Disroot - pour les remercier de m\u0026rsquo;avoir aidé - cf les PR #31 et #32\nTraduction :\nEn Juin : du projet HamBSD.org En Août des articles de l\u0026rsquo;excellent site BSDHowto : \u0026ldquo;Comment créer un serveur de noms avec DNS-over-TLS (DoT)\u0026rdquo; \u0026ldquo;Comment construire un serveur de scan de malware\u0026rdquo; En Novembre : l\u0026rsquo;article \u0026ldquo; Guide du Routeur OpenBSD \u0026rdquo; du site UnixSheikh.com En Décembre : l\u0026rsquo;article \u0026ldquo; Héberger votre suite web office Cryptpad sous OpenBSD … Debian ⇒ 2018\nEn Septembre, travail de traduction EN → FR sur les pages : du projet GNU Hurd du projet GNU/kFreeBSD de la Fondation Linux des différentes interfaces : des paramètres par défaut de bureau de FreeDesktop de l\u0026rsquo;Interface Utilisateur de l\u0026rsquo;Interface Web du Gestionnaire d\u0026rsquo;affichages, Awesome, MATE du Gestionnaire de session XDM, Xsession, xinit et xinitrc du serveur d\u0026rsquo;affichage Wayland de la page Répertoire Personnel et pour finir de la page POSIX ⇒ 2019\nCourant Mars, sur les pages :\nsur les Polices : Polices manquantes les polices MS Windows les polices TrueType En Avril, à-propos :\ndes Gestionnaires de fenêtres DWM - travail précédemment initié par un certain @thuban :p - et i3 du fichier XResources Collaborer avec cette communauté est extrêmement simple : il suffit de s\u0026rsquo;enregistrer et de s\u0026rsquo;y mettre. Un régal !\nDeveloppez.net ⇒ 2019\nEn Mai, j\u0026rsquo;ai fait de la relecture :\ndu chapitre 6 - Dive into Python - retrouvez-la ici ⇒ Dive Into Python 3 - 6 : Closures et Générateurs du chapitre 8 - Dive into Python - retrouvez-la ici ⇒ Dive Into Python 3 - 8 : Itérateurs avancés de Python 3 Module of the Week - Chap 2 : Data Structures - retrouvez-la ici ⇒ Python 3 Module of the Week - Chap 2 : Data Structures En Juin, relecture :\ndu chapitre 4 - Dive into Python - retrouvez-la en ODT et officiellement sur DVP. Collaborez avec cette communauté est sympa, mais le processus est assez lourd.\nOpenBSD ⇒ Depuis fin 2016, étant co-fondateur de la communauté OpenBSD pour Tous, principal administrateur, et traducteur :\nles différentes FAQ OpenBSD : du Guide de Portage du Parefeu PF ⇒ 2017 : Courant mai, commencé un gros travail de traduction sur :\ncertaines pages du site OpenBSD ⇒ 2020\nEn Mai, sur les pages des projets :\nLibreSSL.org, OpenSSH.com OpenIKED, rpki-client En Juin, sur les pages du site OpenBGPD.org\nJe m\u0026rsquo;efforce de maintenir principalement la traduction des pages du site OpenBSD et de ses différentes FAQ, très régulièrement.\nPython Auprès de la communauté python-docs-fr :\n⇒ 2019\nle 2 Juin, j\u0026rsquo;ai fait remonté ma première participation #805 ; le but étant de tester la collaboration avec l\u0026rsquo;équipe, fusionnée le même jour !\nle 10 Juin, j\u0026rsquo;ai commencé mon premier travail de traduction sur la library/thread, fusionné deux jour plus tard - PR #813.\nle 12 Juin, j\u0026rsquo;ai commencé un long travail sur la library/bz2 - qui pour diverses raisons, a pris environ 6 mois - fusionné le 1 Février 2020 - PR #818.\nle 12 Juin (encore), j\u0026rsquo;ai fait une proposition de modification du fichier README, qui a été accepté mais intégré différement - PR #820.\nle 29 Octobre, une proposition sur le fichier Dict qui finalement a été repoussé - PR #911.\nC\u0026rsquo;est clairement la communauté que j\u0026rsquo;ai le plus aimé ; collaboré avec Seluj ou deronnax est un régal.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRetrouvez sur cette page mes différentes participations et autres traductions\nque j\u0026rsquo;ai faites, soit par mes propres soins, soit en collaborant avec des\néquipes :\u003c/p\u003e\n\u003ch3 id=\"diverses\"\u003eDiverses\u003c/h3\u003e\n\u003cp\u003eLa plupart de ces traductions diverses sont hébergés sur le wiki de la communauté \u0026ldquo;OpenBSD pour Tous\u0026rdquo; !\u003c/p\u003e\n\u003cp\u003e⇒ Date inconnue : l\u0026rsquo;article \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/comprendre-unix-en-10-minutes/\" title=\"Lien interne vers l\u0026#39;article : 'Comprendre Unix en 10 Minutes'\"\u003eComprendre Unix en 10 Minutes\u003c/a\u003e\u0026rdquo; de feu site \u003cstrong\u003eFreeenginer.org\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2017\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTraduction du site feu \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/trad/libertybsd.net/start\" rel=\"external\"\u003eLibertyBSD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2018\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTraduction :\n\u003cul\u003e\n\u003cli\u003eEn Mai : \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/fausses-croyances-dev-temps/\" title=\"Lien interne vers l\u0026#39;article : 'Fausses croyances des développeurs à-propos du temps'\"\u003eFausses croyances des développeurs à-propos du temps\u003c/a\u003e\u0026rdquo; et\n\u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/fausses-croyances-dev-temps-2/\" title=\"Lien interne vers l\u0026#39;article : 'D\u0026#39;autres fausses croyances des développeurs à-propos du temps'\"\u003eD\u0026#39;autres fausses croyances des développeurs à-propos du temps\u003c/a\u003e\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eEn Juin : de l\u0026rsquo;article \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/tumfatig.net/openbsd-collectd-influxdb-grafana/\" title=\"Lien interne vers l\u0026#39;article : 'Monitorer OpenBSD en utilisant CollectD, InfluxDB et Grafana'\"\u003eMonitorer OpenBSD en utilisant CollectD, InfluxDB et Grafana\u003c/a\u003e\u0026rdquo;\ndu site \u003ca href=\"https://www.tumfatig.net/20180220/monitoring-openbsd-using-collectd-influxdb-grafana/\" rel=\"external\"\u003eTum\u0026rsquo;fatig\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEn Septembre :\n\u003cul\u003e\n\u003cli\u003ede l\u0026rsquo;article \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/tumfatig.net/telegraf-openbsd/\" title=\"Lien interne vers l\u0026#39;article : 'Exécuter Telegraf sur OpenBSD'\"\u003eExécuter Telegraf sur OpenBSD\u003c/a\u003e\u0026rdquo;\ndu site \u003ca href=\"https://www.tumfatig.net/20180905/running-telegraf-openbsd/\" rel=\"external\"\u003eTum\u0026rsquo;fatig\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ede l\u0026rsquo;article \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/jcs.org/openbsd-surface-go/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD sur la Surface Go de Microsoft'\"\u003eOpenBSD sur la Surface Go de Microsoft\u003c/a\u003e\u0026rdquo;\ndu site de \u003ca href=\"https://jcs.org/2018/08/31/surface_go\" rel=\"external\"\u003eJoshua Stein\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eEn Octobre :\n\u003cul\u003e\n\u003cli\u003ede l\u0026rsquo;article \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/tumfatig.net/openbsd-raspberry-pi3/\" title=\"Lien interne vers l\u0026#39;article : 'Faire fonctionner OpenBSD sur le Raspberry Pi 3'\"\u003eFaire fonctionner OpenBSD sur le Raspberry Pi 3\u003c/a\u003e\u0026rdquo;\ndu site \u003ca href=\"https://www.tumfatig.net/20180706/running-openbsd-on-raspberry-pi-3/\" rel=\"external\"\u003eTum\u0026rsquo;fatig\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2019\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEn Mars, traduction du site \u003cstrong\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/trad/why-openbsd.rocks/start\" rel=\"external\"\u003eWhy OpenBSD Rocks !\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEn Décembre, relecture pour le site de \u003cstrong\u003e\u003ca href=\"http://poolp.org\" rel=\"external\"\u003eGilles Chehade\u003c/a\u003e\u003c/strong\u003e,\nde deux articles - cf PR #\u003ca href=\"https://github.com/poolpOrg/poolp.org/pull/30/\" rel=\"external\"\u003e30\u003c/a\u003e\net #\u003ca href=\"https://github.com/poolpOrg/poolp.org/pull/32\" rel=\"external\"\u003e32\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2020\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEn Février, différentes relectures pour le site \u003cstrong\u003e\u003ca href=\"https://disroot.org\" rel=\"external\"\u003eDisroot\u003c/a\u003e\u003c/strong\u003e - \u003cem\u003epour les\nremercier de m\u0026rsquo;avoir aidé\u003c/em\u003e - cf les PR #\u003ca href=\"https://git.disroot.org/Disroot/Howto/pulls/31\" rel=\"external\"\u003e31\u003c/a\u003e et #\u003ca href=\"https://git.disroot.org/Disroot/Howto/pulls/32\" rel=\"external\"\u003e32\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTraduction :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEn Juin : du projet \u003cstrong\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/trad/hambsd/start\" rel=\"external\"\u003eHamBSD.org\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eEn Août des articles de l\u0026rsquo;excellent site \u003cstrong\u003eBSDHowto\u003c/strong\u003e :\n\u003cul\u003e\n\u003cli\u003e\u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/bsdhowto.ch/externaldns/\" title=\"Lien interne vers l\u0026#39;article : 'Comment créer un serveur de noms avec DNS-over-TLS (DoT)'\"\u003eComment créer un serveur de noms avec DNS-over-TLS (DoT)\u003c/a\u003e\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u0026ldquo;\u003ca class=\"inside\" href=\"/fr/trad/bsdhowto.ch/malware/\" title=\"Lien interne vers l\u0026#39;article : 'Comment construire un serveur de scan de malware'\"\u003eComment construire un serveur de scan de malware\u003c/a\u003e\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eEn Novembre : l\u0026rsquo;article \u0026ldquo;\n\u003ca class=\"inside\" href=\"/fr/trad/unixsheikh.com/guide-du-routeur-openbsd/\" title=\"Lien interne vers l\u0026#39;article : 'Guide du Routeur OpenBSD'\"\u003eGuide du Routeur OpenBSD\u003c/a\u003e\n\n\u0026rdquo; du site \u003ca href=\"https://unixsheikh.com/tutorials/openbsd-router-guide/\" rel=\"external\"\u003eUnixSheikh.com\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEn Décembre : l\u0026rsquo;article \u0026ldquo;\n\u003ca class=\"inside\" href=\"/fr/trad/solene-rapenne/cryptpad-openbsd/\" title=\"Lien interne vers l\u0026#39;article : 'Héberger votre suite web office Cryptpad sous OpenBSD'\"\u003eHéberger votre suite web office Cryptpad sous OpenBSD\u003c/a\u003e\n\n…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"debian\"\u003eDebian\u003c/h3\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2018\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eEn Septembre, travail de traduction EN → FR sur les pages :\n\u003cul\u003e\n\u003cli\u003edu projet \u003ca href=\"https://wiki.debian.org/fr/Debian_GNU/Hurd\" rel=\"external\"\u003eGNU Hurd\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edu projet \u003ca href=\"https://wiki.debian.org/fr/Debian_GNU/kFreeBSD\" rel=\"external\"\u003eGNU/kFreeBSD\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ede la \u003ca href=\"https://wiki.debian.org/fr/The_Linux_Foundation\" rel=\"external\"\u003eFondation Linux\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edes différentes interfaces :\n\u003cul\u003e\n\u003cli\u003edes \u003ca href=\"https://wiki.debian.org/fr/DesktopDefaultSettings\" rel=\"external\"\u003eparamètres par défaut de bureau\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ede \u003ca href=\"https://wiki.debian.org/fr/FreeDesktop\" rel=\"external\"\u003eFreeDesktop\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ede l\u0026rsquo;\u003ca href=\"https://wiki.debian.org/fr/User_interface\" rel=\"external\"\u003eInterface Utilisateur\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ede l\u0026rsquo;\u003ca href=\"https://wiki.debian.org/fr/WebInterface\" rel=\"external\"\u003eInterface Web\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edu \u003ca href=\"https://wiki.debian.org/fr/DisplayManager\" rel=\"external\"\u003eGestionnaire d\u0026rsquo;affichages\u003c/a\u003e, \u003ca href=\"https://wiki.debian.org/fr/Awesome\" rel=\"external\"\u003eAwesome\u003c/a\u003e, \u003ca href=\"https://wiki.debian.org/fr/MATE\" rel=\"external\"\u003eMATE\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edu Gestionnaire de session \u003ca href=\"https://wiki.debian.org/fr/XDM\" rel=\"external\"\u003eXDM\u003c/a\u003e, \u003ca href=\"https://wiki.debian.org/fr/Xsession\" rel=\"external\"\u003eXsession\u003c/a\u003e, \u003ca href=\"https://wiki.debian.org/fr/xinit\" rel=\"external\"\u003exinit\u003c/a\u003e et \u003ca href=\"https://wiki.debian.org/fr/Xinitrc\" rel=\"external\"\u003exinitrc\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edu serveur d\u0026rsquo;affichage \u003ca href=\"https://wiki.debian.org/fr/Wayland\" rel=\"external\"\u003eWayland\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ede la page \u003ca href=\"https://wiki.debian.org/fr/home_directory\" rel=\"external\"\u003eRépertoire Personnel\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eet pour finir de la page \u003ca href=\"https://wiki.debian.org/fr/POSIX\" rel=\"external\"\u003ePOSIX\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2019\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCourant Mars, sur les pages :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esur les \u003ca href=\"https://wiki.debian.org/fr/Fonts\" rel=\"external\"\u003ePolices\u003c/a\u003e :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.debian.org/fr/Fonts/Missing\" rel=\"external\"\u003ePolices manquantes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.debian.org/fr/Fonts/ppviewerFonts\" rel=\"external\"\u003eles polices MS Windows\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.debian.org/fr/TrueType\" rel=\"external\"\u003eles polices TrueType\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEn Avril, à-propos :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edes Gestionnaires de fenêtres \u003ca href=\"https://wiki.debian.org/fr/Dwm\" rel=\"external\"\u003eDWM\u003c/a\u003e - \u003cem\u003etravail précédemment initié par un certain @thuban\u003c/em\u003e :p - et \u003ca href=\"https://wiki.debian.org/fr/i3\" rel=\"external\"\u003ei3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edu fichier \u003ca href=\"https://wiki.debian.org/fr/Xresources\" rel=\"external\"\u003eXResources\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCollaborer avec cette communauté est extrêmement simple : il suffit de\ns\u0026rsquo;enregistrer et de s\u0026rsquo;y mettre. Un régal !\u003c/p\u003e\n\u003ch3 id=\"developpeznet\"\u003eDeveloppez.net\u003c/h3\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2019\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEn Mai, j\u0026rsquo;ai fait de la relecture :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edu \u003ca href=\"https://www.developpez.net/forums/d1958268/forums-beneficiaires-d-hebergement/priv-redaction/priv-traduction-gabarisation/traduction/2019-03-30-chapitre-6-dive-into-python-3-a/#post10947814\" rel=\"external\"\u003echapitre 6 - Dive into Python\u003c/a\u003e -\n\u003cem\u003eretrouvez-la ici ⇒ \n\u003ca class=\"inside\" href=\"/fr/trad/developpez.net/dive-into-python-6-closures-et-generateurs/\" title=\"Lien interne vers l\u0026#39;article : 'Dive Into Python 3 - 6 : Closures et Générateurs'\"\u003eDive Into Python 3 - 6 : Closures et Générateurs\u003c/a\u003e\n\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003edu \u003ca href=\"https://www.developpez.net/forums/d1969406/forums-beneficiaires-d-hebergement/priv-redaction/priv-traduction-gabarisation/traduction/2019-05-06-dive-into-python-chapitre-8-a/#post10936823\" rel=\"external\"\u003echapitre 8 - Dive into Python\u003c/a\u003e -\n\u003cem\u003eretrouvez-la ici ⇒ \n\u003ca class=\"inside\" href=\"/fr/trad/developpez.net/dive-into-python-8-iterateurs-avances/\" title=\"Lien interne vers l\u0026#39;article : 'Dive Into Python 3 - 8 : Itérateurs avancés'\"\u003eDive Into Python 3 - 8 : Itérateurs avancés\u003c/a\u003e\n\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003ede \u003ca href=\"https://www.developpez.net/forums/d1976102/forums-beneficiaires-d-hebergement/priv-redaction/priv-traduction-gabarisation/traduction/2017-02-25-python-3-module-of-the-week-chap-2-data-structures/\" rel=\"external\"\u003ePython 3 Module of the Week - Chap 2 : Data Structures\u003c/a\u003e -\n\u003cem\u003eretrouvez-la ici ⇒ \n\u003ca class=\"inside\" href=\"/fr/trad/developpez.net/pymotw3-structures-de-donnees/\" title=\"Lien interne vers l\u0026#39;article : 'Python 3 Module of the Week - Chap 2 : Data Structures '\"\u003ePython 3 Module of the Week - Chap 2 : Data Structures \u003c/a\u003e\n\n\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEn Juin, relecture :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edu \u003ca href=\"https://www.developpez.net/forums/d1895623/forums-beneficiaires-d-hebergement/priv-redaction/priv-traduction-gabarisation/archives/2018-09-21-dive-into-python-3-strings/\" rel=\"external\"\u003echapitre 4 - Dive into Python\u003c/a\u003e -\n\u003cem\u003eretrouvez-la en \u003cstrong\u003e\u003ca href=\"/share/dive-into-python3-chapitre4-strings.odt\"\u003eODT\u003c/a\u003e\u003c/strong\u003e et officiellement sur \u003cstrong\u003e\u003ca href=\"https://python.developpez.com/tutoriels/plonger-au-coeur-de-python/?page=chapitre-4-moins-strings\" rel=\"external\"\u003eDVP\u003c/a\u003e\u003c/strong\u003e.\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCollaborez avec cette communauté est sympa, mais le processus est\nassez lourd.\u003c/p\u003e\n\u003ch3 id=\"openbsd\"\u003eOpenBSD\u003c/h3\u003e\n\u003cp\u003e⇒ Depuis fin \u003cstrong\u003e2016\u003c/strong\u003e, étant co-fondateur de la communauté \u003cstrong\u003eOpenBSD pour Tous\u003c/strong\u003e,\nprincipal administrateur, et traducteur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles différentes \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/start\" rel=\"external\"\u003eFAQ\u003c/a\u003e OpenBSD :\n\u003cul\u003e\n\u003cli\u003edu \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/ports/start\" rel=\"external\"\u003eGuide de Portage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003edu \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/pf/start\" rel=\"external\"\u003eParefeu\u003c/a\u003e \u003cstrong\u003e\u003cabbr title=\"Packet-Filter\"\u003ePF\u003c/abbr\u003e\n\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2017\u003c/strong\u003e : Courant mai, commencé un gros travail de traduction sur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecertaines pages du site \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/start\" rel=\"external\"\u003eOpenBSD\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2020\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eEn Mai, sur les pages des projets :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/libressl/start\" rel=\"external\"\u003eLibreSSL.org\u003c/a\u003e\u003c/strong\u003e,\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/openssh/start\" rel=\"external\"\u003eOpenSSH.com\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/openiked/start\" rel=\"external\"\u003eOpenIKED\u003c/a\u003e\u003c/strong\u003e,\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/rpki-client/start\" rel=\"external\"\u003erpki-client\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEn Juin, sur les pages du site \u003cstrong\u003e\u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/openbgpd/start\" rel=\"external\"\u003eOpenBGPD.org\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJe m\u0026rsquo;efforce de maintenir principalement la traduction des pages du site\nOpenBSD et de ses différentes FAQ, très régulièrement.\u003c/p\u003e\n\u003ch3 id=\"python\"\u003ePython\u003c/h3\u003e\n\u003cp\u003eAuprès de la communauté \u003cstrong\u003epython-docs-fr\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003e2019\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ele 2 Juin, j\u0026rsquo;ai fait remonté ma première participation #\u003ca href=\"https://github.com/python/python-docs-fr/pull/805\" rel=\"external\"\u003e805\u003c/a\u003e ;\nle but étant de tester la collaboration avec l\u0026rsquo;équipe, fusionnée le même jour !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele 10 Juin, j\u0026rsquo;ai commencé mon premier travail de traduction sur la \u003cstrong\u003elibrary/thread\u003c/strong\u003e,\nfusionné deux jour plus tard - PR #\u003ca href=\"https://github.com/python/python-docs-fr/pull/813\" rel=\"external\"\u003e813\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele 12 Juin, j\u0026rsquo;ai commencé un long travail sur la \u003cstrong\u003elibrary/bz2\u003c/strong\u003e -\n\u003cem\u003equi pour diverses raisons, a pris environ 6 mois\u003c/em\u003e - fusionné le 1\nFévrier 2020 - PR #\u003ca href=\"https://github.com/python/python-docs-fr/pull/818\" rel=\"external\"\u003e818\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele 12 Juin \u003cem\u003e(encore)\u003c/em\u003e, j\u0026rsquo;ai fait une proposition de modification du fichier\n\u003cstrong\u003eREADME\u003c/strong\u003e, qui a été accepté mais intégré différement - PR #\u003ca href=\"https://github.com/python/python-docs-fr/pull/820\" rel=\"external\"\u003e820\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele 29 Octobre, une proposition sur le fichier \u003cstrong\u003eDict\u003c/strong\u003e qui finalement\na été repoussé - PR #\u003ca href=\"https://github.com/python/python-docs-fr/pull/911\" rel=\"external\"\u003e911\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eC\u0026rsquo;est clairement la communauté que j\u0026rsquo;ai le plus aimé ; collaboré avec \u003ca href=\"https://github.com/Seluj78\" rel=\"external\"\u003eSeluj\u003c/a\u003e\nou \u003ca href=\"https://github.com/deronnax\" rel=\"external\"\u003ederonnax\u003c/a\u003e est un régal.\u003c/p\u003e\n",
            "summary": "Carnet de revues concernant les différentes traductions EN → FR que j'ai faites et autres relectures auquelles j'ai participées",
            "tags": ["Traduction", "Revue"],
            "date_published": "2020-11-21T10:52:01+01:00",
            "date_modified": "2023-05-09T21:52:03+02:00"
        },{
            "id": "urn:uuid:907b47bc-5030-d044-a3c5-36dfe9a16931",
            "url": "http://doc.huc.fr.eu.org/fr/sys/debian/add-apt-key/",
            "title": "Apt : Ajouter une clé GPG",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Historiquement, pour ajouter une clé GPG pour l\u0026rsquo;outil apt, on utilisait la commande apt-key. Or, cette commande est déclarée obsolète !\nQuand vous utilisez la commande, vous avez le droit à ce message d\u0026rsquo;erreur : Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).\nIl est maintenant recommandé de déposer la clé dans le répertoire /etc/apt/keyrings/ !\nCode Pour me simplifier la vie, je me suis créé ce petit script add-apt-k.sh, que je symlink vers mon répertoire personnel ~/bin/ - ainsi je peux l\u0026rsquo;appeler où que je sois dans la racine du système :\ndir_keys=\u0026#34;/etc/apt/keyrings/\u0026#34; name=\u0026#34;\u0026#34; url=\u0026#34;\u0026#34; read -p \u0026#34;Quel est le nom du projet ? \u0026#34; name read -p \u0026#34;Où est l\u0026#39;URL de la clé GPG (à ajouter pour l\u0026#39;outil apt) ? \u0026#34; url # creation du repertoire local de clés [ ! -d \u0026#34;${dir_keyrs}\u0026#34; ] \u0026amp;\u0026amp; mkdir -p \u0026#34;${dir_keys}\u0026#34; # recupération de la clé du projet curl -fsSL \u0026#34;${url}\u0026#34; | gpg --dearmor | tee \u0026#34;${dir_keys}/${name}.gpg\u0026#34; \u0026gt; /dev/null status=\u0026#34;$?\u0026#34; if [ \u0026#34;${status}\u0026#34; -eq 0 ]; then printf \u0026#39;%s : %s\\n\u0026#39; \u0026#34;OK\u0026#34; \u0026#34;La clé GPG pour le projet \u0026#39;${name}\u0026#39; a bien été ajoutée.\u0026#34; else printf \u0026#39;%s : %s\\n\u0026#39; \u0026#34;KO\u0026#34; \u0026#34;Il semble y avoir un soucis pour ajouter la clé GPG du projet \u0026#39;${name}\u0026#39; !\u0026#34; fi Ensuite :\n$ chmod 0700 $HOME/repertoire/add-apt-key.sh $ ln $HOME/repertoire/add-apt-key.sh $HOME/bin Puis appel du script : $ sudo ~/bin/add-apt-key.sh\nEnsuite utilisation de l\u0026rsquo;outil apt pour éditer les sources et mise à jour de la base de données d\u0026rsquo;apt puis installation du binaire.\nPlus d\u0026rsquo;informations sur le forum Debian-fr.org : https://www.debian-fr.org/t/apt-ajout-correct-dune-cle-gpg/85278\nEnjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eHistoriquement, pour ajouter une clé GPG pour l\u0026rsquo;outil \u003cstrong\u003eapt\u003c/strong\u003e, on utilisait\nla commande \u003ccode\u003eapt-key\u003c/code\u003e. Or, cette commande est déclarée obsolète !\u003c/p\u003e\n\u003cp\u003eQuand vous utilisez la commande, vous avez le droit à ce message d\u0026rsquo;erreur : \u003cbr\u003e\n\u003ccode\u003eWarning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl est maintenant recommandé de déposer la clé dans le répertoire\n\u003ccode\u003e/etc/apt/keyrings/\u003c/code\u003e !\u003c/p\u003e\n\u003ch2 id=\"code\"\u003eCode\u003c/h2\u003e\n\u003cp\u003ePour me simplifier la vie, je me suis créé ce petit script \u003ccode\u003eadd-apt-k.sh\u003c/code\u003e,\nque je symlink vers mon répertoire personnel \u003ccode\u003e~/bin/\u003c/code\u003e - \u003cem\u003eainsi je peux\nl\u0026rsquo;appeler où que je sois dans la racine du système\u003c/em\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_keys\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/etc/apt/keyrings/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eread -p \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Quel est le nom du projet ? \u0026#34;\u003c/span\u003e name\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eread -p \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Où est l\u0026#39;URL de la clé GPG (à ajouter pour l\u0026#39;outil apt) ? \u0026#34;\u003c/span\u003e url\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# creation du repertoire local de clés\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -d \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_keyrs\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e mkdir -p \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_keys\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# recupération de la clé du projet\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl -fsSL \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e | gpg --dearmor | tee \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_keys\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.gpg\u0026#34;\u003c/span\u003e \u0026gt; /dev/null\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003estatus\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$?\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatus\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -eq \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s : %s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OK\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;La clé GPG pour le projet \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39; a bien été ajoutée.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    printf \u003cspan style=\"color:#48b685\"\u003e\u0026#39;%s : %s\\n\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;KO\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Il semble y avoir un soucis pour ajouter la clé GPG du projet \u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39; !\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ chmod \u003cspan style=\"color:#f99b15\"\u003e0700\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/repertoire/add-apt-key.sh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ln \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/repertoire/add-apt-key.sh \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/bin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis appel du script : \u003ccode\u003e$ sudo ~/bin/add-apt-key.sh\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eEnsuite utilisation de l\u0026rsquo;outil apt pour éditer les sources et mise à jour\nde la base de données d\u0026rsquo;apt puis installation du binaire.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePlus d\u0026rsquo;informations sur le forum Debian-fr.org : \u003ca href=\"https://www.debian-fr.org/t/apt-ajout-correct-dune-cle-gpg/85278\" rel=\"external\"\u003ehttps://www.debian-fr.org/t/apt-ajout-correct-dune-cle-gpg/85278\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID! \u003cbr\u003e\nEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Debian, Devuan : Ajouter correctement une clé GPG pour l'outil apt et résoudre l'erreur 'Warning: apt-key is deprecated'.",
            "tags": ["Debian", "Devuan", "apt", "GPG", "astuce"],
            "date_published": "2020-11-20T15:13:19+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:1ca91ab1-ad49-5ad8-45bf-d1512633e7e1",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-bluetooth/",
            "title": "OpenBSD et le Bluetooth",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD et quoi ?!\nSoyons sérieux !\nInfoEn fait, depuis 2014, la pile Bluetooth a été supprimé d\u0026rsquo;OpenBSD ; écriture du code \u0026ldquo;moyen-âge\u0026rdquo;, pas assez sécurisé et personne ne veut s\u0026rsquo;y mettre !\nalors, si vous avez les compétences de développeurs, et que vous avez de solides connaissances sur le protocole Bluetooth et que vous acceptez de collaborer avec l\u0026rsquo;équipe OpenBSD : contactez-les ! Bluetooth Audio Oui, mais…\nOfficieusement, cela fonctionne grâce à un dongle USB Récepteur Audio Bluetooth, tel les Creative BT-W2, BT-W3 ou le Jabra Evolve 2 85 !\nVous l\u0026rsquo;avez ? Connectez-le tout simplement !\nAstuce : Au cas où… vérifiez dans le Bios, que le paramétrage du mode USB 3, soit bien actif, et non pas en mode auto ou désactivé !\n(…) uaudio0 at uhub0 port 2 configuration 1 interface 1 \u0026#34;Creative Labs Creative Bluetooth Audio W2\u0026#34; rev 2.00/1.00 addr 2 uaudio0: class v1, full-speed, sync, channels: 2 play, 1 rec, 0 ctls audio1 at uaudio0 uhidev0 at uhub0 port 2 configuration 1 interface 3 \u0026#34;Creative Labs Creative Bluetooth Audio W2\u0026#34; rev 2.00/1.00 addr 2 uhidev0: iclass 3/0, 3 report ids uhid0 at uhidev0 reportid 1: input=2, output=0, feature=0 uhid1 at uhidev0 reportid 2: input=18, output=18, feature=0 uhid2 at uhidev0 reportid 3: input=64, output=64, feature=0 Vous avez ce genre de messages, la led bleue clignote : c\u0026rsquo;est OK !\nAppairage BT Pressez le bouton du récepteur audio Bluetooth, la led bleu va clignoter très rapidement. Il reste plus qu\u0026rsquo;à activer l’appairage de votre périphérique audio.\nGestion du service audio Attachez votre dongle USB au serveur audio sndiod :\n# rcctl set sndiod flags \u0026#34;-f rsnd/0 -F rsnd/1\u0026#34; # rcctl restart sndiod OpenBSD ≥ 6.8 L\u0026rsquo;outil natif sndioctl permet de contrôler le volume, tel que :\n$ sndioctl output.level=+0.05 $ sndioctl output.level=-0.05 OpenBSD ≤ 6.7 Installez le paquet aucatctl et utilisez-le en mode console, tel que :\n$ aucatctl master=20\nRemerciement un premier @jcs un second à Matthias Schmidt ; cf : https://xosc.org/bluetooth.html Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOpenBSD et quoi ?!\u003c/p\u003e\n\u003cp\u003eSoyons sérieux !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eEn fait, depuis \u003ca href=\"https:*marc.info/?l=openbsd-cvs\u0026amp;m=140511572108715\u0026amp;w=2\" rel=\"external\"\u003e2014\u003c/a\u003e,\nla pile Bluetooth a été supprimé d\u0026rsquo;OpenBSD ; écriture du code \u0026ldquo;moyen-âge\u0026rdquo;,\npas assez sécurisé et personne ne veut s\u0026rsquo;y mettre !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ealors, \u003cem\u003esi vous avez les compétences de développeurs, et que vous avez\nde solides connaissances sur le protocole Bluetooth et que vous acceptez\nde collaborer avec l\u0026rsquo;équipe OpenBSD\u003c/em\u003e : \u003cstrong\u003econtactez-les\u003c/strong\u003e !\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003ch2 id=\"bluetooth-audio\"\u003eBluetooth Audio\u003c/h2\u003e\n\u003cp\u003eOui, mais…\u003c/p\u003e\n\u003cp\u003eOfficieusement, cela fonctionne grâce à un dongle USB Récepteur Audio\nBluetooth, tel les \u003cstrong\u003eCreative BT-W2, BT-W3\u003c/strong\u003e ou le \u003cstrong\u003eJabra Evolve 2 85\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eVous l\u0026rsquo;avez ? Connectez-le tout simplement !\u003c/p\u003e\n\u003cp\u003eAstuce : Au cas où… vérifiez dans le Bios, que le paramétrage du mode\nUSB 3, soit bien actif, et non pas en mode auto ou désactivé !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euaudio0 at uhub0 port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Creative Labs Creative Bluetooth Audio W2\u0026#34;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rev 2.00/1.00 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euaudio0: class v1, full-speed, sync, channels: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e play, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e rec, \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ctls\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaudio1 at uaudio0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev0 at uhub0 port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Creative Labs Creative Bluetooth Audio W2\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rev 2.00/1.00 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhidev0: iclass 3/0, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e report ids\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhid0 at uhidev0 reportid 1: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e2, \u003cspan style=\"color:#ef6155\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0, \u003cspan style=\"color:#ef6155\"\u003efeature\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhid1 at uhidev0 reportid 2: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e18, \u003cspan style=\"color:#ef6155\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e18, \u003cspan style=\"color:#ef6155\"\u003efeature\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhid2 at uhidev0 reportid 3: \u003cspan style=\"color:#ef6155\"\u003einput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e64, \u003cspan style=\"color:#ef6155\"\u003eoutput\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e64, \u003cspan style=\"color:#ef6155\"\u003efeature\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous avez ce genre de messages, la led bleue clignote : c\u0026rsquo;est OK !\u003c/p\u003e\n\u003ch3 id=\"appairage-bt\"\u003eAppairage BT\u003c/h3\u003e\n\u003cp\u003ePressez le bouton du récepteur audio Bluetooth, la led bleu va clignoter\ntrès rapidement. Il reste plus qu\u0026rsquo;à activer l’appairage de votre\npériphérique audio.\u003c/p\u003e\n\u003ch3 id=\"gestion-du-service-audio\"\u003eGestion du service audio\u003c/h3\u003e\n\u003cp\u003eAttachez votre dongle USB au serveur audio \u003ccode\u003esndiod\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set sndiod flags \u0026#34;-f rsnd/0 -F rsnd/1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl restart sndiod\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"openbsd--68\"\u003eOpenBSD ≥ 6.8\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;outil natif \u003ccode\u003esndioctl\u003c/code\u003e permet de contrôler le volume, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sndioctl output.level\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e+0.05\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sndioctl output.level\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e-0.05\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"openbsd--67\"\u003eOpenBSD ≤ 6.7\u003c/h4\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003eaucatctl\u003c/code\u003e et utilisez-le en mode console, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ aucatctl master=20\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"remerciement\"\u003eRemerciement\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eun premier @jcs\u003c/li\u003e\n\u003cli\u003eun second à Matthias Schmidt ; cf : \u003ca href=\"https://xosc.org/bluetooth.html\" rel=\"external\"\u003ehttps://xosc.org/bluetooth.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuce pour gérer le Bluetooth sur OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Bluetooth", "Audio"],
            "date_published": "2020-11-03T16:28:42+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:4a00cb8b-65eb-29c5-df96-83cc12d361f4",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/openssh/",
            "title": "OpenWRT : OpenSSH pour remplacer Dropbear",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Par défaut, OpenWRT est livré avec Dropbear. Bien que ce serveur SSH (Secure SHell) utilise seulement la version 2 du protocole SSH , et soit léger, il comporte quelques lacunes :\nIl a un support partial du protocole SFTP (SSH File Transfer Protocol) ; il faut lui adjoindre le paquet openssh-sftp-server pour que ce soit fonctionnel. Il n\u0026rsquo;a aucune séparation de privilège utilisateur. Il n\u0026rsquo;a pas officiellement de support des modules cryptographiques, approuvés par la FIPS 140-2. (bien que dans notre contexte particulier, ce ne soit pas une nécessité) Depuis, la version 2020.79, Dropbear semble gérer l\u0026rsquo;utilisation des algorythmes à courbes Elliptiques - ce qui n\u0026rsquo;est pas le cas des versions précédentes, incluses avant 19.07.4 - tel que : hostkey ed25519 le chiffrement chacha20-poly1305 voire les signatures de clés au format rsa-sha2 Installation :# opkg update :# opkg install openssh-server openssh-moduli InfoLe paquet openssh-moduli n\u0026rsquo;est pas strictement nécessaire. Pour rappel, le fichier /etc/ssh/moduli est un fichier contenant les nombres premiers et les générateurs à utiliser par le serveur SSH dans la méthode d\u0026rsquo;échange des clés de groupe\nDH (Diffie-Hellman)\n. Préférez l\u0026rsquo;installer…\nConfiguration Dropbear Mieux vaut laisser Dropbear sur le port par défaut.\nNéanmoins, vous pouvez le reconfigurer soit par l\u0026rsquo;interface LuCI, soit en mode console - ce qui peut se faire ainsi :\n:# uci set dropbear.@dropbear[0].Port=xxx :# uci commit dropbear :# /etc/init.d/dropbear restart où xxx est le numéro de port que vous choisirez !\npuis connectez-vous au serveur sur ce nouveau numéro de port.\nOpenSSH Fichier de configuration : /etc/ssh/sshd_config Les recommandations de bases suivantes s\u0026rsquo;appliquent ABSOLUMENT :\nn\u0026rsquo;utiliser QUE la Version 2 du protocole, NE PAS permettre au compte root de se connecter, désactiver l\u0026rsquo;authentification par mot de passe, n\u0026rsquo;utiliser QUE l\u0026rsquo;authentification par clés. Nous allons en profitez pour durcir la configuration par défaut :\nrecréons les clés d'hôtes proprement. Et tant qu\u0026rsquo;à faire, autorisons QUE les clés au format Ed25519. Lisez mon autre article , pour savoir comment créer de manière correcte des clés au format ed25519. InfoÀ savoir qu\u0026rsquo;au démarrage du serveur OpenSSH, il recréera les clés ECDSA. autorisons QUE : les chiffrements forts, les algorithmes suivants : d\u0026rsquo;échange de clés , de clés d'hôtes des codes d'authentification de messages , AttentionLes algorithmes des clés d\u0026rsquo;hôtes sk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com ne semblent pas être reconnus ; NE les ajoutez PAS ! Pour finir, ne configurez pas le service sur le port 22 ; en cas de problème, Dropbear pourra toujours vous être utile, même s\u0026rsquo;il faut le réactiver !\nFichier moduli Si vous avez installé le paquet openssh-moduli, il serait préférable de n\u0026rsquo;accepter que les échanges de clés de groupe DH supérieure ou égale à 3072 bits.\nAvant de le modifier, sauvegardons le fichier, au cas où…\n:# cp /etc/ssh/moduli /etc/ssh/moduli.bckp :# chmod 0400 /etc/ssh/moduli.bckp Ensuite, il faut le recréer AstuceSi vous avez configuré correctement un utilisateur ayant des droits sudo :\n:# sudo awk \u0026#39;$5 \u0026gt;= 3071\u0026#39; /etc/ssh/moduli | sudo tee /etc/ssh/moduli.safe :# mv /etc/ssh/moduli.safe /etc/ssh/moduli TL;DR Voici un exemple minimaliste du fichier de configuration du serveur :\nHostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ed25519_key Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org, HostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com PermitRootLogin no MaxAuthTries 3 PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no PermitEmptyPasswords no Subsystem sftp /usr/lib/sftp-server AttentionVous avez paramétré l\u0026rsquo;option ListenAddress ? Oubliez ou vous buterez face à une situation de compétition ! Gestion des services Service OpenSSH Et, voilà, maintenant, il ne vous reste plus qu\u0026rsquo;à vous connecter… après avoir testé la configuration puis activé et démarré le service :\n:# sshd -t\nSi la configuration est valide :\n:# /etc/init.d/sshd enable :# /etc/init.d/sshd start Service Dropbear Vous pouvez vous connecter au service d\u0026rsquo;OpenSSH, sans soucis ? Maintenant, vous pouvez arrêter et désactiver le service :\n:# /etc/init.d/dropbear stop :# /etc/init.d/dropbear disable Sauvegarde système Normalement, le répertoire /etc/ssh et ce qu\u0026rsquo;il contient est inclus dans la sauvegarde système par l\u0026rsquo;outil sysupgrade.\nPour le vérifier : :# sysupgrade -l | grep ssh\nSi ce n\u0026rsquo;est pas le cas, éditez le fichier /etc/sysupgrade.conf et ajoutez le répertoire.\nDépannage Situation de compétition ⇒ Impossible de se connecter après un redémarrage :\nAvez-vous paramétré l\u0026rsquo;option ListenAdress dans le fichier de configuration du service ?\nSi oui, désactivez la ligne correspondante . Du fait d\u0026rsquo;une situation de compétition, le démarrage du service OpenSSH ne peut pas s\u0026rsquo;effectuer.\nSi vous spécifiez l\u0026rsquo;option ListenAddress, OpenSSH s\u0026rsquo;exécutera lorsque vous le démarrerez. Néanmoins, au redémarrage de la machine, OpenSSH échouera à démarrer car il ne trouvera pas les interfaces réseau !\nDonc, évitez de spécifier cette option et configurez le parefeu pour n\u0026rsquo;autoriser que sur l\u0026rsquo;interface de votre LAN.\nsource\nDocumentation Wikipédia Comparison_of_SSH_servers WP , FIPS_140-2 WP Situation_de_compétition WP ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePar défaut, OpenWRT est livré avec Dropbear. Bien que ce serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSSH \u003cem\u003e(Secure SHell)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nutilise seulement la version 2 du protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, et soit léger,\nil comporte quelques lacunes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIl a un support partial du protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSFTP \u003cem\u003e(SSH File Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ; il faut lui\nadjoindre le     paquet \u003cstrong\u003eopenssh-sftp-server\u003c/strong\u003e pour que ce soit fonctionnel.\u003c/li\u003e\n\u003cli\u003eIl n\u0026rsquo;a aucune séparation de privilège utilisateur.\u003c/li\u003e\n\u003cli\u003eIl n\u0026rsquo;a pas officiellement de support des modules cryptographiques, approuvés\npar la \u003cstrong\u003eFIPS 140-2\u003c/strong\u003e. \u003cem\u003e(bien que dans notre contexte particulier,\nce ne soit pas une nécessité)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eDepuis, la version \u003cstrong\u003e2020.79\u003c/strong\u003e, Dropbear semble gérer l\u0026rsquo;utilisation des\nalgorythmes à courbes Elliptiques - \u003cem\u003ece qui n\u0026rsquo;est pas le cas des versions\nprécédentes, incluses avant 19.07.4\u003c/em\u003e - tel que :\n\u003cul\u003e\n\u003cli\u003ehostkey \u003cstrong\u003eed25519\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele chiffrement \u003cstrong\u003echacha20-poly1305\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003evoire les signatures de clés au format \u003cstrong\u003ersa-sha2\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# opkg update\n:# opkg install openssh-server openssh-moduli\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eLe paquet \u003cstrong\u003eopenssh-moduli\u003c/strong\u003e n\u0026rsquo;est pas strictement nécessaire. Pour rappel,\nle fichier \u003ccode\u003e/etc/ssh/moduli\u003c/code\u003e est un fichier contenant les nombres premiers\net les générateurs à utiliser par le serveur SSH dans la méthode d\u0026rsquo;échange\ndes clés de groupe\u003c/p\u003e\n\u003cp\u003e\u003cspan lang=\"en\"\u003eDH \u003cem\u003e(Diffie-Hellman)\u003c/em\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e. Préférez l\u0026rsquo;installer…\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"dropbear\"\u003eDropbear\u003c/h3\u003e\n\u003cp\u003eMieux vaut laisser Dropbear sur le port par défaut.\u003c/p\u003e\n\u003cp\u003eNéanmoins, vous pouvez le reconfigurer soit par l\u0026rsquo;interface LuCI, soit\nen mode console - \u003cem\u003ece qui peut se faire ainsi\u003c/em\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# uci set dropbear.@dropbear[0].Port=xxx\n:# uci commit dropbear\n:# /etc/init.d/dropbear restart\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eoù \u003ccode\u003exxx\u003c/code\u003e est le numéro de port que vous choisirez !\u003c/p\u003e\n\u003cp\u003epuis connectez-vous au serveur sur ce nouveau numéro de port.\u003c/p\u003e\n\u003ch3 id=\"openssh\"\u003eOpenSSH\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/etc/ssh/sshd_config\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLes recommandations de bases suivantes s\u0026rsquo;appliquent ABSOLUMENT :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003en\u0026rsquo;utiliser \u003cstrong\u003eQUE la Version 2\u003c/strong\u003e du protocole,\u003c/li\u003e\n\u003cli\u003eNE \u003cstrong\u003ePAS\u003c/strong\u003e permettre au compte \u003cstrong\u003eroot\u003c/strong\u003e de se connecter,\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003edésactiver l\u0026rsquo;authentification par mot de passe\u003c/strong\u003e,\u003c/li\u003e\n\u003cli\u003en\u0026rsquo;utiliser \u003cstrong\u003eQUE l\u0026rsquo;authentification par clés\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eNous allons en profitez pour durcir la configuration par défaut :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sec/ssh/sshd-durci/#recr%c3%a9ation-des-cl%c3%a9s-dh%c3%b4te\" title=\"Lien interne vers l\u0026#39;article : 'OpenSSH : Durcir la configuration du serveur SSH'\"\u003erecréons les clés d'hôtes\u003c/a\u003e\n proprement.\nEt tant qu\u0026rsquo;à faire, autorisons QUE les clés au format \u003cstrong\u003eEd25519\u003c/strong\u003e. \u003cbr\u003e\n\u003cem\u003e\u003ca class=\"inside\" href=\"/fr/sec/ssh/configuration-securisee/\" title=\"Lien interne vers l\u0026#39;article : 'SSH : Configuration Sécurisée'\"\u003eLisez mon autre article\u003c/a\u003e\n,\npour savoir comment créer de manière correcte des clés au format ed25519.\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eÀ savoir qu\u0026rsquo;au démarrage du serveur OpenSSH, il recréera les clés \u003cstrong\u003eECDSA\u003c/strong\u003e.\u003c/div\u003e\n\n\u003cul\u003e\n\u003cli\u003eautorisons QUE :\n\u003cul\u003e\n\u003cli\u003eles \u003ca class=\"inside\" href=\"/fr/sec/ssh/sshd-durci/#chiffrements\" title=\"Lien interne vers l\u0026#39;article : 'OpenSSH : Durcir la configuration du serveur SSH'\"\u003echiffrements\u003c/a\u003e\n forts,\u003c/li\u003e\n\u003cli\u003eles algorithmes  suivants :\n\u003cul\u003e\n\u003cli\u003ed\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sec/ssh/sshd-durci/#%c3%a9change-de-cl%c3%a9s\" title=\"Lien interne vers l\u0026#39;article : 'OpenSSH : Durcir la configuration du serveur SSH'\"\u003eéchange de clés\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003ede \u003ca class=\"inside\" href=\"/fr/sec/ssh/sshd-durci/#algorithmes-de-cl%c3%a9-h%c3%b4te\" title=\"Lien interne vers l\u0026#39;article : 'OpenSSH : Durcir la configuration du serveur SSH'\"\u003eclés d'hôtes\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003edes \u003ca class=\"inside\" href=\"/fr/sec/ssh/sshd-durci/#message-authentication-codes\" title=\"Lien interne vers l\u0026#39;article : 'OpenSSH : Durcir la configuration du serveur SSH'\"\u003ecodes d'authentification de messages\u003c/a\u003e\n,\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eLes algorithmes des clés d\u0026rsquo;hôtes \u003cstrong\u003e\u003ca href=\"mailto:sk-ssh-ed25519@openssh.com\" rel=\"external\"\u003esk-ssh-ed25519@openssh.com\u003c/a\u003e,sk-ssh-ed25519-cert-v01@openssh.com\u003c/strong\u003e\nne semblent pas être reconnus ; \u003cstrong\u003eNE les ajoutez PAS !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003ePour finir, ne configurez pas le service sur le port 22 ; en cas de problème,\nDropbear pourra toujours vous être utile, même s\u0026rsquo;il faut le réactiver !\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"fichier-moduli\"\u003eFichier moduli\u003c/h4\u003e\n\u003cp\u003eSi vous avez installé le paquet \u003cstrong\u003eopenssh-moduli\u003c/strong\u003e, il serait préférable\nde n\u0026rsquo;accepter que les échanges de clés de groupe \u003cabbr title=\"Diffie-Hellman\"\u003eDH\u003c/abbr\u003e\n\nsupérieure ou égale à 3072 bits.\u003c/p\u003e\n\u003cp\u003eAvant de le modifier, sauvegardons le fichier, au cas où…\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# cp /etc/ssh/moduli /etc/ssh/moduli.bckp\n:# chmod 0400 /etc/ssh/moduli.bckp\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEnsuite, il faut le \u003ca class=\"inside\" href=\"/fr/sec/ssh/sshd-durci/#moduli--linux\" title=\"Lien interne vers l\u0026#39;article : 'OpenSSH : Durcir la configuration du serveur SSH'\"\u003erecréer\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eSi vous avez configuré correctement un utilisateur ayant des droits \u003ca class=\"inside\" href=\"/fr/sys/openwrt/sudo/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : sudo'\"\u003esudo\u003c/a\u003e\n:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# sudo awk \u0026#39;$5 \u0026gt;= 3071\u0026#39; /etc/ssh/moduli | sudo tee /etc/ssh/moduli.safe\n:# mv /etc/ssh/moduli.safe /etc/ssh/moduli\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\n\u003ch4 id=\"tldr\"\u003eTL;DR\u003c/h4\u003e\n\u003cp\u003eVoici un exemple minimaliste du fichier de configuration du serveur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKey /etc/ssh/ssh_host_rsa_key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKey /etc/ssh/ssh_host_ed25519_key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eCiphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eKexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKeyAlgorithms ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eMACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePermitRootLogin no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eMaxAuthTries 3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePubkeyAuthentication yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAuthorizedKeysFile  .ssh/authorized_keys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePasswordAuthentication no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePermitEmptyPasswords no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSubsystem   sftp    /usr/lib/sftp-server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVous avez paramétré l\u0026rsquo;option \u003cstrong\u003eListenAddress\u003c/strong\u003e ? Oubliez ou vous buterez\nface à une \u003ca href=\"/fr/sys/openwrt/openssh/#situation-de-compétition\"\u003esituation de compétition\u003c/a\u003e !\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"gestion-des-services\"\u003eGestion des services\u003c/h2\u003e\n\u003ch3 id=\"service-openssh\"\u003eService OpenSSH\u003c/h3\u003e\n\u003cp\u003eEt, voilà, maintenant, il ne vous reste plus qu\u0026rsquo;à vous connecter… après\navoir testé la configuration puis activé et démarré le service :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# sshd -t\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi la configuration est valide :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# /etc/init.d/sshd enable\n:# /etc/init.d/sshd start\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"service-dropbear\"\u003eService Dropbear\u003c/h3\u003e\n\u003cp\u003eVous pouvez vous connecter au service d\u0026rsquo;OpenSSH, sans soucis ? \u003cbr\u003e\nMaintenant, vous pouvez arrêter et désactiver le service :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e:# /etc/init.d/dropbear stop\n:# /etc/init.d/dropbear disable\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"sauvegarde-système\"\u003eSauvegarde système\u003c/h2\u003e\n\u003cp\u003eNormalement, le répertoire \u003ccode\u003e/etc/ssh\u003c/code\u003e et ce qu\u0026rsquo;il contient est inclus\ndans la sauvegarde système par l\u0026rsquo;outil \u003ccode\u003esysupgrade\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour le vérifier : \u003ccode\u003e:# sysupgrade -l | grep ssh\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi ce n\u0026rsquo;est pas le cas, éditez le fichier \u003ccode\u003e/etc/sysupgrade.conf\u003c/code\u003e et ajoutez\nle répertoire.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"situation-de-compétition\"\u003eSituation de compétition\u003c/h3\u003e\n\u003cp\u003e⇒ Impossible de se connecter après un redémarrage :\u003c/p\u003e\n\u003cp\u003eAvez-vous paramétré l\u0026rsquo;option \u003ccode\u003eListenAdress\u003c/code\u003e dans le fichier de configuration\ndu service ?\u003c/p\u003e\n\u003cp\u003eSi oui, \u003cspan class=\"red\"\u003edésactivez la ligne correspondante \u003c/span\u003e\n.\nDu fait d\u0026rsquo;une \u003cstrong\u003esituation de compétition\u003c/strong\u003e, le démarrage du service OpenSSH ne\npeut pas s\u0026rsquo;effectuer.\u003c/p\u003e\n\u003cp\u003eSi vous spécifiez l\u0026rsquo;option \u003cstrong\u003eListenAddress\u003c/strong\u003e, OpenSSH s\u0026rsquo;exécutera lorsque\nvous le démarrerez. Néanmoins, au redémarrage de la machine, OpenSSH\néchouera à démarrer car il ne trouvera pas les interfaces réseau !\u003c/p\u003e\n\u003cp\u003eDonc, évitez de spécifier cette option et configurez le parefeu pour\nn\u0026rsquo;autoriser que sur l\u0026rsquo;interface de votre LAN.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003ca href=\"https://forum.openwrt.org/t/luci-https-not-working-after-upgrade-to-19-7-4/74352/16\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"wikipédia\"\u003eWikipédia\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Comparison_of_SSH_servers\" title=\"Article Wikipédia : Comparison_of_SSH_servers\"\u003eComparison_of_SSH_servers \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n, \u003ca href=\"https://en.wikipedia.org/wiki/FIPS_140-2\" title=\"Article Wikipédia : FIPS_140-2\"\u003eFIPS_140-2 \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Situation_de_comp%c3%a9tition\" title=\"Article Wikipédia : Situation_de_compétition\"\u003eSituation_de_compétition \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Installer OpenSSH dans OpenWRT pour remplacer Dropbear.",
            "tags": ["OpenWRT", "OpenSSH", "SSH"],
            "date_published": "2020-09-20T12:02:05+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:bb7d5630-becc-b64a-4693-235336d2661b",
            "url": "http://doc.huc.fr.eu.org/fr/sec/ssh/sshd-durci/",
            "title": "OpenSSH : Durcir la configuration du serveur SSH",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Par défaut, même sous OpenBSD, la configuration de SSH n\u0026rsquo;est pas des plus sécurisées.\nLes algorithmes NISTP, voire du SHA1, sont encore utilisés.\nAttentionIl est impératif QUE la version du serveur OpenSSH utilisée soit supérieure à la version 6.5 ! Configuration Le fichier de configuration : /etc/ssh/sshd_config Bien sûr, hormis le fait de :\nn\u0026rsquo;utiliser QUE la Version 2 du protocole, NE PAS permettre au compte root de se connecter, désactiver l\u0026rsquo;authentification par mot de passe, n\u0026rsquo;utiliser QUE l\u0026rsquo;authentification par clés. Recréation des clés d\u0026rsquo;Hôte $ cd /etc/ssh # rm ssh_host_* # ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N \u0026#34;\u0026#34; # ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N \u0026#34;\u0026#34; -o -a 64 InfoNe mettez pas de passphrases lors de la génération, autrement le serveur ne sera pas capable de les lire…\nDe toute facon, le fichier /var/log/auth vous le dira !\nEnsuite, il faut veillez aux choses ci-dessous :\nHostKey AttentionNE PAS utiliser les protocoles de chiffrement DSA, ECDSA Commentez les déclarations HostKey pour ne garder que celles relatives au chiffrement RSA et ED25519.\nHostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ed25519_key AstuceVous pouvez très bien n\u0026rsquo;utiliser que les clés à courbe elliptiques, de type ed25519. Dans ce cas-là, veillez à ce que tous vos clients puissent utiliser aussi ce mode de chiffrement. Chiffrements Les chiffrements à autoriser sont :\nCiphers chacha20-poly1305@openssh.com\nÉchange de clés Les algorithmes d\u0026rsquo;échanges de clé à privilégier sont :\nKexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com\nAlgorithmes de clé Hôte Les algorithmes de clé d\u0026rsquo;Hôte sont :\nHostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519\nInfoIl est possible que selon la version de votre serveur, cette définition d\u0026rsquo;algorithme provoque une erreur. Veuillez lire la section Dépannage ! Message Authentication Codes Les algorithmes des Codes d\u0026rsquo;Authentification de Messages sont :\nMACs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com\nLe fichier Moduli Le fichier moduli est un fichier contenant les nombres premiers et les générateurs à utiliser par le serveur SSH dans la méthode d\u0026rsquo;échange des clés de groupe DH (Diffie-Hellman) .\nAttentionDepuis 2017, le bogue #2793 explique que dans certains contextes le bon fonctionnement échoue, suite aux recommandations ci-dessous.\nSi vous n\u0026rsquo;arrivez plus à vous connecter, envisagez de revenir en arrière sur cette modification !\nModuli / Linux Il est recommandé de le recréer de telle manière :\nawk \u0026#39;$5 \u0026gt;= 3071\u0026#39; /etc/ssh/moduli \u0026gt; /etc/ssh/moduli.safe mv /etc/ssh/moduli.safe /etc/ssh/moduli Moduli / OpenBSD S\u0026rsquo;il est possible de le créer ainsi : ssh-keygen -G /etc/ssh/moduli -b 3072\nattention, la génération sera longue et dépend très fortement de la puissance machine de votre serveur.\nNéanmoins, sachez que depuis quelques années/versions, le fichier est déjà généré et se trouve être : /etc/moduli\nPour en savoir plus, lisez le manpage moduli(5) Sandbox AttentionCette option est obsolète depuis la version 7.5.\nVeillez à ne plus l\u0026rsquo;utiliser !\nTL;DR Voici un exemple minimaliste du fichier de configuration sécurisée côté serveur :\nPort 22 ListenAddress 192.168.xxx.yyy ListenAddress fd00:abcd:efg0::1 HostKey /etc/ssh/ssh_host_rsa_key HostKey /etc/ssh/ssh_host_ed25519_key Ciphers chacha20-poly1305@openssh.com KexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com HostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519 MACs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com PermitRootLogin no PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys PasswordAuthentication no Dépannage Bad key types Si vous avez l\u0026rsquo;erreur suivante : /etc/ssh/sshd_config line 26: Bad key types 'ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com'\nEnlevez les deux déclarations suivantes sk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com et testez à nouveau, puis si c\u0026rsquo;est OK, relancez le service.\nLoginGraceTime Du fait de générer des clés RSA + PKBDF, ou ed25519, si vous avez paramétré l\u0026rsquo;option LoginGraceTime, pour la diminuer au strict minimum, pensez à augmenter sa valeur, sinon vous aurez le droit à ne pas pouvoir vous connecter, sans aucun message d\u0026rsquo;erreur dans le log d\u0026rsquo;authentification.\nTest Vérifier la configuration : :# sshd -t ssh-audit Pour tester la configuration de votre serveur, il existe un outil nommé ssh-audit. Installez-le et exécutez à l\u0026rsquo;encontre de votre serveur SSH :\n:$ ssh-audit adresse-ip-serveur-ssh\nTout message en rouge est à corriger URGEMMENT. Tout message en vert signifie que l\u0026rsquo;analyse en question est bonne. sshaudit internet Il est possible de tester la valeur de la configuration de votre serveur sur le site sshaudit : https://www.sshaudit.com\nDocumentation Manpages sshd(8) , sshd_config(5) , sftp-server(8) moduli(5) Autres https://infosec.mozilla.org/guidelines/openssh https://www.sshaudit.com/hardening_guides.html ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePar défaut, même sous OpenBSD, la configuration de SSH n\u0026rsquo;est pas des\nplus sécurisées.\u003c/p\u003e\n\u003cp\u003eLes algorithmes NISTP, voire du SHA1, sont encore utilisés.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eIl est impératif QUE la version du serveur OpenSSH utilisée soit supérieure\nà la version 6.5 !\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration : \u003ccode\u003e/etc/ssh/sshd_config\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eBien sûr, hormis le fait de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003en\u0026rsquo;utiliser \u003cstrong\u003eQUE la Version 2\u003c/strong\u003e du protocole,\u003c/li\u003e\n\u003cli\u003eNE \u003cstrong\u003ePAS\u003c/strong\u003e permettre au compte \u003cstrong\u003eroot\u003c/strong\u003e de se connecter,\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003edésactiver l\u0026rsquo;authentification par mot de passe\u003c/strong\u003e,\u003c/li\u003e\n\u003cli\u003en\u0026rsquo;utiliser \u003cstrong\u003eQUE l\u0026rsquo;authentification par clés\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"recréation-des-clés-dhôte\"\u003eRecréation des clés d\u0026rsquo;Hôte\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd /etc/ssh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rm ssh_host_*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ssh-keygen -t ed25519 -f ssh_host_ed25519_key -N \u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ssh-keygen -t rsa -b 4096 -f ssh_host_rsa_key -N \u0026#34;\u0026#34; -o -a 64\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eNe mettez pas de passphrases lors de la génération, autrement le serveur ne\nsera pas capable de les lire…\u003c/p\u003e\n\u003cp\u003eDe toute facon, le fichier \u003ccode\u003e/var/log/auth\u003c/code\u003e vous le dira !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eEnsuite, il faut veillez aux choses ci-dessous :\u003c/p\u003e\n\u003ch3 id=\"hostkey\"\u003eHostKey\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cspan class=\"red\"\u003eNE PAS utiliser les protocoles de chiffrement DSA, ECDSA\u003c/span\u003e\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eCommentez\u003c/strong\u003e les déclarations \u003ccode\u003eHostKey\u003c/code\u003e pour \u003cspan em\u003ene garder que celles\nrelatives au chiffrement RSA et ED25519\u003c/span\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKey /etc/ssh/ssh_host_rsa_key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKey /etc/ssh/ssh_host_ed25519_key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eVous pouvez très bien n\u0026rsquo;utiliser que les clés à courbe elliptiques, de type\ned25519. Dans ce cas-là, veillez à ce que tous vos clients puissent utiliser\naussi ce mode de chiffrement.\u003c/div\u003e\n\n\u003ch3 id=\"chiffrements\"\u003eChiffrements\u003c/h3\u003e\n\u003cp\u003eLes \u003cstrong\u003echiffrements\u003c/strong\u003e à autoriser sont :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eCiphers chacha20-poly1305@openssh.com\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"échange-de-clés\"\u003eÉchange de clés\u003c/h3\u003e\n\u003cp\u003eLes \u003cstrong\u003ealgorithmes d\u0026rsquo;échanges de clé\u003c/strong\u003e à privilégier sont :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eKexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"algorithmes-de-clé-hôte\"\u003eAlgorithmes de clé Hôte\u003c/h3\u003e\n\u003cp\u003eLes \u003cstrong\u003ealgorithmes de clé d\u0026rsquo;Hôte\u003c/strong\u003e sont :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eHostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eIl est possible que selon la version de votre serveur, cette définition\nd\u0026rsquo;algorithme provoque une erreur. Veuillez lire la section\n\u003ca href=\"/fr/sec/ssh/sshd-durci/#bad-key-types\"\u003eDépannage\u003c/a\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"message-authentication-codes\"\u003eMessage Authentication Codes\u003c/h3\u003e\n\u003cp\u003eLes algorithmes des \u003cstrong\u003eCodes d\u0026rsquo;Authentification de Messages\u003c/strong\u003e sont :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eMACs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"le-fichier-moduli\"\u003eLe fichier Moduli\u003c/h3\u003e\n\u003cp\u003eLe fichier moduli est un fichier contenant les nombres premiers et les\ngénérateurs à utiliser par le serveur SSH dans la méthode d\u0026rsquo;échange\ndes clés de groupe \n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDH \u003cem\u003e(Diffie-Hellman)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eDepuis 2017, le \u003ca href=\"https://bugzilla.mindrot.org/show_bug.cgi?id=2793\" rel=\"external\"\u003ebogue #2793\u003c/a\u003e\nexplique que dans certains contextes le bon fonctionnement échoue, suite\naux recommandations ci-dessous.\u003c/p\u003e\n\u003cp\u003eSi vous n\u0026rsquo;arrivez plus à vous connecter, envisagez de revenir en arrière\nsur cette modification !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"moduli--linux\"\u003eModuli / Linux\u003c/h4\u003e\n\u003cp\u003eIl est recommandé de le recréer de telle manière :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eawk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;$5 \u0026gt;= 3071\u0026#39;\u003c/span\u003e /etc/ssh/moduli \u0026gt; /etc/ssh/moduli.safe\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emv /etc/ssh/moduli.safe /etc/ssh/moduli\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"moduli--openbsd\"\u003eModuli / OpenBSD\u003c/h4\u003e\n\u003cp\u003eS\u0026rsquo;il est possible de le créer ainsi : \u003cbr\u003e\n\u003ccode\u003essh-keygen -G /etc/ssh/moduli -b 3072\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eattention, la génération sera longue et dépend très fortement de la puissance\nmachine de votre serveur.\u003c/p\u003e\n\u003cp\u003eNéanmoins, sachez que depuis quelques années/versions, le fichier est déjà\ngénéré et se trouve être : \u003ccode\u003e/etc/moduli\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour en savoir plus, lisez le manpage \n\u003ca class=\"man\" href=\"https://man.openbsd.org/moduli.5\" title=\"Page du Manuel OpenBSD pour : moduli\"\u003emoduli(5)\u003c/a\u003e\n\u003c/p\u003e\n\u003ch3 id=\"sandbox\"\u003eSandbox\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eCette option est \u003cspan em\u003eobsolète depuis la version 7.5\u003c/span\u003e.\u003c/p\u003e\n\u003cp\u003eVeillez à ne plus l\u0026rsquo;utiliser !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"tldr\"\u003eTL;DR\u003c/h2\u003e\n\u003cp\u003eVoici un exemple minimaliste du fichier de configuration sécurisée côté\nserveur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePort 22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eListenAddress 192.168.xxx.yyy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eListenAddress fd00:abcd:efg0::1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKey /etc/ssh/ssh_host_rsa_key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKey /etc/ssh/ssh_host_ed25519_key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eCiphers chacha20-poly1305@openssh.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eKexAlgorithms mlkem768x25519-sha256,sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHostKeyAlgorithms ssh-ed25519-cert-v01@openssh.com,ssh-ed25519\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eMACs umac-64-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePermitRootLogin no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePubkeyAuthentication yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAuthorizedKeysFile  .ssh/authorized_keys\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePasswordAuthentication no\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"bad-key-types\"\u003eBad key types\u003c/h3\u003e\n\u003cp\u003eSi vous avez l\u0026rsquo;erreur suivante : \u003cbr\u003e\n\u003ccode\u003e/etc/ssh/sshd_config line 26: Bad key types 'ssh-ed25519,ssh-ed25519-cert-v01@openssh.com,sk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com,rsa-sha2-256,rsa-sha2-512,rsa-sha2-256-cert-v01@openssh.com,rsa-sha2-512-cert-v01@openssh.com'\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnlevez les deux déclarations suivantes\n\u003ccode\u003esk-ssh-ed25519@openssh.com,sk-ssh-ed25519-cert-v01@openssh.com\u003c/code\u003e\net \u003ca href=\"/fr/sec/ssh/sshd-durci/#test\"\u003etestez\u003c/a\u003e à nouveau, puis si c\u0026rsquo;est \u003cstrong\u003eOK\u003c/strong\u003e, relancez le service.\u003c/p\u003e\n\u003ch3 id=\"logingracetime\"\u003eLoginGraceTime\u003c/h3\u003e\n\u003cp\u003eDu fait de générer des clés RSA + PKBDF, ou ed25519, si vous avez paramétré\nl\u0026rsquo;option \u003ccode\u003eLoginGraceTime\u003c/code\u003e, pour la diminuer au strict minimum, pensez à\n\u003cstrong\u003eaugmenter sa valeur, sinon\u003c/strong\u003e vous aurez \u003cstrong\u003ele droit à ne pas pouvoir vous\nconnecter, sans aucun message d\u0026rsquo;erreur\u003c/strong\u003e dans le log d\u0026rsquo;authentification.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"test\"\u003eTest\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eVérifier la configuration : \u003ccode\u003e:# sshd -t\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch4 id=\"ssh-audit\"\u003essh-audit\u003c/h4\u003e\n\u003cp\u003ePour tester la configuration de votre serveur, il existe un outil nommé\n\u003ccode\u003essh-audit\u003c/code\u003e. Installez-le et exécutez à l\u0026rsquo;encontre de votre serveur SSH :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ ssh-audit adresse-ip-serveur-ssh\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTout message en rouge est à corriger URGEMMENT.\u003c/li\u003e\n\u003cli\u003eTout message en vert signifie que l\u0026rsquo;analyse en question est bonne.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"sshaudit-internet\"\u003esshaudit internet\u003c/h4\u003e\n\u003cp\u003eIl est possible de tester la valeur de la configuration de votre serveur\nsur le site \u003cstrong\u003esshaudit\u003c/strong\u003e : \u003ca href=\"https://www.sshaudit.com\" rel=\"external\"\u003ehttps://www.sshaudit.com\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/sshd.8\" title=\"Page du Manuel OpenBSD pour : sshd\"\u003esshd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sshd_config.5\" title=\"Page du Manuel OpenBSD pour : sshd_config\"\u003esshd_config(5)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/sftp-server.8\" title=\"Page du Manuel OpenBSD pour : sftp-server\"\u003esftp-server(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/moduli.5\" title=\"Page du Manuel OpenBSD pour : moduli\"\u003emoduli(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"autres\"\u003eAutres\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://infosec.mozilla.org/guidelines/openssh\" rel=\"external\"\u003ehttps://infosec.mozilla.org/guidelines/openssh\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.sshaudit.com/hardening_guides.html\" rel=\"external\"\u003ehttps://www.sshaudit.com/hardening_guides.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Configurer le serveur SSH pour une configuration plus sécurisée, que celle par défaut.",
            "tags": ["SSH", "harden"],
            "date_published": "2020-09-18T15:58:58+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:45fd50cd-b1c8-3046-4dbc-ec10e3cf6ef3",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-compose/",
            "title": "Gestion de la touche de composition sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description La touche Compose, dite touche de composition est une touche suivi d\u0026rsquo;un ensemble d\u0026rsquo;une ou plusieurs touches qui permet d\u0026rsquo;imprimer les caractères Unicode de manière pratique.\nIl faut \u0026ldquo;voir\u0026rdquo; la touche de composition comme un raccourci à la combinaison des touches.\nSous X, souvent le DE permet de définir une touche Compose. Une fois que vous avez fait vos modifications systèmes, il est nécessaire de redémarrer votre session !\nConfiguration Il existe plusieurs moyens de configurer la touche de composition :\nselon votre bureau graphique, tel Gnome, KDE, Xfce…\nla configuration des fichiers .XCompose, .Xmodmap et .xsession n\u0026rsquo;est utile que pour les sessions terminales, en mode console, voire les environnements graphiques différents des bureaux graphiques.\nGnome Menu \u0026ldquo;Préférences\u0026rdquo; \u0026gt; option \u0026ldquo;Position de la touche compose\u0026rdquo;\nKDE Menu \u0026ldquo;Paramètres\u0026rdquo; (Alt+F2) \u0026gt; \u0026ldquo;Régions et langues\u0026rdquo;, puis choisir l\u0026rsquo;option \u0026ldquo;Avancé\u0026rdquo; dans \u0026ldquo;Disposition du clavier\u0026rdquo;. Puis parmi les options Xkb, cherchez \u0026ldquo;position de la touche compose\u0026rdquo;.\nXfce Xfce ≥ 4.14 Depuis Xfce 4.14, le sélecteur est renommé : \u0026ldquo;Touche de composition\u0026rdquo;.\nXfce \u0026lt; 4.14 C\u0026rsquo;est dans \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;Clavier\u0026rdquo; : onglet \u0026ldquo;Disposition\u0026rdquo;, puis définir le sélecteur \u0026ldquo;Touche composée\u0026rdquo;.\nFichier .XCompose Le fichier ~/.XCompose sert à définir vos combinaisons de touche personnalisées.\nPour exemple :\n\u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;v\u0026gt; : \u0026#34;✓\u0026#34; U2713 # CHECK MARK \u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;at\u0026gt; \u0026lt;v\u0026gt; : \u0026#34;✔\u0026#34; U2714 # HEAVY CHECK MARK \u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;X\u0026gt; : \u0026#34;✗\u0026#34; U2717 # BALLOT X \u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;at\u0026gt; \u0026lt;X\u0026gt; : \u0026#34;✘\u0026#34; U2718 # HEAVY BALLOT X \u0026lt;Multi_key\u0026gt; \u0026lt;Multi_key\u0026gt; \u0026lt;t\u0026gt; \u0026lt;e\u0026gt; \u0026lt;l\u0026gt; : \u0026#34;☎\u0026#34; U260E # BLACK TELEPHONE Dans cet exemple, la touche \u0026lt;Multi_key\u0026gt; est votre touche de composition ; la touche \u0026lt;at\u0026gt; correspond à la touche @ et les autres correspondent à vos lettres que vous retrouvez sur votre clavier.\nFichier .Xmodmap Pour la gestion de cette fonction, en mode terminal ou dans une console, il faut créer le fichier ~/.Xmodmap et définir dedans :\n# key Compose : Touche Window keycode 115 = Multi_key Fichier .xsession Ajouter à votre fichier ~/.xsession :\n# Gestion des touches clavier xmodmap $HOME/.Xmodmap Documentations https://fr.wikipedia.org/wiki/Aide:Caract%C3%A8res_sp%C3%A9ciaux_probl%C3%A9matiques https://fr.wikipedia.org/wiki/Touche_compose Le manpage : http://man.openbsd.org/XCompose Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa touche \u003ccode\u003eCompose\u003c/code\u003e, dite touche de composition est une touche suivi\nd\u0026rsquo;un ensemble d\u0026rsquo;une ou plusieurs touches qui permet d\u0026rsquo;imprimer les\ncaractères \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-unicode/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion de l\u0026#39;Unicode sous OpenBSD'\"\u003eUnicode\u003c/a\u003e\n de\nmanière pratique.\u003c/p\u003e\n\u003cp\u003eIl faut \u0026ldquo;voir\u0026rdquo; la touche de composition comme un raccourci à la\ncombinaison des touches.\u003c/p\u003e\n\u003cp\u003eSous X, souvent le DE permet de définir une touche Compose. Une fois que\nvous avez fait vos modifications systèmes, il est nécessaire de\nredémarrer votre session !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eIl existe plusieurs moyens de configurer la touche de composition :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eselon votre bureau graphique, tel \u003ca href=\"/fr/sys/openbsd/tip-compose/#gnome\"\u003eGnome\u003c/a\u003e, \u003ca href=\"/fr/sys/openbsd/tip-compose/#kde\"\u003eKDE\u003c/a\u003e, \u003ca href=\"/fr/sys/openbsd/tip-compose/#xfce\"\u003eXfce\u003c/a\u003e…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela configuration des fichiers \u003ca href=\"/fr/sys/openbsd/tip-compose/#fichier-xcompose\"\u003e.XCompose\u003c/a\u003e,\n\u003ca href=\"/fr/sys/openbsd/tip-compose/#fichier-xmodmap\"\u003e.Xmodmap\u003c/a\u003e et \u003ca href=\"/fr/sys/openbsd/tip-compose/#fichier-xsession\"\u003e.xsession\u003c/a\u003e n\u0026rsquo;est utile\nque pour les sessions terminales, en mode console, voire les environnements\ngraphiques différents des bureaux graphiques.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gnome\"\u003eGnome\u003c/h3\u003e\n\u003cp\u003eMenu \u0026ldquo;Préférences\u0026rdquo; \u0026gt; option \u0026ldquo;Position de la touche compose\u0026rdquo;\u003c/p\u003e\n\u003ch3 id=\"kde\"\u003eKDE\u003c/h3\u003e\n\u003cp\u003eMenu \u0026ldquo;Paramètres\u0026rdquo; (Alt+F2) \u0026gt; \u0026ldquo;Régions et langues\u0026rdquo;, puis choisir l\u0026rsquo;option\n\u0026ldquo;Avancé\u0026rdquo; dans \u0026ldquo;Disposition du clavier\u0026rdquo;. Puis parmi les options Xkb,\ncherchez \u0026ldquo;position de la touche compose\u0026rdquo;.\u003c/p\u003e\n\u003ch3 id=\"xfce\"\u003eXfce\u003c/h3\u003e\n\u003ch4 id=\"xfce--414\"\u003eXfce ≥ 4.14\u003c/h4\u003e\n\u003cp\u003eDepuis Xfce 4.14, le sélecteur est renommé : \u0026ldquo;Touche de composition\u0026rdquo;.\u003c/p\u003e\n\u003ch4 id=\"xfce--414-1\"\u003eXfce \u0026lt; 4.14\u003c/h4\u003e\n\u003cp\u003eC\u0026rsquo;est dans \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;Clavier\u0026rdquo; : onglet \u0026ldquo;Disposition\u0026rdquo;, puis définir\nle sélecteur \u0026ldquo;Touche composée\u0026rdquo;.\u003c/p\u003e\n\u003ch3 id=\"fichier-xcompose\"\u003eFichier .XCompose\u003c/h3\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e~/.XCompose\u003c/code\u003e sert à définir vos combinaisons de touche\npersonnalisées.\u003c/p\u003e\n\u003cp\u003ePour exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;v\u0026gt;    :   \u0026#34;✓\u0026#34; U2713   # CHECK MARK\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;at\u0026gt; \u0026lt;v\u0026gt;   :   \u0026#34;✔\u0026#34; U2714   # HEAVY CHECK MARK\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;X\u0026gt;        :   \u0026#34;✗\u0026#34; U2717   # BALLOT X\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026lt;Multi_key\u0026gt; \u0026lt;at\u0026gt; \u0026lt;at\u0026gt; \u0026lt;X\u0026gt; : \u0026#34;✘\u0026#34; U2718 # HEAVY BALLOT X\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e\u0026lt;Multi_key\u0026gt; \u0026lt;Multi_key\u0026gt; \u0026lt;t\u0026gt; \u0026lt;e\u0026gt; \u0026lt;l\u0026gt; : \u0026#34;☎\u0026#34; U260E # BLACK TELEPHONE\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans cet exemple, la touche \u003ccode\u003e\u0026lt;Multi_key\u0026gt;\u003c/code\u003e est votre touche de\ncomposition ; la touche \u003ccode\u003e\u0026lt;at\u0026gt;\u003c/code\u003e correspond à la touche \u003ckbd\u003e@\u003c/kbd\u003e et\nles autres correspondent à vos lettres que vous retrouvez sur votre\nclavier.\u003c/p\u003e\n\u003ch3 id=\"fichier-xmodmap\"\u003eFichier .Xmodmap\u003c/h3\u003e\n\u003cp\u003ePour la gestion de cette fonction, en mode terminal ou dans une console,\nil faut créer le fichier \u003ccode\u003e~/.Xmodmap\u003c/code\u003e et définir dedans :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# key Compose : Touche Window\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekeycode 115\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eMulti_key\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"fichier-xsession\"\u003eFichier .xsession\u003c/h3\u003e\n\u003cp\u003eAjouter à votre fichier \u003ccode\u003e~/.xsession\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Gestion des touches clavier\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exmodmap $HOME/.Xmodmap\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Aide:Caract%C3%A8res_sp%C3%A9ciaux_probl%C3%A9matiques\" rel=\"external\"\u003ehttps://fr.wikipedia.org/wiki/Aide:Caract%C3%A8res_sp%C3%A9ciaux_probl%C3%A9matiques\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Touche_compose\" rel=\"external\"\u003ehttps://fr.wikipedia.org/wiki/Touche_compose\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLe manpage : \u003ca href=\"http://man.openbsd.org/XCompose\" rel=\"external\"\u003ehttp://man.openbsd.org/XCompose\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuce pour gérer la composition sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "unicode", "compose"],
            "date_published": "2020-09-18T12:24:39+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:6dcb70a6-49a7-1d00-3c4e-5d7b79d8054e",
            "url": "http://doc.huc.fr.eu.org/fr/trad/que-se-passe-t-il-quand-vous-ecrivez-dans-la-barre-d-adresse-du-navigateur-web/",
            "title": "Que se passe-t-il quand vous écrivez dans la barre d'adresse du navigateur web…",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Prologue Cet article est la traduction de l\u0026rsquo;article anglais \u0026quot;What happens when…\u0026quot; d\u0026rsquo;Alex Gaynor. De même que l\u0026rsquo;article original est sous licence CC0, ainsi est la traduction de cet article.\nQue se passe-t-il quand… Ce dépôt est une tentative pour répondre à cette vieille question d\u0026rsquo;interview \u0026ldquo;Que se passe-t-il quand vous écrivez google.com dans la barre d\u0026rsquo;adresse de votre navigateur web et que vous appuyez sur la touche Entrée ?\u0026rdquo;\nHormis l\u0026rsquo;habituel histoire, nous allons essayer de répondre à cette question avec autant de détails que possible. Rien ne sera négligé.\nCeci est un processus collaboratif, alors svp creusez et essayez d\u0026rsquo;aider ! Il y a des tonnes de détails manquants qui n\u0026rsquo;attendent que vous pour les ajouter ! SVP, envoyez-nous vos requêtes !\nTout ceci est sous les termes de la licence Creative Commons Zero\nVous pouvez lire ceci en 简体中文 (Chinois simplifié), 日本語 (Japonais) et 한국어 (Coréen). NOTE : ces traductions n\u0026rsquo;ont pas été examinées par les responsables de alex/what-happens-when.\nLa touche \u0026ldquo;g\u0026rdquo; est appuyée La section suivante explique les actions physiques du clavier et les interruptions du système d\u0026rsquo;exploitation. Lorsque vous appuyez sur la touche g, le navigateur reçoit l\u0026rsquo;événement et les fonctions d\u0026rsquo;autocomplétion s\u0026rsquo;enclenchent.\nSelon l\u0026rsquo;algorithme de votre navigateur et si vous êtes en mode privé, ou non, diverses suggestions vous seront présentées dans un menu déroulant sous la barre d\u0026rsquo; URL . La plupart des algorithmes trient et priorisent les résultats selon la recherche historique, les marques-pages, les cookies, et les recherches populaires sur Internet.\nLorsque vous écrivez google.com, de nombreux blocs de code s\u0026rsquo;exécutent et les suggestions seront affinées à chaque appui sur une touche. Il peut même vous suggérer \u0026ldquo;google.com\u0026rdquo; avant que vous ayez fini de l\u0026rsquo;écrire.\nL\u0026rsquo;appui sur la touche \u0026ldquo;Entrée\u0026rdquo; Pour commencer, choisissons l\u0026rsquo;appui sur le bas de la touche Entrée.\nÀ ce moment, un circuit électrique spécifique à la touche est verrouillée (soit directement, soit de manière capacitive). Ceci permet à une petite quantité de courant de circuler dans le circuit logique du clavier, qui analyse l\u0026rsquo;état de l\u0026rsquo;interrupteur de chaque touche, élimine le bruit électrique de la fermeture intermittente rapide de l\u0026rsquo;interrupteur et le convertit en un entier de code de touche, en l’occurrence 13.\nLe contrôleur du clavier encode alors le code de touche pour le transport vers l\u0026rsquo;ordinateur. Actuellement, c\u0026rsquo;est presque universellement au-travers d\u0026rsquo;une connexion USB ou par Bluetooth, mais historiquement c\u0026rsquo;était des connexions de type PS /2 ou ADB .\nDans le cas d\u0026rsquo;un clavier USB :\nLe circuit USB du clavier est alimenté par l\u0026rsquo;alimentation 5V fournit sur la broche 1 du contrôleur USB de l\u0026rsquo;ordinateur.\nLe code de touche généré est enregistré par la mémoire du circuit interne du clavier dans un registre appelé \u0026ldquo;endpoint\u0026rdquo;.\nLe contrôleur USB analyse ce registre \u0026ldquo;endpoint\u0026rdquo; environ toutes les 10 millisecondes (valeur minimum déclarée par le clavier), ainsi il enregistre la valeur du code de touche.\nCette valeur parvient au moteur d\u0026rsquo;interface série USB SIE afin d\u0026rsquo;être converti dans un ou plusieurs paquets USB selon le protocole USB de bas niveau.\nCes paquets sont envoyés par un signal électrique différentiel sur les connecteurs D+ et D- (entre 2) à la vitesse maximale de 1.5 Mo/s , puisqu\u0026rsquo;un dispositif IHM est toujours déclaré en tant que \u0026ldquo;dispositif à faible vitesse\u0026rdquo; (en conformité avec la norme USB 2.0).\nCe signal en série est alors décodé par le contrôleur USB de l\u0026rsquo;ordinateur, puis interprété par le pilote du dispositif universel de clavier IHM de l\u0026rsquo;ordinateur. La valeur de la touche est passée au-travers de la couche d\u0026rsquo;abstraction matérielle du système d\u0026rsquo;exploitation.\nDans le cas d\u0026rsquo;un clavier virtuel (de même pour les écrans tactiles) :\nQuand l\u0026rsquo;utilisateur pose son doigt sur un écran tactile capacitif moderne, une quantité infime de courant est transmise au doigt. Cela complète le circuit par le champ électrostatique de la couche conductrice et crée une chute de tension à cet endroit de l\u0026rsquo;écran. Le contrôleur de l\u0026rsquo;écran lève une interruption rapportant les coordonnées de la touche pressée.\nAlors le système d\u0026rsquo;exploitation mobile notifie à l\u0026rsquo;application en cours de l’événement de pression d\u0026rsquo;un des éléments de son interface (qui sont les boutons de l\u0026rsquo;interface virtuelle de l\u0026rsquo;application de clavier).\nLe clavier virtuel peut maintenant lever une interruption logicielle afin d\u0026rsquo;envoyer un message de \u0026rsquo;touche pressée\u0026rsquo; au système d\u0026rsquo;exploitation.\nCette interruption notifie l\u0026rsquo;application en cours d\u0026rsquo;un événement de \u0026rsquo;touche pressée'.\nDéclenchement d\u0026rsquo;interruption [Hors claviers USB] Le clavier envoie des signaux sur sa ligne de requêtes d\u0026rsquo;interruption ( IRQ ), qui correspond à un entier interrupt vector du contrôleur d\u0026rsquo;interruption.\nLe processeur ( UCT ) utilise la table de descripteurs d\u0026rsquo;interruptions ( IDT ) qui correspond aux vecteurs d\u0026rsquo;interruptions vers les fonctions (interrupt handlers) qui sont fournis par le noyau. Lorsqu\u0026rsquo;une interruption arrive, l\u0026rsquo; UCT indexe l\u0026rsquo; IDT avec le vecteur d\u0026rsquo;interruptions et exécute le gestionnaire approprié.\nAinsi, le noyau est introduit.\n(Dans Windows) Un message WM_KEYDOWN est envoyé à l\u0026rsquo;application Le transport IHM envoie l\u0026rsquo;événement de touche pressée au pilote KBDHID.sys qui convertit l\u0026rsquo;utilisation de l\u0026rsquo; IHM vers un code d\u0026rsquo;analyse. Dans ce cas, le code d\u0026rsquo;analyse est VK_RETURN (0x0D).\nLe pilote KBDHID.sys s\u0026rsquo;interface avec KBDCLASS.sys (un pilote de classe clavier). Ce pilote est responsable de toutes les entrées de clavier et clavier numérique de manière sécurisée. Il les appelle ensuite dans Win32K.sys (après avoir passer le message dans les filtres de clavier tiers installés).\nC\u0026rsquo;est tout ce qui se passe dans le noyau.\nWin32K.sys détermine quelle fenêtre est active au-travers de l\u0026rsquo; API GetForegroundWindow(). Cette API fournit la capture de la fenêtre à la boite d\u0026rsquo;adresse du navigateur.\nLa fenêtre principale \u0026ldquo;message pump\u0026rdquo; appelle alors SendMessage(hWnd, WM_KEYDOWN, VK_RETURN, lParam). lParam est un masque binaire qui indique des informations complémentaires à la pression de touche : compteur de répétition (0 dans ce cas), le code d\u0026rsquo;analyse actuel (peut être dépendant du fabriquant, mais ne l\u0026rsquo;est pas généralement pour VK_RETURN), quelque soit la touche étendue (e.g. alt, shift, ctrl) qui soit aussi appuyée (elles ne l\u0026rsquo;étaient pas), ou dans un autre état.\nL\u0026rsquo;API Windows SendMessage est une fonction simple qui ajoute le message à une queue d\u0026rsquo;un gestionnaire de fenêtres particulier (hWnd). Plus tard, la fonction principale de traitement des messages (appelée WindowProc) assignée à hWnd est appelée afin de traiter chaque message dans la queue.\nLa fenêtre (hWnd) qui est active est en fait un contrôleur d\u0026rsquo;édition, et le WindowProc dans ce cas est un gestionnaire de messages pour WM_KEYDOWN. Ce code cherche un paramètre tiers qui est passé à SendMessage (wParam), parce que VK_RETURN sait qu\u0026rsquo;un utilisateur a appuyé sur la touche Entrée.\n(Dans OS X) Un NSEvent KeyDown est envoyé à l\u0026rsquo;application Le signal d\u0026rsquo;interruption déclenche un événement d\u0026rsquo;interruption dans le pilote du Kit d\u0026rsquo;Entrée/Sortie (I/O) kext du clavier. Le pilote traduit le signal dans un code de touche qui est passée au process d\u0026rsquo;OS X WindowServer.\nPour résultat, le WindowServer envoie un événement à toute application appropriée (e.g. active ou écoutant) au-travers du port Mach qui est placé dans la queue d\u0026rsquo;événements. Les événements peuvent alors être lus depuis cette queue par des \u0026ldquo;fils\u0026rdquo; (appelés threads) disposant des privilèges suffisants appelant la fonction mach_ipc_dispatch.\nCela arrive généralement au-travers d\u0026rsquo;une boucle de gestion principale NSApplication le gérant, via un événement NSEvent d\u0026rsquo;un type d\u0026rsquo;événement NSEventType KeyDown.\n(Dans GNU/Linux) Le serveur Xorg écoute les codes de touches Lorsqu\u0026rsquo;un serveur graphique X server est utilisé, X utilisera le pilote d\u0026rsquo;événement générique evdev afin d\u0026rsquo;acquérir l\u0026rsquo;événement de pression de touche. La conversion des codes de touches en codes d\u0026rsquo;analyse est faite à l\u0026rsquo;aide de règles et de keymaps (\u0026ldquo;cartes de claviers\u0026rdquo;) spécifiques à X server.\nLorsque la correspondance du code d\u0026rsquo;analyse à une touche pressée est complète, le X server envoie le caractère au gestionnaire de fenêtres window manager (DWM, metacity, i3, etc), afin que le window manager à son tour envoie le caractère à la fenêtre en cours.\nL\u0026rsquo; API graphique de la fenêtre qui reçoit le caractère affiche le symbole de police approprié dans le champ approprié ayant le focus.\nAnalyse d\u0026rsquo;URL Le navigateur a maintenant l\u0026rsquo;information suivante contenue dans l\u0026rsquo; URL :\nProtocole \u0026ldquo;http\u0026rdquo; : Utilise \u0026ldquo; HTTP \u0026rdquo; Ressource \u0026ldquo;/\u0026rdquo; : Récupère la page principale (index) Est-ce une URL ou un terme recherché ? Quand aucun protocole ou nom de domaine valide n\u0026rsquo;est donné, le navigateur s\u0026rsquo;occupe de récupérer le texte donné dans la boite d\u0026rsquo;adresse au moteur de recherche web par défaut du navigateur.\nDans beaucoup de cas, un texte spécial est ajouté à l\u0026rsquo; URL pour indiquer au moteur de recherche qu\u0026rsquo;il provient de la barre d\u0026rsquo; URL d\u0026rsquo;un navigateur particulier.\nConvertir les caractères Unicode non-ASCII dans le nom d\u0026rsquo;hôte Le navigateur vérifie tous les caractères du nom d\u0026rsquo;hôte, qui ne soient pas a-z, A-Z, 0-9, -, ou ..\nPuisque le nom d\u0026rsquo;hôte est google.com, il n\u0026rsquo;y en aura pas ; mais si c\u0026rsquo;était le cas, le navigateur appliquerait l\u0026rsquo;encodage Punycode à la portion du nom d\u0026rsquo;hôte dans l\u0026rsquo; URL .\nVérifier la liste HSTS Le navigateur vérifie sa liste de \u0026ldquo;HSTS préchargés\u0026rdquo;. C\u0026rsquo;est une liste de sites web qui ont requis de n\u0026rsquo;être contactés seulement que sur HTTPS .\nSi le site web est dans la liste, le navigateur envoie sa requête via HTTPS plutôt qu\u0026rsquo;en HTTP . Autrement, la requête initiale est envoyée en HTTP . (Notez qu\u0026rsquo;un site web peut toujours utiliser une politique HSTS sans être dans la liste HSTS . La première requête HTTP au site web faite par un utilisateur recevra une réponse demandant que l\u0026rsquo;utilisateur envoie seulement des requêtes HTTPS . Toutefois, cette unique requête HTTP pourrait potentiellement laisser l\u0026rsquo;utilisateur vulnérable à une attaque dite downgrade attack ; c\u0026rsquo;est la raison pour laquelle la liste HSTS est incluse dans les navigateurs web modernes).\nRecherche DNS Le navigateur vérifie si le domaine est dans son cache. (Pour voir le cache DNS dans Chrome, écrivez dans la barre d\u0026rsquo;adresse chrome://net-internals/#dns).\nS\u0026rsquo;il n\u0026rsquo;est pas trouvé, le navigateur appelle la fonction de bibliothèque gethostbyname (qui varie selon l\u0026rsquo;OS) afin de faire la recherche.\ngethostbyname vérifie si le nom d\u0026rsquo;hôte peut être résolu par référence dans le fichier local hosts (dont la localisation varie selon l\u0026rsquo;OS) avant d\u0026rsquo;essayer de résoudre le nom d\u0026rsquo;hôte au-travers DNS .\nSi gethostbyname ne le trouve pas dans le cache, ni dans le fichier hosts alors elle fait une requête vers le serveur DNS configuré dans la pile réseau. C\u0026rsquo;est typiquement le routeur local ou le serveur DNS cache du FAI .\nSi le serveur DNS est sur le même sous-réseau, la bibliothèque réseau suit le processus ARP décrit ci-dessous pour le serveur DNS .\nSi le serveur DNS est sur un sous-réseau différent, la bibliothèque réseau suit le processus ARP décrit ci-dessous pour l\u0026rsquo;adresse IP de la passerelle par défaut.\nProcessus ARP Avant d\u0026rsquo;envoyer une diffusion ARP , la bibliothèque de la pile réseau a besoin de l\u0026rsquo;adresse IP cible à rechercher. Elle doit aussi connaître l\u0026rsquo;adresse MAC de l\u0026rsquo;interface qu\u0026rsquo;elle utilisera pour envoyer la diffusion ARP .\nLe cache ARP est vérifié en premier pour trouver une entrée ARP de notre IP cible. Si elle est dans le cache, la bibliothèque retourne le résultat : IP cible = MAC .\nSi l\u0026rsquo;entrée n\u0026rsquo;est pas dans le cache ARP :\nLa table de routage est recherchée, pour voir si l\u0026rsquo;adresse IP ciblée est dans le sous-réseau de la table de routage local. Si elle y est, la bibliothèque utilise l\u0026rsquo;interface associée au sous-réseau. Si elle n\u0026rsquo;y est pas, la bibliothèque utilise l\u0026rsquo;interface qui est dans le sous-réseau de notre passerelle par défaut.\nL\u0026rsquo;adresse MAC de l\u0026rsquo;interface réseau sélectionnée est recherchée.\nLa bibliothèque réseau envoie une requête ARP de la Couche de Liaison 2 (trame de liaison d\u0026rsquo;adressage physique du modèle OSI ) :\nRequête ARP Émetteur MAC : interface:mac:address:here Émetteur IP : interface.ip.goes.here Cible MAC : FF:FF:FF:FF:FF:FF (Broadcast) Cible IP : target.ip.goes.here Cela dépend du type de matériel qui est entre l\u0026rsquo;ordinateur et le routeur :\n⇒ Directement connecté :\nSi l\u0026rsquo;ordinateur est directement connecté au routeur, le routeur répond avec une \u0026ldquo;réponse ARP (lire ci-dessous) ⇒ Par un Hub :\nSi l\u0026rsquo;ordinateur est connecté à un hub, le hub diffusera la requête ARP vers tous les autres ports. Si le routeur est connecté sur la même \u0026ldquo;interface\u0026rdquo;, il répondra avec une \u0026ldquo;réponse ARP \u0026rdquo; (lire ci-dessous). ⇒ Par un commutateur :\nSi l\u0026rsquo;ordinateur est connecté à un commutateur, le commutateur vérifiera sa table MAC pour savoir sur quel port est diffusé l\u0026rsquo;adresse MAC recherchée. Si le commutateur n\u0026rsquo;a pas d\u0026rsquo;entrée pour l\u0026rsquo;adresse MAC , il rediffusera la requête ARP vers tous les autres ports.\nSi le commutateur a une entrée dans la table MAC , il enverra une requête ARP au port correspondant à l\u0026rsquo;adresse MAC recherchée.\nSi le routeur est sur la même \u0026ldquo;interface\u0026rdquo;, il répondra avec une \u0026ldquo;réponse ARP \u0026rdquo; (lire ci-dessous)\nRéponse ARP Émetteur MAC : target:mac:address:here Émetteur IP : target.ip.goes.here Cible MAC : interface:mac:address:here Cible IP : interface.ip.goes.here Le protocole ARP est nécessaire au fonctionnement d’ IPv4 , utilisé par dessus un réseau de type Ethernet. En IPv6 , les fonctions ARP ont été reprises dans le processus de découverte NDP Maintenant que la bibliothèque réseau a l\u0026rsquo;adresse IP , soit de notre serveur DNS , soit de la passerelle par défaut, elle peut reprendre son processus DNS :\nLe client DNS établit un socket vers le port UDP 53 du serveur DNS , utilisant un port source au-delà de 1023.\nSi la taille de la réponse est trop grande, TCP sera utilisé à la place.\nSi le serveur DNS local ou du FAI ne l\u0026rsquo;a pas, alors une recherche récursive est requise et fait remonter la liste des serveurs DNS , et qu\u0026rsquo;une réponse soit retournée.\nOuverture d\u0026rsquo;une socket Une fois que le navigateur reçoit l\u0026rsquo;adresse IP du serveur de destination, il la prend ainsi que le numéro de port donné dans l\u0026rsquo; URL (par défaut, le protocole HTTP a le port 80, et HTTPS le port 443), puis fait un appel à la fonction de la bibliothèque système nommée socket et requiert un flux de socket TCP - AF_INET/AF_INET6 et SOCK_STREAM.\nCette requête est en premier passé à la Couche de Transport où un segment TCP est créé. Le port de destination est ajouté à l\u0026rsquo;entête, et le port source est choisi parmi une plage de port dynamique du noyau (ip_local_port_range dans Linux).\nCe segment est envoyé vers la Couche Réseau, qui enveloppe une entête IP additionnelle. L\u0026rsquo;adresse IP du serveur cible aussi bien que celle de la machine courante est insérée pour former un paquet.\nLe paquet suivant arrive sur la Couche de Liaison. Une entête de trame est ajouté qui inclut l\u0026rsquo;adresse MAC de l\u0026rsquo;interface réseau de la machine ainsi que l\u0026rsquo;adresse MAC de la passerelle (le routeur local). Tout comme avant, si le noyau ne connaît pas l\u0026rsquo;adresse MAC de la passerelle, il doit diffuser une requête ARP pour la trouver.\nÀ partir de ce point, le paquet est prêt à être transmis, soit au-travers :\nEthernet WiFi Réseau de Téléphonie Mobile Pour la plupart des connexions à Internet depuis une maison, ou pour de petites entreprises, le paquet passera de votre ordinateur, possiblement au-travers du réseau local, puis vers un modem qui convertit les 0 et 1 numériques en signal analogique adapté à la transmission par téléphone, câble ou connexions de téléphonie sans fil.\nÀ l\u0026rsquo;autre extrémité de la connexion se trouve un autre modem qui reconvertit le signal analogique en données numériques qui seront traitées par le prochain nœud de réseau où les adresses de départ et d\u0026rsquo;arrivée seront analysées plus en détail.\nLa plupart des grandes entreprises et certaines connexions résidentielles plus récentes disposeront de connexions en fibre optique ou de connexions Ethernet directes, auxquels cas les données restent numériques et sont transmises directement au prochain nœud de réseau pour y être traitées.\nÉventuellement, le paquet atteindra le routeur gérant le sous-réseau local. Depuis là, il continuera à voyager vers l\u0026rsquo; AS au-delà du routeur, vers d\u0026rsquo;autres AS , et finalement atteindra le serveur de destination.\nChaque routeur, le long du chemin, extrait l\u0026rsquo;adresse de destination de l\u0026rsquo;entête d\u0026rsquo; IP et la dirige vers le prochain saut approprié.\nLe champ TTL dans l\u0026rsquo;entête de l\u0026rsquo; IP est décrémenté de un à chaque routeur traversé. Le paquet sera supprimé si le champ TTL atteint zéro ou si le routeur en cours n\u0026rsquo;a plus d\u0026rsquo;espace dans sa queue (cela peut être dû à une congestion du réseau).\nCet envoi et cette réception arrive de nombreuses fois suivant le flux de connexion TCP :\nLe client choisit un ISN et envoie le paquet au serveur avec le bit SYN paramétré pour indiquer qu\u0026rsquo;il active l\u0026rsquo; ISN .\nLe serveur reçoit le bit SYN et s\u0026rsquo;il est \u0026ldquo;d\u0026rsquo;humeur agréable\u0026rdquo; :\nle serveur choisit son propre numéro de séquence initial le serveur paramètre le bit SYN afin d\u0026rsquo;indiquer qu\u0026rsquo;il a choisit son ISN le serveur copie l\u0026rsquo; ISN du client +1 dans son champ ACK et ajoute le drapeau ACK afin d\u0026rsquo;indiquer qu\u0026rsquo;il accuse réception du premier paquet. Le client reconnaît la connexion en envoyant un paquet :\naugmentant son propre numéro de séquence augmentant le numéro d\u0026rsquo;accusé de réception paramètre le champ ACK La donnée est transmise ainsi :\nLorsqu\u0026rsquo;une partie envoie N octets de données, elle augmente sa séquence SEQ par un numéro Quand l\u0026rsquo;autre partie accuse réception du paquet (ou d\u0026rsquo;une chaîne de paquets), elle envoie un paquet ACK avec une valeur ACK égale à la dernière séquence reçue depuis l\u0026rsquo;autre partie. Pour fermer la connexion :\nla partie qui termine la connexion envoie un paquet FIN. l\u0026rsquo;autre partie accuse réception ACK du paquet FIN et envoie son propre paquet FIN. la première partie accuse réception ACK du paquet FIN de l\u0026rsquo;autre partie. La Poignée de Main TLS L\u0026rsquo;ordinateur client envoie un message ClientHello au serveur avec sa version de TLS , une liste d\u0026rsquo;algorithmes de chiffrement et de méthodes de compression disponibles.\nLe serveur répond avec un message ServerHello au client avec la version TLS , le chiffrement choisi, les méthodes de compression sélectionnées et le certificat public signé par une AC du serveur. Le certificat contient une clé publique qui sera utilisée par le client pour chiffrer le reste de la poignée de main jusqu\u0026rsquo;à ce qu\u0026rsquo;une clé symétrique puisse être convenue.\nLe client vérifie que le certificat numérique du serveur soit dans sa liste d\u0026rsquo; AC de confiance. Si la confiance peut être établie, basée sur l\u0026rsquo; AC , le client génère une chaîne d\u0026rsquo;octets pseudo-aléatoires et la chiffre avec la clé publique du serveur. Ces octets aléatoires peuvent être utilisés pour déterminer la clé symétrique.\nLe serveur déchiffre les octets aléatoires en utilisant sa clé privée puis utilise ces octets pour générer sa propre copie de la clé symétrique maître.\nLe client envoie un message Finished au serveur, chiffrant un hash de la transmission jusqu\u0026rsquo;à ce point avec la clé symétrique.\nLe serveur génère son propre hash, puis déchiffre le hash envoyé par le client pour vérifier la correspondance. Si elle existe, il envoie son propre message Finished au client, le chiffrant aussi avec sa clé symétrique.\nÀ partir de maintenant la session TLS transmet les données de l\u0026rsquo;application ( HTTP ) chiffrées avec la clé symétrique agréée.\nProtocole HTTP Si le navigateur web utilisé été écrit par Google, au lieu d\u0026rsquo;envoyer une requête HTTP pour récupérer la page, il enverra une requête pour négocier avec le serveur une \u0026ldquo;mise à jour\u0026rdquo; du protocole HTTP vers le protocole SPDY .\nSi le client utilise le protocole HTTP mais ne prend pas en charge SPDY , il envoie une requête au serveur de la forme :\nGET / HTTP/1.1 Host: google.com Connection: close [autres entêtes] où [autres entêtes] référent à une série de paire de clé et valeur séparée par le symbole deux points \u0026lsquo;:\u0026rsquo;, formatées selon la spécification HTTP et séparées par d\u0026rsquo;uniques nouvelles lignes. (Cela suppose que le navigateur web utilisé n\u0026rsquo;ait pas de bogues violant la spécification HTTP . Cela suppose aussi que le navigateur web utilise HTTP/1.1, autrement il ne pourrait pas inclure l\u0026rsquo;entête Host dans la requête ; la version spécifiée dans la requête GET serait soit HTTP/1.0 ou HTTP/0.9.)\nHTTP /1.1 définit l\u0026rsquo;option de \u0026ldquo;fermeture\u0026rdquo; de la connexion pour que l\u0026rsquo;expéditeur signale que la connexion sera fermée après l\u0026rsquo;achèvement de la réponse. Par exemple :\nConnection: close\nLes applications HTTP /1.1 qui ne prennent pas en charge les connexions persistantes DOIVENT inclure l\u0026rsquo;option de \u0026ldquo;fermeture\u0026rdquo; de connexion dans chaque message.\nAprès l\u0026rsquo;envoi de la requête et des entêtes, le navigateur web envoie une unique nouvelle ligne vierge pour indiquer au serveur que le contenu de la requête est fait.\nLe serveur répond avec un code de réponse dénotant le statut de la requête et avec une réponse de la forme :\n200 OK [entêtes de réponse] Suivies d\u0026rsquo;une unique nouvelle ligne, il envoie alors la charge du contenu HTML de www.google.com. Le serveur peut alors soit fermer la connexion, soit si les entêtes envoyées par le client le demande, garder la connexion ouverte afin d\u0026rsquo;être réutilisées pour de prochaines requêtes.\nSi les entêtes HTTP envoyées par le navigateur web comportent des informations suffisantes pour que le serveur web détermine si la version du fichier en cache dans le navigateur web n\u0026rsquo;a pas été modifié depuis la dernière récupération (tel que si le navigateur web inclut une entête ETag), il peut alors répondre par une requête de la forme :\n304 Not Modified [entêtes de réponse] il n\u0026rsquo;y aura pas charge utile, et le navigateur web récupérera le HTML depuis son cache.\nAprès l\u0026rsquo;analyse du HTML , le navigateur web (ainsi que le serveur) répétera ce processus pour chaque ressource (image, CSS, favicon.ico, etc) référencée dans la page HTML , excepté que la requête sera GET /$(URL relative à www.google.com) HTTP/1.1 au lieu de GET / HTTP/1.1.\nSi le HTML référence une ressource sur un domaine différent que www.google.com, le navigateur web reprendra les étapes invoquées pour résoudre l\u0026rsquo;autre domaine, et suivra toutes les mêmes étapes jusqu\u0026rsquo;à ce point pour ce domaine. L\u0026rsquo;entête Host dans la requête sera paramétrée vers le nom du serveur approprié plutôt que google.com.\nGestionnaire de Requêtes HTTP du Serveur Le serveur HTTPD (Service HTTP) est un gestionnaire de requêtes et de réponses côté serveur. Les serveurs HTTPD des plus communs sont Apache ou nginx pour Linux et IIS pour Windows.\nLe serveur HTTPD (Service HTTP) reçoit la requête.\nLe serveur décompose la requête selon les paramètres suivants :\nla méthode de requête HTTP (soit GET, HEAD, POST, PUT, PATCH, DELETE, CONNECT, OPTIONS, ou TRACE). Dans le cas où l\u0026rsquo;URL est entrée directement dans la barre d\u0026rsquo;adresse, elle sera GET. le domaine ; dans ce cas : google.com le chemin ou la page demandé ; dans ce cas : / (puisqu\u0026rsquo;il n\u0026rsquo;y a pas de chemin ou de page spécifique demandé, / est le chemin par défaut). Le serveur vérifie qu\u0026rsquo;un Hôte Virtuel soit configuré sur le serveur correspondant à google.com.\nLe serveur vérifie que google.com peut accepter les requêtes GET.\nLe serveur vérifie que le client est autorisé à utiliser cette méthode (par l\u0026rsquo;adresse IP , authentification, etc).\nSi le serveur a un module de ré-écriture installé (tel que mod_rewrite pour Apache ou URL Rewrite pour IIS), il essaiera la correspondance de la requête avec une des règles configurées. Si une règle correspondante est trouvée, le serveur utilise la règle pour ré-écrire la requête.\nLe serveur envoie le contenu qui correspond à la requête, dans notre cas, il reviendra au fichier index, puisque \u0026ldquo;/\u0026rdquo; est le fichier principal (dans certains cas, cela peut être surchargé, mais c\u0026rsquo;est la méthode commune).\nLe serveur analyse le fichier en accord avec le gestionnaire. Si Google exécute PHP, le serveur utilise PHP pour interpréter le fichier index, et envoie le flux vers le client.\nLa scène derrière le Navigateur Une fois que le serveur délivre les ressources ( HTML , CSS , JS , images, etc) au navigateur, il est soumis au processus suivant :\nAnalyse HTML , CSS , JS Rendu : construit l\u0026rsquo;arborescence DOM → l\u0026rsquo;arborescence de rendu → le plan de l\u0026rsquo;arborescence de rendu → l\u0026rsquo;affichage de l\u0026rsquo;arborescence de rendu Le Navigateur La fonction du navigateur est de présenter la ressource web que vous avez choisi, en la demandant à un serveur et en l\u0026rsquo;affichant dans la fenêtre du navigateur. La ressource est habituellement un document HTML , mais peut être aussi un PDF, une image, ou tout autre type de contenu. L\u0026rsquo;endroit de la ressource est spécifié par l\u0026rsquo;utilisateur selon une .\nLa manière dont le navigateur interprète et affiche les fichiers HTML est spécifiée dans les spécifications HTML et CSS . Ces spécifications sont maintenues par le W3C , qui est l\u0026rsquo;organisation des standards du web.\nLes interfaces utilisateur de navigation ont beaucoup en commun entre elles. Parmi les éléments communs de l\u0026rsquo;interface utilisateur, on peut citer :\nune barre d\u0026rsquo;adresse pour l\u0026rsquo;insertion d\u0026rsquo;une des boutons de retour et d\u0026rsquo;avance des options de marque-pages (favoris) des boutons pour rafraîchir et stopper le chargement de documents en cours un bouton d’accueil pour vous permettre d\u0026rsquo;aller à votre page d\u0026rsquo;accueil. Structure de Haut Niveau du Navigateur\nLes composants des navigateurs sont :\nUne Interface Utilisateur : l\u0026rsquo;interface utilisateur (UI) inclue la barre d\u0026rsquo;adresse, les boutons retour/avance, le menu des marque-pages, etc. Chaque partie du navigateur s\u0026rsquo;affiche, exceptée la fenêtre où vous voyez la page demandée.\nLe Moteur du Navigateur : le moteur du navigateur répartit les actions entre l\u0026rsquo;UI et le moteur de rendu.\nLe Moteur de Rendu : le moteur de rendu est responsable d\u0026rsquo;afficher le contenu demandé. Par exemple, si le contenu demandé est du HTML , le moteur de rendu analyse le HTML et le CSS , et affiche le contenu analysé à l\u0026rsquo;écran.\nRéseau : le réseau gère les appels réseau tels que les requêtes HTTP utilisant différentes implémentations pour les différentes plateformes derrière une interface de plateforme indépendante.\nBackend UI : le backend de l\u0026rsquo;UI est utilisé pour dessiner les widgets basiques tels que les comboboxes et les fenêtres. Ce backend expose une interface générique qui n\u0026rsquo;est pas spécifique à une plateforme. En profondeur, il utilise les méthodes de l\u0026rsquo;interface utilisateur du système d\u0026rsquo;exploitation.\nLe Moteur JavaScript : le moteur JavaScript est utilisé pour analyser et exécuter le code JavaScript.\nLe Stockage des Données : le stockage des données est une couche persistante. Le navigateur peut sauvegarder toute sorte de données localement, tels que des cookies. Les navigateurs prennent en charge aussi des mécanismes de stockage tels que localStorage, IndexedDB, WebSQL et FileSystem.\nAnalyse du HTML Le moteur de rendu démarre l\u0026rsquo;obtention des contenus du document demandé depuis la couche réseau. Cela se fait habituellement par morceaux de 8 Ko.\nLe premier travail de l\u0026rsquo;analyseur HTML est d\u0026rsquo;analyser le langage HTML dans une arborescence.\nLa sortie de l\u0026rsquo;arborescence (\u0026ldquo;l\u0026rsquo;arborescence analysée\u0026rdquo;) est une arborescence des éléments du DOM et des nœuds d\u0026rsquo;attributs. DOM est l\u0026rsquo;abréviation de Document Object Model. C\u0026rsquo;est la présentation objet du document HTML et l\u0026rsquo;interface des éléments HTML au monde extérieur tel JavaScript. La racine de l\u0026rsquo;arborescence est l\u0026rsquo;objet \u0026ldquo;Document\u0026rdquo;.\nAvant toute manipulation par script, le DOM a une relation quasi-univoque avec le balisage.\nAlgorithme d\u0026rsquo;Analyse\nLe HTML ne peut être analysé par des analyseurs habituels.\nLes raisons sont :\nla nature indulgente du langage. le fait que les navigateurs ont une tolérance traditionnelle à l\u0026rsquo;erreur pour prendre en charge les cas connus de HTML invalides. le processus d\u0026rsquo;analyse est ré-entrant. Pour les autres langages, la source ne change pas durant l\u0026rsquo;analyse, mais en HTML , le code dynamique (tels que des éléments de scripts contenant des appels à document.write()) peut ajouter des jetons supplémentaires ; le processus d\u0026rsquo;analyse en cours modifie alors l\u0026rsquo;entrée. Si le navigateur est incapable d\u0026rsquo;utiliser les techniques d\u0026rsquo;analyses régulières, il utilisera un analyseur personnalisé pour l\u0026rsquo;analyse HTML . L\u0026rsquo;algorithme d\u0026rsquo;analyse est décrit en détail par la spécification HTML 5.\nL\u0026rsquo;algorithme consiste en deux phases : mise en jeton et construction de l\u0026rsquo;arborescence.\nLes Actions lorsque l\u0026rsquo;Analyse est terminée\nLe navigateur commence par récupérer les ressources externes liées à la page ( CSS , images, fichiers JavaScript, etc).\nLors de cette étape, le navigateur marque le document comme interactif et démarre les scripts d\u0026rsquo;analyse qui sont dans le mode \u0026ldquo;différé\u0026rdquo; : tout ce qui doit être exécuté après le document est analysé. L\u0026rsquo;état du document est paramétré sur \u0026ldquo;complet\u0026rdquo; et un événement \u0026ldquo;charge\u0026rdquo; est levé.\nNotez qu\u0026rsquo;il n\u0026rsquo;y a jamais d\u0026rsquo;erreur \u0026ldquo;Invalid Syntax\u0026rdquo; sur une page HTML . Les navigateurs corrigent tout contenu invalide et l\u0026rsquo;envoie.\nInterprétation du CSS Analyse des fichiers CSS , du contenu des balises \u0026lt;style\u0026gt;, et des valeurs des attributs style en utilisant la \u0026ldquo;syntaxe de grammaire et champ lexical CSS \u0026rdquo;.\nChaque fichier CSS est analysé dans un StyleSheet object, où chaque objet contient les règles CSS avec les sélecteur et les objets correspondant à la grammaire CSS .\nUn analyseur CSS peut être descendant ou ascendant lorsqu\u0026rsquo;un générateur d\u0026rsquo;analyse spécifique est utilisé.\nRendu de Page Crée une \u0026ldquo;Arborescence d\u0026rsquo;Image\u0026rdquo; ou une \u0026lsquo;Arborescence de Rendu\u0026rdquo; en traversant les nœuds du DOM , et en calculant les valeurs du style CSS pour chaque nœud.\nCalcul la largeur préférée de chaque nœud de l\u0026rsquo;arbre du cadre de bas en haut en additionnant la largeur préférée des nœuds enfants et les marges horizontales, les bordures et le padding du nœud.\nCalcul la largeur actuelle de chaque nœud de haut en bas en allouant à chaque nœud disponible la largeur de ses enfants.\nCalcul la hauteur de chaque nœud de bas en haut en appliquant un habillage de texte et en additionnant les hauteurs des nœuds enfants, les marges, les bordures et le padding du nœud.\nCalcul les coordonnées de chaque nœud en utilisant l\u0026rsquo;information calculée ci-dessus.\nDes étapes plus compliquées sont menées lorsque les éléments sont positionnés en floated, absolutely ou relatively, ou lorsque d\u0026rsquo;autres fonctionnalités plus complexes sont utilisées. Pour avoir plus de détails, voir http://dev.w3.org/csswg/css2/ et http://www.w3.org/Style/CSS/current-work\nCrée des calques pour décrire quelles parties de la page peuvent être animées en tant que groupe sans être re-traitées. Chaque objet d\u0026rsquo;image ou de rendu peut être assigné à un calque.\nDes textures sont allouées à chaque calque de la page.\nLes objets d\u0026rsquo;image ou de rendu pour chaque calque sont parcourus et des commandes de dessein sont exécutées pour leur calque respectif. Ils doivent être traités par le CPU ou dessinés par le GPU en utilisant directement D2D/SkiaGL.\nToutes les étapes ci-dessus peuvent réutilisées les valeurs calculées depuis la dernière fois où la page web a été rendue, ainsi les changements incrémentaux demandent moins de travail.\nLes calques de page sont envoyés au processus de composition où ils sont combinés avec les calques d\u0026rsquo;autres contenus visibles, tel que le chrome du navigateur, les iframes, et les panneaux d\u0026rsquo;extension.\nLes positions de calque final sont calculés et les commandes de composition sont émises via Direct3D/OpenGL. Les tampons de commande du GPU sont vidés vers le GPU pour le rendu asynchrone et l\u0026rsquo;image est envoyée au serveur de fenêtrage.\nRendu du GPU Durant le processus de rendu, les calques de calcul graphique peuvent utilisés aussi bien le CPU que le processeur graphique GPU.\nLors de l\u0026rsquo;utilisation du GPU pour le calcul du rendu graphique, les calques du logiciel graphique découpe la tâche en de multiples pièces, ainsi il peut utiliser avantageusement le parallélisme massif du GPU pour le calcul de virgule flottante requis pour le processus de rendu.\nExécution Post-Rendu et induite par l\u0026rsquo;utilisateur Après que le rendu soit complet, le navigateur exécute le code JavaScript grâce à un mécanisme de temporisation (tel qu\u0026rsquo;une animation Google Doodle) ou à une interaction de l\u0026rsquo;utilisateur (écrivant une requête dans une boîte de recherche et recevant des suggestions).\nDes plugins tels que Flash ou Java peuvent aussi être exécutés, mais actuellement pas depuis la page d\u0026rsquo;accueil de Google. Des scripts peuvent causer des requêtes réseaux additionnelles, modifier la page ou sa mise en page, entraînant un nouveau cycle de rendu et de dessin de la page.\nÉpilogue Les sources \u0026ldquo;officielles\u0026rdquo; de la traduction de cet article sont disponibles sur mon espace de dépôt GitHub. Si vous voyez des erreurs de traduction, de sens, si en tant qu\u0026rsquo;experts/utilisateurs confirmés, vous souhaitez apporter des précisions/corrections, n\u0026rsquo;hésitez pas à lever une issue, voire mieux à fournir une PR ;-)\n",
            "content_html": "\u003ch2 id=\"prologue\"\u003ePrologue\u003c/h2\u003e\n\u003cp\u003eCet article est la traduction de l\u0026rsquo;article anglais \u003cstrong\u003e\u0026quot;\u003ca href=\"https://github.com/alex/what-happens-when\" rel=\"external\"\u003eWhat happens when…\u003c/a\u003e\u0026quot;\u003c/strong\u003e\nd\u0026rsquo;Alex Gaynor. De même que l\u0026rsquo;article original est sous \u003ca href=\"https://creativecommons.org/publicdomain/zero/1.0/deed.fr\" rel=\"external\"\u003elicence CC0\u003c/a\u003e, ainsi\nest la traduction de cet article.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"que-se-passe-t-il-quand\"\u003eQue se passe-t-il quand…\u003c/h2\u003e\n\u003cp\u003eCe dépôt est une tentative pour répondre à cette vieille question d\u0026rsquo;interview\n\u0026ldquo;Que se passe-t-il quand vous écrivez google.com dans la barre d\u0026rsquo;adresse\nde votre navigateur web et que vous appuyez sur la touche Entrée ?\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eHormis l\u0026rsquo;habituel histoire, nous allons essayer de répondre à cette question\navec autant de détails que possible. Rien ne sera négligé.\u003c/p\u003e\n\u003cp\u003eCeci est un processus collaboratif, alors svp creusez et essayez d\u0026rsquo;aider !\nIl y a des tonnes de détails manquants qui n\u0026rsquo;attendent que vous pour les\najouter ! SVP, envoyez-nous vos requêtes !\u003c/p\u003e\n\u003cp\u003eTout ceci est sous les termes de la licence \u003ca href=\"https://creativecommons.org/publicdomain/zero/1.0/deed.fr\" rel=\"external\"\u003eCreative Commons Zero\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eVous pouvez lire ceci en \u003ca href=\"https://github.com/skyline75489/what-happens-when-zh_CN\" rel=\"external\"\u003e简体中文\u003c/a\u003e (Chinois simplifié), \u003ca href=\"https://github.com/tettttsuo/what-happens-when-JA\" rel=\"external\"\u003e日本語\u003c/a\u003e (Japonais)\net \u003ca href=\"https://github.com/SantonyChoi/what-happens-when-KR\" rel=\"external\"\u003e한국어\u003c/a\u003e (Coréen).  NOTE : ces traductions n\u0026rsquo;ont pas été examinées par les\nresponsables de alex/what-happens-when.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"la-touche-g-est-appuyée\"\u003eLa touche \u0026ldquo;g\u0026rdquo; est appuyée\u003c/h3\u003e\n\u003cp\u003eLa section suivante explique les actions physiques du clavier et les\ninterruptions du système d\u0026rsquo;exploitation. Lorsque vous appuyez sur la touche\n\u003ckbd\u003eg\u003c/kbd\u003e, le navigateur reçoit l\u0026rsquo;événement et les fonctions d\u0026rsquo;autocomplétion\ns\u0026rsquo;enclenchent.\u003c/p\u003e\n\u003cp\u003eSelon l\u0026rsquo;algorithme de votre navigateur et si vous êtes en mode privé, ou\nnon, diverses suggestions vous seront présentées dans un menu déroulant\nsous la barre d\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n. La plupart des algorithmes trient et\npriorisent les résultats selon la recherche historique, les marques-pages, les\ncookies, et les recherches populaires sur Internet.\u003c/p\u003e\n\u003cp\u003eLorsque vous écrivez \u003ckbd\u003egoogle.com\u003c/kbd\u003e, de nombreux blocs de code s\u0026rsquo;exécutent\net les suggestions seront affinées à chaque appui sur une touche. Il peut\nmême vous suggérer \u0026ldquo;google.com\u0026rdquo; avant que vous ayez fini de l\u0026rsquo;écrire.\u003c/p\u003e\n\u003ch3 id=\"lappui-sur-la-touche-entrée\"\u003eL\u0026rsquo;appui sur la touche \u0026ldquo;Entrée\u0026rdquo;\u003c/h3\u003e\n\u003cp\u003ePour commencer, choisissons l\u0026rsquo;appui sur le bas de la touche \u003ckbd\u003eEntrée\u003c/kbd\u003e.\u003c/p\u003e\n\u003cp\u003eÀ ce moment, un circuit électrique spécifique à la touche est verrouillée\n(soit directement, soit de manière capacitive). Ceci permet à une petite\nquantité de courant de circuler dans le circuit logique du clavier, qui\nanalyse l\u0026rsquo;état de l\u0026rsquo;interrupteur de chaque touche, élimine le bruit électrique\nde la fermeture intermittente rapide de l\u0026rsquo;interrupteur et le convertit en\nun entier de code de touche, en l’occurrence 13.\u003c/p\u003e\n\u003cp\u003eLe contrôleur du clavier encode alors le code de touche pour le transport\nvers l\u0026rsquo;ordinateur. Actuellement, c\u0026rsquo;est presque universellement au-travers\nd\u0026rsquo;une connexion \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n ou par Bluetooth, mais historiquement c\u0026rsquo;était\ndes connexions de type \u003ca href=\"https://fr.wikipedia.org/wiki/Port_PS/2\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Personal System\"\u003ePS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/2\u003c/a\u003e\nou \u003ca href=\"https://fr.wikipedia.org/wiki/Apple_Desktop_Bus\" rel=\"external\"\u003e\n\n\n\u003cabbr lang=\"en\" title=\"Apple Desktop Bus\"\u003eADB\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eDans le cas d\u0026rsquo;un clavier \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n :\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe circuit USB du clavier est alimenté par l\u0026rsquo;alimentation 5\u003cabbr title=\"volt\"\u003eV\u003c/abbr\u003e\n\nfournit sur la broche 1 du contrôleur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n de l\u0026rsquo;ordinateur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe code de touche généré est enregistré par la mémoire du circuit interne\ndu clavier dans un registre appelé \u0026ldquo;endpoint\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe contrôleur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n analyse ce registre \u0026ldquo;endpoint\u0026rdquo; environ toutes\nles 10 millisecondes \u003cem\u003e(valeur minimum déclarée par le clavier)\u003c/em\u003e, ainsi il\nenregistre la valeur du code de touche.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCette valeur parvient au moteur d\u0026rsquo;interface série \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \u003cabbr lang=\"en\" title=\"Serial Interface Engine\"\u003eSIE\u003c/abbr\u003e\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\nafin d\u0026rsquo;être converti dans un ou plusieurs paquets \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n selon le\nprotocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n de bas niveau.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCes paquets sont envoyés par un signal électrique différentiel sur les\nconnecteurs D+ et D- (entre 2) à la vitesse maximale de 1.5\n\u003cabbr title=\"Méga-octet par seconde\"\u003eMo/s\u003c/abbr\u003e\n, puisqu\u0026rsquo;un dispositif\n\u003ca href=\"https://fr.wikipedia.org/wiki/Interactions_homme-machine\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Interface Homme-Machine\"\u003eIHM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e est toujours déclaré en tant que \u0026ldquo;dispositif à faible\nvitesse\u0026rdquo; \u003cem\u003e(en conformité avec la norme \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n 2.0)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCe signal en série est alors décodé par le contrôleur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Universal Serial Bus\"\u003eUSB\u003c/abbr\u003e\n\n\n\n\n\n\n de\nl\u0026rsquo;ordinateur, puis interprété par le pilote du dispositif universel de clavier\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"fr\" title=\"Interface Homme-Machine\"\u003eIHM\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n de l\u0026rsquo;ordinateur. La valeur de la touche est passée au-travers\nde la couche d\u0026rsquo;abstraction matérielle du système d\u0026rsquo;exploitation.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eDans le cas d\u0026rsquo;un clavier virtuel (de même pour les écrans tactiles) :\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eQuand l\u0026rsquo;utilisateur pose son doigt sur un écran tactile capacitif moderne,\nune quantité infime de courant est transmise au doigt. Cela complète\nle circuit par le champ électrostatique de la couche conductrice et\ncrée une chute de tension à cet endroit de l\u0026rsquo;écran. Le \u003cstrong\u003econtrôleur de l\u0026rsquo;écran\u003c/strong\u003e\nlève une interruption rapportant les coordonnées de la touche pressée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAlors le système d\u0026rsquo;exploitation mobile notifie à l\u0026rsquo;application en cours\nde l’événement de pression d\u0026rsquo;un des éléments de son interface \u003cem\u003e(qui sont\nles boutons de l\u0026rsquo;interface virtuelle de l\u0026rsquo;application de clavier)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe clavier virtuel peut maintenant lever une interruption logicielle\nafin d\u0026rsquo;envoyer un message de \u0026rsquo;touche pressée\u0026rsquo; au système d\u0026rsquo;exploitation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCette interruption notifie l\u0026rsquo;application en cours d\u0026rsquo;un événement de \u0026rsquo;touche\npressée'.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"déclenchement-dinterruption-hors-claviers-usb\"\u003eDéclenchement d\u0026rsquo;interruption [Hors claviers USB]\u003c/h3\u003e\n\u003cp\u003eLe clavier envoie des signaux sur sa ligne de requêtes d\u0026rsquo;interruption\n\u003cem\u003e(\u003ca href=\"https://fr.wikipedia.org/wiki/Interruption_mat%C3%A9rielle\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Interrupt ReQuest\"\u003eIRQ\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e)\u003c/em\u003e, qui correspond à un entier \u003ccode\u003einterrupt vector\u003c/code\u003e\ndu contrôleur d\u0026rsquo;interruption.\u003c/p\u003e\n\u003cp\u003eLe processeur (\u003ca href=\"https://fr.wikipedia.org/wiki/Processeur\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Unité Centrale de Traitement\"\u003eUCT\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e) utilise la table de descripteurs\nd\u0026rsquo;interruptions (\u003ca href=\"https://fr.wikipedia.org/wiki/Interrupt_Descriptor_Table\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Interrupt Descriptor Table\"\u003eIDT\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e) qui correspond aux vecteurs\nd\u0026rsquo;interruptions vers les fonctions \u003cem\u003e(\u003ccode\u003einterrupt handlers\u003c/code\u003e)\u003c/em\u003e qui sont fournis\npar le noyau. Lorsqu\u0026rsquo;une interruption arrive, l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Unité Centrale de Traitement\"\u003eUCT\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n indexe\nl\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Interrupt Descriptor Table\"\u003eIDT\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n avec le vecteur d\u0026rsquo;interruptions et exécute le gestionnaire\napproprié.\u003c/p\u003e\n\u003cp\u003eAinsi, le noyau est introduit.\u003c/p\u003e\n\u003ch3 id=\"dans-windows-un-message-wm_keydown-est-envoyé-à-lapplication\"\u003e(Dans Windows) Un message \u003ccode\u003eWM_KEYDOWN\u003c/code\u003e est envoyé à l\u0026rsquo;application\u003c/h3\u003e\n\u003cp\u003eLe transport \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Interface Homme-Machine\"\u003eIHM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n envoie l\u0026rsquo;événement de touche pressée au pilote\n\u003ccode\u003eKBDHID.sys\u003c/code\u003e qui convertit l\u0026rsquo;utilisation de l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Interface Homme-Machine\"\u003eIHM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n vers un code\nd\u0026rsquo;analyse. Dans ce cas, le code d\u0026rsquo;analyse est \u003ccode\u003eVK_RETURN\u003c/code\u003e \u003cem\u003e(\u003ccode\u003e0x0D\u003c/code\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLe pilote \u003ccode\u003eKBDHID.sys\u003c/code\u003e s\u0026rsquo;interface avec \u003ccode\u003eKBDCLASS.sys\u003c/code\u003e \u003cem\u003e(un pilote de classe\nclavier)\u003c/em\u003e. Ce pilote est responsable de toutes les entrées de clavier et clavier\nnumérique de manière sécurisée. Il les appelle ensuite dans \u003ccode\u003eWin32K.sys\u003c/code\u003e\n\u003cem\u003e(après avoir passer le message dans les filtres de clavier tiers installés)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est tout ce qui se passe dans le noyau.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eWin32K.sys\u003c/code\u003e détermine quelle fenêtre est active au-travers de\nl\u0026rsquo;\u003ca href=\"https://fr.wikipedia.org/wiki/Interface_de_programmation\" rel=\"external\"\u003e\n\n\n\n\u003cabbr lang=\"fr\" title=\"Interface de Programmation Applicative\"\u003eAPI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e \u003ccode\u003eGetForegroundWindow()\u003c/code\u003e. Cette \n\n\n\n\u003cabbr lang=\"fr\" title=\"Interface de Programmation Applicative\"\u003eAPI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nfournit la capture de la fenêtre à la boite d\u0026rsquo;adresse du navigateur.\u003c/p\u003e\n\u003cp\u003eLa fenêtre principale \u0026ldquo;message pump\u0026rdquo; appelle alors\n\u003ccode\u003eSendMessage(hWnd, WM_KEYDOWN, VK_RETURN, lParam)\u003c/code\u003e. \u003ccode\u003elParam\u003c/code\u003e est un masque\nbinaire qui indique des informations complémentaires à la pression de touche :\ncompteur de répétition \u003cem\u003e(\u003ccode\u003e0\u003c/code\u003e dans ce cas)\u003c/em\u003e, le code d\u0026rsquo;analyse actuel \u003cem\u003e(peut être\ndépendant du fabriquant, mais ne l\u0026rsquo;est pas généralement pour \u003ccode\u003eVK_RETURN\u003c/code\u003e)\u003c/em\u003e,\nquelque soit la touche étendue \u003cem\u003e(e.g. alt, shift, ctrl)\u003c/em\u003e qui soit aussi\nappuyée \u003cem\u003e(elles ne l\u0026rsquo;étaient pas)\u003c/em\u003e, ou dans un autre état.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;API Windows \u003ccode\u003eSendMessage\u003c/code\u003e est une fonction simple qui ajoute le message\nà une queue d\u0026rsquo;un gestionnaire de fenêtres particulier \u003cem\u003e(\u003ccode\u003ehWnd\u003c/code\u003e)\u003c/em\u003e. Plus tard,\nla fonction principale de traitement des messages \u003cem\u003e(appelée \u003ccode\u003eWindowProc\u003c/code\u003e)\u003c/em\u003e\nassignée à \u003ccode\u003ehWnd\u003c/code\u003e est appelée afin de traiter chaque message dans la queue.\u003c/p\u003e\n\u003cp\u003eLa fenêtre \u003cem\u003e(\u003ccode\u003ehWnd\u003c/code\u003e)\u003c/em\u003e qui est active est en fait un contrôleur d\u0026rsquo;édition,\net le \u003ccode\u003eWindowProc\u003c/code\u003e dans ce cas est un gestionnaire de messages pour \u003ccode\u003eWM_KEYDOWN\u003c/code\u003e.\nCe code cherche un paramètre tiers qui est passé à \u003ccode\u003eSendMessage\u003c/code\u003e \u003cem\u003e(\u003ccode\u003ewParam\u003c/code\u003e)\u003c/em\u003e,\nparce que \u003ccode\u003eVK_RETURN\u003c/code\u003e sait qu\u0026rsquo;un utilisateur a appuyé sur la touche\n\u003ckbd\u003eEntrée\u003c/kbd\u003e.\u003c/p\u003e\n\u003ch3 id=\"dans-os-x-un-nsevent-keydown--est-envoyé-à-lapplication\"\u003e(Dans OS X) Un NSEvent \u003ccode\u003eKeyDown\u003c/code\u003e  est envoyé à l\u0026rsquo;application\u003c/h3\u003e\n\u003cp\u003eLe signal d\u0026rsquo;interruption déclenche un événement d\u0026rsquo;interruption dans le pilote\ndu Kit d\u0026rsquo;Entrée/Sortie (I/O) kext du clavier. Le pilote traduit le signal\ndans un code de touche qui est passée au process d\u0026rsquo;OS X \u003ccode\u003eWindowServer\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour résultat, le \u003ccode\u003eWindowServer\u003c/code\u003e envoie un événement à toute application\nappropriée \u003cem\u003e(e.g. active ou écoutant)\u003c/em\u003e au-travers du port Mach qui est placé\ndans la queue d\u0026rsquo;événements. Les événements peuvent alors être lus depuis\ncette queue par des \u0026ldquo;fils\u0026rdquo; \u003cem\u003e(appelés threads)\u003c/em\u003e disposant des privilèges\nsuffisants appelant la fonction \u003ccode\u003emach_ipc_dispatch\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCela arrive généralement au-travers d\u0026rsquo;une boucle de gestion principale\n\u003ccode\u003eNSApplication\u003c/code\u003e le gérant, via un événement \u003ccode\u003eNSEvent\u003c/code\u003e d\u0026rsquo;un type d\u0026rsquo;événement\n\u003ccode\u003eNSEventType\u003c/code\u003e \u003ccode\u003eKeyDown\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"dans-gnulinux-le-serveur-xorg-écoute-les-codes-de-touches\"\u003e(Dans GNU/Linux) Le serveur Xorg écoute les codes de touches\u003c/h3\u003e\n\u003cp\u003eLorsqu\u0026rsquo;un serveur graphique \u003ccode\u003eX server\u003c/code\u003e est utilisé, \u003ccode\u003eX\u003c/code\u003e utilisera\nle pilote d\u0026rsquo;événement générique \u003ccode\u003eevdev\u003c/code\u003e afin d\u0026rsquo;acquérir l\u0026rsquo;événement de\npression de touche. La conversion des codes de touches en codes d\u0026rsquo;analyse\nest faite à l\u0026rsquo;aide de règles et de keymaps \u003cem\u003e(\u0026ldquo;cartes de claviers\u0026rdquo;)\u003c/em\u003e spécifiques\nà \u003ccode\u003eX server\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLorsque la correspondance du code d\u0026rsquo;analyse à une touche pressée est complète,\nle \u003ccode\u003eX server\u003c/code\u003e envoie le caractère au gestionnaire de fenêtres \u003ccode\u003ewindow manager\u003c/code\u003e\n\u003cem\u003e(DWM, metacity, i3, etc)\u003c/em\u003e, afin que le \u003ccode\u003ewindow manager\u003c/code\u003e à son tour envoie\nle caractère à la fenêtre en cours.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;\n\n\n\n\u003cabbr lang=\"fr\" title=\"Interface de Programmation Applicative\"\u003eAPI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n graphique de la fenêtre qui reçoit le caractère affiche le\nsymbole de police approprié dans le champ approprié ayant le focus.\u003c/p\u003e\n\u003ch3 id=\"analyse-durl\"\u003eAnalyse d\u0026rsquo;URL\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe navigateur a maintenant l\u0026rsquo;information suivante contenue dans\nl\u0026rsquo;\u003ca href=\"https://fr.wikipedia.org/wiki/Uniform_Resource_Locator\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n\u003c/a\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eProtocole\u003c/strong\u003e \u0026ldquo;http\u0026rdquo; : Utilise \u0026ldquo;\u003ca href=\"https://fr.wikipedia.org/wiki/Hypertext_Transfer_Protocol\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\u0026rdquo;\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eRessource\u003c/strong\u003e \u0026ldquo;/\u0026rdquo; : Récupère la page principale (index)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"est-ce-une-url-ou-un-terme-recherché-\"\u003eEst-ce une URL ou un terme recherché ?\u003c/h3\u003e\n\u003cp\u003eQuand aucun protocole ou nom de domaine valide n\u0026rsquo;est donné, le navigateur\ns\u0026rsquo;occupe de récupérer le texte donné dans la boite d\u0026rsquo;adresse au moteur de\nrecherche web par défaut du navigateur.\u003c/p\u003e\n\u003cp\u003eDans beaucoup de cas, un texte spécial est ajouté à l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n pour\nindiquer au moteur de recherche qu\u0026rsquo;il provient de la barre d\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n\nd\u0026rsquo;un navigateur particulier.\u003c/p\u003e\n\u003ch3 id=\"convertir-les-caractères-unicode-non-ascii-dans-le-nom-dhôte\"\u003eConvertir les caractères Unicode non-ASCII dans le nom d\u0026rsquo;hôte\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe navigateur vérifie tous les caractères du nom d\u0026rsquo;hôte, qui ne soient pas\n\u003ccode\u003ea-z\u003c/code\u003e,  \u003ccode\u003eA-Z\u003c/code\u003e, \u003ccode\u003e0-9\u003c/code\u003e, \u003ccode\u003e-\u003c/code\u003e, ou \u003ccode\u003e.\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePuisque le nom d\u0026rsquo;hôte est \u003ccode\u003egoogle.com\u003c/code\u003e, il n\u0026rsquo;y en aura pas ; mais si\nc\u0026rsquo;était le cas, le navigateur appliquerait l\u0026rsquo;encodage \u003ca href=\"https://fr.wikipedia.org/wiki/Punycode\" rel=\"external\"\u003ePunycode\u003c/a\u003e à la\nportion du nom d\u0026rsquo;hôte dans l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"vérifier-la-liste-hsts\"\u003eVérifier la liste HSTS\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe navigateur vérifie sa liste de \u0026ldquo;\u003ca href=\"https://fr.wikipedia.org/wiki/HTTP_Strict_Transport_Security\" rel=\"external\"\u003e\u003cabbr title=\"\"\u003eHSTS\u003c/abbr\u003e\n\u003c/a\u003e préchargés\u0026rdquo;. \u003cbr\u003e\nC\u0026rsquo;est une liste de sites web qui ont requis de n\u0026rsquo;être contactés seulement\nque sur \u003ca href=\"https://fr.wikipedia.org/wiki/HyperText_Transfer_Protocol_Secure\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi le site web est dans la liste, le navigateur envoie sa requête via\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n plutôt qu\u0026rsquo;en \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. Autrement, la requête\ninitiale est envoyée en \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. \u003cbr\u003e\n\u003cem\u003e(Notez qu\u0026rsquo;un site web peut toujours utiliser une politique \u003cabbr title=\"\"\u003eHSTS\u003c/abbr\u003e\n\n\u003cem\u003esans\u003c/em\u003e être dans la liste \u003cabbr title=\"\"\u003eHSTS\u003c/abbr\u003e\n. La première requête\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n au site web faite par un utilisateur recevra une réponse\ndemandant que l\u0026rsquo;utilisateur envoie seulement des requêtes \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\nToutefois, cette unique requête \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pourrait potentiellement\nlaisser l\u0026rsquo;utilisateur vulnérable à une attaque dite \u003ca href=\"https://fr.wikipedia.org/wiki/Moxie_Marlinspike#HTTPS_stripping\" rel=\"external\"\u003e\u003ccode\u003edowngrade attack\u003c/code\u003e\u003c/a\u003e ;\nc\u0026rsquo;est la raison pour laquelle la liste \u003cabbr title=\"\"\u003eHSTS\u003c/abbr\u003e\n est incluse dans les\nnavigateurs web modernes)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"recherche-dns\"\u003eRecherche DNS\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe navigateur vérifie si le domaine est dans son cache. \u003cem\u003e(Pour voir le\ncache \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n dans Chrome, écrivez dans la barre d\u0026rsquo;adresse\n\u003ccode\u003echrome://net-internals/#dns\u003c/code\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eS\u0026rsquo;il n\u0026rsquo;est pas trouvé, le navigateur appelle la fonction de bibliothèque\n\u003ccode\u003egethostbyname\u003c/code\u003e \u003cem\u003e(qui varie selon l\u0026rsquo;OS)\u003c/em\u003e afin de faire la recherche.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003egethostbyname\u003c/code\u003e vérifie si le nom d\u0026rsquo;hôte peut être résolu par référence\ndans le fichier local \u003ccode\u003ehosts\u003c/code\u003e \u003cem\u003e(dont la localisation \u003ca href=\"https://fr.wikipedia.org/wiki/Hosts#Localisation\" rel=\"external\"\u003evarie selon l\u0026rsquo;OS\u003c/a\u003e)\u003c/em\u003e\navant d\u0026rsquo;essayer de résoudre le nom d\u0026rsquo;hôte au-travers \u003ca href=\"https://fr.wikipedia.org/wiki/Domain_Name_System\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi \u003ccode\u003egethostbyname\u003c/code\u003e ne le trouve pas dans le cache, ni dans le fichier\n\u003ccode\u003ehosts\u003c/code\u003e alors elle fait une requête vers le serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nconfiguré dans la pile réseau. C\u0026rsquo;est typiquement le routeur local ou le\nserveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n cache du \u003ca href=\"https://fr.wikipedia.org/wiki/Fournisseur_d%27acc%C3%A8s_%C3%A0_Internet\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Fournisseur d\u0026#39;Accès Internet\"\u003eFAI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi le serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est sur le même sous-réseau, la bibliothèque\nréseau suit le \u003ccode\u003eprocessus \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/code\u003e décrit ci-dessous pour le\nserveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi le serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est sur un sous-réseau différent, la\nbibliothèque réseau suit le \u003ccode\u003eprocessus \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/code\u003e décrit ci-dessous\npour l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de la passerelle par défaut.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"processus-arp\"\u003eProcessus ARP\u003c/h3\u003e\n\u003cp\u003eAvant d\u0026rsquo;envoyer une diffusion \u003ca href=\"https://fr.wikipedia.org/wiki/Address_Resolution_Protocol\" rel=\"external\"\u003e\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e, la bibliothèque de la\npile réseau a besoin de l\u0026rsquo;\u003ca href=\"https://fr.wikipedia.org/wiki/Adresse_IP\" rel=\"external\"\u003eadresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e cible à rechercher.\nElle doit aussi connaître l\u0026rsquo;\u003ca href=\"https://fr.wikipedia.org/wiki/Adresse_MAC\" rel=\"external\"\u003eadresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e de l\u0026rsquo;interface\nqu\u0026rsquo;elle utilisera pour envoyer la diffusion \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003eLe cache \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est vérifié en premier pour trouver une entrée\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de notre \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n cible. Si elle est dans le cache,\nla bibliothèque retourne le résultat : \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n cible = \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003eSi l\u0026rsquo;entrée n\u0026rsquo;est pas dans le cache \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLa table de routage est recherchée, pour voir si l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nciblée est dans le sous-réseau de la table de routage local. Si elle y est,\nla bibliothèque utilise l\u0026rsquo;interface associée au sous-réseau. Si elle n\u0026rsquo;y\nest pas, la bibliothèque utilise l\u0026rsquo;interface qui est dans le sous-réseau\nde notre passerelle par défaut.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de l\u0026rsquo;interface réseau sélectionnée est recherchée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa bibliothèque réseau envoie une \u003ca href=\"/fr/trad/que-se-passe-t-il-quand-vous-ecrivez-dans-la-barre-d-adresse-du-navigateur-web/#requête-arp\"\u003erequête \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\nde la Couche de Liaison 2 \u003cem\u003e(trame de liaison d\u0026rsquo;adressage physique du\n\u003ca href=\"https://fr.wikipedia.org/wiki/Mod%C3%A8le_OSI\" rel=\"external\"\u003emodèle \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Open Systems Interconnection\"\u003eOSI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e)\u003c/em\u003e :\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"requête-arp\"\u003eRequête ARP\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eÉmetteur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003einterface:mac:address:here\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eÉmetteur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003einterface.ip.goes.here\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCible \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003eFF:FF:FF:FF:FF:FF\u003c/code\u003e \u003cem\u003e(Broadcast)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eCible \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003etarget.ip.goes.here\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCela dépend du type de matériel qui est entre l\u0026rsquo;ordinateur et le routeur :\u003c/p\u003e\n\u003cp\u003e⇒ Directement connecté :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi l\u0026rsquo;ordinateur est directement connecté au routeur, le routeur répond\navec une \u0026ldquo;\u003ca href=\"/fr/trad/que-se-passe-t-il-quand-vous-ecrivez-dans-la-barre-d-adresse-du-navigateur-web/#réponse-arp\"\u003eréponse \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e \u003cem\u003e(lire ci-dessous)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Par un Hub :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi l\u0026rsquo;ordinateur est connecté à un hub, le hub diffusera la requête\n\n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n vers tous les autres ports. Si le routeur est connecté sur\nla même \u0026ldquo;interface\u0026rdquo;, il répondra avec une \u0026ldquo;\u003ca href=\"/fr/trad/que-se-passe-t-il-quand-vous-ecrivez-dans-la-barre-d-adresse-du-navigateur-web/#réponse-arp\"\u003eréponse \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\u0026rdquo;\n\u003cem\u003e(lire ci-dessous)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Par un commutateur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSi l\u0026rsquo;ordinateur est connecté à un commutateur, le commutateur vérifiera sa\ntable \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour savoir sur quel port est diffusé l\u0026rsquo;adresse\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n recherchée. \u003cbr\u003e\nSi le commutateur n\u0026rsquo;a pas d\u0026rsquo;entrée pour l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, il\nrediffusera la requête \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n vers tous les autres ports.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi le commutateur a une entrée dans la table \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, il enverra\nune requête \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n au port correspondant à l\u0026rsquo;adresse\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n recherchée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi le routeur est sur la même \u0026ldquo;interface\u0026rdquo;, il répondra avec une\n\u0026ldquo;\u003ca href=\"/fr/trad/que-se-passe-t-il-quand-vous-ecrivez-dans-la-barre-d-adresse-du-navigateur-web/#réponse-arp\"\u003eréponse \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\u0026rdquo; \u003cem\u003e(lire ci-dessous)\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"réponse-arp\"\u003eRéponse ARP\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eÉmetteur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003etarget:mac:address:here\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eÉmetteur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003etarget.ip.goes.here\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCible \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003einterface:mac:address:here\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCible \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n: \u003ccode\u003einterface.ip.goes.here\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eLe protocole \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est nécessaire au fonctionnement\nd’\u003ca href=\"https://fr.wikipedia.org/wiki/Internet_Protocol\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v4\"\u003eIPv4\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e, utilisé par dessus un réseau de type Ethernet. En\n\u003ca href=\"https://fr.wikipedia.org/wiki/IPv6\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e, les fonctions \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ont été reprises dans\nle processus de découverte \u003ca href=\"https://fr.wikipedia.org/wiki/Neighbor_Discovery_Protocol\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Neighbor Discovery Protocol\"\u003eNDP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eMaintenant que la bibliothèque réseau a l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, soit de\nnotre serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, soit de la passerelle par défaut, elle peut\nreprendre son processus \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe client \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n établit un socket vers le port \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"User Datagram Protocol\"\u003eUDP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n53 du serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, utilisant un port source au-delà de 1023.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi la taille de la réponse est trop grande, \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Transfer Control Protocol\"\u003eTCP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sera utilisé à\nla place.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi le serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n local ou du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Fournisseur d\u0026#39;Accès Internet\"\u003eFAI\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ne l\u0026rsquo;a pas,\nalors une recherche récursive est requise et fait remonter la liste des\nserveurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Domain Name Service\"\u003eDNS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, et qu\u0026rsquo;une réponse soit retournée.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"ouverture-dune-socket\"\u003eOuverture d\u0026rsquo;une socket\u003c/h3\u003e\n\u003cp\u003eUne fois que le navigateur reçoit l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du serveur de\ndestination, il la prend ainsi que le numéro de port donné dans l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\u003cem\u003e(par défaut, le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a le port 80, et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nle port 443)\u003c/em\u003e, puis fait un appel à la fonction de la bibliothèque système\nnommée \u003ccode\u003esocket\u003c/code\u003e et requiert un flux de socket \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Transfer Control Protocol\"\u003eTCP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n -\n\u003ccode\u003eAF_INET/AF_INET6\u003c/code\u003e et \u003ccode\u003eSOCK_STREAM\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCette requête est en premier passé à la Couche de Transport où un segment\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Transfer Control Protocol\"\u003eTCP\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n est créé. Le port de destination est ajouté à l\u0026rsquo;entête, et\nle port source est choisi parmi une plage de port dynamique du noyau\n\u003cem\u003e(\u003ccode\u003eip_local_port_range\u003c/code\u003e dans Linux)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCe segment est envoyé vers la Couche Réseau, qui enveloppe une entête\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n   additionnelle. L\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du serveur cible\naussi bien que celle de la machine courante est insérée pour former un paquet.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe paquet suivant arrive sur la Couche de Liaison. Une entête de trame est\najouté qui inclut l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de l\u0026rsquo;interface réseau de la\nmachine ainsi que l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de la passerelle \u003cem\u003e(le routeur\nlocal)\u003c/em\u003e. Tout comme avant, si le noyau ne connaît pas l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nde la passerelle, il doit diffuser une requête \n\n\n\n\n\u003cabbr lang=\"en\" title=\"Address Resolution Protocol\"\u003eARP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour la trouver.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eÀ partir de ce point, le paquet est prêt à être transmis, soit au-travers :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/IEEE_802.3\" rel=\"external\"\u003eEthernet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/IEEE_802.11\" rel=\"external\"\u003eWiFi\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/R%C3%A9seau_de_t%C3%A9l%C3%A9phonie_mobile\" rel=\"external\"\u003eRéseau de Téléphonie Mobile\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour la plupart des connexions à Internet depuis une maison, ou pour de\npetites entreprises, le paquet passera de votre ordinateur, possiblement\nau-travers du réseau local, puis vers un \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"MOdulateur/DEModulateur\"\u003emodem\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n qui convertit les\n0 et 1 numériques en signal analogique adapté à la transmission par téléphone,\ncâble ou connexions de téléphonie sans fil.\u003c/p\u003e\n\u003cp\u003eÀ l\u0026rsquo;autre extrémité de la connexion se trouve un autre modem qui reconvertit\nle signal analogique en données numériques qui seront traitées par le\nprochain \u003ca href=\"https://fr.wikipedia.org/wiki/R%C3%A9seau_informatique\" rel=\"external\"\u003enœud de réseau\u003c/a\u003e où les adresses de départ et d\u0026rsquo;arrivée seront\nanalysées plus en détail.\u003c/p\u003e\n\u003cp\u003eLa plupart des grandes entreprises et certaines connexions résidentielles\nplus récentes disposeront de connexions en fibre optique ou de connexions\nEthernet directes, auxquels cas les données restent numériques et sont\ntransmises directement au prochain \u003ca href=\"https://fr.wikipedia.org/wiki/R%C3%A9seau_informatique\" rel=\"external\"\u003enœud de réseau\u003c/a\u003e pour y être traitées.\u003c/p\u003e\n\u003cp\u003eÉventuellement, le paquet atteindra le routeur gérant le sous-réseau local.\nDepuis là, il continuera à voyager vers l\u0026rsquo;\u003ca href=\"https://fr.wikipedia.org/wiki/Autonomous_System\" rel=\"external\"\u003e\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Système Autonome\"\u003eAS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e au-delà\ndu routeur, vers d\u0026rsquo;autres \n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Système Autonome\"\u003eAS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, et finalement atteindra le serveur\nde destination.\u003c/p\u003e\n\u003cp\u003eChaque routeur, le long du chemin, extrait l\u0026rsquo;adresse de destination de\nl\u0026rsquo;entête d\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et la dirige vers le prochain saut approprié.\u003c/p\u003e\n\u003cp\u003eLe champ \u003ca href=\"https://fr.wikipedia.org/wiki/Time_to_Live#Le_Time_to_Live_sur_les_paquets_IP\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Time to Live\"\u003eTTL\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e dans l\u0026rsquo;entête de l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est\ndécrémenté de un à chaque routeur traversé. Le paquet sera supprimé si le champ\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Time to Live\"\u003eTTL\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n atteint zéro ou si le routeur en cours n\u0026rsquo;a plus d\u0026rsquo;espace dans\nsa queue \u003cem\u003e(cela peut être dû à une congestion du réseau)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eCet envoi et cette réception arrive de nombreuses fois suivant le flux de\nconnexion \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Transfer Control Protocol\"\u003eTCP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe client choisit un \u003ca href=\"https://fr.wikipedia.org/wiki/Transmission_Control_Protocol#Num%C3%A9ros_de_s%C3%A9quence_et_d\u0026#39;acquittement\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Numéro de Séquence Initial\"\u003eISN\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\net envoie le paquet au serveur avec le bit SYN paramétré pour indiquer\nqu\u0026rsquo;il active l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Numéro de Séquence Initial\"\u003eISN\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur reçoit le bit SYN et s\u0026rsquo;il est \u0026ldquo;d\u0026rsquo;humeur agréable\u0026rdquo; :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele serveur choisit son propre numéro de séquence initial\u003c/li\u003e\n\u003cli\u003ele serveur paramètre le bit SYN afin d\u0026rsquo;indiquer qu\u0026rsquo;il a choisit son\n\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \u003cabbr lang=\"fr\" title=\"Numéro de Séquence Initial\"\u003eISN\u003c/abbr\u003e\n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n    \n\u003c/li\u003e\n\u003cli\u003ele serveur copie l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"fr\" title=\"Numéro de Séquence Initial\"\u003eISN\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du client +1 dans son champ ACK et\najoute le drapeau ACK afin d\u0026rsquo;indiquer qu\u0026rsquo;il accuse réception du premier\npaquet.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe client reconnaît la connexion en envoyant un paquet :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eaugmentant son propre numéro de séquence\u003c/li\u003e\n\u003cli\u003eaugmentant le numéro d\u0026rsquo;accusé de réception\u003c/li\u003e\n\u003cli\u003eparamètre le champ ACK\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa donnée est transmise ainsi :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLorsqu\u0026rsquo;une partie envoie N octets de données, elle augmente sa séquence\nSEQ par un numéro\u003c/li\u003e\n\u003cli\u003eQuand l\u0026rsquo;autre partie accuse réception du paquet (ou d\u0026rsquo;une chaîne de\npaquets), elle envoie un paquet ACK avec une valeur ACK égale à la\ndernière séquence reçue depuis l\u0026rsquo;autre partie.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePour fermer la connexion :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela partie qui termine la connexion envoie un paquet FIN.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;autre partie accuse réception ACK du paquet FIN et envoie son propre\npaquet FIN.\u003c/li\u003e\n\u003cli\u003ela première partie accuse réception ACK du paquet FIN de l\u0026rsquo;autre partie.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"la-poignée-de-main-tls\"\u003eLa Poignée de Main TLS\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;ordinateur client envoie un message \u003ccode\u003eClientHello\u003c/code\u003e au serveur avec sa\nversion de \u003ca href=\"https://fr.wikipedia.org/wiki/Transport_Layer_Security\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e, une liste d\u0026rsquo;algorithmes de chiffrement\net de méthodes de compression disponibles.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur répond avec un message \u003ccode\u003eServerHello\u003c/code\u003e au client avec la version\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n, le chiffrement choisi, les méthodes de compression\nsélectionnées et le certificat public signé par une \u003ca href=\"https://fr.wikipedia.org/wiki/Autorit%C3%A9_de_certification\" rel=\"external\"\u003e\n\n\u003cabbr lang=\"fr\" title=\"Autorité de Certification\"\u003eAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\ndu serveur. \u003cbr\u003e\nLe certificat contient une clé publique qui sera utilisée par le client\npour chiffrer le reste de la poignée de main jusqu\u0026rsquo;à ce qu\u0026rsquo;une clé symétrique\npuisse être convenue.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe client vérifie que le certificat numérique du serveur soit dans sa\nliste d\u0026rsquo;\n\n\u003cabbr lang=\"fr\" title=\"Autorité de Certification\"\u003eAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de confiance. Si la confiance peut être établie,\nbasée sur l\u0026rsquo;\n\n\u003cabbr lang=\"fr\" title=\"Autorité de Certification\"\u003eAC\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, le client génère une chaîne d\u0026rsquo;octets\npseudo-aléatoires et la chiffre avec la clé publique du serveur. Ces octets\naléatoires peuvent être utilisés pour déterminer la clé symétrique.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur déchiffre les octets aléatoires en utilisant sa clé privée\npuis utilise ces octets pour générer sa propre copie de la clé symétrique\nmaître.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe client envoie un message \u003ccode\u003eFinished\u003c/code\u003e au serveur, chiffrant un hash\nde la transmission jusqu\u0026rsquo;à ce point avec la clé symétrique.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur génère son propre hash, puis déchiffre le hash envoyé par le\nclient pour vérifier la correspondance. Si elle existe, il envoie son\npropre message \u003ccode\u003eFinished\u003c/code\u003e au client, le chiffrant aussi avec sa clé\nsymétrique.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eÀ partir de maintenant la session \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n transmet les données de\nl\u0026rsquo;application \u003cem\u003e(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n)\u003c/em\u003e chiffrées avec la clé symétrique agréée.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"protocole-http\"\u003eProtocole HTTP\u003c/h3\u003e\n\u003cp\u003eSi le navigateur web utilisé été écrit par Google, au lieu d\u0026rsquo;envoyer une\nrequête HTTP pour récupérer la page, il enverra une requête pour négocier\navec le serveur une \u0026ldquo;mise à jour\u0026rdquo; du protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n vers le\nprotocole \u003ca href=\"https://fr.wikipedia.org/wiki/SPDY\" rel=\"external\"\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Speedy\"\u003eSPDY\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eSi le client utilise le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n mais ne prend pas en\ncharge \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Speedy\"\u003eSPDY\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, il envoie une requête au serveur de la forme :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eGET / HTTP/1.1\nHost: google.com\nConnection: close\n[autres entêtes]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eoù \u003ccode\u003e[autres entêtes]\u003c/code\u003e référent à une série de paire de clé et valeur séparée\npar le symbole deux points \u0026lsquo;:\u0026rsquo;, formatées selon la spécification\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et séparées par d\u0026rsquo;uniques nouvelles lignes. \u003cbr\u003e\n\u003cem\u003e(Cela suppose que le navigateur web utilisé n\u0026rsquo;ait pas de bogues violant la\nspécification \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. Cela suppose aussi que le navigateur web\nutilise \u003ccode\u003eHTTP/1.1\u003c/code\u003e, autrement il ne pourrait pas inclure l\u0026rsquo;entête \u003ccode\u003eHost\u003c/code\u003e\ndans la requête ; la version spécifiée dans la requête \u003ccode\u003eGET\u003c/code\u003e serait soit\n\u003ccode\u003eHTTP/1.0\u003c/code\u003e ou \u003ccode\u003eHTTP/0.9\u003c/code\u003e.)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/1.1 définit l\u0026rsquo;option de \u0026ldquo;fermeture\u0026rdquo; de la connexion pour que\nl\u0026rsquo;expéditeur signale que la connexion sera fermée après l\u0026rsquo;achèvement de la\nréponse. \u003cbr\u003e\nPar exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eConnection: close\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLes applications \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n/1.1 qui ne prennent pas en charge les\nconnexions persistantes DOIVENT inclure l\u0026rsquo;option de \u0026ldquo;fermeture\u0026rdquo; de connexion\ndans chaque message.\u003c/p\u003e\n\u003cp\u003eAprès l\u0026rsquo;envoi de la requête et des entêtes, le navigateur web envoie une\nunique nouvelle ligne vierge pour indiquer au serveur que le contenu de\nla requête est fait.\u003c/p\u003e\n\u003cp\u003eLe serveur répond avec un code de réponse dénotant le statut de la requête\net avec une réponse de la forme :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e200 OK\n[entêtes de réponse]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSuivies d\u0026rsquo;une unique nouvelle ligne, il envoie alors la charge du contenu\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n de \u003ccode\u003ewww.google.com\u003c/code\u003e. Le serveur peut alors soit fermer la\nconnexion, soit si les entêtes envoyées par le client le demande, garder la\nconnexion ouverte afin d\u0026rsquo;être réutilisées pour de prochaines requêtes.\u003c/p\u003e\n\u003cp\u003eSi les entêtes \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n envoyées par le navigateur web comportent des\ninformations suffisantes pour que le serveur web détermine si la version du\nfichier en cache dans le navigateur web n\u0026rsquo;a pas été modifié depuis la dernière\nrécupération \u003cem\u003e(tel que si le navigateur web inclut une entête \u003ccode\u003eETag\u003c/code\u003e)\u003c/em\u003e, il\npeut alors répondre par une requête de la forme :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e304 Not Modified\n[entêtes de réponse]\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eil n\u0026rsquo;y aura pas charge utile, et le navigateur web récupérera le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ndepuis son cache.\u003c/p\u003e\n\u003cp\u003eAprès l\u0026rsquo;analyse du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, le navigateur web \u003cem\u003e(ainsi que le serveur)\u003c/em\u003e\nrépétera ce processus pour chaque ressource \u003cem\u003e(image, CSS, favicon.ico, etc)\u003c/em\u003e\nréférencée dans la page \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, excepté que la requête sera\n\u003ccode\u003eGET /$(URL relative à www.google.com) HTTP/1.1\u003c/code\u003e au lieu de \u003ccode\u003eGET / HTTP/1.1\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSi le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n référence une ressource sur un domaine différent que\n\u003ccode\u003ewww.google.com\u003c/code\u003e, le navigateur web reprendra les étapes invoquées pour\nrésoudre l\u0026rsquo;autre domaine, et suivra toutes les mêmes étapes jusqu\u0026rsquo;à ce point\npour ce domaine. \u003cbr\u003e\nL\u0026rsquo;entête \u003ccode\u003eHost\u003c/code\u003e dans la requête sera paramétrée vers le nom du serveur\napproprié plutôt que \u003ccode\u003egoogle.com\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"gestionnaire-de-requêtes-http-du-serveur\"\u003eGestionnaire de Requêtes HTTP du Serveur\u003c/h3\u003e\n\u003cp\u003eLe serveur HTTPD \u003cem\u003e(Service HTTP)\u003c/em\u003e est un gestionnaire de requêtes et de réponses\ncôté serveur. Les serveurs HTTPD des plus communs sont Apache ou nginx pour\nLinux et IIS pour Windows.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur HTTPD \u003cem\u003e(Service HTTP)\u003c/em\u003e reçoit la requête.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur décompose la requête selon les paramètres suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela méthode de requête HTTP \u003cem\u003e(soit \u003ccode\u003eGET\u003c/code\u003e, \u003ccode\u003eHEAD\u003c/code\u003e, \u003ccode\u003ePOST\u003c/code\u003e, \u003ccode\u003ePUT\u003c/code\u003e,\n\u003ccode\u003ePATCH\u003c/code\u003e, \u003ccode\u003eDELETE\u003c/code\u003e, \u003ccode\u003eCONNECT\u003c/code\u003e, \u003ccode\u003eOPTIONS\u003c/code\u003e, ou \u003ccode\u003eTRACE\u003c/code\u003e)\u003c/em\u003e. Dans\nle cas où l\u0026rsquo;URL est entrée directement dans la barre d\u0026rsquo;adresse, elle\nsera \u003ccode\u003eGET\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ele domaine ; dans ce cas : google.com\u003c/li\u003e\n\u003cli\u003ele chemin ou la page demandé ; dans ce cas : / \u003cem\u003e(puisqu\u0026rsquo;il n\u0026rsquo;y a pas\nde chemin ou de page spécifique demandé, / est le chemin par défaut)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur vérifie qu\u0026rsquo;un Hôte Virtuel soit configuré sur le serveur\ncorrespondant à google.com.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur vérifie que google.com peut accepter les requêtes GET.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur vérifie que le client est autorisé à utiliser cette méthode\n\u003cem\u003e(par l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, authentification, etc)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi le serveur a un module de ré-écriture installé \u003cem\u003e(tel que mod_rewrite\npour Apache ou URL Rewrite pour IIS)\u003c/em\u003e, il essaiera la correspondance de\nla requête avec une des règles configurées. Si une règle correspondante\nest trouvée, le serveur utilise la règle pour ré-écrire la requête.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur envoie le contenu qui correspond à la requête, dans notre cas,\nil reviendra au fichier index, puisque \u0026ldquo;/\u0026rdquo; est le fichier principal\n\u003cem\u003e(dans certains cas, cela peut être surchargé, mais c\u0026rsquo;est la méthode commune)\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur analyse le fichier en accord avec le gestionnaire. Si Google\nexécute PHP, le serveur utilise PHP pour interpréter le fichier index,\net envoie le flux vers le client.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"la-scène-derrière-le-navigateur\"\u003eLa scène derrière le Navigateur\u003c/h3\u003e\n\u003cp\u003eUne fois que le serveur délivre les ressources \u003cem\u003e(\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript\"\u003eJS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, images, etc)\u003c/em\u003e au navigateur, il est soumis\nau processus suivant :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAnalyse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript\"\u003eJS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/li\u003e\n\u003cli\u003eRendu : construit l\u0026rsquo;arborescence \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Document Object Model\"\u003eDOM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n → l\u0026rsquo;arborescence de rendu\n→ le plan de l\u0026rsquo;arborescence de rendu → l\u0026rsquo;affichage de l\u0026rsquo;arborescence de\nrendu\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"le-navigateur\"\u003eLe Navigateur\u003c/h3\u003e\n\u003cp\u003eLa fonction du navigateur est de présenter la ressource web que vous avez\nchoisi, en la demandant à un serveur et en l\u0026rsquo;affichant dans la fenêtre du\nnavigateur. La ressource est habituellement un document \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\nmais peut être aussi un PDF, une image, ou tout autre type de contenu. \u003cbr\u003e\nL\u0026rsquo;endroit de la ressource est spécifié par l\u0026rsquo;utilisateur selon une\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003eLa manière dont le navigateur interprète et affiche les fichiers\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est spécifiée dans les spécifications \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. Ces spécifications sont maintenues par le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"World Wide Web Consortium\"\u003eW3C\u003c/abbr\u003e\n\n\n,\nqui est l\u0026rsquo;organisation des standards du web.\u003c/p\u003e\n\u003cp\u003eLes interfaces utilisateur de navigation ont beaucoup en commun entre elles.\nParmi les éléments communs de l\u0026rsquo;interface utilisateur, on peut citer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eune barre d\u0026rsquo;adresse pour l\u0026rsquo;insertion d\u0026rsquo;une \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/li\u003e\n\u003cli\u003edes boutons de retour et d\u0026rsquo;avance\u003c/li\u003e\n\u003cli\u003edes options de marque-pages \u003cem\u003e(favoris)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003edes boutons pour rafraîchir et stopper le chargement de documents en cours\u003c/li\u003e\n\u003cli\u003eun bouton d’accueil pour vous permettre d\u0026rsquo;aller à votre page d\u0026rsquo;accueil.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eStructure de Haut Niveau du Navigateur\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLes composants des navigateurs sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eUne Interface Utilisateur\u003c/strong\u003e : l\u0026rsquo;interface utilisateur \u003cem\u003e(UI)\u003c/em\u003e inclue la barre\nd\u0026rsquo;adresse, les boutons retour/avance, le menu des marque-pages, etc.\nChaque partie du navigateur s\u0026rsquo;affiche, exceptée la fenêtre où vous voyez\nla page demandée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLe Moteur du Navigateur\u003c/strong\u003e : le moteur du navigateur répartit les actions\nentre l\u0026rsquo;UI et le moteur de rendu.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLe Moteur de Rendu\u003c/strong\u003e : le moteur de rendu est responsable d\u0026rsquo;afficher\nle contenu demandé. Par exemple, si le contenu demandé est du\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n, le moteur de rendu analyse le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et le\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n, et affiche le contenu analysé à l\u0026rsquo;écran.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRéseau\u003c/strong\u003e : le réseau gère les appels réseau tels que les requêtes\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n utilisant différentes implémentations pour les différentes\nplateformes derrière une interface de plateforme indépendante.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eBackend UI\u003c/strong\u003e : le backend de l\u0026rsquo;UI est utilisé pour dessiner les widgets\nbasiques tels que les comboboxes et les fenêtres. Ce backend expose une\ninterface générique qui n\u0026rsquo;est pas spécifique à une plateforme. \u003cbr\u003e\nEn profondeur, il utilise les méthodes de l\u0026rsquo;interface utilisateur du\nsystème d\u0026rsquo;exploitation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLe Moteur JavaScript\u003c/strong\u003e : le moteur JavaScript est utilisé pour analyser\net exécuter le code JavaScript.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eLe Stockage des Données\u003c/strong\u003e : le stockage des données est une couche\npersistante. \u003cbr\u003e\nLe navigateur peut sauvegarder toute sorte de données localement, tels\nque des cookies. Les navigateurs prennent en charge aussi des mécanismes\nde stockage tels que localStorage, IndexedDB, WebSQL et FileSystem.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"analyse-du-html\"\u003eAnalyse du HTML\u003c/h3\u003e\n\u003cp\u003eLe moteur de rendu démarre l\u0026rsquo;obtention des contenus du document demandé\ndepuis la couche réseau. Cela se fait habituellement par morceaux de 8 Ko.\u003c/p\u003e\n\u003cp\u003eLe premier travail de l\u0026rsquo;analyseur HTML est d\u0026rsquo;analyser le langage\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n dans une arborescence.\u003c/p\u003e\n\u003cp\u003eLa sortie de l\u0026rsquo;arborescence \u003cem\u003e(\u0026ldquo;l\u0026rsquo;arborescence analysée\u0026rdquo;)\u003c/em\u003e est une arborescence\ndes éléments du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Document Object Model\"\u003eDOM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et des nœuds d\u0026rsquo;attributs. \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Document Object Model\"\u003eDOM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nest l\u0026rsquo;abréviation de Document Object Model. C\u0026rsquo;est la présentation objet du\ndocument \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et l\u0026rsquo;interface des éléments \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n au\nmonde extérieur tel JavaScript. La racine de l\u0026rsquo;arborescence est l\u0026rsquo;objet \u0026ldquo;Document\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eAvant toute manipulation par script, le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Document Object Model\"\u003eDOM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a une relation\nquasi-univoque avec le balisage.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAlgorithme d\u0026rsquo;Analyse\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLe \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ne peut être analysé par des analyseurs habituels.\u003c/p\u003e\n\u003cp\u003eLes raisons sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela nature indulgente du langage.\u003c/li\u003e\n\u003cli\u003ele fait que les navigateurs ont une tolérance traditionnelle à l\u0026rsquo;erreur\npour prendre en charge les cas connus de \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n invalides.\u003c/li\u003e\n\u003cli\u003ele processus d\u0026rsquo;analyse est ré-entrant. Pour les autres langages, la source\nne change pas durant l\u0026rsquo;analyse, mais en \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, le code dynamique\n\u003cem\u003e(tels que des éléments de scripts contenant des appels à \u003ccode\u003edocument.write()\u003c/code\u003e)\u003c/em\u003e\npeut ajouter des jetons supplémentaires ; le processus d\u0026rsquo;analyse en cours\nmodifie alors l\u0026rsquo;entrée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi le navigateur est incapable d\u0026rsquo;utiliser les techniques d\u0026rsquo;analyses régulières,\nil utilisera un analyseur personnalisé pour l\u0026rsquo;analyse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\nL\u0026rsquo;algorithme d\u0026rsquo;analyse est décrit en détail par la spécification\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n5.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;algorithme consiste en deux phases : mise en jeton et construction de\nl\u0026rsquo;arborescence.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLes Actions lorsque l\u0026rsquo;Analyse est terminée\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eLe navigateur commence par récupérer les ressources externes liées à la page\n\u003cem\u003e(\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, images, fichiers JavaScript, etc)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLors de cette étape, le navigateur marque le document comme interactif et\ndémarre les scripts d\u0026rsquo;analyse qui sont dans le mode \u0026ldquo;différé\u0026rdquo; : tout ce\nqui doit être exécuté après le document est analysé. L\u0026rsquo;état du document\nest paramétré sur \u0026ldquo;complet\u0026rdquo; et un événement \u0026ldquo;charge\u0026rdquo; est levé.\u003c/p\u003e\n\u003cp\u003eNotez qu\u0026rsquo;il n\u0026rsquo;y a jamais d\u0026rsquo;erreur \u0026ldquo;Invalid Syntax\u0026rdquo; sur une page \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\nLes navigateurs corrigent tout contenu invalide et l\u0026rsquo;envoie.\u003c/p\u003e\n\u003ch3 id=\"interprétation-du-css\"\u003eInterprétation du CSS\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAnalyse des fichiers \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, du contenu des balises \u003ccode\u003e\u0026lt;style\u0026gt;\u003c/code\u003e,\net des valeurs des attributs \u003ccode\u003estyle\u003c/code\u003e en utilisant la\n\u0026ldquo;\u003ca href=\"http://www.w3.org/TR/CSS2/grammar.html\" rel=\"external\"\u003esyntaxe de grammaire et champ lexical \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/a\u003e\u0026rdquo;.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChaque fichier \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est analysé dans un \u003ccode\u003eStyleSheet object\u003c/code\u003e,\noù chaque objet contient les règles \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n avec les sélecteur et\nles objets correspondant à la grammaire \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUn analyseur \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n peut être descendant ou ascendant lorsqu\u0026rsquo;un\ngénérateur d\u0026rsquo;analyse spécifique est utilisé.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rendu-de-page\"\u003eRendu de Page\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCrée une \u0026ldquo;Arborescence d\u0026rsquo;Image\u0026rdquo; ou une \u0026lsquo;Arborescence de Rendu\u0026rdquo; en traversant\nles nœuds du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Document Object Model\"\u003eDOM\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, et en calculant les valeurs du style\n\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n  \n pour chaque nœud.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCalcul la largeur préférée de chaque nœud de l\u0026rsquo;arbre du cadre de bas\nen haut en additionnant la largeur préférée des nœuds enfants et les\nmarges horizontales, les bordures et le padding du nœud.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCalcul la largeur actuelle de chaque nœud de haut en bas en allouant à\nchaque nœud disponible la largeur de ses enfants.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCalcul la hauteur de chaque nœud de bas en haut en appliquant un habillage\nde texte et en additionnant les hauteurs des nœuds enfants, les marges,\nles bordures et le padding du nœud.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCalcul les coordonnées de chaque nœud en utilisant l\u0026rsquo;information calculée\nci-dessus.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDes étapes plus compliquées sont menées lorsque les éléments sont positionnés\nen \u003ccode\u003efloated\u003c/code\u003e, \u003ccode\u003eabsolutely\u003c/code\u003e ou \u003ccode\u003erelatively\u003c/code\u003e, ou lorsque d\u0026rsquo;autres\nfonctionnalités plus complexes sont utilisées. Pour avoir plus de détails,\nvoir \u003ca href=\"http://dev.w3.org/csswg/css2/\" rel=\"external\"\u003ehttp://dev.w3.org/csswg/css2/\u003c/a\u003e et \u003ca href=\"http://www.w3.org/Style/CSS/current-work\" rel=\"external\"\u003ehttp://www.w3.org/Style/CSS/current-work\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCrée des calques pour décrire quelles parties de la page peuvent être\nanimées en tant que groupe sans être re-traitées. Chaque objet d\u0026rsquo;image\nou de rendu peut être assigné à un calque.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDes textures sont allouées à chaque calque de la page.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes objets d\u0026rsquo;image ou de rendu pour chaque calque sont parcourus et des\ncommandes de dessein sont exécutées pour leur calque respectif. Ils doivent\nêtre traités par le \n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Central Processing Unit\"\u003eCPU\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ou dessinés par le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Graphic Processing Unit\"\u003eGPU\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nen utilisant directement D2D/SkiaGL.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eToutes les étapes ci-dessus peuvent réutilisées les valeurs calculées\ndepuis la dernière fois où la page web a été rendue, ainsi les changements\nincrémentaux demandent moins de travail.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes calques de page sont envoyés au processus de composition où ils sont\ncombinés avec les calques d\u0026rsquo;autres contenus visibles, tel que le chrome\ndu navigateur, les iframes, et les panneaux d\u0026rsquo;extension.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes positions de calque final sont calculés et les commandes de composition\nsont émises via Direct3D/OpenGL. Les tampons de commande du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Graphic Processing Unit\"\u003eGPU\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nsont vidés vers le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Graphic Processing Unit\"\u003eGPU\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour le rendu asynchrone et l\u0026rsquo;image est\nenvoyée au serveur de fenêtrage.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rendu-du-gpu\"\u003eRendu du GPU\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDurant le processus de rendu, les calques de calcul graphique peuvent\nutilisés aussi bien le \u003ccode\u003eCPU\u003c/code\u003e que le processeur graphique \u003ccode\u003eGPU\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLors de l\u0026rsquo;utilisation du \u003ccode\u003eGPU\u003c/code\u003e pour le calcul du rendu graphique, les\ncalques du logiciel graphique découpe la tâche en de multiples pièces,\nainsi il peut utiliser avantageusement le parallélisme massif du \u003ccode\u003eGPU\u003c/code\u003e\npour le calcul de virgule flottante requis pour le processus de rendu.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"exécution-post-rendu-et-induite-par-lutilisateur\"\u003eExécution Post-Rendu et induite par l\u0026rsquo;utilisateur\u003c/h3\u003e\n\u003cp\u003eAprès que le rendu soit complet, le navigateur exécute le code JavaScript\ngrâce à un mécanisme de temporisation \u003cem\u003e(tel qu\u0026rsquo;une animation Google Doodle)\u003c/em\u003e\nou à une interaction de l\u0026rsquo;utilisateur \u003cem\u003e(écrivant une requête dans une boîte\nde recherche et recevant des suggestions)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eDes plugins tels que Flash ou Java peuvent aussi être exécutés, mais actuellement\npas depuis la page d\u0026rsquo;accueil de Google. Des scripts peuvent causer des\nrequêtes réseaux additionnelles, modifier la page ou sa mise en page,\nentraînant un nouveau cycle de rendu et de dessin de la page.\u003c/p\u003e\n\u003ch2 id=\"épilogue\"\u003eÉpilogue\u003c/h2\u003e\n\u003cp\u003eLes \u003ca href=\"https://github.com/hucste/what-happens-when/blob/master/README-fr.rst\" rel=\"external\"\u003esources \u0026ldquo;officielles\u0026rdquo; de la traduction de cet article sont disponibles\nsur mon espace de dépôt GitHub\u003c/a\u003e. Si vous voyez des erreurs de traduction,\nde sens, si en tant qu\u0026rsquo;experts/utilisateurs confirmés, vous souhaitez apporter\ndes précisions/corrections, n\u0026rsquo;hésitez pas à \u003ca href=\"https://github.com/hucste/what-happens-when/issues\" rel=\"external\"\u003elever une issue\u003c/a\u003e, voire mieux\nà \u003ca href=\"https://github.com/hucste/what-happens-when/pulls\" rel=\"external\"\u003efournir une PR\u003c/a\u003e ;-)\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Traduction EN→FR : Que se passe-t-il quand vous écrivez dans la barre d'adresse du navigateur web ?!",
            "tags": ["Traduction"],
            "date_published": "2020-09-16T21:19:47+02:00",
            "date_modified": "2025-11-18T16:07:44+01:00"
        },{
            "id": "urn:uuid:d1df3eef-003e-dafe-be6b-f39abaf68cbd",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/sysupgrade/",
            "title": "OpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description DangerAvant de faire la mise à jour du système, veuillez IMPÉRATIVEMENT bien lire l\u0026rsquo;annonce de version faite par le projet OpenWRT, et tout particulièrement les chapitres \u0026ldquo;Upgrading to…\u0026rdquo; et \u0026ldquo;Known issues\u0026rdquo;. En effet ces chapitres peuvent contenir des informations relatives à votre routeur ; faire l\u0026rsquo;impasse pourrait endommager votre matériel et le rendre inutilisable ! OpenWRT a un outil pour faire la mise à niveau d\u0026rsquo;une version à une autre nommé sysupgrade. Il est possible de l\u0026rsquo;invoquer depuis l\u0026rsquo;interface web d\u0026rsquo;administration LuCI.\nSi le procédé vous intéresse plus que le faire par CLI, lisez la note en question : Flash depuis LuCI\nLe procédé suivant explique pas-à-pas la mise à niveau tout en mode CLI, tout en préservant la configuration utilisateur…\nProcédé La première chose à laquelle nous veillons est d\u0026rsquo;installer l\u0026rsquo;outil curl, car par défaut le binaire wget nativement installé ne supporte pas TLS.\n:# opkg install curl ``` ### opkgscript.sh Le script `opkgscript.sh` permet de sauvegarder la liste des paquets installés en sus de la base. ⇒ Récupèrons le depuis [opkgscript.sh](https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh) : `:$ curl -O https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh` \u0026lt;!-- AstuceAu cas où, je mets à disposition le script… --\u0026gt; ⇒ Donnons les droits d\u0026#39;exécution nécessaire : `:# chmod 0700 opkgscript.sh` \u0026lt;!-- AstuceCopier le localement sur votre machine d\u0026rsquo;administration… surtout qu\u0026rsquo;après la mise à niveau, il pourrait être possible que vous n\u0026rsquo;ayez plus momentanément Internet, sauf normalement depuis le routeur. --\u0026gt; ⇒ Sauvegardons la liste des paquets installés - *pour pouvoir restaurer après la mise à niveau système* : ```sh :# ./opkgscript.sh -v write ``` Le script écrit la liste dans un fichier `/etc/config/opkg.installed`. ### Téléchargement firmware Depuis le répertoire `/tmp`, récupèrons la nouvelle version du firmware : - e.g. pour la version actuelle : `:# v=\u0026#34;24.10.5\u0026#34;` ⇒ pour le routeur **OpenWRT One** : `:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/mediatek/filogic/{openwrt-\u0026#34;${v}\u0026#34;-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb,sha256sums}` ⇒ pour le routeur **Ubiquiti EdgeRouter X** : `:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/ramips/mt7621/{openwrt-\u0026#34;${v}\u0026#34;-ramips-mt7621-ubnt_edgerouter-x-squashfs-sysupgrade.bin,sha256sums}` ⇒ pour le **Xiaomi Mi Router AX3000T** : `:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/mediatek/filogic/{openwrt-\u0026#34;${v}\u0026#34;-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin,sha256sums}` ⇒ pour le **Xiaomi Redmi Router AC2100** : `:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/ramips/mt7621/{openwrt-\u0026#34;${v}\u0026#34;-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin,sha256sums}` #### Vérification du téléchargement Puis, nous vérifions la somme de contrôle afin de nous assurer du firmware : ```sh :$ sha256sum -c sha256sums 2\u0026gt; /dev/null | grep OK ``` ⇒ Résultat correct pour le routeur **OpenWRT One** : \\ `openwrt-24.10.4-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb: OK` DangerATTENTION : Si la vérification échoue, allez en discuter sur le forum !\nNe cherchez pas à mettre à jour avec un micro-logiciel corrompu !!!\n### Sauvegarde configuration L\u0026#39;étape suivante est de vérifier la configuration de la sauvegarde : ```sh :# sysupgrade -l ``` Si nécessaire, il faut éditer le fichier pour ajouter certains répertoires/fichiers, ainsi dans le cas où un utilisateur a été ajouté correctement au groupe `sudo` , il faudra ajouter ce qui suit dans le fichier `/etc/sysupgrade.conf` : * /etc/sudoers * /etc/sudoers.d/ Vérifions à nouveau - et sauvegardons la configuration : ```sh :# sysupgrade -b /tmp/backup-${HOSTNAME}-$(date +%F).tar.gz ``` InfoOn peut remarquer que dans la sauvegarde en question se trouve le fichier /etc/config/opkg.installed précédemment créé avec le script opkgscript.sh. --- Puis, il faut récupèrer cette sauvegarde : `:$ scp root@openwrt:/tmp/backup*.tar.gz $(pwd)` *(où \u0026#39;openwrt\u0026#39; est l\u0026#39;adresse IP de votre routeur…)* InfoSi vous avez le message d\u0026rsquo;erreur suivant : ash: /usr/libexec/sftp-server: not found\nMerci de lire la note ci-dessous À-propos de SSH v9.0 et supérieure\nLa note À-propos de la libération de la mémoire peut-être intéressante à lire, mais peu utile dans le contexte des routeurs mis en exemple, car dans leur cas, une RAM conséquente est embarquée.\n--- ### Mise à Niveau Système Passons à la mise à niveau système, tel que, par exemple : `:# sysupgrade -v openwrt-\u0026#34;${v}\u0026#34;-*-sysupgrade.bin` ou \\ `:# sysupgrade -v openwrt-\u0026#34;${v}\u0026#34;-*-sysupgrade.itb` selon le modèle de routeur. ⇒ Exemple, pour le routeur **OpenWRT One** : ```ash :# sysupgrade -v openwrt-\u0026#34;$v\u0026#34;-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb (date) upgrade: Saving config files... etc/config/attendedsysupgrade etc/config/dhcp etc/config/dropbear etc/config/firewall etc/config/https-dns-proxy etc/config/luci etc/config/network etc/config/opkg.installed etc/config/rpcd etc/config/system etc/config/ubihealthd etc/config/ubootenv etc/config/uhttpd etc/config/unbound etc/config/wifi_schedule etc/config/wireless etc/crontabs/root etc/dropbear/authorized_keys etc/dropbear/dropbear_ed25519_host_key etc/dropbear/dropbear_rsa_host_key etc/fw_env.config etc/group etc/hosts etc/inittab etc/luci-uploads/.placeholder etc/nftables.d/10-custom-filter-chains.nft etc/nftables.d/README etc/opkg/keys/8a11255d14aef6c8 etc/opkg/keys/d310c6f2833e97f7 etc/passwd etc/profile etc/profile.d/busybox-history-file.sh etc/rc.local etc/shadow etc/shells etc/shinit etc/sysctl.conf etc/sysupgrade.conf etc/uhttpd.crt etc/uhttpd.key etc/unbound/unbound.conf etc/unbound/unbound_ext.conf root/opkgscript.sh (date) upgrade: Commencing upgrade. Closing all shell sessions. ``` Normalement votre session SSH va se fermer et le routeur démarrer ! --- InfoLors de la reconnexion au routeur depuis votre client SSH, il peut arriver que la connexion soit empêchée avec le message d\u0026rsquo;erreur suivant :\nWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED. Si c\u0026rsquo;est le cas, merci de lire la note adéquate : À-propos de l\u0026rsquo;identification de l\u0026rsquo;hôte à distance par SSH\nSi jamais vous faites une migration depuis 19.07.x vers 21.02.x ou supérieure, veuillez lire impérativement la note ad hoc : À-propos de la Migration vers ≥ 21.02.0\nAprès le reboot, il peut arriver que le routeur n\u0026rsquo;ait plus accès à Internet. Merci de vérifier le fichier /etc/resolv.conf et de le reconfigurer si besoin.\n#### Vérification nouvelle version À partir du moment où vous pourrez vous connecter à nouveau à votre routeur, vous retrouverez l\u0026#39;information relative à votre nouvelle version : - depuis LuCI, aller vers \u0026#34;Status\u0026#34; \u0026gt; \u0026#34;Overview\u0026#34;, celui-ci sera affiché dans la section \u0026#34;System\u0026#34;, face à l\u0026#39;information \u0026#34;Firmware version\u0026#34; - en SSH, dans la bannière de connexion affichant ce nouveau numéro de version, comme ci-dessous : ```ash BusyBox v1.36.1 (2025-12-17 21:08:22 UTC) built-in shell (ash) _______ ________ __ | |.-----.-----.-----.| | | |.----.| |_ | - || _ | -__| || | | || _|| _| |_______|| __|_____|__|__||________||__| |____| |__| W I R E L E S S F R E E D O M ----------------------------------------------------- OpenWrt 24.10.5, r29087-d9c5716d1d ----------------------------------------------------- ``` --- ### Mise à Niveau \u0026#34;tiers\u0026#34; AttentionSur les routeurs ayant moins de 4 Mo de NVRAM, les mises à jour peuvent ne pas avoir lieu correctement ; il est nécessaire de s\u0026rsquo;assurer d\u0026rsquo;avoir au moins 600 Ko de libre.\nEssayez de libérer de la mémoire…\nVérifiez les caractéristiques techniques de votre routeur !\n⇒ Effectuons la mise à niveau des paquets tiers : `:# opkg update \u0026amp;\u0026amp; opkg list-upgradable` Normalement suite à la mise à niveau, il ne devrait pas y en avoir. S\u0026#39;il y en a, exécutez la commande suivante : ```sh :# for name in `opkg list-upgradable | awk \u0026#39;{print $1}\u0026#39;`; do opkg upgrade \u0026#34;${name}\u0026#34;; done ``` ### Restauration profil utilisateur Pour restaurer le profil utilisateur, on répète les étapes d\u0026#39;installation de l\u0026#39;outil curl, puis du script `opkgscript.sh`. Et une fois installé et les droits d\u0026#39;exécution attribués, on l\u0026#39;exécute pour qu\u0026#39;il complète l\u0026#39;installation du \u0026#34;profil utilisateur\u0026#34; : ```sh :# ./opkgscript.sh -v install ``` Pour finir, mieux vaut redémarrer ! --- ## Ultimes Vérifications Ensuite, vérifier la configuration de votre routeur : * que vos différentes interfaces réseaux soient toujours présentes et opérationnelles. * que votre configuration \u0026#34;firewall\u0026#34; soit correcte ; vérifiez dans les différents onglets votre configuration. * que les différents services, que vous auriez précédement installés, soient toujours opérationnels, tel qu\u0026#39;un tunnel IPv6 (Internet Protocol v6) , OpenVPN, ou tout service accessible depuis le menu \u0026#34;Services\u0026#34;. --- Voilà… Normalement, tout devrait fonctionner correctement en suivant ce processus de mise à niveau. ## Notes Retrouvez ci-dessous différentes notes d\u0026#39;informations utiles, seulement dans certains contextes. ### Flash depuis LuCI Depuis le menu \u0026#34;System\u0026#34; \u0026gt; \u0026#34;Backup / Flash firmware\u0026#34; de l\u0026#39;interface web LuCI : 1/ Il est utile d\u0026#39;aller à l\u0026#39;onglet \u0026#39;Configuration\u0026#39; pour modifier la liste des fichiers personnalisés à sauvegarder aussi… \\ Si les fichiers et autres répertoires relatifs à l\u0026#39;installation de binaires tiers ne sont pas écrits ici, rien ne sera sauvegardé ! 2/ Faites une sauvegarde de votre configuration d\u0026#39;OpenWRT depuis l\u0026#39;onglet \u0026#39;Actions\u0026#39;, section \u0026#39;Backup\u0026#39;. 3/ Lors du processus pour flasher une nouvelle image de mise à niveau : ⇒ Pensez à utiliser les options : - la case à cocher **KEEP SETTINGS AND RETAIN THE CURRENT CONFIGURATION**, à minima - la case à cocher **INCLUDE IN BACKUP A LIST OF CURRENT INSTALLED PACKAGES AT /ETC/BACKUP/INSTALLED_PACKAGES.TXT**, qui inclut une liste des paquets supplémentaires installés par vos soins. Si ces cases ne sont pas cochées, vous perdrez toute votre configuration lié à OpenWRT. De même les binaires tiers seront dans tous les cas à réinstaller, voire à reconfigurer. Gardez à l\u0026#39;esprit QUE des changements induits par les mises à niveau vers une version majeure peuvent poser des soucis lors de la migration. Il peut y avoir des changements critiques. ### À-propos de SSH v9.0 et supérieure Si votre client SSH est de version ≥ 9.0 : À partir de la version 9.0 de SSH, le comportement de `scp` a changé. \\ Dans l\u0026#39;état, la commande ci-dessus échouera avec le message d\u0026#39;erreur suivant : ``` scp router:/tmp/backup-***-2022-04-21.tar.gz . ash: /usr/libexec/sftp-server: not found scp: Connection closed ``` Dans les faits, Dropbear ne peut plus discuter avec… Ajoutez l\u0026#39;option `-O` à la commande `scp`, tel que : `:$ scp -O root@openwrt:/tmp/backup*.tar.gz $(pwd)` *(cela rétablit l\u0026#39;ancien comportement SFTP de scp)* Une autre astuce est d\u0026#39;installer le serveur OpenSSH en lieu et place de Dropbear . ### Libération mémoire Cette section est surtout utile si le système de fichier `/tmp` n\u0026#39;est pas assez grand pour enregistrer l\u0026#39;image d\u0026#39;OpenWRT. Les actions ci-dessous vont permettre de libérer temporairement de l\u0026#39;espace dans la RAM. Par acquis de conscience, assurons-nous de l\u0026#39;espace mémoire et disque avec les commandes `free` et `df`, voire `cat /proc/meminfo` ; le but est de vérifier que **la taille de RAM *libre* est plus importante que la taille de l\u0026#39;image** téléchargée. Si c\u0026#39;est le cas, nous pouvons continuer le processus, sinon, nous avons un sérieux problème et il faut en discuter sur le forum d\u0026#39;OpenWRT. Prenons un exemple pour mieux comprendre : ⇒ la taille du binaire d\u0026#39;upgrade de la version ci-dessus : ```ash :$ ll -h (…) -rw-rw-r-- 1 root root 6.7M Sep 10 13:53 openwrt-22.03.0-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin (…) ``` elle est donc de 6.7 Mo. ⇒ L\u0026#39;espace disponible dans `/tmp` : ```ash :# df -h Filesystem Size Used Available Use% Mounted on /dev/root 3.8M 3.8M 0 100% /rom tmpfs 59.7M 540.0K 59.1M 1% /tmp /dev/ubi0_1 97.2M 7.8M 84.7M 8% /overlay overlayfs:/overlay 97.2M 7.8M 84.7M 8% / tmpfs 512.0K 0 512.0K 0% /dev ``` Dans le contexte du Xiaomi Redmi AC2100, à ce jour, l\u0026#39;espace disponible est de 59.1 Mo, ce qui est largement suffisant pour récupèrer l\u0026#39;image de mise à niveau et la gérer. ⇒ De même, l\u0026#39;espace libérée de mémoire : ```ash :# free -m total used free shared buff/cache available Mem: 122220 40532 61400 540 20288 46700 Swap: 0 0 0 ``` Dans ce contexte, l\u0026#39;espace libre en mémoire est de d\u0026#39;environ 60 Mo. Là, encore, il y a assez d\u0026#39;espace pour gérer l\u0026#39;image de mise à niveau. --- **Si** ainsi, dans votre contexte, l\u0026#39;espace totale disponible, soit celle de la mémoire plus celle en `/tmp` n\u0026#39;est pas assez grande, il est possible d\u0026#39;essayer ce qui suit - supprimer ce qui devient désormais inutile : * les fichiers de listes des paquets : `:# rm -r /tmp/opkg-lists/` * les caches suivants : `:# sync \u0026amp;\u0026amp; echo 3 \u0026gt; /proc/sys/vm/drop_caches` * Et si nécessaire, suppression des pilotes wifi suivants : `:# rm /etc/modules.d/*{80211,ath9k,b43}*` * Pour finir, vérifiez qu\u0026#39;il n\u0026#39;y ait aucun lien symbolique dans le répertoire `/etc/modules.d`, si c\u0026#39;est le cas, détruisez-les, ce qui libérera de la RAM au prochain démarrage, puis **redémarrez absolument OpenWRT** avant de faire la mise à niveau. --- ### À-propos de l\u0026#39;identification de l\u0026#39;hôte à distance par SSH Lors de la nouvelle connexion par SSH, il est normalement possible que vous ayez le droit au message d\u0026#39;erreur suivant : ```sh @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ED25519 key sent by the remote host is SHA256:0atP7BnQQ98EVJciOCBDYAUD245lKm2tbau8BgWMpQ0. Please contact your system administrator. Add correct host key in /home/you/.ssh/known_hosts to get rid of this message. Offending RSA key in /home/you/.ssh/known_hosts:93 remove with: ssh-keygen -f \u0026#34;/home/you/.ssh/known_hosts\u0026#34; -R \u0026#34;192.168.xyz.1\u0026#34; ED25519 host key for 192.168.xyz.1 has changed and you have requested strict checking. Host key verification failed. ``` **Ne paniquez pas, c\u0026#39;est normal !** Ayant changé de version de système d\u0026#39;exploitation, l\u0026#39;identification de l\u0026#39;hôte a changé aussi. Appliquez la commande ssh-keygen, telle que donnée, dans votre cas, pour supprimer l\u0026#39;ancienne identification d\u0026#39;hôte. Puis retentez votre connexion. AttentionAprès la mise à niveau, il est très probable que les machines derrière le routeur n\u0026rsquo;aient plus accès correctement à Internet. C\u0026rsquo;est une phase normale ; ne pas paniquer !\nEn effet, ne pas oublier que sysupgrade supprime toute configuration utilisateur. L\u0026rsquo;étape suivante va d\u0026rsquo;être de restaurer le \u0026ldquo;profil utilisateur\u0026rdquo;.\n### À-propos de la Migration vers ≥ 21.02.0 AttentionPrérequis matériel minimum : À partir de la version 21.02.0, le minimum requis est de 8 Mo de flash, et 64 Mo de RAM. Vous avez choisi de migrer vers la version 21.02.0-*** depuis 19.07.***, c\u0026#39;est bien ! Mais avant de faire toute autre action, connectez-vous à l\u0026#39;interface web, puis sur le menu \u0026#34;Interfaces\u0026#34; ; il va vous être proposé de faire une migration de la configuration, faites-la ! Puis, redémarrez ! --- ### resolv.conf À ce moment de l\u0026#39;étape, il est possible que vous ne puissiez plus communiquer avec l\u0026#39;extérieur, car le fichier `/etc/resolv.conf` est toujours configuré pour la résolution de noms en interne, tel que : ```cfg :# cat /etc/resolv.conf search huc.home nameserver 127.0.0.1 nameserver ::1 ``` Dans ce cas, éditez le fichier pour ajouter un serveur DNS à interroger, tel que ceux de la FDN : `80.67.169.12`, et `2001:910:800::12`. Par exemple : ```sh :# sed -i -e \u0026#39;s/127.0.0.1/80.67.169.12/;s/::1/2001:910:800::12/\u0026#39; /etc/resolv.conf ``` Bien sûr, modifiez à votre convenance ! \u0026lt;!-- Exemple : 8.8.8.8 ! # Cx de Google ! sed -i -e \u0026#39;s/127.0.0.1/8.8.8.8/;s/::1//\u0026#39; /etc/resolv.conf sed -i -e \u0026#39;s/80.67.169.12/8.8.8.8/;s/2001:910:800::12//\u0026#39; /etc/resolv.conf --\u0026gt; ## Documentations Comme vous pourrez le lire dans la documentation du wiki OpenWRT, il y a d\u0026#39;autres méthodes ; celle que je vous propose me semble la plus pertinente… - [Upgrading OpenWrt firmware using LuCI and CLI](https://openwrt.org/docs/guide-user/installation/generic.sysupgrade) - [Upgrading OpenWrt firmware using LuCI](https://openwrt.org/docs/guide-quick-start/sysupgrade.luci) - [Upgrading OpenWrt firmware using CLI](https://openwrt.org/docs/guide-user/installation/sysupgrade.cli) --- ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003eAvant de faire la mise à jour du système, veuillez IMPÉRATIVEMENT bien lire\nl\u0026rsquo;annonce de version faite par le projet OpenWRT, et tout particulièrement les\nchapitres \u0026ldquo;Upgrading to…\u0026rdquo; et \u0026ldquo;Known issues\u0026rdquo;. En effet ces chapitres peuvent\ncontenir des informations relatives à votre routeur ; faire l\u0026rsquo;impasse pourrait\nendommager votre matériel et le rendre inutilisable !\u003c/div\u003e\n\n\u003cp\u003eOpenWRT a un outil pour faire la mise à niveau d\u0026rsquo;une version à une autre\nnommé \u003cstrong\u003esysupgrade\u003c/strong\u003e. Il est possible de l\u0026rsquo;invoquer depuis l\u0026rsquo;interface web\nd\u0026rsquo;administration LuCI.\u003c/p\u003e\n\u003cp\u003eSi le procédé vous intéresse plus que le faire par CLI, lisez la note en\nquestion : \u003ca href=\"/fr/sys/openwrt/sysupgrade/#flash-depuis-luci\"\u003eFlash depuis LuCI\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLe procédé suivant explique pas-à-pas la mise à niveau tout en mode CLI,\ntout en préservant la configuration utilisateur…\u003c/p\u003e\n\u003ch2 id=\"procédé\"\u003eProcédé\u003c/h2\u003e\n\u003cp\u003eLa première chose à laquelle nous veillons est d\u0026rsquo;installer l\u0026rsquo;outil \u003ccode\u003ecurl\u003c/code\u003e,\ncar par défaut le binaire \u003ccode\u003ewget\u003c/code\u003e nativement installé ne supporte pas TLS.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# opkg install curl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### opkgscript.sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLe script \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003eopkgscript.sh\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e permet de sauvegarder la liste des paquets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstallés en sus de la base.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⇒ Récupèrons le depuis \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eopkgscript.sh\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003ehttps://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e:$ curl -O https://raw.githubusercontent.com/richb-hanover/OpenWrtScripts/master/opkgscript.sh\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;!--\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eAu cas où, je mets à disposition le \u003ca href=\"/share/opkgscript\"\u003escript\u003c/a\u003e…\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⇒ Donnons les droits d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;exécution nécessaire :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# chmod 0700 opkgscript.sh`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026lt;!--\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eCopier le localement sur votre machine d\u0026rsquo;administration… surtout qu\u0026rsquo;après la\nmise à niveau, il pourrait être possible que vous n\u0026rsquo;ayez plus momentanément\nInternet, sauf normalement depuis le routeur.\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e--\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ Sauvegardons la liste des paquets installés - *pour pouvoir restaurer\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eaprès la mise à niveau système* :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e:# ./opkgscript.sh -v write\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eLe script écrit la liste dans un fichier `/etc/config/opkg.installed`.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e### Téléchargement firmware\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eDepuis le répertoire `/tmp`, récupèrons la nouvelle version du firmware :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e- e.g. pour la version actuelle :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# v=\u0026#34;24.10.5\u0026#34;`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ pour le routeur **OpenWRT One** :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/mediatek/filogic/{openwrt-\u0026#34;${v}\u0026#34;-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb,sha256sums}`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ pour le routeur **Ubiquiti EdgeRouter X** :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/ramips/mt7621/{openwrt-\u0026#34;${v}\u0026#34;-ramips-mt7621-ubnt_edgerouter-x-squashfs-sysupgrade.bin,sha256sums}`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ pour le **Xiaomi Mi Router AX3000T** :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/mediatek/filogic/{openwrt-\u0026#34;${v}\u0026#34;-mediatek-filogic-xiaomi_mi-router-ax3000t-squashfs-sysupgrade.bin,sha256sums}`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ pour le **Xiaomi Redmi Router AC2100** :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# curl -O https://downloads.openwrt.org/releases/\u0026#34;${v}\u0026#34;/targets/ramips/mt7621/{openwrt-\u0026#34;${v}\u0026#34;-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin,sha256sums}`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e#### Vérification du téléchargement\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ePuis, nous vérifions la somme de contrôle afin de nous assurer du firmware :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e:$ sha256sum -c sha256sums 2\u0026gt; /dev/null | grep OK\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ Résultat correct pour le routeur **OpenWRT One** : \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`openwrt-24.10.4-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb: OK`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Si la vérification échoue, allez en discuter sur le forum !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNe cherchez pas à mettre à jour avec un micro-logiciel corrompu !!!\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e### Sauvegarde configuration\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eL\u0026#39;\u003c/span\u003eétape suivante est de vérifier la configuration de la sauvegarde :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003esh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sysupgrade -l\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSi nécessaire, il faut éditer le fichier pour ajouter certains répertoires/fichiers,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eainsi dans le cas où un \u003ca class=\"inside\" href=\"/fr/sys/openwrt/sudo/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : sudo'\"\u003eutilisateur a été ajouté correctement au groupe `sudo`\u003c/a\u003e\n,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eil faudra ajouter ce qui suit dans le fichier \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e/etc/sysupgrade.conf\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* /etc/sudoers\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* /etc/sudoers.d/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVérifions à nouveau - et sauvegardons la configuration :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003esh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sysupgrade -b /tmp/backup-\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eHOSTNAME\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e-\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edate +%F\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e.tar.gz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eOn peut remarquer que dans la sauvegarde en question se trouve le fichier\n\u003ccode\u003e/etc/config/opkg.installed\u003c/code\u003e précédemment créé avec le script \u003ccode\u003eopkgscript.sh\u003c/code\u003e.\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePuis, il faut récupèrer cette sauvegarde :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e:$ scp root@openwrt:/tmp/backup*.tar.gz \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003epwd\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e*\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eoù \u003cspan style=\"color:#48b685\"\u003e\u0026#39;openwrt\u0026#39;\u003c/span\u003e est l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;adresse IP de votre routeur…)*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eSi vous avez le message d\u0026rsquo;erreur suivant :\n\u003ccode\u003eash: /usr/libexec/sftp-server: not found\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMerci de lire la note ci-dessous \u003ca href=\"/fr/sys/openwrt/sysupgrade/#à-propos-de-ssh-v90-et-supérieure\"\u003eÀ-propos de SSH v9.0 et supérieure\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLa note \u003ca href=\"/fr/sys/openwrt/sysupgrade/#libération-mémoire\"\u003eÀ-propos de la libération de la mémoire\u003c/a\u003e\npeut-être intéressante à lire, mais peu utile dans le contexte des routeurs mis\nen exemple, car dans leur cas, une RAM conséquente est embarquée.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e### Mise à Niveau Système\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ePassons à la mise à niveau système, tel que, par exemple :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# sysupgrade -v openwrt-\u0026#34;${v}\u0026#34;-*-sysupgrade.bin` ou \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# sysupgrade -v openwrt-\u0026#34;${v}\u0026#34;-*-sysupgrade.itb` selon le modèle de routeur.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ Exemple, pour le routeur **OpenWRT One** :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```ash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e:# sysupgrade -v openwrt-\u0026#34;$v\u0026#34;-mediatek-filogic-openwrt_one-squashfs-sysupgrade.itb\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e(date) upgrade: Saving config files...\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/attendedsysupgrade\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/dhcp\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/dropbear\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/firewall\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/https-dns-proxy\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/luci\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/network\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/opkg.installed\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/rpcd\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/system\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/ubihealthd\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/ubootenv\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/uhttpd\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/unbound\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/wifi_schedule\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/config/wireless\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/crontabs/root\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/dropbear/authorized_keys\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/dropbear/dropbear_ed25519_host_key\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/dropbear/dropbear_rsa_host_key\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/fw_env.config\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/group\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/hosts\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/inittab\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/luci-uploads/.placeholder\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/nftables.d/10-custom-filter-chains.nft\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/nftables.d/README\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/opkg/keys/8a11255d14aef6c8\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/opkg/keys/d310c6f2833e97f7\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/passwd\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/profile\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/profile.d/busybox-history-file.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/rc.local\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/shadow\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/shells\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/shinit\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/sysctl.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/sysupgrade.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/uhttpd.crt\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/uhttpd.key\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/unbound/unbound.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eetc/unbound/unbound_ext.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eroot/opkgscript.sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e(date) upgrade: Commencing upgrade. Closing all shell sessions.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eNormalement votre session SSH va se fermer et le routeur démarrer !\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eLors de la reconnexion au routeur depuis votre client SSH, il peut\narriver que la connexion soit empêchée avec le message d\u0026rsquo;erreur suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eWARNING: REMOTE HOST IDENTIFICATION HAS CHANGED\u003c/code\u003e.\nSi c\u0026rsquo;est le cas, merci de lire la note adéquate :\n\u003ca href=\"/fr/sys/openwrt/sysupgrade/#à-propos-de-lidentification-de-lhôte-à-distance-par-ssh\"\u003eÀ-propos de l\u0026rsquo;identification de l\u0026rsquo;hôte à distance par SSH\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eSi jamais vous faites une migration depuis 19.07.x vers 21.02.x ou\nsupérieure, veuillez lire impérativement la note ad hoc :\n\u003ca href=\"/fr/sys/openwrt/sysupgrade/#à-propos-de-la-migration-vers--21020\"\u003eÀ-propos de la Migration vers ≥ 21.02.0\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAprès le reboot, il peut arriver que le routeur n\u0026rsquo;ait plus accès à Internet.\nMerci de vérifier le fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e et de le reconfigurer si\nbesoin.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e#### Vérification nouvelle version\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eÀ partir du moment où vous pourrez vous connecter à nouveau à votre routeur,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003evous retrouverez l\u0026#39;\u003c/span\u003einformation relative à votre nouvelle version :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- depuis LuCI, aller vers \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Status\u0026#34;\u003c/span\u003e \u0026gt; \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Overview\u0026#34;\u003c/span\u003e, celui-ci sera affiché\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    dans la section \u003cspan style=\"color:#48b685\"\u003e\u0026#34;System\u0026#34;\u003c/span\u003e, face à l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;information \u0026#34;Firmware version\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e- en SSH, dans la bannière de connexion affichant ce nouveau numéro de\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    version, comme ci-dessous :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```ash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eBusyBox v1.36.1 (2025-12-17 21:08:22 UTC) built-in shell (ash)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  _______                     ________        __\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e |       |.-----.-----.-----.|  |  |  |.----.|  |_\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e |_______||   __|_____|__|__||________||__|  |____|\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e          |__| W I R E L E S S   F R E E D O M\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e -----------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e OpenWrt 24.10.5, r29087-d9c5716d1d\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e -----------------------------------------------------\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e### Mise à Niveau \u0026#34;tiers\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eSur les routeurs ayant moins de 4 Mo de NVRAM, les mises à jour peuvent\nne pas avoir lieu correctement ; il est nécessaire de s\u0026rsquo;assurer d\u0026rsquo;avoir\nau moins 600 Ko de libre.\u003c/p\u003e\n\u003cp\u003eEssayez de \u003ca href=\"/fr/sys/openwrt/sysupgrade/#libération-mémoire\"\u003elibérer de la mémoire\u003c/a\u003e…\u003c/p\u003e\n\u003cp\u003eVérifiez les caractéristiques techniques de votre routeur !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ Effectuons la mise à niveau des paquets tiers :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`:# opkg update \u0026amp;\u0026amp; opkg list-upgradable`\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eNormalement suite à la mise à niveau, il ne devrait pas y en avoir.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eS\u0026#39;\u003c/span\u003eil y en a, exécutez la commande suivante :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003esh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name in \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003eopkg list-upgradable | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e opkg upgrade \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### Restauration profil utilisateur\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePour restaurer le profil utilisateur, on répète les étapes d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;installation\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ede l\u0026#39;\u003c/span\u003eoutil curl, puis du script \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003eopkgscript.sh\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEt une fois installé et les droits d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;exécution attribués, on l\u0026#39;\u003c/span\u003eexécute pour\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equ\u003cspan style=\"color:#48b685\"\u003e\u0026#39;il complète l\u0026#39;\u003c/span\u003einstallation du \u003cspan style=\"color:#48b685\"\u003e\u0026#34;profil utilisateur\u0026#34;\u003c/span\u003e :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003esh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# ./opkgscript.sh -v install\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePour finir, mieux vaut redémarrer !\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## Ultimes Vérifications\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnsuite, vérifier la configuration de votre routeur :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* que vos différentes interfaces réseaux soient toujours présentes et\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    opérationnelles.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* que votre configuration \u003cspan style=\"color:#48b685\"\u003e\u0026#34;firewall\u0026#34;\u003c/span\u003e soit correcte ; vérifiez dans les\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    différents onglets votre configuration.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* que les différents services, que vous auriez précédement installés,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    soient toujours opérationnels, tel qu\u003cspan style=\"color:#48b685\"\u003e\u0026#39;un tunnel \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPv6 \u003cem\u003e(Internet Protocol v6)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, OpenVPN,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    ou tout service accessible depuis le menu \u0026#34;Services\u0026#34;.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eVoilà…\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eNormalement, tout devrait fonctionner correctement en suivant\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ece processus de mise à niveau.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e## Notes\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eRetrouvez ci-dessous différentes notes d\u0026#39;\u003c/span\u003einformations utiles, seulement\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edans certains contextes.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### Flash depuis LuCI\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDepuis le menu \u003cspan style=\"color:#48b685\"\u003e\u0026#34;System\u0026#34;\u003c/span\u003e \u0026gt; \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Backup / Flash firmware\u0026#34;\u003c/span\u003e de l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;interface web LuCI :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e1/ Il est utile d\u0026#39;\u003c/span\u003ealler à l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;onglet \u0026#39;\u003c/span\u003eConfiguration\u003cspan style=\"color:#48b685\"\u003e\u0026#39; pour modifier la liste\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003edes fichiers personnalisés à sauvegarder aussi… \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eSi les fichiers et autres répertoires relatifs à l\u0026#39;\u003c/span\u003einstallation de binaires\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etiers ne sont pas écrits ici, rien ne sera sauvegardé !\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e2/ Faites une sauvegarde de votre configuration d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OpenWRT depuis l\u0026#39;\u003c/span\u003eonglet\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Actions\u0026#39;\u003c/span\u003e, section \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Backup\u0026#39;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e3/ Lors du processus pour flasher une nouvelle image de mise à niveau :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⇒ Pensez à utiliser les options :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- la \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e à cocher **KEEP SETTINGS AND RETAIN THE CURRENT CONFIGURATION**,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    à minima\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- la \u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e à cocher **INCLUDE IN BACKUP A LIST OF CURRENT INSTALLED PACKAGES AT /ETC/BACKUP/INSTALLED_PACKAGES.TXT**,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    qui inclut une liste des paquets supplémentaires installés par vos soins.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSi ces cases ne sont pas cochées, vous perdrez toute votre configuration\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elié à OpenWRT.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDe même les binaires tiers seront dans tous les cas à réinstaller, voire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eà reconfigurer.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGardez à l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;esprit QUE des changements induits par les mises à niveau vers\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eune version majeure peuvent poser des soucis lors de la migration. Il peut\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ey avoir des changements critiques.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e### À-propos de SSH v9.0 et supérieure\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eSi votre client SSH est de version ≥ 9.0 :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eÀ partir de la version 9.0 de SSH, le comportement de `scp` a changé. \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eDans l\u0026#39;\u003c/span\u003eétat, la commande ci-dessus échouera avec le message d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;erreur suivant :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003escp router:/tmp/backup-***-2022-04-21.tar.gz .\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eash: /usr/libexec/sftp-server: not found\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003escp: Connection closed\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eDans les faits, Dropbear ne peut plus discuter avec…\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eAjoutez l\u0026#39;\u003c/span\u003eoption \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e-O\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e à la commande \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003escp\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e, tel que :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e:$ scp -O root@openwrt:/tmp/backup*.tar.gz \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003epwd\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e*\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ecela rétablit l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ancien comportement SFTP de scp)*\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eUne autre astuce est d\u0026#39;\u003c/span\u003e\u003ca class=\"inside\" href=\"/fr/sys/openwrt/openssh/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : OpenSSH pour remplacer Dropbear'\"\u003einstaller le serveur OpenSSH en lieu et place de Dropbear\u003c/a\u003e\n.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### Libération mémoire\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCette section est surtout utile si le système de fichier \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e/tmp\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e n\u003cspan style=\"color:#48b685\"\u003e\u0026#39;est pas\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eassez grand pour enregistrer l\u0026#39;\u003c/span\u003eimage d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OpenWRT. Les actions ci-dessous\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003evont permettre de libérer temporairement de l\u0026#39;\u003c/span\u003eespace dans la RAM.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePar acquis de conscience, assurons-nous de l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;espace mémoire et disque\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eavec les commandes `free` et `df`, voire `cat /proc/meminfo` ; le but\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eest de vérifier que **la taille de RAM *libre* est plus importante que la\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003etaille de l\u0026#39;\u003c/span\u003eimage** téléchargée. Si c\u003cspan style=\"color:#48b685\"\u003e\u0026#39;est le cas, nous pouvons continuer\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ele processus, sinon, nous avons un sérieux problème et il faut en discuter\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003esur le forum d\u0026#39;\u003c/span\u003eOpenWRT.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePrenons un exemple pour mieux comprendre :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⇒ la taille du binaire d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;upgrade de la version ci-dessus :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```ash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e:$ ll -h\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e(…)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e-rw-rw-r-- 1 root root 6.7M Sep  10 13:53 openwrt-22.03.0-ramips-mt7621-xiaomi_redmi-router-ac2100-squashfs-sysupgrade.bin\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e(…)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eelle est donc de 6.7 Mo.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e⇒ L\u0026#39;\u003c/span\u003eespace disponible dans \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e/tmp\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003eash\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# df -h\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFilesystem                Size      Used Available Use% Mounted on\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/root                 3.8M      3.8M         \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e 100% /rom\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etmpfs                    59.7M    540.0K     59.1M   1% /tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/ubi0_1              97.2M      7.8M     84.7M   8% /overlay\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoverlayfs:/overlay       97.2M      7.8M     84.7M   8% /\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etmpfs                   512.0K         \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e    512.0K   0% /dev\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDans le contexte du Xiaomi Redmi AC2100, à ce jour, l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;espace disponible\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eest de 59.1 Mo, ce qui est largement suffisant pour récupèrer l\u0026#39;\u003c/span\u003eimage\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ede mise à niveau et la gérer.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⇒ De même, l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;espace libérée de mémoire :\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```ash\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e:# free -m\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e              total        used        free      shared  buff/cache   available\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eMem:         122220       40532       61400         540       20288       46700\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eSwap:             0           0           0\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eDans ce contexte, l\u0026#39;\u003c/span\u003eespace libre en mémoire est de d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;environ 60 Mo. Là,\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eencore, il y a assez d\u0026#39;\u003c/span\u003eespace pour gérer l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;image de mise à niveau.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e**Si** ainsi, dans votre contexte, l\u0026#39;\u003c/span\u003eespace totale disponible, soit celle de\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ela mémoire plus celle en \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e/tmp\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e n\u003cspan style=\"color:#48b685\"\u003e\u0026#39;est pas assez grande, il est possible\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ed\u0026#39;\u003c/span\u003eessayer ce qui suit - supprimer ce qui devient désormais inutile :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* les fichiers de listes des paquets :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e:# rm -r /tmp/opkg-lists/\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* les caches suivants :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e:# sync \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e echo \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u0026gt; /proc/sys/vm/drop_caches\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* Et si nécessaire, suppression des pilotes wifi suivants :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e:# rm /etc/modules.d/*\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e80211,ath9k,b43\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e*\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e* Pour finir, vérifiez qu\u003cspan style=\"color:#48b685\"\u003e\u0026#39;il n\u0026#39;\u003c/span\u003ey ait aucun lien symbolique dans le répertoire\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e/etc/modules.d\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e, si c\u003cspan style=\"color:#48b685\"\u003e\u0026#39;est le cas, détruisez-les, ce qui libérera de\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    la RAM au prochain démarrage, puis **redémarrez absolument OpenWRT**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    avant de faire la mise à niveau.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e### À-propos de l\u0026#39;\u003c/span\u003eidentification de l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;hôte à distance par SSH\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eLors de la nouvelle connexion par SSH, il est normalement possible que\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003evous ayez le droit au message d\u0026#39;\u003c/span\u003eerreur suivant :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003esh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSomeone could be eavesdropping on you right now \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eman-in-the-middle attack\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIt is also possible that a host key has just been changed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThe fingerprint \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e the ED25519 key sent by the remote host is\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSHA256:0atP7BnQQ98EVJciOCBDYAUD245lKm2tbau8BgWMpQ0.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePlease contact your system administrator.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAdd correct host key in /home/you/.ssh/known_hosts to get rid of this message.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOffending RSA key in /home/you/.ssh/known_hosts:93\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  remove with:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  ssh-keygen -f \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/home/you/.ssh/known_hosts\u0026#34;\u003c/span\u003e -R \u003cspan style=\"color:#48b685\"\u003e\u0026#34;192.168.xyz.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eED25519 host key \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e 192.168.xyz.1 has changed and you have requested strict checking.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eHost key verification failed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e**Ne paniquez pas, c\u003cspan style=\"color:#48b685\"\u003e\u0026#39;est normal !**\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eAyant changé de version de système d\u0026#39;\u003c/span\u003eexploitation, l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;identification de l\u0026#39;\u003c/span\u003ehôte\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea changé aussi.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAppliquez la commande ssh-keygen, telle que donnée, dans votre cas, pour\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esupprimer l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ancienne identification d\u0026#39;\u003c/span\u003ehôte. Puis retentez votre connexion.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eAprès la mise à niveau, il est très probable que les machines derrière le\nrouteur n\u0026rsquo;aient plus accès correctement à Internet. \u003cbr\u003e\nC\u0026rsquo;est une phase normale ; ne pas paniquer !\u003c/p\u003e\n\u003cp\u003eEn effet, ne pas oublier que \u003ccode\u003esysupgrade\u003c/code\u003e supprime toute configuration utilisateur.\nL\u0026rsquo;étape suivante va d\u0026rsquo;être de restaurer le \u0026ldquo;profil utilisateur\u0026rdquo;.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### À-propos de la Migration vers ≥ 21.02.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003ePrérequis matériel minimum\u003c/strong\u003e : À partir de la version 21.02.0, le minimum\nrequis est de 8 Mo de flash, et 64 Mo de RAM.\u003c/div\u003e\n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVous avez choisi de migrer vers la version 21.02.0-*** depuis 19.07.***,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ec\u003cspan style=\"color:#48b685\"\u003e\u0026#39;est bien !\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eMais avant de faire toute autre action, connectez-vous à l\u0026#39;\u003c/span\u003einterface web,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epuis sur le menu \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Interfaces\u0026#34;\u003c/span\u003e ; il va vous être proposé de faire une\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emigration de la configuration, faites-la !\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePuis, redémarrez !\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### resolv.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eÀ ce moment de l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;étape, il est possible que vous ne puissiez plus\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ecommuniquer avec l\u0026#39;\u003c/span\u003eextérieur, car le fichier \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e/etc/resolv.conf\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e est\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etoujours configuré pour la résolution de noms en interne, tel que :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003ecfg\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cat /etc/resolv.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esearch huc.home\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enameserver 127.0.0.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enameserver ::1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDans ce cas, éditez le fichier pour ajouter un serveur DNS à interroger,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etel que ceux de la FDN : \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e80.67.169.12\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e, et \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e2001:910:800::12\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePar exemple :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003esh\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s/127.0.0.1/80.67.169.12/;s/::1/2001:910:800::12/\u0026#39;\u003c/span\u003e /etc/resolv.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e```\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBien sûr, modifiez à votre convenance !\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;!--\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eExemple : 8.8.8.8 ! \u003cspan style=\"color:#776e71\"\u003e# Cx de Google !\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s/127.0.0.1/8.8.8.8/;s/::1//\u0026#39;\u003c/span\u003e /etc/resolv.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s/80.67.169.12/8.8.8.8/;s/2001:910:800::12//\u0026#39;\u003c/span\u003e /etc/resolv.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## Documentations\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eComme vous pourrez le lire dans la documentation du wiki OpenWRT, il y a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ed\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003eautres méthodes ; celle que je vous propose me semble la plus pertinente…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eUpgrading OpenWrt firmware using LuCI and CLI\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003ehttps://openwrt.org/docs/guide-user/installation/generic.sysupgrade\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eUpgrading OpenWrt firmware using LuCI\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003ehttps://openwrt.org/docs/guide-quick-start/sysupgrade.luci\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eUpgrading OpenWrt firmware using CLI\u003cspan style=\"color:#5bc4bf\"\u003e](\u003c/span\u003ehttps://openwrt.org/docs/guide-user/installation/sysupgrade.cli\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e---\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e",
            "summary": "Comment mettre à niveau correctement OpenWRT… sans perdre de données de configuration utilisateur (+) explications pour la migration vers une version majeure ; routeurs servis comme exemple : OpenWRT One, Ubiquiti EdgeRouter X, Xiaomi Redmi AC2100, Xiaomi Mi Router AX3000T",
            "tags": ["OpenWRT", "sysupgrade", "opkg", "sysadmin", "router", "Ubiquiti", "EdgeRouter", "Xiaomi", "Mi", "Redmi", "AC2100", "AX3000T", "One"],
            "date_published": "2020-09-14T18:03:35+02:00",
            "date_modified": "2025-12-22T13:43:32+01:00"
        },{
            "id": "urn:uuid:922551ea-9661-b87a-48a2-12e929b3561c",
            "url": "http://doc.huc.fr.eu.org/fr/trad/bsdhowto.ch/malware/",
            "title": "Comment construire un serveur de scan de malware",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;How to build a malware scan server\u0026rdquo;, écrit par Bruno Flückiger.\nDate : 2020-05-16\nIntroduction Récemment, j\u0026rsquo;ai eu la tâche de construire, au travail, un serveur de scan de malware supportant ICAP. Actuellement, nous utilisons RedHat Enterprise Linux. Mais c-icap n\u0026rsquo;est pas disponible en tant que paquet dans un des dépôts de confiance, alors j\u0026rsquo;ai décidé d\u0026rsquo;utiliser OpenBSD pour cette tâche.\nLe serveur de scan de malware utilise ClamAV en tant que scanner de malware et c-icap en tant que serveur ICAP, fournissant une interface pour chaque produit qui supporte ICAP tel Squid.\nInstallation des paquets C\u0026rsquo;est une tâche très simple, un seul paquet s\u0026rsquo;occupe de tout : $ doas pkg_add -i c-icap-clamav\nCe paquet contient le module c-icap pour ClamAV qui installe c-icap et clamav en dépendances.\nConfiguration de ClamAV Deux des trois démons installés par ClamAv sont d\u0026rsquo;intérêt : freshclam et clamd. En premier, configurez freshclam afin de vous assurer que la base de données des malware de ClamAV reste à jour.\nLe fichier /etc/freshclam.conf contient les paramètres suivants :\nLogTime yes LogSyslog yes LogFacility LOG_DAEMON DatabaseMirror db.ch.clamav.net DatabaseMirror database.clamav.net NotifyClamd /etc/clamd.conf Maintenant, activez et démarrez freshclam afin qu\u0026rsquo;il mette à jour la signature de la base de donnée de ClamAV :\n$ doas rcctl enable freshclam $ doas rcctl start freshclam Ensuite, configurez clamd. Dans le fichier /etc/clamd.conf, les lignes suivantes sont paramétrées :\nLogTime yes LogSyslog yes LogFacility LOG_DAEMON TemporaryDirectory /tmp LocalSocket /var/clamav/clamd.sock TCPSocket 3310 TCPAddr 127.0.0.1 User _clamav DetectPUA yes AlertEncrypted yes AlertEncryptedArchive yes AlertEncryptedDoc yes AlertOLE2Macros yes AlertPhishingSSLMismatch yes AlertPhishingCloak yes MaxRecursion 12 La dernière partie de configuration est à-propos de c-icap. Deux fichiers de configurations ont besoin de modifications avant de permettre à c-icap d\u0026rsquo;utiliser ClamAV en tant que scanner de malware.\nLe premier est /etc/c-icap/c-icap.conf. Ajoutez les lignes suivantes :\nInclude /etc/c-icap/clamd_mod.conf Include /etc/c-icap/virus_scan.conf Vous devriez changer les valeurs suivantes dans ce fichier de manière significative et différente :\nServerAdmin admin@example.org ServerName scanner.example.org TmpDir /tmp Il y a un défaut dans le fichier de configuration à-propos de la journalisation. L\u0026rsquo;option Logger est paramétrée vers sys_logger. Mais le module sys_logger requis est chargé seulement plus tard dans le fichier de configuration. Si vous voulez utiliser sys_logger, vous devez charger le module avant de paramétrer l\u0026rsquo;option Logger. Cela empêchera c-icap de démarrer, bien que rcctl(8) retournera ok. Soit vous changez l\u0026rsquo;option Logger vers file_logger soit vous déplacez les blocs dans le fichier de configuration pour utiliser sys_logger.\nDans le fichier /etc/c-icap/clamd_scan.conf, faites les paramétrages suivants :\nclamd_mod.ClamdHost 127.0.0.1 clamd_mod.ClamdPort 3310 Démarrer les services Puisque toute la configuration est faite, c\u0026rsquo;est maintenant le moment d\u0026rsquo;activer et de démarrer les services :\n$ for s in clamd c_icap ; do \u0026gt; rcctl enable $s \u0026gt; rcctl start $s \u0026gt; done Soyez patient avec clamd. Il prend du temps à démarrer parce qu\u0026rsquo;il vérifie la base de données des signatures.\nTester le serveur ICAP Tester votre démarrage est facile parce que c-icap est fourni avec un client ICAP pour cette tâche : c-icap-client. Appellez-le sans arguments effectuera un simple appel d\u0026rsquo;OPTIONS pour vérifier si le server fonctionne :\n$ c-icap-client ICAP server:localhost, ip:127.0.0.1, port:1344 OPTIONS: Allow 204: Yes Preview: 1024 Keep alive: Yes ICAP HEADERS: ICAP/1.0 200 OK Methods: RESPMOD, REQMOD Service: C-ICAP/0.5.6 server - Echo demo service ISTag: CI0001-XXXXXXXXX Transfer-Preview: * Options-TTL: 3600 Date: Sat, 16 May 2020 10:02:03 GMT Preview: 1024 Allow: 204 X-Include: X-Authenticated-User, X-Authenticated-Groups Encapsulated: null-body=0 Remerciements Avec l\u0026rsquo;aimable autorisation de Bruno Flückiger !\nCette page est la traduction de la page How to build a malware scan server du site BSDHowto.ch.\nHistorique J\u0026rsquo;ai écrit historiquement cette traduction sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://www.bsdhowto.ch/malware.html\" rel=\"external\"\u003eHow to build a malware scan server\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Bruno Flückiger.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDate : 2020-05-16\u003c/p\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eRécemment, j\u0026rsquo;ai eu la tâche de construire, au travail, un serveur de\nscan de malware supportant \u003ca href=\"https://tools.ietf.org/html/rfc3507\" rel=\"external\"\u003eICAP\u003c/a\u003e.\nActuellement, nous utilisons RedHat Enterprise Linux. Mais\n\u003ca href=\"http://c-icap.sourceforge.net/\" rel=\"external\"\u003ec-icap\u003c/a\u003e n\u0026rsquo;est pas disponible en tant\nque paquet dans un des dépôts de confiance, alors j\u0026rsquo;ai décidé d\u0026rsquo;utiliser\n\u003ca href=\"https://www.openbsd.org/\" rel=\"external\"\u003eOpenBSD\u003c/a\u003e pour cette tâche.\u003c/p\u003e\n\u003cp\u003eLe serveur de scan de malware utilise \u003ca href=\"https://www.clamav.net/\" rel=\"external\"\u003eClamAV\u003c/a\u003e\nen tant que scanner de malware et c-icap en tant que serveur ICAP,\nfournissant une interface pour chaque produit qui supporte ICAP tel\n\u003ca href=\"http://www.squid-cache.org/\" rel=\"external\"\u003eSquid\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation-des-paquets\"\u003eInstallation des paquets\u003c/h2\u003e\n\u003cp\u003eC\u0026rsquo;est une tâche très simple, un seul paquet s\u0026rsquo;occupe de tout :\n\u003ccode\u003e$ doas pkg_add -i c-icap-clamav\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCe paquet contient le module c-icap pour ClamAV qui installe c-icap et\nclamav en dépendances.\u003c/p\u003e\n\u003ch2 id=\"configuration-de-clamav\"\u003eConfiguration de ClamAV\u003c/h2\u003e\n\u003cp\u003eDeux des trois démons installés par ClamAv sont d\u0026rsquo;intérêt : freshclam et\nclamd. En premier, configurez freshclam afin de vous assurer que la base\nde données des malware de ClamAV reste à jour.\u003c/p\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/freshclam.conf\u003c/code\u003e contient les paramètres suivants :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLogTime yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLogSyslog yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLogFacility LOG_DAEMON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDatabaseMirror db.ch.clamav.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDatabaseMirror database.clamav.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eNotifyClamd /etc/clamd.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMaintenant, activez et démarrez freshclam afin qu\u0026rsquo;il mette à jour la\nsignature de la base de donnée de ClamAV :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl enable freshclam\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl start freshclam\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, configurez clamd. Dans le fichier \u003ccode\u003e/etc/clamd.conf\u003c/code\u003e, les lignes\nsuivantes sont paramétrées :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLogTime yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLogSyslog yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLogFacility LOG_DAEMON\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eTemporaryDirectory /tmp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLocalSocket /var/clamav/clamd.sock\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eTCPSocket 3310\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eTCPAddr 127.0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUser _clamav\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eDetectPUA yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAlertEncrypted yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAlertEncryptedArchive yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAlertEncryptedDoc yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAlertOLE2Macros yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAlertPhishingSSLMismatch yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eAlertPhishingCloak yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eMaxRecursion 12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa dernière partie de configuration est à-propos de c-icap. Deux fichiers\nde configurations ont besoin de modifications avant de permettre à c-icap\nd\u0026rsquo;utiliser ClamAV en tant que scanner de malware.\u003c/p\u003e\n\u003cp\u003eLe premier est \u003ccode\u003e/etc/c-icap/c-icap.conf\u003c/code\u003e. Ajoutez les lignes suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eInclude /etc/c-icap/clamd_mod.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eInclude /etc/c-icap/virus_scan.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous devriez changer les valeurs suivantes dans ce fichier de manière\nsignificative et différente :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eServerAdmin admin@example.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eServerName scanner.example.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eTmpDir /tmp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl y a un défaut dans le fichier de configuration à-propos de la\njournalisation. L\u0026rsquo;option \u003ccode\u003eLogger\u003c/code\u003e est paramétrée vers \u003ccode\u003esys_logger\u003c/code\u003e.\nMais le module \u003ccode\u003esys_logger\u003c/code\u003e requis est chargé seulement plus tard dans\nle fichier de configuration. Si vous voulez utiliser \u003ccode\u003esys_logger\u003c/code\u003e, vous\ndevez charger le module avant de paramétrer l\u0026rsquo;option \u003ccode\u003eLogger\u003c/code\u003e. Cela\nempêchera c-icap de démarrer, bien que \u003ca href=\"https://man.openbsd.org/rcctl\" rel=\"external\"\u003ercctl(8)\u003c/a\u003e\nretournera ok. Soit vous changez l\u0026rsquo;option \u003ccode\u003eLogger\u003c/code\u003e vers \u003ccode\u003efile_logger\u003c/code\u003e\nsoit vous déplacez les blocs dans le fichier de configuration pour\nutiliser \u003ccode\u003esys_logger\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDans le fichier \u003ccode\u003e/etc/c-icap/clamd_scan.conf\u003c/code\u003e, faites les paramétrages\nsuivants :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eclamd_mod.ClamdHost 127.0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eclamd_mod.ClamdPort 3310\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"démarrer-les-services\"\u003eDémarrer les services\u003c/h2\u003e\n\u003cp\u003ePuisque toute la configuration est faite, c\u0026rsquo;est maintenant le moment\nd\u0026rsquo;activer et de démarrer les services :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e s in clamd c_icap ; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; rcctl enable \u003cspan style=\"color:#ef6155\"\u003e$s\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; rcctl start \u003cspan style=\"color:#ef6155\"\u003e$s\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSoyez patient avec clamd. Il prend du temps à démarrer parce qu\u0026rsquo;il\nvérifie la base de données des signatures.\u003c/p\u003e\n\u003ch2 id=\"tester-le-serveur-icap\"\u003eTester le serveur ICAP\u003c/h2\u003e\n\u003cp\u003eTester votre démarrage est facile parce que c-icap est fourni avec un\nclient ICAP pour cette tâche : c-icap-client. Appellez-le sans arguments\neffectuera un simple appel d\u0026rsquo;OPTIONS pour vérifier si le server fonctionne :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ c-icap-client\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eICAP server:localhost, ip:127.0.0.1, port:1344\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOPTIONS:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Allow 204: Yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Preview: \u003cspan style=\"color:#f99b15\"\u003e1024\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Keep alive: Yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eICAP HEADERS:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ICAP/1.0 \u003cspan style=\"color:#f99b15\"\u003e200\u003c/span\u003e OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Methods: RESPMOD, REQMOD\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Service: C-ICAP/0.5.6 server - Echo demo service\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ISTag: CI0001-XXXXXXXXX\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Transfer-Preview: *\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Options-TTL: \u003cspan style=\"color:#f99b15\"\u003e3600\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Date: Sat, \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e May \u003cspan style=\"color:#f99b15\"\u003e2020\u003c/span\u003e 10:02:03 GMT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Preview: \u003cspan style=\"color:#f99b15\"\u003e1024\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Allow: \u003cspan style=\"color:#f99b15\"\u003e204\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    X-Include: X-Authenticated-User, X-Authenticated-Groups\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Encapsulated: null-body\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eAvec l\u0026rsquo;aimable autorisation de Bruno Flückiger !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCette page est la traduction de la page\n\u003cstrong\u003e\u003ca href=\"https://www.bsdhowto.ch/malware.html\" rel=\"external\"\u003eHow to build a malware scan server\u003c/a\u003e\u003c/strong\u003e du site \u003cstrong\u003eBSDHowto.ch\u003c/strong\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette traduction sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Traduction EN → FR de l'article 'How to build a malware scan server' de l'auteur Bruno Flückiger.",
            "tags": ["Traduction", "OpenBSD", "malware"],
            "date_published": "2020-08-29T15:04:08+02:00",
            "date_modified": "2023-05-03T06:30:55+02:00"
        },{
            "id": "urn:uuid:4520d57d-93dc-c690-c6b1-593d26f588fc",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/help/",
            "title": "help : aide pour les nouveaux utilisateurs et administrateurs, sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Utilisation help en ligne de commande 8-)\nDocumentation man help man help Description Ce document a pour but de familiariser les nouveaux utilisateurs et administrateurs systèmes avec OpenBSD et, si nécessaire, avec UNIX en général.\nEn premier, une mine d\u0026rsquo;informations est contenue dans les pages de manuel système. Dans UNIX, la commande man(1) est utilisée pour les voir. Écrivez man man pour avoir les instructions à-propos de comment l\u0026rsquo;utiliser correctement. Prêtez une attention spéciale à l\u0026rsquo;option -k.\nD\u0026rsquo;autres références à OpenBSD incluent la FAQ (Foire aux Questions) localisée à https://www.openbsd.org/faq/, qui est plus à l\u0026rsquo;attention des administrateurs et qui présume que le lecteur possède une certaine connaissance d\u0026rsquo;UNIX. Il y a aussi des listes de diffusion en place où des questions sont posées aux développeurs d\u0026rsquo;OpenBSD et à d\u0026rsquo;autres utilisateurs ; voir https://www.openbsd.org/mail.html.\nLes administrateurs systèmes devraient toujours lire la page de manuel afterboot(8) qui explique une variété de tâches qui sont typiquement assumées après le premier démarrage du système. Durant la configuration du système, considérez en premier toutes implications de sécurité possibles qui peuvent résulter de vos changements.\nLe shell Unix Après être connecté, certains messages systèmes sont typiquement affichés, ensuite l\u0026rsquo;utilisateur est capable d\u0026rsquo;entrer des commandes à exécuter par le programme shell. Le shell est un interpréteur en ligne de commande qui lit les entrées utilisateur (normalement depuis un terminal) et exécute des commandes. Différents shells sont disponibles ; OpenBSD est fourni avec csh(1), ksh(1), et sh(1). Chaque shell utilisateur est indiqué dans le dernier champ correspondant à l\u0026rsquo;entrée dans le fichier système password (/etc/passwd).\nCommandes de base Unix man interface aux pages de manuel système. Concernant toutes les commandes listées ci-dessous, écrivez man command pour obtenir l\u0026rsquo;information détaillée sur ce qu\u0026rsquo;elle fait et comment l\u0026rsquo;utiliser.\npwd imprime le chemin en cours. Les fichiers sont organisés en hiérarchie (voir hier(7) appelée arborescence. Cette commande indiquera dans quel répertoire vous êtes actuellement localisé.\ncd change le chemin de travail. Utilisez cette commande pour naviguer au-travers de la hiérarchie fichier. Par exemple, écrivez cd / pour changer de répertoire de travail vers root.\nls liste le contenu du répertoire. Écrivez ls -l pour une liste détaillée.\ncat bien qu\u0026rsquo;il est plusieurs utilisations possibles, cat filename affichera le contenu d\u0026rsquo;un fichier texte à l\u0026rsquo;écran.\nvi édite les fichiers textes. Par exemple, vi filename. Voir aussi mg(1).\nmkdir crée un répertoire. Par exemple, mkdir dirname.\nrmdir supprime un répertoire.\nrm supprime des fichiers. Les fichiers sont généralement supprimés par leurs propriétaires. Voir la commande chmod(1) pour avoir les informations sur les permissions de fichier.\nchmod change les modes de fichier, incluant les permissions. L\u0026rsquo;utilisation n\u0026rsquo;est pas immédiatement évidente ; veuillez lire sa page de manuel avec attention, à-propos des permissions de fichiers, spécifiquement sur les fichiers systèmes, qui sont vitaux pour maintenir la sécurité et l\u0026rsquo;intégrité.\ncp copie des fichiers.\nmv déplace et renomme des fichiers.\nps liste les processus actifs. La plupart des systèmes basés sur UNIX, incluant OpenBSD, sont multi-tâches, ce qui signifie que beaucoup de programment partagent les ressources systèmes en même temps. Un usage commun est ps -auxw, qui affichera les informations à-propos de tous les processus actifs.\nkill tue les processus. Utilisé la plupart du temps pour arrêter des programmes ne s\u0026rsquo;exécutant pas normalement, mais aussi pour signaler des programmes demandant certaines opérations (e.g., relire leur configuration).\ndate affiche la date et l\u0026rsquo;heure système actuelle.\nmail accède à la boite mail.\nexit se déconnecte du système.\nQuand une commande est entrée, il est vérifié en premier si elle est interne au shell. Si ce n\u0026rsquo;est pas le cas, le shell parcours tout répertoire contenu dans la variable d\u0026rsquo;environnement PATH (voir environ(7)). Si la commande n\u0026rsquo;est pas trouvée, un message d\u0026rsquo;erreur est affiché. Autrement, le shell exécute la commande, passant les arguments spécifiés dans la ligne de commande.\nLes commandes internes au shell n\u0026rsquo;ont pas leur propre page de manuel, il est ainsi nécessaire de lire la page de manuel du shell utilisateur. Des outils tels que which(1) et \u0026ldquo;whence\u0026rdquo;, une commande interne à ksh(1), peuvent être utilisés pour voir les commandes en cours d\u0026rsquo;exécution.\nVoir aussi csh(1), ksh(1), man(1), whatis(1), whereis(1), which(1), afterboot(8) Histoire Cette page de manuel a été écrite par Aaron Campbell aaron@openbsd.org et est apparue la première fois dans OpenBSD 2.6.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003ehelp\u003c/code\u003e en ligne de commande 8-)\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/help/#man-help\"\u003eman help\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-help\"\u003eman help\u003c/h3\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003eCe document a pour but de familiariser les nouveaux utilisateurs et administrateurs\nsystèmes avec OpenBSD et, si nécessaire, avec UNIX en général.\u003c/p\u003e\n\u003cp\u003eEn premier, une mine d\u0026rsquo;informations est contenue dans les pages de manuel\nsystème. Dans UNIX, la commande \u003ca href=\"https://man.openbsd.org/man\" rel=\"external\"\u003eman(1)\u003c/a\u003e est\nutilisée pour les voir. Écrivez \u003cstrong\u003eman man\u003c/strong\u003e pour avoir les instructions\nà-propos de comment l\u0026rsquo;utiliser correctement. Prêtez une attention spéciale\nà l\u0026rsquo;option \u003cstrong\u003e-k\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eD\u0026rsquo;autres références à OpenBSD incluent la FAQ (Foire aux Questions) localisée\nà \u003cstrong\u003e\u003ca href=\"https://www.openbsd.org/faq/\" rel=\"external\"\u003ehttps://www.openbsd.org/faq/\u003c/a\u003e\u003c/strong\u003e, qui est plus à l\u0026rsquo;attention des administrateurs\net qui présume que le lecteur possède une certaine connaissance d\u0026rsquo;UNIX.\nIl y a aussi des listes de diffusion en place où des questions sont posées\naux développeurs d\u0026rsquo;OpenBSD et à d\u0026rsquo;autres utilisateurs ;\nvoir \u003cstrong\u003e\u003ca href=\"https://www.openbsd.org/mail.html\" rel=\"external\"\u003ehttps://www.openbsd.org/mail.html\u003c/a\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLes administrateurs systèmes devraient toujours lire la page de manuel\n\u003ca href=\"https://man.openbsd.org/afterboot.8\" rel=\"external\"\u003eafterboot(8)\u003c/a\u003e qui explique une variété\nde tâches qui sont typiquement assumées après le premier démarrage du système.\nDurant la configuration du système, considérez en premier toutes implications\nde sécurité possibles qui peuvent résulter de vos changements.\u003c/p\u003e\n\u003ch5 id=\"le-shell-unix\"\u003eLe shell Unix\u003c/h5\u003e\n\u003cp\u003eAprès être connecté, certains messages systèmes sont typiquement affichés,\nensuite l\u0026rsquo;utilisateur est capable d\u0026rsquo;entrer des commandes à exécuter par\nle programme shell. Le shell est un interpréteur en ligne de commande qui\nlit les entrées utilisateur (normalement depuis un terminal) et exécute\ndes commandes. Différents shells sont disponibles ; OpenBSD est fourni avec\n\u003ca href=\"https://man.openbsd.org/csh\" rel=\"external\"\u003ecsh(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/ksh\" rel=\"external\"\u003eksh(1)\u003c/a\u003e,\net \u003ca href=\"https://man.openbsd.org/sh\" rel=\"external\"\u003esh(1)\u003c/a\u003e. Chaque shell utilisateur est indiqué\ndans le dernier champ correspondant à l\u0026rsquo;entrée dans le fichier système\npassword (\u003cstrong\u003e/etc/passwd\u003c/strong\u003e).\u003c/p\u003e\n\u003ch5 id=\"commandes-de-base-unix\"\u003eCommandes de base Unix\u003c/h5\u003e\n\u003cp\u003e\u003cstrong\u003eman\u003c/strong\u003e interface aux pages de manuel système. Concernant toutes les commandes\nlistées ci-dessous, écrivez \u003cstrong\u003eman\u003c/strong\u003e \u003cstrong\u003ecommand\u003c/strong\u003e pour obtenir l\u0026rsquo;information\ndétaillée sur ce qu\u0026rsquo;elle fait et comment l\u0026rsquo;utiliser.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003epwd\u003c/strong\u003e imprime le chemin en cours. Les fichiers sont organisés en hiérarchie\n(voir \u003ca href=\"https://man.openbsd.org/hier.7\" rel=\"external\"\u003ehier(7)\u003c/a\u003e appelée arborescence.\nCette commande indiquera dans quel répertoire vous êtes actuellement localisé.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecd\u003c/strong\u003e change le chemin de travail. Utilisez cette commande pour naviguer\nau-travers de la hiérarchie fichier. Par exemple, écrivez \u003cstrong\u003ecd /\u003c/strong\u003e pour\nchanger de répertoire de travail vers root.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003els\u003c/strong\u003e liste le contenu du répertoire. Écrivez \u003cstrong\u003els -l\u003c/strong\u003e pour une liste\ndétaillée.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecat\u003c/strong\u003e bien qu\u0026rsquo;il est plusieurs utilisations possibles,\n\u003cstrong\u003ecat\u003c/strong\u003e \u003cstrong\u003efilename\u003c/strong\u003e affichera le contenu d\u0026rsquo;un fichier texte à l\u0026rsquo;écran.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003evi\u003c/strong\u003e édite les fichiers textes. Par exemple, \u003cstrong\u003evi\u003c/strong\u003e \u003cstrong\u003efilename\u003c/strong\u003e.\nVoir aussi \u003ca href=\"https://man.openbsd.org/mg\" rel=\"external\"\u003emg(1)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emkdir\u003c/strong\u003e crée un répertoire. Par exemple, \u003cstrong\u003emkdir\u003c/strong\u003e \u003cstrong\u003edirname\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ermdir\u003c/strong\u003e supprime un répertoire.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003erm\u003c/strong\u003e supprime des fichiers. Les fichiers sont généralement supprimés\npar leurs propriétaires. Voir la commande \u003ca href=\"https://man.openbsd.org/chmod\" rel=\"external\"\u003echmod(1)\u003c/a\u003e\npour avoir les informations sur les permissions de fichier.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003echmod\u003c/strong\u003e change les modes de fichier, incluant les permissions.\nL\u0026rsquo;utilisation n\u0026rsquo;est pas immédiatement évidente ; veuillez lire sa page\nde manuel avec attention, à-propos des permissions de fichiers, spécifiquement\nsur les fichiers systèmes, qui sont vitaux pour maintenir la sécurité et\nl\u0026rsquo;intégrité.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ecp\u003c/strong\u003e copie des fichiers.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emv\u003c/strong\u003e déplace et renomme des fichiers.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eps\u003c/strong\u003e liste les processus actifs. La plupart des systèmes basés sur UNIX,\nincluant OpenBSD, sont multi-tâches, ce qui signifie que beaucoup de programment\npartagent les ressources systèmes en même temps. Un usage commun est \u003cstrong\u003eps -auxw\u003c/strong\u003e,\nqui affichera les informations à-propos de tous les processus actifs.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ekill\u003c/strong\u003e tue les processus. Utilisé la plupart du temps pour arrêter des\nprogrammes ne s\u0026rsquo;exécutant pas normalement, mais aussi pour signaler des\nprogrammes demandant certaines opérations (e.g., relire leur configuration).\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003edate\u003c/strong\u003e affiche la date et l\u0026rsquo;heure système actuelle.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003email\u003c/strong\u003e accède à la boite mail.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eexit\u003c/strong\u003e se déconnecte du système.\u003c/p\u003e\n\u003cp\u003eQuand une commande est entrée, il est vérifié en premier si elle est interne\nau shell. Si ce n\u0026rsquo;est pas le cas, le shell parcours tout répertoire contenu\ndans la variable d\u0026rsquo;environnement PATH (voir \u003ca href=\"https://man.openbsd.org/environ.7\" rel=\"external\"\u003eenviron(7)\u003c/a\u003e).\nSi la commande n\u0026rsquo;est pas trouvée, un message d\u0026rsquo;erreur est affiché.\nAutrement, le shell exécute la commande, passant les arguments spécifiés\ndans la ligne de commande.\u003c/p\u003e\n\u003cp\u003eLes commandes internes au shell n\u0026rsquo;ont pas leur propre page de manuel, il\nest ainsi nécessaire de lire la page de manuel du shell utilisateur.\nDes outils tels que \u003ca href=\"https://man.openbsd.org/which\" rel=\"external\"\u003ewhich(1)\u003c/a\u003e et \u0026ldquo;whence\u0026rdquo;,\nune commande interne à \u003ca href=\"https://man.openbsd.org/ksh\" rel=\"external\"\u003eksh(1)\u003c/a\u003e, peuvent être\nutilisés pour voir les commandes en cours d\u0026rsquo;exécution.\u003c/p\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/csh\" rel=\"external\"\u003ecsh(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/ksh\" rel=\"external\"\u003eksh(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/man\" rel=\"external\"\u003eman(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/whatis\" rel=\"external\"\u003ewhatis(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/whereis\" rel=\"external\"\u003ewhereis(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/which\" rel=\"external\"\u003ewhich(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/afterboot.8\" rel=\"external\"\u003eafterboot(8)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"histoire\"\u003eHistoire\u003c/h4\u003e\n\u003cp\u003eCette page de manuel a été écrite par Aaron Campbell \u003ca href=\"mailto:aaron@openbsd.org\" rel=\"external\"\u003eaaron@openbsd.org\u003c/a\u003e et est apparue la première fois dans OpenBSD 2.6.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment aider les administrateurs systèmes, grâce à la commande 'help', sous OpenBSD",
            "tags": ["OpenBSD", "halp"],
            "date_published": "2020-08-27T05:05:36+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:9b59b1b1-13c7-e16e-15e7-43fe9cc460da",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/sshguard/",
            "title": "SSHGuard : se protéger des attaques par force brute sur sshd et autres (services) / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description SSHGuard protège les hôtes des attaques par force brute. Il supporte IPv6, gère des listes blanches et journalise l\u0026rsquo;authentification ; il s\u0026rsquo;interface avec les plus grands systèmes pare-feu, a un analyseur de journaux remarquablement intelligent, et est indépendant, rapide et léger puisqu\u0026rsquo;écrit en C.\nwww : http://www.sshguard.net\nInstallation Installez le paquet sshguard.\nDocumentation man 8 sshguard man 7 sshguard-setup less /usr/local/share/doc/[[#pkg-readme|pkg-readmes]]/sshguard less /usr/local/share/examples/sshguard/sshguard.conf.sample pkg-readme man 8 sshguard Synopsis sshguard [-hv] [-a threshold] [-b threshold:blacklist_file] [-i pidfile] [-p blocktime] [-s detection_time] [-w address | whitelist_file] [file \u0026hellip;]\nDescription sshguard protège les hôtes des attaques par force brute contre SSH et d\u0026rsquo;autres services. Il aggrége les journaux systèmes et bloque les récidives en utilisant un des nombreux backend pare-feu.\nsshguard peut surveiller les fichiers des journaux ou lire les messages depuis l\u0026rsquo;entrée standard. Les messages sont analysés ligne par ligne selon des patterns reconnus. Une attaque est détectée lorsque plusieurs patterns correspondent dans une intervalle de temps définie. Les attaquants sont bloqués temporairement mais peuvent aussi être bannis de manière semi-permanente en utilisant l\u0026rsquo;option blacklist.\nOptions -a threshold (default 30) Bloque les attaquants lorsque leur score d\u0026rsquo;attaque cumulée excède un seuil. La plupart des attaques ont un score de 10.\n-b threshold:blacklist_file Blackliste un attaquant lorsque son score excède le seuil. Les adresses blacklistées sont chargées et ajoutées dans un fichier de blackliste.\n-i pidfile Écrit le PID de sshguard vers le fichier pidfile.\n-p blocktime (default 120) Bloque les attaquants selon un temps de blocage en seconde après avoir atteint le seuil. Les blocages suivants sont incrémentés d\u0026rsquo;un facteur de 1.5. sshguard débloque les attaques à intervalles aléatoires, ainsi les temps de blocages actuels seront plus longs.\n-s detection_time (default 1800) Se souvenir de potentiels attaquants durant un temp de détection en secondes avant de réinitialiser leur score.\n[-w address | whitelist_file] Une liste blanche est une simple adresse, ou un bloc d\u0026rsquo;adresse. Cette option peut être utilisée plusieurs fois. Alternativement, il est possible de fournir un chemin absolu vers une fichier de liste blanche contenant des adresses. Voir la section Liste Blanche\n-h affiche l\u0026rsquo;information d\u0026rsquo;utilisation puis sort.\n-v affiche l\u0026rsquo;information de version puis sort.\nEnvironnement SSHGUARD_DEBUG Permet d\u0026rsquo;activer la sortie verbeuse depuis sshg-blocker. Fichiers /etc/sshguard.conf Lire le fichier d\u0026rsquo;exemple de configuration dans /usr/local/share/examples/sshguard/sshguard.conf.sample. Liste Blanche Les adresses en liste blanche ne sont jamais bloquées. Les adresses peuvent être spécifiées depuis la ligne de commande ou être enregistrées dans un fichier.\nEn ligne de commande, écrivez l\u0026rsquo;option -w une ou plusieurs fois avec une adresse IP, un bloc d\u0026rsquo;adresses CIDR, ou un nom d\u0026rsquo;hôte en argument. Les noms d\u0026rsquo;hôtes sont résolus une fois lors du démarrage. Si un nom d\u0026rsquo;hôte résoud de multiples adresses, elles sont toutes mises en liste blanches.\nPar exemple :\nsshguard -w 192.168.1.10 -w 192.168.0.0/24 -w friend.example.com -w 2001:0db8:85a3:0000:0000:8a2e:0370:7334 -w 2002:836b:4179::836b:0000/126 Si l\u0026rsquo;argument donné à -w commence avec un \u0026lsquo;/\u0026rsquo; ou un \u0026lsquo;.\u0026rsquo;, l\u0026rsquo;argument est traité en tant que chemin vers une fichier de liste blanche.\nLe fichier de liste blanche contient des commentaires (des lignes commençant avec \u0026lsquo;#\u0026rsquo;), des adresses, des blocs d\u0026rsquo;adresses, ou des noms d\u0026rsquo;hôtes, un par ligne.\nVoir aussi sshguard-setup(7) 2.3, 9 Janvier 2017, SSHGUARD(8)\npkg-readme Pour utiliser sshguard avec pf(4), ajouter quelque chose de similaire à ce qui suit dans votre fichier /etc/pf.conf :\ntable \u0026lt;sshguard\u0026gt; persist block in quick on egress proto tcp from \u0026lt;sshguard\u0026gt; \\ to any port ssh label \u0026#34;ssh bruteforce\u0026#34; Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSSHGuard\u003c/strong\u003e protège les hôtes des attaques par force brute. Il supporte\nIPv6, gère des listes blanches et journalise l\u0026rsquo;authentification ; il\ns\u0026rsquo;interface avec les plus grands systèmes pare-feu, a un analyseur de\njournaux remarquablement intelligent, et est indépendant, rapide et\nléger puisqu\u0026rsquo;écrit en C.\u003c/p\u003e\n\u003cp\u003ewww : \u003ca href=\"http://www.sshguard.net\" rel=\"external\"\u003ehttp://www.sshguard.net\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003esshguard\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/sshguard/#man-8-sshguard\"\u003eman 8 sshguard\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eman 7 sshguard-setup\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eless /usr/local/share/doc/[[#pkg-readme|pkg-readmes]]/sshguard\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eless /usr/local/share/examples/sshguard/sshguard.conf.sample\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/sshguard/#pkg-readme\"\u003epkg-readme\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-8-sshguard\"\u003eman 8 sshguard\u003c/h3\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esshguard\u003c/strong\u003e [\u003cstrong\u003e-hv\u003c/strong\u003e] [\u003cstrong\u003e-a\u003c/strong\u003e threshold] [\u003cstrong\u003e-b\u003c/strong\u003e threshold:blacklist_file] [\u003cstrong\u003e-i\u003c/strong\u003e pidfile] [\u003cstrong\u003e-p\u003c/strong\u003e blocktime] [\u003cstrong\u003e-s\u003c/strong\u003e detection_time] [\u003cstrong\u003e-w\u003c/strong\u003e address | whitelist_file] [file \u0026hellip;]\u003c/p\u003e\n\u003ch4 id=\"description-1\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esshguard\u003c/strong\u003e protège les hôtes des attaques par force brute contre SSH\net d\u0026rsquo;autres services. Il aggrége les journaux systèmes et bloque les\nrécidives en utilisant un des nombreux backend pare-feu.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esshguard\u003c/strong\u003e peut surveiller les fichiers des journaux ou lire les\nmessages depuis l\u0026rsquo;entrée standard. Les messages sont analysés ligne par\nligne selon des patterns reconnus. Une attaque est détectée lorsque\nplusieurs patterns correspondent dans une intervalle de temps définie.\nLes attaquants sont bloqués temporairement mais peuvent aussi être bannis\nde manière semi-permanente en utilisant l\u0026rsquo;option blacklist.\u003c/p\u003e\n\u003ch4 id=\"options\"\u003eOptions\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e-a\u003c/strong\u003e \u003cstrong\u003ethreshold\u003c/strong\u003e (\u003cstrong\u003edefault 30\u003c/strong\u003e) \u003cbr\u003e\nBloque les attaquants lorsque leur score d\u0026rsquo;attaque cumulée excède un\n\u003cstrong\u003eseuil\u003c/strong\u003e. La plupart des attaques ont un score de 10.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e-b\u003c/strong\u003e \u003cstrong\u003ethreshold:blacklist_file\u003c/strong\u003e \u003cbr\u003e\nBlackliste un attaquant lorsque son score excède le \u003cstrong\u003eseuil\u003c/strong\u003e. Les\nadresses blacklistées sont chargées et ajoutées dans un\n\u003cstrong\u003efichier de blackliste\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e-i\u003c/strong\u003e \u003cstrong\u003epidfile\u003c/strong\u003e \u003cbr\u003e\nÉcrit le PID de \u003cstrong\u003esshguard\u003c/strong\u003e vers le fichier \u003cstrong\u003epidfile\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e-p\u003c/strong\u003e \u003cstrong\u003eblocktime\u003c/strong\u003e (\u003cstrong\u003edefault 120\u003c/strong\u003e) \u003cbr\u003e\nBloque les attaquants selon un \u003cstrong\u003etemps de blocage\u003c/strong\u003e en seconde après\navoir atteint le \u003cstrong\u003eseuil\u003c/strong\u003e. Les blocages suivants sont incrémentés\nd\u0026rsquo;un facteur de 1.5. \u003cbr\u003e\n\u003cstrong\u003esshguard\u003c/strong\u003e débloque les attaques à intervalles aléatoires, ainsi\nles temps de blocages actuels seront plus longs.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e-s\u003c/strong\u003e \u003cstrong\u003edetection_time\u003c/strong\u003e (\u003cstrong\u003edefault 1800\u003c/strong\u003e) \u003cbr\u003e\nSe souvenir de potentiels attaquants durant un \u003cstrong\u003etemp de détection\u003c/strong\u003e\nen secondes avant de réinitialiser leur score.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e[\u003cstrong\u003e-w\u003c/strong\u003e \u003cstrong\u003eaddress\u003c/strong\u003e | \u003cstrong\u003ewhitelist_file\u003c/strong\u003e] \u003cbr\u003e\nUne liste blanche est une simple adresse, ou un bloc d\u0026rsquo;adresse.\nCette option peut être utilisée plusieurs fois. Alternativement, il\nest possible de fournir un chemin absolu vers une fichier de liste\nblanche contenant des adresses. Voir la section \u003ca href=\"/fr/sys/openbsd/sshguard/#liste-blanche\"\u003eListe Blanche\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e-h\u003c/strong\u003e affiche l\u0026rsquo;information d\u0026rsquo;utilisation puis sort.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e-v\u003c/strong\u003e affiche l\u0026rsquo;information de version puis sort.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"environnement\"\u003eEnvironnement\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eSSHGUARD_DEBUG\u003c/strong\u003e \u003cbr\u003e\nPermet d\u0026rsquo;activer la sortie verbeuse depuis sshg-blocker.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"fichiers\"\u003eFichiers\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e/etc/sshguard.conf\u003c/strong\u003e \u003cbr\u003e\nLire le fichier d\u0026rsquo;exemple de configuration dans\n\u003ccode\u003e/usr/local/share/examples/sshguard/sshguard.conf.sample\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"liste-blanche\"\u003eListe Blanche\u003c/h4\u003e\n\u003cp\u003eLes adresses en liste blanche ne sont jamais bloquées. Les adresses\npeuvent être spécifiées depuis la ligne de commande ou être enregistrées\ndans un fichier.\u003c/p\u003e\n\u003cp\u003eEn ligne de commande, écrivez l\u0026rsquo;option \u003cstrong\u003e-w\u003c/strong\u003e une ou plusieurs fois avec\nune adresse IP, un bloc d\u0026rsquo;adresses CIDR, ou un nom d\u0026rsquo;hôte en argument.\nLes noms d\u0026rsquo;hôtes sont résolus une fois lors du démarrage. Si un nom\nd\u0026rsquo;hôte résoud de multiples adresses, elles sont toutes mises en liste\nblanches.\u003c/p\u003e\n\u003cp\u003ePar exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esshguard -w 192.168.1.10 -w 192.168.0.0/24 -w friend.example.com\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              -w 2001:0db8:85a3:0000:0000:8a2e:0370:7334\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              -w 2002:836b:4179::836b:0000/126\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi l\u0026rsquo;argument donné à \u003cstrong\u003e-w\u003c/strong\u003e commence avec un \u0026lsquo;/\u0026rsquo; ou un \u0026lsquo;.\u0026rsquo;, l\u0026rsquo;argument\nest traité en tant que chemin vers une fichier de liste blanche.\u003c/p\u003e\n\u003cp\u003eLe fichier de liste blanche contient des commentaires \u003cem\u003e(des lignes\ncommençant avec \u0026lsquo;#\u0026rsquo;)\u003c/em\u003e, des adresses, des blocs d\u0026rsquo;adresses, ou des noms\nd\u0026rsquo;hôtes, un par ligne.\u003c/p\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003esshguard-setup(7)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e2.3,                             9 Janvier 2017,                    SSHGUARD(8)\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"pkg-readme\"\u003epkg-readme\u003c/h3\u003e\n\u003cp\u003ePour utiliser sshguard avec pf(4), ajouter quelque chose de similaire à\nce qui suit dans votre fichier \u003ccode\u003e/etc/pf.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;sshguard\u0026gt; persist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in quick on egress proto tcp from \u0026lt;sshguard\u0026gt; \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eto any port ssh label \u0026#34;ssh bruteforce\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Se protéger des attaques par force brute sur le serveur SSH sous OpenBSD.",
            "tags": ["OpenBSD", "SSHGuard", "SSH"],
            "date_published": "2020-08-27T03:04:57+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:5e924de6-4a8c-2b24-793c-952228e78b9d",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-search-jqueryui-autocomplete-json/",
            "title": "Hugo Search : un moteur de recherche interne (JQueryUI: Autocomplete + JSON)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Il y a quelques mois, j\u0026rsquo;ai écrit ce premier article pour obtenir un moteur de recherche basique en s\u0026rsquo;aidant de la méthode autocomplete() de JQueryUI : Hugo Search : un moteur de recherche interne (JQueryUI Autocomplete) Et, puis je me suis rappelé que, parmi les flux de syndication, j\u0026rsquo;en génère un au format JSON, le bien nommé feed.json, disponible à partir de la page d\u0026rsquo;accueil. Je me suis demandé si je pouvais réutiliser mon code, et je découvre que notre fameux SSG Hugo a une fonction native getJSON.\nReprenons le code…\nAttentionNe fonctionne pas en environnement de développement ! Code Hugo Je construis une variable $feed qui injectera la valeur du chemin absolu de mon fichier feed.json.\n{{- $baseURL := site.BaseURL | absLangURL -}} {{- $feed := urls.JoinPath $baseURL \u0026#34;/feed.json\u0026#34; | absLangURL -}} JQuery La partie du code JQuery est sensiblement la même, à la différence près est que la fonction range d\u0026rsquo;Hugo va directement appeler le contenu retourné par la fonction getJSON. La suite du traitement est faite par la méthode autocomplete() de JQuery, ni plus ni moins.\nVoici le code :\n{{- with resources.Get $feed -}} \u0026lt;!-- Javascript --\u0026gt; \u0026lt;script\u0026gt; $(function() { var projects = [ {{- range .items -}} { value: \u0026#34;{{ safeHTML .title }}\u0026#34;, label: \u0026#34;{{ safeHTML .summary }}\u0026#34;, url:\u0026#34;{{ safeURL .url }}\u0026#34; }, {{- end -}} ]; $(\u0026#34;#search\u0026#34;).autocomplete({ minLength: 0, source: projects, focus: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); return false; }, select: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); $(\u0026#34;#replyer\u0026#34;).val( ui.item.value ); return false; } }) .data(\u0026#39;ui-autocomplete\u0026#39;)._renderItem = function(ul, item) { return $(\u0026#39;\u0026lt;li\u0026gt;\u0026#39;) .append(\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39; + item.url + \u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;+ item.label + \u0026#39;\u0026#34;\u0026gt;\u0026#39; + item.value + \u0026#39;\u0026lt;/a\u0026gt;\u0026#39; ) .appendTo(ul); }; }); \u0026lt;/script\u0026gt; {{- end -}} HTML La partie de code HTML est toujours aussi simple :\n\u0026lt;input class=\u0026#34;form-control\u0026#34; id=\u0026#34;search\u0026#34; placeholder=\u0026#34;{{ T \u0026#34;searchHolderTitle\u0026#34; }}\u0026#34;\u0026gt; \u0026lt;input aria-hidden=\u0026#34;true\u0026#34; id=\u0026#34;replyer\u0026#34; class=\u0026#34;hidden\u0026#34;\u0026gt; TL;DR L\u0026rsquo;ensemble du code :\n\u0026lt;div id=\u0026#34;search\u0026#34;\u0026gt; \u0026lt;input class=\u0026#34;form-control\u0026#34; id=\u0026#34;search\u0026#34; placeholder=\u0026#34;{{ T \u0026#34;searchHolderTitle\u0026#34; }}\u0026#34;\u0026gt; \u0026lt;input aria-hidden=\u0026#34;true\u0026#34; id=\u0026#34;replyer\u0026#34; class=\u0026#34;hidden\u0026#34;\u0026gt; {{- $baseURL := site.BaseURL | absLangURL -}} {{- $feed := urls.JoinPath $baseURL \u0026#34;/feed.json\u0026#34; | absLangURL -}} {{- with resources.Get $feed -}} \u0026lt;!-- Javascript --\u0026gt; \u0026lt;script\u0026gt; $(function() { var projects = [ {{- range .items -}} { value: \u0026#34;{{ safeHTML .title }}\u0026#34;, label: \u0026#34;{{ safeHTML .summary }}\u0026#34;, url:\u0026#34;{{ safeURL .url }}\u0026#34; }, {{- end -}} ]; $(\u0026#34;#search\u0026#34;).autocomplete({ minLength: 0, source: projects, focus: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); return false; }, select: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); $(\u0026#34;#replyer\u0026#34;).val( ui.item.value ); return false; } }) .data(\u0026#39;ui-autocomplete\u0026#39;)._renderItem = function(ul, item) { return $(\u0026#39;\u0026lt;li\u0026gt;\u0026#39;) .append(\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39; + item.url + \u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;+ item.label + \u0026#39;\u0026#34;\u0026gt;\u0026#39; + item.value + \u0026#39;\u0026lt;/a\u0026gt;\u0026#39; ) .appendTo(ul); }; }); \u0026lt;/script\u0026gt; {{- end -}} \u0026lt;/div\u0026gt; Voilà !\nErreur Q : Lors de la génération en local, vous avez une multitude d\u0026rsquo;erreur, telle que la suivante et le serveur s\u0026rsquo;arrête tout seul : ERROR 2020/08/27 08:16:41 Failed to get JSON resource “http://localhost:1313/fr/feed.json”: Get “http://localhost:1313/fr/feed.json”: dial tcp [::1]:1313: connect: connection refused\nR : En environnement local, le serveur n\u0026rsquo;est pas capable d\u0026rsquo;appeler une donnée qui n\u0026rsquo;est pas encore générée.\nDocumentations La documentation officielle : Hugo Documentation : Tools \u0026gt; Search - lien en anglais La fonction Hugo getJSON : Hugo Documentation : Templates \u0026gt; Data templates - lien en anglais La méthode JQuery UI autocomplete() : https://jqueryui.com/autocomplete - lien en anglais ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIl y a quelques mois, j\u0026rsquo;ai écrit ce premier article pour obtenir un\nmoteur de recherche basique en s\u0026rsquo;aidant de la méthode \u003ccode\u003eautocomplete()\u003c/code\u003e de\nJQueryUI : \n\u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-search-jqueryui-autocomplete/\" title=\"Lien interne vers l\u0026#39;article : 'Hugo Search : un moteur de recherche interne (JQueryUI Autocomplete)'\"\u003eHugo Search : un moteur de recherche interne (JQueryUI Autocomplete)\u003c/a\u003e\n\n\u003c/p\u003e\n\u003cp\u003eEt, puis je me suis rappelé que, parmi les flux de syndication, j\u0026rsquo;en génère\nun au format JSON, le bien nommé \u003cstrong\u003efeed.json\u003c/strong\u003e, \u003cem\u003edisponible à partir\nde la page d\u0026rsquo;accueil\u003c/em\u003e. Je me suis demandé si je pouvais réutiliser mon\ncode, et je découvre que notre fameux \u003cabbr title=\"Static Site Generator\"\u003eSSG\u003c/abbr\u003e\n\nHugo a une fonction native \u003ccode\u003egetJSON\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eReprenons le code…\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNe fonctionne pas en environnement de développement !\u003c/div\u003e\n\n\u003ch2 id=\"code\"\u003eCode\u003c/h2\u003e\n\u003ch3 id=\"hugo\"\u003eHugo\u003c/h3\u003e\n\u003cp\u003eJe construis une variable \u003ccode\u003e$feed\u003c/code\u003e qui injectera la valeur du chemin absolu\nde mon fichier \u003cstrong\u003efeed.json\u003c/strong\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $baseURL := site.BaseURL | absLangURL -}}\n{{- $feed :=  urls.JoinPath $baseURL \u0026#34;/feed.json\u0026#34; | absLangURL -}}\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"jquery\"\u003eJQuery\u003c/h3\u003e\n\u003cp\u003eLa partie du code JQuery est sensiblement la même, à la différence près\nest que la fonction \u003ccode\u003erange\u003c/code\u003e d\u0026rsquo;Hugo va directement appeler le contenu retourné\npar la fonction \u003ccode\u003egetJSON\u003c/code\u003e. La suite du traitement est faite par la méthode\n\u003ccode\u003eautocomplete()\u003c/code\u003e de JQuery, ni plus ni moins.\u003c/p\u003e\n\u003cp\u003eVoici le code :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eresources\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eGet\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$feed\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e\u0026lt;!--\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eJavascript\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e--\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003escript\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erange\u003c/span\u003e .\u003cspan style=\"color:#06b6ef\"\u003eitems\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ safeHTML .title }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ safeHTML .summary }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ safeURL .url }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eautocomplete\u003c/span\u003e({\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eminLength\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003esource\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003efocus\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eselect\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#replyer\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    .\u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ui-autocomplete\u0026#39;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003e_renderItem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;li\u0026gt;\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappend\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;\u0026gt;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/a\u0026gt;\u0026#39;\u003c/span\u003e )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappendTo\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/script\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"html\"\u003eHTML\u003c/h3\u003e\n\u003cp\u003eLa partie de code HTML est toujours aussi simple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;form-control\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ T \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003esearchHolderTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-hidden\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;replyer\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;hidden\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"tldr\"\u003eTL;DR\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;ensemble du code :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;form-control\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ T \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003esearchHolderTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-hidden\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;replyer\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;hidden\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- $baseURL := site.BaseURL | absLangURL -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- $feed :=  urls.JoinPath $baseURL \u0026#34;/feed.json\u0026#34; | absLangURL -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- with resources.Get $feed -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e\u0026lt;!-- Javascript --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erange\u003c/span\u003e .\u003cspan style=\"color:#06b6ef\"\u003eitems\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ safeHTML .title }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ safeHTML .summary }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ safeURL .url }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eautocomplete\u003c/span\u003e({\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eminLength\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003esource\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003efocus\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eselect\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#replyer\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    .\u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ui-autocomplete\u0026#39;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003e_renderItem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;li\u0026gt;\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappend\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;\u0026gt;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/a\u0026gt;\u0026#39;\u003c/span\u003e )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappendTo\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"erreur\"\u003eErreur\u003c/h3\u003e\n\u003cp\u003e\u003cabbr title=\"Question\"\u003eQ\u003c/abbr\u003e\n : Lors de la génération en local, vous avez une\nmultitude d\u0026rsquo;erreur, telle que la suivante et le serveur s\u0026rsquo;arrête\ntout seul : \u003cbr\u003e\n\u003ccode\u003eERROR 2020/08/27 08:16:41 Failed to get JSON resource “http://localhost:1313/fr/feed.json”: Get “http://localhost:1313/fr/feed.json”: dial tcp [::1]:1313: connect: connection refused\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cabbr title=\"Réponse\"\u003eR\u003c/abbr\u003e\n : En environnement local, le serveur n\u0026rsquo;est pas\ncapable d\u0026rsquo;appeler une donnée qui n\u0026rsquo;est pas encore générée.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa documentation officielle : \u003ca href=\"https://gohugo.io/tools/search/\" title=\"Lien vers la page du site officiel Hugo : Tools \u0026gt; Search\"\u003eHugo Documentation : Tools \u0026gt; Search\u003c/a\u003e\n - \u003cem\u003elien en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eLa fonction Hugo \u003ccode\u003egetJSON\u003c/code\u003e : \u003ca href=\"https://gohugo.io/templates/data-templates/#load-local-files\" title=\"Lien vers la page du site officiel Hugo : Templates \u0026gt; Data templates\"\u003eHugo Documentation : Templates \u0026gt; Data templates\u003c/a\u003e\n - \u003cem\u003elien en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eLa méthode JQuery UI \u003ccode\u003eautocomplete()\u003c/code\u003e : \u003ca href=\"https://jqueryui.com/autocomplete\" rel=\"external\"\u003ehttps://jqueryui.com/autocomplete\u003c/a\u003e - \u003cem\u003elien en anglais\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le flux JSON pour intégrer un 'moteur de recherche' dans Hugo, avec JQuery UI autocomplete()",
            "tags": ["Hugo", "search", "JQuery", "JSON"],
            "date_published": "2020-08-25T23:32:48+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:bbc478db-7901-e555-d1e1-ced4f8accae9",
            "url": "http://doc.huc.fr.eu.org/fr/trad/bsdhowto.ch/externaldns/",
            "title": "Comment créer un serveur de noms avec DNS-over-TLS (DoT)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Retrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;How to build a name server with DNS over TLS (DoT)\u0026rdquo;, écrit par Bruno Flückiger.\nDate : 2020-08-25\nIntroduction Cet article est en rapport avec la configuration de nsd(8) en tant que serveur de noms public pour votre propre domaine, fournissant DNS-over-TLS (DOT). Tout ce qui faut pour cette tâche est inclus dans l\u0026rsquo;installation de base d\u0026rsquo;OpenBSD. Vous n\u0026rsquo;avez besoin d\u0026rsquo;installer aucun paquet additionnel pour cela.\nCertificats Tout fournisseur de certificats qui supporte le protocole ACME peut être utilisé. Personnellement, j\u0026rsquo;utilise le plus populaire actuellement : Let\u0026rsquo;s Encrypt.\nLes challenges reçus du fournisseur de certificats seront utilisés par httpd(8) en configurant /etc/httpd.conf, similaire à ceci :\nserver \u0026#34;ns1.example.net\u0026#34; { listen on egress port http root \u0026#34;/\u0026#34; location \u0026#34;/.well-known/acme-challenge/*\u0026#34; { request strip 2 root \u0026#34;/acme\u0026#34; } } types { include \u0026#34;/usr/share/misc/mime.types\u0026#34; } Testez votre configuration, puis activez et démarrez httpd(8) :\n$ doas httpd -n $ doas rcctl enable httpd $ doas rcctl start httpd L\u0026rsquo;étape suivante est de configurer acme-client(1). Je vous suggère d\u0026rsquo;utiliser /etc/examples/acme-client.conf en tant que source à sauvegarder puis à modifier conséquemment. Le fichier acme-client.conf résultant devrait être sauvegardé dans /etc et ressemblait à :\nauthority letsencrypt { api url \u0026#34;https://acme-v02.api.letsencrypt.org/directory\u0026#34; account key \u0026#34;/etc/acme/letsencrypt-privkey.pem\u0026#34; } authority letsencrypt-staging { api url \u0026#34;https://acme-staging.api.letsencrypt.org/directory\u0026#34; account key \u0026#34;/etc/acme/letsencrypt-staging-privkey.pem\u0026#34; } domain ns1.bsdhowto.ch { domain key \u0026#34;/etc/ssl/acme/private/ns1.bsdhowto.ch.key\u0026#34; domain certificate \u0026#34;/etc/ssl/acme/ns1.bsdhowto.ch.crt\u0026#34; domain full chain certificate \u0026#34;/etc/ssl/acme/ns1.bsdhowto.ch.fullchain.pem\u0026#34; sign with letsencrypt } Avant d\u0026rsquo;avoir votre certificat, vous devriez vous assurer que pf(4) laisse passer les requêtes vers httpd(8). Ajoutez une règle similaire à la suivante dans votre fichier pf.conf(5) :\npass in on egress proto tcp from any to egress port http\nVérifiez la configuration dans /etc/pf.conf puis chargez-la dans pf(4) en utilisant les commandes suivantes :\n$ doas pfctl -nf /etc/pf.conf $ doas pfctl -f /etc/pf.conf Maintenant vous êtes prêt à récupérer le certificat pour nsd(8). N\u0026rsquo;oubliez pas de créer le fichier OCSP aussi :\n$ dest=/etc/ssl/ns1.example.net $ doas acme-client ns1.example.net $ doas ocspcheck -No ${dest}.ocsp ${dest}.fullchain.pem Vous devez vous assurer que le certificat soit valide, de même pour la réponse OCSP, et qu\u0026rsquo;ils soient renouvelés avant leurs expirations. Je vous suggère d\u0026rsquo;ajouter quelque chose comme ceci dans /etc/daily.local :\n#!/bin/sh dest=/etc/ssl/ns1.example.net acme-client ns1.example.net if [ $? -eq 0 ] ; then ocspcheck -No ${dest}.ocsp ${dest}.fullchain.pem rcctl restart nsd fi oscpcheck -i ${dest}.ocsp ${dest}.fullchain.pem if [ $? -eq 1 ] ; then ocspcheck -No ${dest}.ocsp ${dest}.fullchain.pem rcctl restart nsd fi Le script vérifie en premier le certificat. S\u0026rsquo;il a été renouvelé , il récupère la réponse OCSP pour le nouveau certificat et redémarre nsd(8) afin de charger les nouveaux fichiers. À la seconde étape, le script vérifie si la réponse OCSP a expirée. Si c\u0026rsquo;est le cas, il récupère une nouvelle réponse OCSP et redémarre nsd(8) afin de charger la nouvelle réponse OCSP.\nConfiguration de nsd(8) La configuration correcte de nsd(8) dépend du rôle de votre serveur : primaire ou secondaire. La plupart des fournisseurs de domaines requièrent que vous exécutiez au moins deux serveurs de noms, de préférence dans deux différents sous-réseaux. Je vous montre la configuration des deux.\nVoici la première pour le primaire :\nserver: hide-identity: yes hide-version: yes ip-address: 192.0.2.11 ip-address: 192.0.2.11@853 ip-address: 2001:db8:1::c000:020b ip-address: 2001:db8:1::c000:020b@853 server-count: 1 statistics: 86400 tls-service-key: \u0026#34;/etc/ssl/ns1.example.net.key\u0026#34; tls-service-pem: \u0026#34;/etc/ssl/ns1.example.net.fullchain.pem\u0026#34; tls-service-ocsp: \u0026#34;/etc/ssl/ns1.example.net.ocsp\u0026#34; remote-control: control-enable: yes key: name: nskey.example.net algorithm: sha256 secret: \u0026#34;IAmASecretKeyForDomainTransfers\u0026#34; zone: name: \u0026#34;example.net\u0026#34; zonefile: \u0026#34;/var/nsd/zones/master/%s.dns\u0026#34; notify: 198.51.100.12 nskey.example.net notify: 2001:db8:2::c633:640c nskey.example.net provide-xfr: 198.51.100.12 nskey.example.net provide-xfr: 2001:db8:2::c633:640c nskey.example.net outgoing-interface: 192.0.2.11 outgoing-interface: 2001:db8:1::c000:020b Assurez vous que le serveur primaire et le secondaire utilise la même clé secrète pour le transfert de domaines, autrement cela ne fonctionnera pas. Vous pouvez générer le secret pour la clé de transfert de domaine en utilisant la commande suivante :\n$ for i in $(jot -r -s \u0026#34; \u0026#34; 32 0 255) ; do \u0026gt; echo ${i} | awk \u0026#39;{ printf \u0026#34;%c\u0026#34;, $1 }\u0026#39; \u0026gt; done | sha256 -b La prochaine étape est de s\u0026rsquo;assurer que le fichier de votre zone contient certaines données valides. Soit vous avez déjà un fichier de zone valide, soit vous pouvez utiliser celui qui suit en tant que point de départ :\n$ORIGIN . $TTL 3600 ; 1 hour example.net IN SOA ns1.example.net. hostmaster.example.net. ( 1 ; serial 10800 ; refresh (3 hours) 600 ; retry (10 minutes) 241900 ; expire (4 weeks) 3600 ; minimum (1 hour) ) NS ns1.example.net. NS ns2.example.net. $ORIGIN example.net. ns1 A 192.0.2.11 AAAA 2001:db8:1::c000:020b ns2 A 198.51.100.12 AAAA 2001:db8:2::c633:640c La configuration du second serveur a besoin d\u0026rsquo;autres options légèrement différentes pour en faire un serveur secondaire, mais elle ressemble à celle du serveur primaire :\nserver: hide-identity: yes hide-version: yes ip-address: 198.51.100.12 ip-address: 198.51.100.12@853 ip-address: 2001:db8:2::c633:640c ip-address: 2001:db8:2::c633:640c@853 server-count: 1 statistics: 86400 tls-service-key: \u0026#34;/etc/ssl/ns2.example.net.key\u0026#34; tls-service-pem: \u0026#34;/etc/ssl/ns2.example.net.fullchain.pem\u0026#34; tls-service-ocsp: \u0026#34;/etc/ssl/ns2.example.net.ocsp\u0026#34; remote-control: control-enable: yes key: name: nskey.example.net algorithm: sha256 secret: \u0026#34;IAmASecretKeyForDomainTransfers\u0026#34; zone: name: \u0026#34;example.net\u0026#34; zonefile: \u0026#34;/var/nsd/zones/slave/%s.dns\u0026#34; allow-notify: 192.0.2.11 nskey.example.net allow-notify: 2001:db8:1::c000:020b nskey.example.net request-xfr: 192.0.2.11 nskey.example.net request-xfr: 2001:db8:1::c000:020b nskey.example.net outgoing-interface: 198.51.100.12 outgoing-interface: 2001:db8:2::c633:640c Sur les deux serveurs, vous devez exécuter la commande suivant pour prendre le contrôle à distance pour que l\u0026rsquo;utilisation de nsd-control(8) fonctionne : $ doas nsd-control-setup\nMaintenant, il faut vérifier votre configuration. Exécutez la commande suivante sur chacun des serveurs afin de trouver des erreurs de typographie : $ doas nsd-checkconf /var/nsd/etc/nsd.conf\nSi tout semble bon, vous êtes prêt pour activer et démarrer nsd(8) sur les deux serveurs :\n$ doas rcctl enable nsd $ doas rcctl start nsd La dernière pièce du puzzle sont les règles pour pf(4) afin d\u0026rsquo;autoriser l\u0026rsquo;accès externe à nsd(8). Ajoutez ces deux lignes à /etc/pf.conf :\npass in on egress proto { tcp udp } from any to egress port domain pass in on egress proto { tcp udp } from any to egress port domain-s Vérifiez puis chargez la configuration changée :\n$ doas pfctl -nf /etc/pf.conf $ doas pfctl -f /etc/pf.conf Remerciements Avec l\u0026rsquo;aimable autorisation de Bruno Flückiger !\nCette page est la traduction de la page How to build a name server with DNS over TLS (DoT) du site BSDHowto.ch.\nHistorique J\u0026rsquo;ai écrit historiquement cette traduction sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous la traduction EN → FR de l\u0026rsquo;article \u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://www.bsdhowto.ch/externaldns.html\" rel=\"external\"\u003eHow to build a name server with DNS over TLS (DoT)\u003c/a\u003e\u003c/strong\u003e\u0026rdquo;,\nécrit par Bruno Flückiger.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDate : 2020-08-25\u003c/p\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003c/h2\u003e\n\u003cp\u003eCet article est en rapport avec la configuration de \u003ca href=\"https://man.openbsd.org/nsd\" rel=\"external\"\u003ensd(8)\u003c/a\u003e\nen tant que serveur de noms public pour votre propre domaine, fournissant\nDNS-over-TLS (DOT). Tout ce qui faut pour cette tâche est inclus dans\nl\u0026rsquo;installation de base d\u0026rsquo;OpenBSD. Vous n\u0026rsquo;avez besoin d\u0026rsquo;installer aucun\npaquet additionnel pour cela.\u003c/p\u003e\n\u003ch2 id=\"certificats\"\u003eCertificats\u003c/h2\u003e\n\u003cp\u003eTout fournisseur de certificats qui supporte le protocole \u003ca href=\"https://tools.ietf.org/html/rfc8555\" rel=\"external\"\u003eACME\u003c/a\u003e\npeut être utilisé. Personnellement, j\u0026rsquo;utilise le plus populaire\nactuellement : \u003ca href=\"https://letsencrypt.org/\" rel=\"external\"\u003eLet\u0026rsquo;s Encrypt\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLes challenges reçus du fournisseur de certificats seront utilisés par\n\u003ca href=\"https://man.openbsd.org/httpd\" rel=\"external\"\u003ehttpd(8)\u003c/a\u003e en configurant \u003ccode\u003e/etc/httpd.conf\u003c/code\u003e,\nsimilaire à ceci :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver \u0026#34;ns1.example.net\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elisten on egress port http\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elocation \u0026#34;/.well-known/acme-challenge/*\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003erequest strip 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/acme\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etypes {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003einclude \u0026#34;/usr/share/misc/mime.types\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTestez votre configuration, puis activez et démarrez httpd(8) :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas httpd -n\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl enable httpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl start httpd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;étape suivante est de configurer acme-client(1). Je vous suggère\nd\u0026rsquo;utiliser \u003ccode\u003e/etc/examples/acme-client.conf\u003c/code\u003e en tant que source à\nsauvegarder puis à modifier conséquemment. Le fichier \u003ccode\u003eacme-client.conf\u003c/code\u003e\nrésultant devrait être sauvegardé dans \u003ccode\u003e/etc\u003c/code\u003e et ressemblait à :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauthority letsencrypt {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eapi url \u0026#34;https://acme-v02.api.letsencrypt.org/directory\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaccount key \u0026#34;/etc/acme/letsencrypt-privkey.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauthority letsencrypt-staging {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eapi url \u0026#34;https://acme-staging.api.letsencrypt.org/directory\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaccount key \u0026#34;/etc/acme/letsencrypt-staging-privkey.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edomain ns1.bsdhowto.ch {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edomain key \u0026#34;/etc/ssl/acme/private/ns1.bsdhowto.ch.key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edomain certificate \u0026#34;/etc/ssl/acme/ns1.bsdhowto.ch.crt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003edomain full chain certificate \u0026#34;/etc/ssl/acme/ns1.bsdhowto.ch.fullchain.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esign with letsencrypt\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAvant d\u0026rsquo;avoir votre certificat, vous devriez vous assurer que\n\u003ca href=\"https://man.openbsd.org/pf\" rel=\"external\"\u003epf(4)\u003c/a\u003e laisse passer les requêtes vers\n\u003ca href=\"https://man.openbsd.org/pf.conf\" rel=\"external\"\u003ehttpd(8)\u003c/a\u003e. Ajoutez une règle similaire\nà la suivante dans votre fichier pf.conf(5) :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epass in on egress proto tcp from any to egress port http\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifiez la configuration dans \u003ccode\u003e/etc/pf.conf\u003c/code\u003e puis chargez-la dans pf(4)\nen utilisant les commandes suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas pfctl -nf /etc/pf.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas pfctl -f /etc/pf.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMaintenant vous êtes prêt à récupérer le certificat pour nsd(8).\nN\u0026rsquo;oubliez pas de créer le fichier OCSP aussi :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/etc/ssl/ns1.example.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas acme-client ns1.example.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas ocspcheck -No \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.ocsp \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.fullchain.pem\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous devez vous assurer que le certificat soit valide, de même pour la\nréponse OCSP, et qu\u0026rsquo;ils soient renouvelés avant leurs expirations. Je\nvous suggère d\u0026rsquo;ajouter quelque chose comme ceci dans \u003ccode\u003e/etc/daily.local\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/etc/ssl/ns1.example.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacme-client ns1.example.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$?\u003c/span\u003e -eq \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e ; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ocspcheck -No \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.ocsp \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.fullchain.pem\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rcctl restart nsd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoscpcheck -i \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.ocsp \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.fullchain.pem\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$?\u003c/span\u003e -eq \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e ; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ocspcheck -No \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.ocsp \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edest\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e.fullchain.pem\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rcctl restart nsd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe script vérifie en premier le certificat. S\u0026rsquo;il a été renouvelé , il\nrécupère la réponse OCSP pour le nouveau certificat et redémarre nsd(8)\nafin de charger les nouveaux fichiers. À la seconde étape, le script\nvérifie si la réponse OCSP a expirée. Si c\u0026rsquo;est le cas, il récupère une\nnouvelle réponse OCSP et redémarre nsd(8) afin de charger la nouvelle\nréponse OCSP.\u003c/p\u003e\n\u003ch2 id=\"configuration-de-nsd8\"\u003eConfiguration de nsd(8)\u003c/h2\u003e\n\u003cp\u003eLa configuration correcte de nsd(8) dépend du rôle de votre serveur :\nprimaire ou secondaire. La plupart des fournisseurs de domaines\nrequièrent que vous exécutiez au moins deux serveurs de noms, de\npréférence dans deux différents sous-réseaux. Je vous montre la\nconfiguration des deux.\u003c/p\u003e\n\u003cp\u003eVoici la première pour le primaire :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehide-identity: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehide-version: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 192.0.2.11\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 192.0.2.11@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 2001:db8:1::c000:020b\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 2001:db8:1::c000:020b@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eserver-count: 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003estatistics: 86400\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls-service-key: \u0026#34;/etc/ssl/ns1.example.net.key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls-service-pem: \u0026#34;/etc/ssl/ns1.example.net.fullchain.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls-service-ocsp: \u0026#34;/etc/ssl/ns1.example.net.ocsp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eremote-control:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-enable: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekey:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename: nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ealgorithm: sha256\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esecret: \u0026#34;IAmASecretKeyForDomainTransfers\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ezone:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename: \u0026#34;example.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ezonefile: \u0026#34;/var/nsd/zones/master/%s.dns\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003enotify: 198.51.100.12 nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003enotify: 2001:db8:2::c633:640c nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprovide-xfr: 198.51.100.12 nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eprovide-xfr: 2001:db8:2::c633:640c nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoutgoing-interface: 192.0.2.11\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoutgoing-interface: 2001:db8:1::c000:020b\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAssurez vous que le serveur primaire et le secondaire utilise la même\nclé secrète pour le transfert de domaines, autrement cela ne fonctionnera\npas. Vous pouvez générer le secret pour la clé de transfert de domaine\nen utilisant la commande suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e i in \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ejot -r -s \u003cspan style=\"color:#48b685\"\u003e\u0026#34; \u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e 255\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e ; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; echo \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ei\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{ printf \u0026#34;%c\u0026#34;, $1 }\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026gt; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e | sha256 -b\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa prochaine étape est de s\u0026rsquo;assurer que le fichier de votre zone contient\ncertaines données valides. Soit vous avez déjà un fichier de zone valide,\nsoit vous pouvez utiliser celui qui suit en tant que point de départ :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$ORIGIN .\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$TTL 3600   ; 1 hour\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexample.net IN  SOA ns1.example.net. hostmaster.example.net. (\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003e1   ; serial\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003e10800   ; refresh (3 hours)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003e600 ; retry (10 minutes)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003e241900  ; expire (4 weeks)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003e3600    ; minimum (1 hour)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u003cspan style=\"color:#06b6ef\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eNS  ns1.example.net.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eNS  ns2.example.net.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$ORIGIN example.net.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ens1         A   192.0.2.11\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eAAAA    2001:db8:1::c000:020b\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ens2         A   198.51.100.12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eAAAA    2001:db8:2::c633:640c\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa configuration du second serveur a besoin d\u0026rsquo;autres options légèrement\ndifférentes pour en faire un serveur secondaire, mais elle ressemble à\ncelle du serveur primaire :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehide-identity: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehide-version: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 198.51.100.12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 198.51.100.12@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 2001:db8:2::c633:640c\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eip-address: 2001:db8:2::c633:640c@853\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eserver-count: 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003estatistics: 86400\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls-service-key: \u0026#34;/etc/ssl/ns2.example.net.key\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls-service-pem: \u0026#34;/etc/ssl/ns2.example.net.fullchain.pem\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etls-service-ocsp: \u0026#34;/etc/ssl/ns2.example.net.ocsp\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eremote-control:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003econtrol-enable: yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekey:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename: nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ealgorithm: sha256\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esecret: \u0026#34;IAmASecretKeyForDomainTransfers\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ezone:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename: \u0026#34;example.net\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ezonefile: \u0026#34;/var/nsd/zones/slave/%s.dns\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eallow-notify: 192.0.2.11 nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eallow-notify: 2001:db8:1::c000:020b nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003erequest-xfr: 192.0.2.11 nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003erequest-xfr: 2001:db8:1::c000:020b nskey.example.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoutgoing-interface: 198.51.100.12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eoutgoing-interface: 2001:db8:2::c633:640c\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSur les deux serveurs, vous devez exécuter la commande suivant pour\nprendre le contrôle à distance pour que l\u0026rsquo;utilisation de nsd-control(8)\nfonctionne :\n\u003ccode\u003e$ doas nsd-control-setup\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMaintenant, il faut vérifier votre configuration. Exécutez la commande\nsuivante sur chacun des serveurs afin de trouver des erreurs de\ntypographie :\n\u003ccode\u003e$ doas nsd-checkconf /var/nsd/etc/nsd.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi tout semble bon, vous êtes prêt pour activer et démarrer nsd(8) sur\nles deux serveurs :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl enable nsd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas rcctl start nsd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa dernière pièce du puzzle sont les règles pour pf(4) afin d\u0026rsquo;autoriser\nl\u0026rsquo;accès externe à nsd(8). Ajoutez ces deux lignes à \u003ccode\u003e/etc/pf.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in on egress proto { tcp udp } from any to egress port domain\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in on egress proto { tcp udp } from any to egress port domain-s\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVérifiez puis chargez la configuration changée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas pfctl -nf /etc/pf.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas pfctl -f /etc/pf.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eAvec l\u0026rsquo;aimable autorisation de Bruno Flückiger !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCette page est la traduction de la page \u003cstrong\u003e\u003ca href=\"https://www.bsdhowto.ch/externaldns.html\" rel=\"external\"\u003eHow to build a name server with DNS over TLS (DoT)\u003c/a\u003e\u003c/strong\u003e du site \u003cstrong\u003eBSDHowto.ch\u003c/strong\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette traduction sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Traduction EN → FR de l'article 'How to build a name server with DNS over TLS (DoT)' de l'auteur Bruno Flückiger.",
            "tags": ["Traduction", "OpenBSD", "DNS", "DoT"],
            "date_published": "2020-08-25T13:40:59+02:00",
            "date_modified": "2023-05-03T06:30:55+02:00"
        },{
            "id": "urn:uuid:834b0c6c-d9ea-69a2-e902-e4e6a08404e2",
            "url": "http://doc.huc.fr.eu.org/fr/web/nginx/nginx-error-504-gateway-timeout/",
            "title": "Nginx : Erreur 504 Gateway Timeout",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Le serveur web nginx affiche une \u0026ldquo;belle page blanche\u0026rdquo; avec la mention Error 504: Gateway timeout !\nCette erreur indique que le serveur web nginx agit comme une passerelle et ne peut délivrer le contenu. Le serveur ne peut traiter dans un temps imparti la requête demandée, la connexion est alors fermée.\nIl peut y avoir plusieurs raisons, un élément réseau défectueux, mais aussi un des paramètres suivants mal configurés :\nSi vous utilisez PHP-FPM, vérifiez les écritures des directives :\nfastcgi_*_timeout proxy_*_timeout send_timeout Par défaut, toutes ces directives sont de 60 secondes. Des valeurs, en temps de secondes, trop basses impactent le serveur nginx et lui empêchent de délivrer la requête…\nExemple, augmentez dans votre contexte http :\nproxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; send_timeout 600; Et, concernant le contexte location lié à PHP, ajoutez, par exemple :\nfastcgi_connect_timeout 330; fastcgi_read_timeout 330; fastcgi_send_timeout 330; Ceci étant fait, redémarrez le serveur !\nDocumentations https://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_connect_timeout https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_send_timeout https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe serveur web nginx affiche une \u0026ldquo;belle page blanche\u0026rdquo; avec la mention\n\u003cstrong\u003eError 504: Gateway timeout\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eCette erreur indique que le serveur web nginx agit comme une passerelle et\nne peut délivrer le contenu. Le serveur ne peut traiter dans un temps\nimparti la requête demandée, la connexion est alors fermée.\u003c/p\u003e\n\u003cp\u003eIl peut y avoir plusieurs raisons, un élément réseau défectueux, mais aussi\nun des paramètres suivants mal configurés :\u003c/p\u003e\n\u003cp\u003eSi vous utilisez PHP-FPM, vérifiez les écritures des directives :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003efastcgi_*_timeout\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eproxy_*_timeout\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esend_timeout\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePar défaut, toutes ces directives sont de 60 secondes. \u003cbr\u003e\nDes valeurs, en temps de secondes, trop basses impactent le serveur nginx\net lui empêchent de délivrer la requête…\u003c/p\u003e\n\u003cp\u003eExemple, augmentez dans votre contexte \u003ccode\u003ehttp\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eproxy_connect_timeout\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e600\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eproxy_read_timeout\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e600\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eproxy_send_timeout\u003c/span\u003e    \u003cspan style=\"color:#f99b15\"\u003e600\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003esend_timeout\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e600\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, concernant le contexte \u003ccode\u003elocation\u003c/code\u003e lié à PHP, ajoutez, par exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efastcgi_connect_timeout\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e330\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efastcgi_read_timeout\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e330\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efastcgi_send_timeout\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e330\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCeci étant fait, redémarrez le serveur !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout\" rel=\"external\"\u003ehttps://nginx.org/en/docs/http/ngx_http_core_module.html#send_timeout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_connect_timeout\" rel=\"external\"\u003ehttps://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_connect_timeout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout\" rel=\"external\"\u003ehttps://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_read_timeout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_send_timeout\" rel=\"external\"\u003ehttps://nginx.org/en/docs/http/ngx_http_fastcgi_module.html#fastcgi_send_timeout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout\" rel=\"external\"\u003ehttps://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_connect_timeout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout\" rel=\"external\"\u003ehttps://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_read_timeout\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout\" rel=\"external\"\u003ehttps://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_send_timeout\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment résoudre cette erreur - Error 504: Gateway Timeout - de passerelle/proxy (PHP, FastCGI) sous nginx",
            "tags": ["nginx", "Erreur", "504", "astuce"],
            "date_published": "2020-08-22T17:18:25+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:17493ed1-6ae5-205c-69db-9f8d3ed9b4a1",
            "url": "http://doc.huc.fr.eu.org/fr/web/nginx/nginx-error-403-forbidden/",
            "title": "Nginx : Erreur 403  Forbidden",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Il peut y avoir plusieurs raisons pour laquelle nginx affiche une erreur 403. Le serveur comprend la requête mais refuse de répondre au client web.\nLes raisons :\nUne mauvaise configuration du chemin vers le fichier de configuration du contexte server.\nUn problème de droits sur le système de fichiers de la racine web, généralement /var/www/.\nPar exemple, quelques lignes de log d\u0026rsquo;erreur :\n2020/08/22 10:50:18 [error] 77863#0: *2 directory index of \u0026#34;/htdocs/\u0026#34; is forbidden, (…) 2020/08/22 10:52:21 [error] 890#0: *1 open() \u0026#34;/htdocs/robots.txt\u0026#34; failed (2: No such file or directory), (…) Vérifiez :\nLes écritures des chemins web. Exemple dans le fichier de configuration principal de nginx, les include vers sites-enabled sont ils corrects ?\nIl suffit d\u0026rsquo;une erreur de typographie…\nLa racine web doit avoir, normalement pour droits utilisateurs, les noms utilisateur et groupe web… www-data:www-data, ou www:www\nsauf cas particulier, tel sous OpenBSD root:daemon\\\nLes droits systèmes devraient être de type 0755.\nUne fois la situation rétablie, redémarrer/recharger nginx.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIl peut y avoir plusieurs raisons pour laquelle nginx affiche une erreur 403.\nLe serveur comprend la requête mais refuse de répondre au client web.\u003c/p\u003e\n\u003cp\u003eLes raisons :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eUne mauvaise configuration du chemin vers le fichier de configuration\ndu contexte server.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUn problème de droits sur le système de fichiers de la racine web, généralement\n\u003ccode\u003e/var/www/\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003ePar exemple, quelques lignes de log d\u0026rsquo;erreur :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003e2020/08/22 10:50:18 [error] 77863#0: *2 directory index of \u0026#34;/htdocs/\u0026#34; is forbidden, (…)\n2020/08/22 10:52:21 [error] 890#0: *1 open() \u0026#34;/htdocs/robots.txt\u0026#34; failed (2: No such file or directory), (…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eVérifiez :\u003c/strong\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eLes écritures des chemins web. Exemple dans le fichier de configuration\nprincipal de nginx, les \u003ccode\u003einclude\u003c/code\u003e vers \u003ccode\u003esites-enabled\u003c/code\u003e sont ils corrects ?\u003cbr\u003e\nIl suffit d\u0026rsquo;une erreur de typographie…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa racine web doit avoir, normalement pour droits utilisateurs, les noms\nutilisateur et groupe web… \u003ccode\u003ewww-data:www-data\u003c/code\u003e, ou \u003ccode\u003ewww:www\u003c/code\u003e\u003cbr\u003e\n\u003cem\u003esauf cas particulier, tel sous OpenBSD \u003ccode\u003eroot:daemon\u003c/code\u003e\u003c/em\u003e\\\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes droits systèmes devraient être de type \u003ccode\u003e0755\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eUne fois la situation rétablie, redémarrer/recharger nginx.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment résoudre l'erreur 403 - Error 403: Forbidden - pour nginx",
            "tags": ["nginx", "Erreur", "403", "astuce"],
            "date_published": "2020-08-22T16:45:32+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:8827e769-4ed4-4e14-750c-70cad3179c85",
            "url": "http://doc.huc.fr.eu.org/fr/web/nginx/nginx-brotli-openbsd/",
            "title": "Nginx + Brotli / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Sous OpenBSD, il n\u0026rsquo;y a pas encore de port du module nginx-brotli, donc la gestion de la compression au format Brotli semble compromise.\nEt, bien : non !\nVersion :\nOpenBSD : 6.7, 6.8 nginx : 1.16.1, 1.18.0 brotli : 1.0.7 nginx et brotli ne sont pas dans le système de base, mais dans les ports. À installer avec la commande pkg_add…\nÉtant donné qu\u0026rsquo;il n\u0026rsquo;est pas recommandé d\u0026rsquo;activer la compression à la volée - sauf au doux sacrifice d\u0026rsquo;usage de techniques CSP et de contrôle absolu sur l\u0026rsquo;émetteur du contenu compressé à la volée -, dans ce mémo, nous nous concentrerons sur la délivrance de contenu compressé de fichiers statiques.\nIl y a une manière assez simple de mettre en place :\nCompresser les fichiers statiques au format brotli avant l\u0026rsquo;envoi sur l\u0026rsquo;espace web Au sein de nginx : Vérifier le support du format par le client web Vérifier que le fichier statique compressé existe localement Envoi du fichier statique compressé. Compression brotli local La compression de fichiers se fait simplement : $ brotli -Z fichier\nqui produira un fichier supplémentaire portant l\u0026rsquo;extension br. L\u0026rsquo;option -Z offre le meilleur taux de compression, par défaut.\nLire le manpage installé, pour plus d\u0026rsquo;informations, si besoin… $ man brotli\nVoici la fonction que j\u0026rsquo;utilise dans le cadre de mon fichier deploy pour mes fichiers créés avec Hugo :\n_gz() { cd \u0026#34;${dir_local}\u0026#34; || exit 1 find . -type f -size +1024c -a \\( \\ -name \u0026#34;*.css\u0026#34; -o -name \u0026#34;*.eot\u0026#34; -o -name \u0026#34;*.html\u0026#34; -o -name \u0026#34;*.js\u0026#34; \\ -o -name \u0026#34;*.otf\u0026#34; -o -name \u0026#34;*.svg\u0026#34; -o -name \u0026#34;*.ttf\u0026#34; -o -name \u0026#34;*.txt\u0026#34; \\ -o -name \u0026#34;*.xml\u0026#34; \\ \\) | while read -r line; do echo \u0026#34;Compress ${line}\u0026#34;; brotli -Z \u0026#34;${line}\u0026#34;; gzip -9 -f \u0026lt; \u0026#34;${line}\u0026#34; \u0026gt; \u0026#34;${line}.gz\u0026#34;; done cd \u0026#34;$ROOT\u0026#34; || exit 1 } Ainsi, si le fichier statique fait plus de 1024 octets - choix totalement arbitraire - et que son extension est de type CSS, JS, JSON, HTML, SVG, TXT, ou XML, ou des fichiers de fonts de type eot, otf, ou ttf, alors la fonction compresse, dans un premier temps, au format brotli, suivi d\u0026rsquo;une compression au format gzip.\nInfoPourquoi compresser aussi au format gzip ?\nPour les clients web qui n\u0026rsquo;ont pas la gestion du format brotli, cela permettra d\u0026rsquo;offrir un format de compression alternatif, reconnu généralement.\nDe même, la gestion du format brotli semble n\u0026rsquo;être efficace qu\u0026rsquo;avec l\u0026rsquo;usage du protocole HTTPS , même si votre client web lui le gère.\nConfiguration nginx Passons maintenant au paramètrage du serveur web nginx. Dans le contexte server :\nDans un premier temps, nous déclarons une variable nommée $extension : set $extension \u0026quot;\u0026quot;; puis, nous vérifions le support de brotli par le client web, pour affecter la variable $extension qui nous servira ensuite : if ($http_accept_encoding ~ br) { set $extension .br; } dans un second temps, nous demandons à nginx de vérifier l\u0026rsquo;existence du fichier statique au format compressé : if (-f $request_filename$extension) { rewrite (.*) $1$extension break; } ensuite, nous utilisons les déclarations de contexte location pour délivrer le fichier statique demandé dans sa forme compressée. Par exemple, pour un fichier CSS : location ~ /*.css.br$ { add_header Content-Encoding br; add_header Vary \u0026#34;Accept-Encoding\u0026#34;; gzip off; types {} default_type text/css; } Faire de même pour les autres formats de fichiers compressables, tels que ceux cités ci-dessus.\nRemarquons : l\u0026rsquo;usage de la déclaration gzip off; puisque nous n\u0026rsquo;avons pas besoin à ce moment de ladite compression. l\u0026rsquo;ajout des entêtes HTTP nécessaires et la déclaration du type de contenu lié au format de fichier délivré. Voilà.\nPour finir, je vous offre les deux fichiers de déclaration que j\u0026rsquo;utilise pour mon serveur nginx sous OpenBSD :\nset $extension \u0026#34;\u0026#34;; if ($http_accept_encoding ~ br) { set $extension .br; } if (-f $request_filename$extension) { rewrite (.*) $1$extension break; } location ~ /*.css.br$ { include /etc/nginx/conf.d/brotli-infos.conf; default_type text/css; } # font file eot location ~ /*.eot.br$ { include /etc/nginx/conf.d/server/brotli-infos.conf; default_type application/vnd.ms-fontobject; } location ~ /*.html.br { include /etc/nginx/conf.d/brotli-infos.conf; default_type text/html; } location ~ /*.js.br$ { include /etc/nginx/conf.d/brotli-infos.conf; default_type application/javascript; } location ~ /*.json.br$ { include /etc/nginx/conf.d/brotli-infos.conf; default_type application/json; } # opentype font file location ~ /*.otf.br$ { include /etc/nginx/conf.d/server/brotli-infos.conf; default_type font/opentype; } location ~ /*.svg.br$ { include /etc/nginx/conf.d/brotli-infos.conf; default_type image/svg+xml; } # font file ttf location ~ /*.ttf.br$ { include /etc/nginx/conf.d/server/brotli-infos.conf; default_type font/ttf; } location ~ /*.txt.br$ { include /etc/nginx/conf.d/brotli-infos.conf; default_type text/plain; } location ~ /*.xml.br$ { include /etc/nginx/conf.d/brotli-infos.conf; default_type text/xml; } add_header Content-Encoding br; add_header Vary \u0026#34;Accept-Encoding\u0026#34;; gzip off; Documentations Au cas où vous seriez intéressé par savoir comment faire avec le serveur web natif httpd sous OpenBSD, lisez mon article httpd : délivrer des fichiers statiques compressés (\u0026#43; slowcgi) … ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD, il n\u0026rsquo;y a pas encore de port du module \u003ca href=\"https://github.com/google/ngx_brotli\" rel=\"external\"\u003enginx-brotli\u003c/a\u003e, donc la\ngestion de la compression au format Brotli semble compromise.\u003cbr\u003e\nEt, bien :  non !\u003c/p\u003e\n\u003cp\u003eVersion :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : 6.7, 6.8\u003c/li\u003e\n\u003cli\u003enginx : 1.16.1, 1.18.0\u003c/li\u003e\n\u003cli\u003ebrotli : 1.0.7\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003enginx\u003c/strong\u003e et \u003cstrong\u003ebrotli\u003c/strong\u003e ne sont pas dans le système de base, mais dans les\nports. À installer avec la commande \u003ccode\u003epkg_add\u003c/code\u003e…\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eÉtant donné qu\u0026rsquo;il n\u0026rsquo;est pas recommandé d\u0026rsquo;activer la compression à la volée -\n\u003cem\u003esauf au doux sacrifice d\u0026rsquo;usage de techniques \u003ca class=\"tag\" href=\"/fr/tags/csp\"\u003eCSP\u003c/a\u003e\n et de contrôle\nabsolu sur l\u0026rsquo;émetteur du contenu compressé à la volée\u003c/em\u003e -, dans ce mémo,\nnous nous concentrerons sur la délivrance de contenu compressé de fichiers statiques.\u003c/p\u003e\n\u003cp\u003eIl y a une manière assez simple de mettre en place :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eCompresser les fichiers statiques au format brotli avant l\u0026rsquo;envoi sur\nl\u0026rsquo;espace web\u003c/li\u003e\n\u003cli\u003eAu sein de nginx :\n\u003cul\u003e\n\u003cli\u003eVérifier le support du format par le client web\u003c/li\u003e\n\u003cli\u003eVérifier que le fichier statique compressé existe localement\u003c/li\u003e\n\u003cli\u003eEnvoi du fichier statique compressé.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"compression-brotli-local\"\u003eCompression brotli local\u003c/h2\u003e\n\u003cp\u003eLa compression de fichiers se fait simplement : \u003ccode\u003e$ brotli -Z fichier\u003c/code\u003e\u003cbr\u003e\nqui produira un fichier supplémentaire portant l\u0026rsquo;extension \u003ccode\u003ebr\u003c/code\u003e. L\u0026rsquo;option\n\u003ccode\u003e-Z\u003c/code\u003e offre le meilleur taux de compression, par défaut.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eLire le manpage installé, pour plus d\u0026rsquo;informations, si besoin… \u003ccode\u003e$ man brotli\u003c/code\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eVoici la fonction que j\u0026rsquo;utilise dans le cadre de mon fichier \u003ccode\u003edeploy\u003c/code\u003e pour\nmes fichiers créés avec Hugo :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e_gz()\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003ecd\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e${dir_local}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eexit\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003efind\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e.\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ef\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-size\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e+1024c\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-a\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\\(\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.css\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.eot\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.html\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.js\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.otf\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.svg\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.ttf\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.txt\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e-o\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;*.xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\\)\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ewhile\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eread\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-r\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eline\u003c/span\u003e; \u003cspan style=\"color:#5bc4bf\"\u003edo\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eecho\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Compress\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e${line}\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#5bc4bf\"\u003ebrotli\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-Z\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e${line}\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#5bc4bf\"\u003egzip\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-9\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e-f\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026lt;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e${line}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e${line}.gz\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#5bc4bf\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003ecd\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ROOT\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e||\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eexit\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi, si le fichier statique fait plus de 1024 octets - \u003cem\u003echoix totalement\narbitraire\u003c/em\u003e - et que son extension est de type CSS, JS, JSON, HTML, SVG,\nTXT, ou XML, ou des fichiers de fonts de type eot, otf, ou ttf, alors\nla fonction compresse, dans un premier temps, au format brotli, suivi\nd\u0026rsquo;une compression au format gzip.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003ePourquoi compresser aussi au format gzip ?\u003c/p\u003e\n\u003cp\u003ePour les clients web qui n\u0026rsquo;ont pas la gestion du format brotli, cela permettra\nd\u0026rsquo;offrir un format de compression alternatif, reconnu généralement.\u003c/p\u003e\n\u003cp\u003eDe même, la gestion du format brotli semble n\u0026rsquo;être efficace qu\u0026rsquo;avec l\u0026rsquo;usage\ndu protocole \u003cabbr title=\"HyperText Transfert Protocole Secure\"\u003eHTTPS\u003c/abbr\u003e\n, même\nsi votre client web lui le gère.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"configuration-nginx\"\u003eConfiguration nginx\u003c/h2\u003e\n\u003cp\u003ePassons maintenant au paramètrage du serveur web nginx. Dans le contexte \u003ccode\u003eserver\u003c/code\u003e :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDans un premier temps, nous déclarons une variable nommée \u003cstrong\u003e$extension\u003c/strong\u003e : \u003ccode\u003eset $extension \u0026quot;\u0026quot;;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epuis, nous vérifions le support de brotli par le client  web, pour affecter\nla variable \u003ccode\u003e$extension\u003c/code\u003e qui nous servira ensuite :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$http_accept_encoding\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003ebr)\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eset\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$extension\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e.br\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003edans un second temps, nous demandons à nginx de vérifier l\u0026rsquo;existence\ndu fichier statique au format compressé :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e(-f\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$request_filename$extension\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003erewrite\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e(.*)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$1$extension\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"3\"\u003e\n\u003cli\u003eensuite, nous utilisons les déclarations de contexte \u003ccode\u003elocation\u003c/code\u003e pour\ndélivrer le fichier statique demandé dans sa forme compressée. Par\nexemple, pour un fichier CSS :\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.css.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eContent-Encoding\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ebr\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eVary\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Accept-Encoding\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003egzip\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003etypes\u003c/span\u003e {}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etext/css\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eFaire de même pour les autres formats de fichiers compressables, tels\nque ceux cités ci-dessus.\u003cbr\u003e\nRemarquons :\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;usage de la déclaration \u003ccode\u003egzip off;\u003c/code\u003e puisque nous n\u0026rsquo;avons pas besoin\nà ce moment de ladite compression.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;ajout des entêtes HTTP nécessaires\u003c/li\u003e\n\u003cli\u003eet la déclaration du type de contenu lié au format de fichier délivré.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoilà.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour finir, je vous offre les deux fichiers de déclaration que j\u0026rsquo;utilise\npour mon serveur nginx sous OpenBSD :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eset\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$extension\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$http_accept_encoding\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003ebr)\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003eset\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$extension\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e.br\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e(-f\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$request_filename$extension\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e)\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003erewrite\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e(.*)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$1$extension\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ebreak\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.css.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etext/css\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# font file eot\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.eot.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/server/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eapplication/vnd.ms-fontobject\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.html.br\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etext/html\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.js.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eapplication/javascript\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.json.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eapplication/json\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# opentype font file\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.otf.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/server/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003efont/opentype\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.svg.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eimage/svg+xml\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# font file ttf\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.ttf.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/server/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003efont/ttf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.txt.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etext/plain\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003elocation\u003c/span\u003e ~ \u003cspan style=\"color:#48b685\"\u003e/*.xml.br$\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003einclude\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e/etc/nginx/conf.d/brotli-infos.conf\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003edefault_type\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003etext/xml\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-nginx\" data-lang=\"nginx\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eContent-Encoding\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003ebr\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eadd_header\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eVary\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Accept-Encoding\u0026#34;\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003egzip\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eoff\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eAu cas où vous seriez intéressé par savoir comment faire avec le serveur\nweb natif \u003cstrong\u003ehttpd\u003c/strong\u003e sous OpenBSD, lisez mon article \n\u003ca class=\"inside\" href=\"/fr/web/httpd/httpd-delivre-fichiers-compresses/\" title=\"Lien interne vers l\u0026#39;article : 'httpd : délivrer des fichiers statiques compressés (\u0026#43; slowcgi)'\"\u003ehttpd : délivrer des fichiers statiques compressés (\u0026#43; slowcgi)\u003c/a\u003e\n\n…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment utiliser la compression brotli avec le server web nginx sous OpenBSD… pour des fichiers statiques",
            "tags": ["nginx", "brotli", "OpenBSD", "astuce", "Hugo"],
            "date_published": "2020-08-20T12:35:10+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:5ea2fb29-8613-30da-107d-c983c9d023d5",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/acme-client-bad-exit/",
            "title": "OpenBSD: acme-client: bad exit",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Sous OpenBSD depuis 6.1, pour la génération de certificats avec l\u0026rsquo;autorité de certification Let\u0026rsquo;s Encrypt, nous avons intégré au système de base le client acme, écrit en C, reconnu pour être sécurisé.\nJe ne traiterais pas de la configuration, elle est très simple, et vraiment bien documentée dans le manpage ad hoc.\nCe mémo existe pour répertorier quoi faire dans le cas de sortie en erreur.\nDépannage bad HTTP: 400 TL;DR : Le client acme n\u0026rsquo;arrive pas à se connecter à votre serveur web. Dans les faits, il faut en passer par une investigation et une explication un peu plus poussée…\nInvestigation :\nPar exemple, voici la fin du message verbeux d\u0026rsquo;acme :\n# acme-client -v mydomain.tld (…) acme-client: challenge, token: L8dcjbmFhbE6N2GtSKxEi9yzhR888oSdBdgzt7GnJbc, uri: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6581640382/2HdrCw, status: -1 (…) acme-client: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6460247699/ixiI9A: bad HTTP: 400 acme-client: transfer buffer: [{ \u0026#34;type\u0026#34;: \u0026#34;urn:ietf:params:acme:error:malformed\u0026#34;, \u0026#34;detail\u0026#34;: \u0026#34;Unable to update challenge :: authorization must be pending\u0026#34;, \u0026#34;status\u0026#34;: 400 }] (144 bytes) acme-client: bad exit: netproc(70635): 1 Le réflexe à avoir est de basculer en mode doublement verbeux, ce qui nous donnera plus de détail :\n# acme-client -vv mydomain.tld (…) acme-client: transfer buffer: [{ \u0026#34;identifier\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;dns\u0026#34;, \u0026#34;value\u0026#34;: \u0026#34;www.mydomain.tld\u0026#34; }, \u0026#34;status\u0026#34;: \u0026#34;invalid\u0026#34;, \u0026#34;expires\u0026#34;: \u0026#34;2020-08-24T22:24:39Z\u0026#34;, \u0026#34;challenges\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;http-01\u0026#34;, \u0026#34;status\u0026#34;: \u0026#34;invalid\u0026#34;, \u0026#34;error\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;urn:ietf:params:acme:error:connection\u0026#34;, \u0026#34;detail\u0026#34;: \u0026#34;Fetching http://mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg: Connection refused\u0026#34;, \u0026#34;status\u0026#34;: 400 }, \u0026#34;url\u0026#34;: \u0026#34;https://acme-v02.api.letsencrypt.org/acme/chall-v3/6603509164/7d1MkA\u0026#34;, \u0026#34;token\u0026#34;: \u0026#34;xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;validationRecord\u0026#34;: [ { \u0026#34;url\u0026#34;: \u0026#34;http://www.mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;hostname\u0026#34;: \u0026#34;www.mydomain.tld\u0026#34;, \u0026#34;port\u0026#34;: \u0026#34;80\u0026#34;, \u0026#34;addressesResolved\u0026#34;: [ \u0026#34;88.136.16.221\u0026#34;, \u0026#34;2001:470:cc33::3\u0026#34; ], \u0026#34;addressUsed\u0026#34;: \u0026#34;2001:470:cc33::3\u0026#34; }, { \u0026#34;url\u0026#34;: \u0026#34;http://www.mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;hostname\u0026#34;: \u0026#34;www.mydomain.tld\u0026#34;, \u0026#34;port\u0026#34;: \u0026#34;80\u0026#34;, \u0026#34;addressesResolved\u0026#34;: [ \u0026#34;88.136.16.221\u0026#34;, \u0026#34;2001:470:cc33::3\u0026#34; ], \u0026#34;addressUsed\u0026#34;: \u0026#34;88.136.16.221\u0026#34; }, { \u0026#34;url\u0026#34;: \u0026#34;http://mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;hostname\u0026#34;: \u0026#34;mydomain.tld\u0026#34;, \u0026#34;port\u0026#34;: \u0026#34;80\u0026#34;, \u0026#34;addressesResolved\u0026#34;: [ \u0026#34;88.136.16.221\u0026#34;, \u0026#34;2001:470:cc33::3\u0026#34; ], \u0026#34;addressUsed\u0026#34;: \u0026#34;2001:470:cc33::3\u0026#34; } ] } ] }] (1712 bytes) acme-client: challenge, token: xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg, uri: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6603509164/7d1MkA, status: -1 (…) acme-client: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6603509164/7d1MkA: bad HTTP: 400 acme-client: transfer buffer: [{ \u0026#34;type\u0026#34;: \u0026#34;urn:ietf:params:acme:error:malformed\u0026#34;, \u0026#34;detail\u0026#34;: \u0026#34;Unable to update challenge :: authorization must be pending\u0026#34;, \u0026#34;status\u0026#34;: 400 }] (144 bytes) acme-client: bad exit: netproc(37360): 1 Explications\nAu dessus de la ligne terminant par status: -1, on remarque une nouvelle ligne. Cette ligne nous informe :\nque le status est invalid,\nque la connexion a été refusée : Connection refused,\nqu\u0026rsquo;elle a été fermée par le client : status: 400,\nqu\u0026rsquo;elle a échoué sur la connexion de l\u0026rsquo;adresse IPv6 du serveur : \u0026quot;addressUsed\u0026quot;: \u0026quot;2001:470:cc33::3\u0026quot;\nEn fait, acme-client informe qu\u0026rsquo;il n\u0026rsquo;arrive pas à se connecter sur le serveur à l\u0026rsquo;adresse IPv6. La première chose à s\u0026rsquo;assurer est que le serveur web soit joignable sur votre adresse IPv6 !\nIl peut y avoir diverses raisons pour lesquelles votre serveur web ne soit pas joignable sur IPv6 :\nassurez-vous que l\u0026rsquo;adresse IPv6 réponde à la commande ping6, puis…\nl\u0026rsquo;oubli de configuration du serveur lui-même… vérifiez que vous avez bien autorisé la connexion sur IPv6.\npour httpd : listen on votre-adresse-ipv6 port 80\npour nginx : listen [::]:80;\nle pare-feu local PF qui n\u0026rsquo;autorise pas la connexion sur les ports HTTP , voire HTTPS , sur l\u0026rsquo;adresse IPv6 du serveur : pass in quick on egress inet6 proto tcp to votre-adresse-ipv6 port 80 flags S/SA modulate state\nAvez-vous en amont un pare-feu ? vérifiez que vos règles de parefeu redirigent bien le flux HTTP(S) vers votre serveur web…\nUne manière de s\u0026rsquo;en assurer est d\u0026rsquo;utiliser un scanner de port sur IPv6 , par exemple celui de ipv6scanner.com. Si le scanner vous dit qu\u0026rsquo;aucun port correspond n\u0026rsquo;est ouvert, cherchez profondément la raison…\nDans cet exemple, le serveur ne répondait pas lors de l\u0026rsquo;interrogation sur son adresse IPv6. Le status 400 peut très bien être provoqué sur l\u0026rsquo;adresse IPv4 du serveur. Appliquez le même raisonnement pour vous assurez que votre serveur soit joignable sur son adresse IPv4 .\nCeci est une des raisons pour lesquelles acme-client peut retourner un statut d\u0026rsquo;erreur 400. À chaque fois, il faut analyser profondément les informations retournées.\norder.status -1 Le client acme restitue de manière sybilline ce message :\n# acme-client -v mydomain.tld (…) acme-client: order.status -1 acme-client: bad exit: netproc(27643): 1 Là, il peut y avoir de multiples raisons qui empêche tout simplement le client acme de discuter avec votre serveur web.\nLe propos est de vérifier qu\u0026rsquo;aucune écriture de la configuration du serveur n\u0026rsquo;empêche la lecture dans le répertoire de challenge acme.\nExemples pouvant générer :\npour nginx, une simple écriture telle que la suivante peut empêcher l\u0026rsquo;accès au répertoire de challenge acme : location ~ /\\. { access_log off; log_not_found off; deny all; } concernant relayd, des règles filtrantes les méthodes de connexion peuvent empêcher le bon fonctionnement… Documentations Manpages acme-client , acme-client.conf(5) ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD depuis 6.1, pour la génération de certificats avec l\u0026rsquo;autorité\nde certification \u003cstrong\u003eLet\u0026rsquo;s Encrypt\u003c/strong\u003e, nous avons intégré au système de base le\nclient acme, écrit en C, reconnu pour être sécurisé.\u003c/p\u003e\n\u003cp\u003eJe ne traiterais pas de la configuration, elle est très simple, et vraiment\nbien \u003ca href=\"/fr/sys/openbsd/acme-client-bad-exit/#documentations\"\u003edocumentée\u003c/a\u003e dans le manpage ad hoc.\u003c/p\u003e\n\u003cp\u003eCe mémo existe pour répertorier quoi faire dans le cas de sortie en erreur.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"bad-http-400\"\u003ebad HTTP: 400\u003c/h3\u003e\n\u003cp\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Too Long; Did\u0026#39;nt Read\"\u003eTL;DR\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n : Le client acme n\u0026rsquo;arrive pas à se connecter à votre\nserveur web. Dans les faits, il faut en passer par une investigation et une\nexplication un peu plus poussée…\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInvestigation :\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePar exemple, voici la fin du message verbeux d\u0026rsquo;acme :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# acme-client -v mydomain.tld\n(…)\nacme-client: challenge, token: L8dcjbmFhbE6N2GtSKxEi9yzhR888oSdBdgzt7GnJbc, uri: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6581640382/2HdrCw, status: -1\n(…)\nacme-client: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6460247699/ixiI9A: bad HTTP: 400\nacme-client: transfer buffer: [{ \u0026#34;type\u0026#34;: \u0026#34;urn:ietf:params:acme:error:malformed\u0026#34;, \u0026#34;detail\u0026#34;: \u0026#34;Unable to update challenge :: authorization must be pending\u0026#34;, \u0026#34;status\u0026#34;: 400 }] (144 bytes)\nacme-client: bad exit: netproc(70635): 1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLe réflexe à avoir est de basculer en mode doublement verbeux, ce qui nous\ndonnera plus de détail :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# acme-client -vv mydomain.tld\n(…)\nacme-client: transfer buffer: [{ \u0026#34;identifier\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;dns\u0026#34;, \u0026#34;value\u0026#34;: \u0026#34;www.mydomain.tld\u0026#34; }, \u0026#34;status\u0026#34;: \u0026#34;invalid\u0026#34;, \u0026#34;expires\u0026#34;: \u0026#34;2020-08-24T22:24:39Z\u0026#34;, \u0026#34;challenges\u0026#34;: [ { \u0026#34;type\u0026#34;: \u0026#34;http-01\u0026#34;, \u0026#34;status\u0026#34;: \u0026#34;invalid\u0026#34;, \u0026#34;error\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;urn:ietf:params:acme:error:connection\u0026#34;, \u0026#34;detail\u0026#34;: \u0026#34;Fetching http://mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg: Connection refused\u0026#34;, \u0026#34;status\u0026#34;: 400 }, \u0026#34;url\u0026#34;: \u0026#34;https://acme-v02.api.letsencrypt.org/acme/chall-v3/6603509164/7d1MkA\u0026#34;, \u0026#34;token\u0026#34;: \u0026#34;xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;validationRecord\u0026#34;: [ { \u0026#34;url\u0026#34;: \u0026#34;http://www.mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;hostname\u0026#34;: \u0026#34;www.mydomain.tld\u0026#34;, \u0026#34;port\u0026#34;: \u0026#34;80\u0026#34;, \u0026#34;addressesResolved\u0026#34;: [ \u0026#34;88.136.16.221\u0026#34;, \u0026#34;2001:470:cc33::3\u0026#34; ], \u0026#34;addressUsed\u0026#34;: \u0026#34;2001:470:cc33::3\u0026#34; }, { \u0026#34;url\u0026#34;: \u0026#34;http://www.mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;hostname\u0026#34;: \u0026#34;www.mydomain.tld\u0026#34;, \u0026#34;port\u0026#34;: \u0026#34;80\u0026#34;, \u0026#34;addressesResolved\u0026#34;: [ \u0026#34;88.136.16.221\u0026#34;, \u0026#34;2001:470:cc33::3\u0026#34; ], \u0026#34;addressUsed\u0026#34;: \u0026#34;88.136.16.221\u0026#34; }, { \u0026#34;url\u0026#34;: \u0026#34;http://mydomain.tld/.well-known/acme-challenge/xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg\u0026#34;, \u0026#34;hostname\u0026#34;: \u0026#34;mydomain.tld\u0026#34;, \u0026#34;port\u0026#34;: \u0026#34;80\u0026#34;, \u0026#34;addressesResolved\u0026#34;: [ \u0026#34;88.136.16.221\u0026#34;, \u0026#34;2001:470:cc33::3\u0026#34; ], \u0026#34;addressUsed\u0026#34;: \u0026#34;2001:470:cc33::3\u0026#34; } ] } ] }] (1712 bytes)\nacme-client: challenge, token: xCefC0pD3W1VRLeWVYHmYmJj1Bf06G1hoskXdN1xIEg, uri: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6603509164/7d1MkA, status: -1\n(…)\nacme-client: https://acme-v02.api.letsencrypt.org/acme/chall-v3/6603509164/7d1MkA: bad HTTP: 400\nacme-client: transfer buffer: [{ \u0026#34;type\u0026#34;: \u0026#34;urn:ietf:params:acme:error:malformed\u0026#34;, \u0026#34;detail\u0026#34;: \u0026#34;Unable to update challenge :: authorization must be pending\u0026#34;, \u0026#34;status\u0026#34;: 400 }] (144 bytes)\nacme-client: bad exit: netproc(37360): 1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAu dessus de la ligne terminant par \u003ccode\u003estatus: -1\u003c/code\u003e, on remarque une nouvelle\nligne. Cette ligne nous informe :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eque le status est \u003ccode\u003einvalid\u003c/code\u003e,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eque la connexion a été refusée : \u003ccode\u003eConnection refused\u003c/code\u003e,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003equ\u0026rsquo;elle a été fermée par le client : \u003ccode\u003estatus: 400\u003c/code\u003e,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003equ\u0026rsquo;elle a échoué sur la connexion de l\u0026rsquo;adresse IPv6 du serveur :\n\u003ccode\u003e\u0026quot;addressUsed\u0026quot;: \u0026quot;2001:470:cc33::3\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEn fait, acme-client informe qu\u0026rsquo;il n\u0026rsquo;arrive pas à se connecter sur le serveur\nà l\u0026rsquo;adresse IPv6. La première chose à s\u0026rsquo;assurer est que le serveur web\nsoit joignable sur votre adresse IPv6 !\u003c/p\u003e\n\u003cp\u003eIl peut y avoir diverses raisons pour lesquelles votre serveur web ne soit\npas joignable sur IPv6 :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eassurez-vous que l\u0026rsquo;adresse IPv6 réponde à la commande \u003ccode\u003eping6\u003c/code\u003e, puis…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;oubli de configuration du serveur lui-même… vérifiez que vous avez bien\nautorisé la connexion sur IPv6.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003epour httpd : \u003ccode\u003elisten on votre-adresse-ipv6 port 80\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epour nginx : \u003ccode\u003elisten [::]:80;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ele pare-feu local \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Packet Filter\"\u003ePF\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n qui n\u0026rsquo;autorise pas la connexion sur les\nports \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol\"\u003eHTTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, voire \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Transfer Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, sur l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ndu serveur : \u003cbr\u003e\n\u003ccode\u003epass in quick on egress inet6 proto tcp to votre-adresse-ipv6 port 80 flags S/SA modulate state\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAvez-vous en amont un pare-feu ? vérifiez que vos règles de parefeu redirigent\nbien le flux HTTP(S) vers votre serveur web…\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne manière de s\u0026rsquo;en assurer est d\u0026rsquo;utiliser un scanner de port sur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v6\"\u003eIPv6\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\npar exemple celui de \u003ca href=\"http://www.ipv6scanner.com/cgi-bin/main.py\" rel=\"external\"\u003eipv6scanner.com\u003c/a\u003e.\nSi le scanner vous dit qu\u0026rsquo;aucun port correspond n\u0026rsquo;est ouvert, cherchez\nprofondément la raison…\u003c/p\u003e\n\u003cp\u003eDans cet exemple, le serveur ne répondait pas lors de l\u0026rsquo;interrogation sur\nson adresse IPv6. Le \u003ccode\u003estatus 400\u003c/code\u003e peut très bien être provoqué sur l\u0026rsquo;adresse\nIPv4 du serveur. Appliquez le même raisonnement pour vous assurez que votre\nserveur soit joignable sur son adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol v4\"\u003eIPv4\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003eCeci est une des raisons pour lesquelles acme-client peut retourner un statut\nd\u0026rsquo;erreur 400. À chaque fois, il faut analyser profondément les informations\nretournées.\u003c/p\u003e\n\u003ch3 id=\"orderstatus--1\"\u003eorder.status -1\u003c/h3\u003e\n\u003cp\u003eLe client acme restitue de manière sybilline ce message :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# acme-client -v mydomain.tld\n(…)\nacme-client: order.status -1\nacme-client: bad exit: netproc(27643): 1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLà, il peut y avoir de multiples raisons qui empêche tout simplement le\nclient acme de discuter avec votre serveur web.\u003c/p\u003e\n\u003cp\u003eLe propos est de vérifier qu\u0026rsquo;aucune écriture de la configuration du serveur\nn\u0026rsquo;empêche la lecture dans le répertoire de challenge acme.\u003c/p\u003e\n\u003cp\u003eExemples pouvant générer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour nginx, une simple écriture telle que la suivante peut empêcher l\u0026rsquo;accès\nau répertoire de challenge acme :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elocation ~ /\\. {\n    access_log off;\n    log_not_found off;\n    deny all;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003econcernant relayd, des règles filtrantes les méthodes de connexion peuvent\nempêcher le bon fonctionnement…\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/acme-client\" title=\"Page du Manuel OpenBSD pour : acme-client\"\u003eacme-client\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/acme-client.conf.5\" title=\"Page du Manuel OpenBSD pour : acme-client.conf\"\u003eacme-client.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment résoudre des erreurs de sortie du client acme sous OpenBSD…",
            "tags": ["OpenBSD", "acme-client", "Erreur", "astuce"],
            "date_published": "2020-08-19T03:27:17+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:7d6a0b32-fe4c-3e76-b83c-504777bf644f",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/epson-mfp/",
            "title": "OpenBSD : Installer et configurer une imprimante Epson MFP (Cups)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Cet article montre comment installer et utiliser une imprimante {{ abbr2 MFP \u0026gt;}} de marque Epson, sous OpenBSD, avec Cups.\nSi votre imprimante gère le protocole ESC/P-R, continuez la lecture… sinon au-revoir !\nDe même, ce tutoriel ne montre pas la configuration par connexion USB, mais en mode réseau.\nImprimantes testées :\nStylus Office BX525WD - OpenBSD 6.0 ⇒ 6.6 EcoTank ET-3700 - OpenBSD 6.7 ⇒ actuellement Installation Avahi La MFP peut être détectée de manière automatique sur votre réseau, grâce au protocole DNSSD, si et seulement si vous installez le paquet avahi Celui-ci nécessite que le service messagebus soit actif.\nAttentionAutant la détection de la MFP se fait sans soucis, autant je ne suis jamais arrivé à l\u0026rsquo;utiliser ainsi.\nAvahi n\u0026rsquo;est pas strictement nécessaire.\nCups Commencez par installer CUPS !\nDepuis OpenBSD 6.2, les binaires lpq, lpr, et lprm ne sont plus liés symboliquement à /usr/bin. Il est nécessaire de les utiliser en les préfixant de /usr/local/bin/.\nAstucePensez à éditer votre fichier ~/.kshrc, afin de créer des alias qui vous seront utiles, en ajoutant le code suivant :\nfor i in lpq lpr lprm; do alias $i=/usr/local/bin/$i; done\nCups: Fichiers PPD BW525WD : choisir le fichier BX525WD ou BX535WD ET-3700 : copiez le fichier /usr/local/share/ppd/epson-inkjet-printer-escpr/Epson-ET-4700_Series-epson-escpr-en.ppd vers votre répertoire ~/Downloads puis indiquez-le à l\u0026rsquo;interface Web de Cups. Pilote Epson Dans un premier temps, il est nécessaire d\u0026rsquo;installer le paquet epson-inkjet-printer-escpr.\nLes paquets foomatic et gutenprint peuvent à être utile à la reconnaissance du périphérique.\nSane Pour pouvoir scanner, il est nécessaire d\u0026rsquo;installer le logiciel sane : :# sane-backends xsane\nIl sera accessible depuis le menu \u0026ldquo;Graphisme\u0026rdquo; \u0026gt; \u0026ldquo;Xsane\u0026rdquo;.\nConfiguration Protocoles réseaux De préférence, choisir le protocole Unix lpd, c\u0026rsquo;est celui qui fonctionne le mieux… Tel que : lpd://adr_ip/PASSTHRU\nIl est possible d\u0026rsquo;imprimer aussi sur ces autres protocoles :\nipp, ipps : ipp://adr_ip:631/ipp/print ou ipps://adr_ip:631/ipp/print http, https : http://adr_ip:631/ipp/print ou https://adr_ip:631/ipp/print AppSocket/HP JetDirect : socket://adr_ip:9100 Les versions ipps et https nécessitent une configuration plus poussée, non abordée ici.\nThéoriquement, Cups permet aussi d\u0026rsquo;imprimer via Samba, mais je n\u0026rsquo;ai pas testé.\nScanner BW525WD Dans un premier temps, il faut modifier le fichier de configuration /etc/sane.d/dll.conf pour y ajouter le mot clé epkowa.\nEnsuite, il est nécessaire de modifier le fichier de configuration /etc/sane.d/epkowa.conf pour préciser : net adr_ip 1865\nIl est probable que le fichier epkowa.conf ne soit pas disponible ; je vous propose cette version par défaut à configurer :\n# epkowa.conf -- sample configuration for the EPKOWA SANE backend # Copyright (C) 2004, 2008, 2009 Olaf Meeuwissen # # See sane-epkowa(5), sane-usb(5) and sane-scsi(5) for details. # Detect all devices supported by the backend. # If you don\u0026#39;t have a SCSI device, you can comment out the \u0026#34;scsi\u0026#34; # keyword. Similarly for the other keywords. # usb scsi # For any USB scanner not known to the backend (yet), you may, at your # own peril(!!), force the backend to recognise and use it via libusb. # You can do so by the following configuration command: # # usb \u0026lt;USB vendor ID\u0026gt; \u0026lt;USB product ID\u0026gt; # # SEIKO EPSON\u0026#39;s USB vendor ID is \u0026#39;0x04b8\u0026#39; (without quotes). In order # to find the USB product ID, use lsusb(1). # A sample configuration for the Epson Perfection 1650 (Epson GT-8200), # which has a product ID of 0x0110, would look as follows: # #usb 0x04b8 0x0110 # For SCSI devices not detected, you can add an entry like: # # scsi EPSON GT-20000 # # where the GT-20000 bit corresponds to the SCSI model information as # shown in the output of dmesg(1) or in the /var/log/kern.log file. # Network attached devices may be made to work by first installing the # (non-free) iscan-network-nt package and then adding configuration lines # as per information below. # # For each network attached device, you must add an entry as follows: # # net \u0026lt;IP-address|hostname\u0026gt; [port-number] # # Ask your network administrator for the device\u0026#39;s IP address or check # for yourself on the panel (if it has one). The port-number is very # optional and defaults to 1865. # Note that network attached devices are not queried unless configured # in this file. # # Examples: # #net 192.16.136.2 1865 #net 10.0.0.1 #net scanner.mydomain.com # Some backend behaviour can be customized by using the option keyword # followed by an option name, as shown below. # # option \u0026lt;option-name\u0026gt; # # Currently available options: # # Makes the automatic document feeder the default document source #option prefer-adf Scanner ET-3700 La partie scanner n'est pas encore gérée . Les scanners de la série EcoTank sont reconnus en tant que backend externe à SANE, par le projet de pilote nommé utsushi.\nLe dépôt officiel du projet utsushi : https://gitlab.com/utsushi/utsushi\nGageons que dans un futur procher, le projet Sane intégrera ce pilote, ce qui devrait ensuite permettre l\u0026rsquo;usage de la partie scanner.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eCet article montre comment installer et utiliser une imprimante {{ abbr2 MFP \u0026gt;}}\nde marque Epson, sous OpenBSD, avec Cups.\u003c/p\u003e\n\u003cp\u003eSi votre imprimante gère le protocole \u003ca href=\"http://global.epson.com/innovation/universal_printing/driver_library.html\" rel=\"external\"\u003eESC/P-R\u003c/a\u003e,\ncontinuez la lecture… sinon au-revoir !\u003c/p\u003e\n\u003cp\u003eDe même, ce tutoriel ne montre pas la configuration par connexion USB, mais\nen mode réseau.\u003c/p\u003e\n\u003cp\u003eImprimantes testées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eStylus Office \u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/epson-bx525wd/\" title=\"Lien interne vers l\u0026#39;article : 'Epson Stylus Office BX525WD / OpenBSD'\"\u003eBX525WD\u003c/a\u003e\n\u003c/strong\u003e - OpenBSD 6.0 ⇒ 6.6\u003c/li\u003e\n\u003cli\u003eEcoTank \u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/epson-ecotank-et-3700/\" title=\"Lien interne vers l\u0026#39;article : 'Epson EcoTank ET-3700 / OpenBSD'\"\u003eET-3700\u003c/a\u003e\n\u003c/strong\u003e - OpenBSD 6.7 ⇒ actuellement\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003ch3 id=\"avahi\"\u003eAvahi\u003c/h3\u003e\n\u003cp\u003eLa MFP peut être détectée de manière automatique sur votre réseau, grâce\nau protocole DNSSD, si et seulement si vous installez le paquet\n\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003eavahi\u003c/a\u003e\n\u003c/strong\u003e\nCelui-ci nécessite que le service \u003cstrong\u003emessagebus\u003c/strong\u003e soit actif.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eAutant la détection de la MFP se fait sans soucis, autant je ne suis jamais\narrivé à l\u0026rsquo;utiliser ainsi.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAvahi\u003c/strong\u003e n\u0026rsquo;est pas strictement nécessaire.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"cups\"\u003eCups\u003c/h3\u003e\n\u003cp\u003eCommencez par installer \u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003eCUPS\u003c/a\u003e\n !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDepuis OpenBSD 6.2, les binaires \u003ccode\u003elpq\u003c/code\u003e, \u003ccode\u003elpr\u003c/code\u003e, et \u003ccode\u003elprm\u003c/code\u003e ne sont plus liés\nsymboliquement à \u003ccode\u003e/usr/bin\u003c/code\u003e. Il est nécessaire de les utiliser en les préfixant\nde \u003ccode\u003e/usr/local/bin/\u003c/code\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003ePensez à éditer votre fichier \u003ccode\u003e~/.kshrc\u003c/code\u003e, afin de créer des alias qui vous\nseront utiles, en ajoutant le code suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003efor i in lpq lpr lprm; do alias $i=/usr/local/bin/$i; done\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"cups-fichiers-ppd\"\u003eCups: Fichiers PPD\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eBW525WD\u003c/strong\u003e : choisir le fichier BX525WD ou BX535WD\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eET-3700\u003c/strong\u003e : copiez le fichier \u003ccode\u003e/usr/local/share/ppd/epson-inkjet-printer-escpr/Epson-ET-4700_Series-epson-escpr-en.ppd\u003c/code\u003e\nvers votre répertoire \u003ccode\u003e~/Downloads\u003c/code\u003e puis indiquez-le à l\u0026rsquo;interface Web de Cups.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pilote-epson\"\u003ePilote Epson\u003c/h3\u003e\n\u003cp\u003eDans un premier temps, il est nécessaire\nd\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n le\npaquet \u003cstrong\u003eepson-inkjet-printer-escpr\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLes paquets \u003cstrong\u003efoomatic\u003c/strong\u003e et \u003cstrong\u003egutenprint\u003c/strong\u003e peuvent à être utile à la reconnaissance\ndu périphérique.\u003c/p\u003e\n\u003ch3 id=\"sane\"\u003eSane\u003c/h3\u003e\n\u003cp\u003ePour pouvoir scanner, il est nécessaire d\u0026rsquo;installer le logiciel \u003cstrong\u003esane\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003e:# sane-backends xsane\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl sera accessible depuis le menu \u0026ldquo;Graphisme\u0026rdquo; \u0026gt; \u0026ldquo;Xsane\u0026rdquo;.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"protocoles-réseaux\"\u003eProtocoles réseaux\u003c/h3\u003e\n\u003cp\u003eDe préférence, choisir le protocole Unix \u003cstrong\u003elpd\u003c/strong\u003e, c\u0026rsquo;est celui qui fonctionne le\nmieux… \u003cbr\u003e\nTel que : \u003ccode\u003elpd://adr_ip/PASSTHRU\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;imprimer aussi sur ces autres protocoles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eipp\u003c/strong\u003e, \u003cstrong\u003eipps\u003c/strong\u003e : \u003ccode\u003eipp://adr_ip:631/ipp/print\u003c/code\u003e ou \u003ccode\u003eipps://adr_ip:631/ipp/print\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ehttp\u003c/strong\u003e, \u003cstrong\u003ehttps\u003c/strong\u003e : \u003ccode\u003ehttp://adr_ip:631/ipp/print\u003c/code\u003e ou \u003ccode\u003ehttps://adr_ip:631/ipp/print\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAppSocket/HP JetDirect\u003c/strong\u003e : \u003ccode\u003esocket://adr_ip:9100\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes versions \u003cstrong\u003eipps\u003c/strong\u003e et \u003cstrong\u003ehttps\u003c/strong\u003e nécessitent une configuration plus\npoussée, non abordée ici.\u003c/p\u003e\n\u003cp\u003eThéoriquement, Cups permet aussi d\u0026rsquo;imprimer via Samba, mais je n\u0026rsquo;ai pas testé.\u003c/p\u003e\n\u003ch3 id=\"scanner-bw525wd\"\u003eScanner BW525WD\u003c/h3\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eDans un premier temps, il faut modifier le fichier de configuration\n\u003ccode\u003e/etc/sane.d/dll.conf\u003c/code\u003e pour y ajouter le mot clé \u003cstrong\u003eepkowa\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEnsuite, il est nécessaire de modifier le fichier de configuration\n\u003ccode\u003e/etc/sane.d/epkowa.conf\u003c/code\u003e pour préciser : \u003ccode\u003enet adr_ip 1865\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIl est probable que le fichier \u003cstrong\u003eepkowa.conf\u003c/strong\u003e ne soit pas disponible ;\nje vous propose cette version par défaut à configurer :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# epkowa.conf -- sample configuration for the EPKOWA SANE backend\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Copyright (C) 2004, 2008, 2009  Olaf Meeuwissen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# See sane-epkowa(5), sane-usb(5) and sane-scsi(5) for details.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Detect all devices supported by the backend.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# If you don\u0026#39;t have a SCSI device, you can comment out the \u0026#34;scsi\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# keyword.  Similarly for the other keywords.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eusb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003escsi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# For any USB scanner not known to the backend (yet), you may, at your\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# own peril(!!), force the backend to recognise and use it via libusb.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# You can do so by the following configuration command:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   usb \u0026lt;USB vendor ID\u0026gt; \u0026lt;USB product ID\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# SEIKO EPSON\u0026#39;s USB vendor ID is \u0026#39;0x04b8\u0026#39; (without quotes).  In order\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# to find the USB product ID, use lsusb(1).\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# A sample configuration for the Epson Perfection 1650 (Epson GT-8200),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# which has a product ID of 0x0110, would look as follows:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#usb 0x04b8 0x0110\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# For SCSI devices not detected, you can add an entry like:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   scsi EPSON GT-20000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# where the GT-20000 bit corresponds to the SCSI model information as\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# shown in the output of dmesg(1) or in the /var/log/kern.log file.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Network attached devices may be made to work by first installing the\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# (non-free) iscan-network-nt package and then adding configuration lines\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# as per information below.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# For each network attached device, you must add an entry as follows:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   net \u0026lt;IP-address|hostname\u0026gt; [port-number]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Ask your network administrator for the device\u0026#39;s IP address or check\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# for yourself on the panel (if it has one).  The port-number is very\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# optional and defaults to 1865.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Note that network attached devices are not queried unless configured\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# in this file.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Examples:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#net 192.16.136.2 1865\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#net 10.0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#net scanner.mydomain.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Some backend behaviour can be customized by using the option keyword\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# followed by an option name, as shown below.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   option \u0026lt;option-name\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Currently available options:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Makes the automatic document feeder the default document source\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#option prefer-adf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"scanner-et-3700\"\u003eScanner ET-3700\u003c/h3\u003e\n\u003cp\u003e\u003cspan class=\"red\"\u003eLa partie scanner n'est pas encore gérée\u003c/span\u003e\n.\nLes scanners de la série EcoTank sont reconnus en tant que \u003ca href=\"http://www.sane-project.org/lists/sane-backends-external.html#S-UTSUSHI\" rel=\"external\"\u003ebackend externe\u003c/a\u003e\nà SANE, par le projet de pilote nommé \u003cstrong\u003eutsushi\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLe dépôt officiel du projet utsushi : \u003ca href=\"https://gitlab.com/utsushi/utsushi\" rel=\"external\"\u003ehttps://gitlab.com/utsushi/utsushi\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eGageons que dans un futur procher, le projet Sane intégrera ce pilote,\nce qui devrait ensuite permettre l\u0026rsquo;usage de la partie scanner.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment configurer une imprimante multifunction de marque Epson sous OpenBSD avec Cups",
            "tags": ["OpenBSD", "Epson", "MFP", "Cups"],
            "date_published": "2020-07-25T17:39:49+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:a099c459-9a09-45e8-d2b8-8b8584351f67",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/epson-ecotank-et-3700/",
            "title": "Epson EcoTank ET-3700 / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Testée sur OpenBSD stable : 6.7\nGestion de l\u0026rsquo;impression La partie impression fonctionne très bien…\nAprès avoir installé le paquet epson-inkjet-printer-escpr, copiez le fichier /usr/local/share/ppd/epson-inkjet-printer-escpr/Epson-ET-4700_Series-epson-escpr-en.ppd vers votre répertoire ~/Downloads.\nIndiquez à Cups d\u0026rsquo;installer le fichier PPD en cliquant sur le bouton [ Browse… ] au moment du choix de celui-ci.\nProtocoles de connexion supportés Les protocoles de connexion suivants sont supportés :\nlpd : lpd://adr_ip/PASSTHRU ipp, ipps : ipp://adr_ip:631/ipp/print\u0026gt; ou ipps://adr_ip:631/ipp/print http, https : http://adr_ip:631/ipp/print ou https://adr_ip:631/ipp/print AppSocket/HP JetDirect : socket://adr_ip:9100 Protocole de connexion non testé Windows Printer via SAMBA : smb://adr_ip/printer Protocoles de connexion non supportés dnssd : Si le paquet Avahi est installé, elle est vue par le biais du protocole DNS-SD, elle s\u0026rsquo;installera, mais après lors d\u0026rsquo;impression, cups n\u0026rsquo;arrive pas à discuter avec… Pensez à redémarrer le service CUPS !\nGestion du scanner La partie scanner n\u0026rsquo;est pas encore gérée. Les scanners de la série EcoTank sont reconnus pour être pris en charge par la partie de backend externe utsushi au projet SANE.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTestée sur OpenBSD stable : 6.7\u003c/p\u003e\n\u003ch2 id=\"gestion-de-limpression\"\u003eGestion de l\u0026rsquo;impression\u003c/h2\u003e\n\u003cp\u003eLa partie impression fonctionne très bien…\u003c/p\u003e\n\u003cp\u003eAprès avoir \u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallé\u003c/a\u003e\n\nle paquet \u003ccode\u003eepson-inkjet-printer-escpr\u003c/code\u003e, copiez le fichier\n\u003ccode\u003e/usr/local/share/ppd/epson-inkjet-printer-escpr/Epson-ET-4700_Series-epson-escpr-en.ppd\u003c/code\u003e\nvers votre répertoire \u003ccode\u003e~/Downloads\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIndiquez à Cups d\u0026rsquo;installer le fichier PPD en cliquant sur le bouton\n[ Browse… ] au moment du choix de celui-ci.\u003c/p\u003e\n\u003ch3 id=\"protocoles-de-connexion-supportés\"\u003eProtocoles de connexion supportés\u003c/h3\u003e\n\u003cp\u003eLes protocoles de connexion suivants sont supportés :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003elpd\u003c/strong\u003e : \u003ccode\u003elpd://adr_ip/PASSTHRU\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eipp\u003c/strong\u003e, \u003cstrong\u003eipps\u003c/strong\u003e : \u003ccode\u003eipp://adr_ip:631/ipp/print\u003c/code\u003e\u0026gt; ou \u003ccode\u003eipps://adr_ip:631/ipp/print\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ehttp\u003c/strong\u003e, \u003cstrong\u003ehttps\u003c/strong\u003e : \u003ccode\u003ehttp://adr_ip:631/ipp/print\u003c/code\u003e ou \u003ccode\u003ehttps://adr_ip:631/ipp/print\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAppSocket/HP JetDirect\u003c/strong\u003e : \u003ccode\u003esocket://adr_ip:9100\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"protocole-de-connexion-non-testé\"\u003eProtocole de connexion non testé\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eWindows Printer via SAMBA\u003c/strong\u003e : \u003ccode\u003esmb://adr_ip/printer\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"protocoles-de-connexion-non-supportés\"\u003eProtocoles de connexion non supportés\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ednssd\u003c/strong\u003e : Si le paquet \u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003eAvahi\u003c/a\u003e\n\nest installé, elle est vue par le biais du protocole DNS-SD, elle\ns\u0026rsquo;installera, mais après lors d\u0026rsquo;impression, cups n\u0026rsquo;arrive pas à\ndiscuter avec…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePensez à \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#red%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eredémarrer\u003c/a\u003e\n\nle service \u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003eCUPS\u003c/a\u003e\n !\u003c/p\u003e\n\u003ch2 id=\"gestion-du-scanner\"\u003eGestion du scanner\u003c/h2\u003e\n\u003cp\u003eLa partie scanner n\u0026rsquo;est pas encore gérée. Les scanners de la série\nEcoTank sont reconnus pour être pris en charge par la partie de\n\u003ca href=\"http://www.sane-project.org/lists/sane-backends-external.html#S-UTSUSHI\" rel=\"external\"\u003ebackend externe utsushi\u003c/a\u003e\nau projet SANE.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Support de l'imprimante MFP, de marque Epson, modèle EcoTank ET63700, sous OpenBSD",
            "tags": ["OpenBSD", "Epson"],
            "date_published": "2020-06-20T16:57:43+02:00",
            "date_modified": "2023-05-09T21:52:03+02:00"
        },{
            "id": "urn:uuid:dbd1a205-82c4-831c-394b-16247bb06ea9",
            "url": "http://doc.huc.fr.eu.org/fr/sys/debian/unstable-sid/",
            "title": "Debian : Gérer Sid",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Un petit mémoriel pour décrire comment gérer régulièrement une Debian Sid. Ceci est aussi valable pour une Devuan Ceres.\nC\u0026rsquo;est plus du \u0026ldquo;Trucs \u0026amp; Astuces\u0026rdquo;, car je risque fort de ne pas rentrer dans les détails, mais plutôt de préciser les étapes nécessaires à la gestion d\u0026rsquo;une version dite \u0026ldquo;Unstable\u0026rdquo; de Debian, ou Devuan.\nInstallation Je ne décrirais pas le processus d\u0026rsquo;installation. Si vous avez déjà installé une Debian/Devuan, vous êtes certainement déjà familier avec celui-ci. Si ce n\u0026rsquo;est pas le cas, voyez la section Documentation où vous trouverez des informations utiles.\nInstall Sid Pour installer Sid, le plus simple est de télécharger l\u0026rsquo;image mini.iso. Cette version minimale de Debian Sid est mise à jour régulièrement.\nPour :\namd64 : http://ftp.debian.org/debian/dists/sid/main/installer-amd64/current/images/netboot/mini.iso i386 : http://ftp.debian.org/debian/dists/sid/main/installer-i386/current/images/netboot/mini.iso Pour les autres architectures, parcourez l\u0026rsquo;arborescence correspondante à la vôtre dans le répertoire ftp suivant : http://ftp.debian.org/debian/dists/sid/main/\nInfoDe temps à autre, il est possible que l\u0026rsquo;installateur échoue dans l\u0026rsquo;installation de la Sid. Dans ce cas-là, il faudra attendre une nouvelle version de l\u0026rsquo;image ISO. Ou, essayez l\u0026rsquo;un des projets ci-dessous. Pour information, il existe quelques communautés différentes qui proposent aussi Debian Sid, déjà packagée, prête à être installé :\nantiX-Sid : une Debian Sid, sans systemd, principalement pour PC léger, ou très ancien Siduction Xebian Par expérience, préférez la Xebian… elle fournit par défaut les outils apt nécessaires. De plus, l\u0026rsquo;image ISO est plus souvent générée.\nQuoiqu\u0026rsquo;il en soit les conseils de gestion que vous trouverez ci-dessous, sont absolument valables. Tenez en compte !\nInstall Ceres Pour la Devuan Ceres, le plus simple est de partir de l\u0026rsquo;installation de la stable actuelle, puis de modifier votre fichier sources.list pour qu\u0026rsquo;il contienne à minima cette ligne : deb http://deb.devuan.org/merged ceres main non-free contrib\nCe qui signifie de commenter celles de votre précédente installation, voire de les supprimer.\nPour le faire proprement : # apt edit-sources\nPuis mettez à jour les dépôts et faites une mise à niveau :\n:# apt update :# apt full-upgrade Outils apt Les outils supplémentaires à installer ABSOLUMENT sont des outils complémentaires à l\u0026rsquo;outil apt :\napt-listbugs : outil qui lors d\u0026rsquo;une mise à jour vous avertira à-propos duquel logiciel a un bogue plus ou moins critique. Cet outil est PRIMORDIAL. apt-listchanges : outil qui vous informera après la mise à jour, des changements importants fait sur untel logiciel. needrestart : outil qui permet de savoir quel service doit absolument être redémarré après une mise à jour. Pas nécessaire, mais utile. package-update-indicator : outil de suivi et notification de la disponibilité de paquets mis à jour. Pas nécessaire, mais utile. Si vous avez choisi d\u0026rsquo;installer la Xebian, les deux premiers outils sont fournis, par défaut.\nGestion Lorsque vous faites une mise à jour, s\u0026rsquo;il y a des bogues plus ou moins critique, du fait d\u0026rsquo;avoir installé l\u0026rsquo;outil apt-listbugs, apt vous avertira que tel logiciel a tel bogue, ayant tel niveau de criticité.\nLe plus simple est, si vous avez un doute, que vous ne comprenez pas en quoi ce bogue consiste, comment il impacte le système, alors répondez ABSOLUMENT par l\u0026rsquo;appui sur la touche P !\nCela \u0026ldquo;épinglera\u0026rdquo; le logiciel en question, empêchant sa mise à jour jusqu\u0026rsquo;à une future mise à jour qui aura corrigé le bogue en question et vous permettra à ce moment futur de le mettre à jour sans aucun soucis.\nTout épingleage sera enregistré dans le fichier /etc/apt/preferences.d/apt-listbugs.\nL\u0026rsquo;impact : à chaque logiciel, que vous aurez figé en état \u0026ldquo;Pin\u0026rdquo;, il vous faudra arrêter ensuite la mise à jour en appuyant ensuite sur la touche N… Puis relancer la mise à jour normalement.\nLes logiciels \u0026ldquo;étiquettés\u0026rdquo;, ainsi par vos soins, ne vous seront plus soumis à l\u0026rsquo;analyse, et attendront une future mise à jour corrigeant le(s) bogue(s) en question.\n⇒ À partir du moment où vous avez installé apt-listbugs, apt vous avertira aussi lors d\u0026rsquo;une installation logicielle. S\u0026rsquo;il y a un bogue critique qui concerne le logiciel que vous cherchez à installer sur votre architecture, il est certainement prudent d\u0026rsquo;en tenir compte ; si cela concerne une autre architecture, ne vous tracassez pas du bogue en question, et faites votre installation demandée/nécessaire. Dans le cas où vous épinglez le logiciel lors de l\u0026rsquo;installation, à cause d\u0026rsquo;un bogue critique, vous ne pourrez donc pas installer le logiciel ; il vous faudra attendre une future mise à jour de celui-ci.\nC\u0026rsquo;est un dilemne : à vous de faire votre choix. Étant donné que les messages d\u0026rsquo;avertissements sont en anglais, il peut en effet être délicat de les comprendre. Ne faites pas l\u0026rsquo;impasse sur un message que vous ne comprenez pas, en prenant le risque d\u0026rsquo;installer ou de mettre à jour un logiciel.\nPosez des questions au-travers des différentes communautés, qui généralement, seront capables de vous aider de manière adéquate.\n⇒ Si apt-listchanges vous avertit d\u0026rsquo;un changement précis, tenez-en compte. À ce propos, si vous avez configuré votre système pour envoyer des courriels, vous recevrez un courriel vous informant desdits changements.\n⇒ Pensez à redémarrer absolument votre machine si un nouveau noyau a été installé. Malheureusement, parfois un nouveau noyau ne vous permettra pas d\u0026rsquo;utiliser correctement votre matériel, cela peut en effet arriver. Il vous faudra veiller à garder et redémarrer sur un noyau précédent fonctionnel.\n⇒ needrestart vous avertira de redémarrer tel ou tel service ; parfois, ce sera votre session utilisateur qu\u0026rsquo;il faudra simplement redémarrer.\n⇒ Régulièrement, utilisez l\u0026rsquo;option autoremove de l\u0026rsquo;outil apt afin de supprimer les dépendances qui ne seraient plus nécessaires à votre système suite à vos différentes mises à jours. Lire à ce propos le chapitre correspondant.\nGestion Hebdomadaire Une fois par semaine, de préférence le Lundi - l\u0026rsquo;expérience m\u0026rsquo;ayant appris que c\u0026rsquo;est le jour le moins critique, dans le sens où je n\u0026rsquo;ai jamais planté une mise à jour d\u0026rsquo;une Sid ce jour-là ; par contre, cela m\u0026rsquo;est arrivé sur d\u0026rsquo;autres jours de la semaine.\nCe jour-là, utilisez juste l\u0026rsquo;option upgrade à l\u0026rsquo;outil apt.\nGestion Mensuelle Une fois par mois, ceci est un impératif - qui peut être fait une fois par semaine, mais généralement peu utile, utilisez l\u0026rsquo;option full-upgrade de l\u0026rsquo;outil apt.\nInfoPrenez conscience que l\u0026rsquo;usage de l\u0026rsquo;option full-upgrade peut avoir pour conséquence la suppression de certains logiciels installés, qui ne seront peut-être pas réinstallables par la suite. Gestion d\u0026rsquo;autoremove Parfois l\u0026rsquo;outil apt peut vous informer d\u0026rsquo;un certain nombre de logiciels qui n\u0026rsquo;ont plus de dépendances utiles et qui peuvent être supprimés avec l\u0026rsquo;option autoremove.\nCe sera particulièrement le cas lorsque vous aurez utiliser l\u0026rsquo;option full-upgrade pour mettre à jour votre version Unstable.\nSi vous ne voulez pas que apt vous supprime particulièrement certains des logiciels nommés dont vous pouvez avoir besoin, il faudra utiliser l\u0026rsquo;outil apt-mark au cas par cas en utilisant l\u0026rsquo;option manual, tel que :\n$ apt-mark manual nom-logiciel Ensuite, une fois les logiciels marqués, vous pourrez utiliser l\u0026rsquo;option autoremove avec l\u0026rsquo;outil apt.\nIl est utile de lire le manpage : man 8 apt-mark\nDépannage ⇒ Lire les journaux liés à l\u0026rsquo;activité d\u0026rsquo;apt, ils sont dans /var/log/apt et se nomme history et term. Le deuxième nécessite les droits admins même pour la lecture, et reprend l\u0026rsquo;historique de l\u0026rsquo;activité tel qu\u0026rsquo;il est affiché dans le terminal/la console.\n⇒ Pour savoir quels paquets sont épinglés, il y a deux manières :\nl\u0026rsquo;utilisation de l\u0026rsquo;outil apt-cache et de son option policy, tel que : Fichiers du paquet : 100 /var/lib/dpkg/status release a=now 500 http://deb.devuan.org/merged ceres/non-free i386 Packages release v=1.0.0,o=Devuan,a=unstable,n=ceres,l=Devuan,c=non-free,b=i386 origin deb.devuan.org 500 http://deb.devuan.org/merged ceres/non-free amd64 Packages release v=1.0.0,o=Devuan,a=unstable,n=ceres,l=Devuan,c=non-free,b=amd64 origin deb.devuan.org 500 http://deb.devuan.org/merged ceres/contrib i386 Packages release v=1.0.0,o=Devuan,a=unstable,n=ceres,l=Devuan,c=contrib,b=i386 origin deb.devuan.org 500 http://deb.devuan.org/merged ceres/contrib amd64 Packages release v=1.0.0,o=Devuan,a=unstable,n=ceres,l=Devuan,c=contrib,b=amd64 origin deb.devuan.org 500 http://deb.devuan.org/merged ceres/main i386 Packages release v=1.0.0,o=Devuan,a=unstable,n=ceres,l=Devuan,c=main,b=i386 origin deb.devuan.org 500 http://deb.devuan.org/merged ceres/main amd64 Packages release v=1.0.0,o=Devuan,a=unstable,n=ceres,l=Devuan,c=main,b=amd64 origin deb.devuan.org Paquets épinglés : libigdgmm12 -\u0026gt; 22.0.2+ds1-1 avec la priorité 30000 libigdgmm12:i386 -\u0026gt; 22.0.2+ds1-1 avec la priorité 30000 Remarquez la section \u0026ldquo;Paquets épinglés :\u0026rdquo; en fin d\u0026rsquo;invite.\net/ou afficher le fichier d\u0026rsquo;épingles /etc/apt/preferences.d/apt-listbugs. ⇒ Parfois du fait d\u0026rsquo;avoir épinglé un ou plusieurs logiciels, cela rend impossible l\u0026rsquo;installation d\u0026rsquo;un autre logiciel avec un ou plusieurs messages d\u0026rsquo;erreurs lors de la tentative d\u0026rsquo;installation, tel que :\nLecture des listes de paquets… Construction de l\u0026#39;arbre des dépendances… Lecture des informations d\u0026#39;état… Calcul de la mise à jour… Certains paquets ne peuvent être installés. Ceci peut signifier que vous avez demandé l\u0026#39;impossible, ou bien, si vous utilisez la distribution unstable, que certains paquets n\u0026#39;ont pas encore été créés ou ne sont pas sortis d\u0026#39;Incoming. L\u0026#39;information suivante devrait vous aider à résoudre la situation : Les paquets suivants contiennent des dépendances non satisfaites : linux-headers-5.16.0-3-amd64 : Dépend : linux-compiler-gcc-11-x86 E: Impossible de corriger les problèmes, des paquets défectueux sont en mode \u0026#34;garder en l\u0026#39;état\u0026#34;. Essayez d\u0026rsquo;installer le paquet mentionné après le terme \u0026ldquo;Depend :\u0026rdquo;. Parfois il sera nécessaire de supprimer/renommer le fichier de preférences relatif à apt-listbugs, puis de retenter l\u0026rsquo;installation qui avertira très certainement que le paquet dépendant est en défaut… à chacun d\u0026rsquo;analyser les erreurs remontées par apt-listbugs, pour décider si le paquet en défaut peut quand même être installé, ce qui vous permettra d\u0026rsquo;installer le logiciel/paquet désiré. Communauté N\u0026rsquo;oubliez pas que leur coup de main est bénévole, souvent anonyme, alors soyez le plus descriptif possible, fournissez une EXACTE copie du message en n\u0026rsquo;oubliant pas de décrire sur quelle architecture vous installez ou mettez à jour tel logiciel !\nPlus vous serez précis, plus vous serez agréable, et plus vous aurez des chances d\u0026rsquo;être aidé. Et surtout, n\u0026rsquo;attendez pas ET n\u0026rsquo;exigez JAMAIS qu\u0026rsquo;on vous aide absolument.\nSoyez amical, cordial, agréable - même si la réponse ne vous plaît/convient pas.\nDebian Pour débutants : https://debian-facile.org Pour confirmés : https://www.debian-fr.org AntiX semble ne plus avoir de forum de communauté actif Devuan a son propre forum, en langue anglaise : https://dev1galaxy.org/ Siduction a son propre forum, en langue anglaise : https://forum.siduction.org/ Xebian a une communauté d\u0026rsquo;utilisateurs accessible seulement sur IRC, en anglais. Documentation Pour les débutants, concernant la version stable de Debian : https://debian-facile.org/projets/lescahiersdudebutant/ Pour les chevronnés : https://debian-handbook.info/browse/fr-FR/stable/ (documentation obsolète basée sur la Debian stable 11). ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn petit mémoriel pour décrire comment gérer régulièrement une Debian Sid.\nCeci est aussi valable pour une Devuan Ceres.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est plus du \u0026ldquo;Trucs \u0026amp; Astuces\u0026rdquo;, car je risque fort de ne pas rentrer dans\nles détails, mais plutôt de préciser les étapes nécessaires à la gestion\nd\u0026rsquo;une version dite \u0026ldquo;Unstable\u0026rdquo; de Debian, ou Devuan.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eJe ne décrirais pas le processus d\u0026rsquo;installation. Si vous avez déjà installé\nune Debian/Devuan, vous êtes certainement déjà familier avec celui-ci.\nSi ce n\u0026rsquo;est pas le cas, voyez la section \u003ca href=\"/fr/sys/debian/unstable-sid/#documentation\"\u003eDocumentation\u003c/a\u003e\noù vous trouverez des informations utiles.\u003c/p\u003e\n\u003ch3 id=\"install-sid\"\u003eInstall Sid\u003c/h3\u003e\n\u003cp\u003ePour installer Sid, le plus simple est de télécharger l\u0026rsquo;image \u003cstrong\u003emini.iso\u003c/strong\u003e.\nCette version minimale de Debian Sid est mise à jour régulièrement.\u003c/p\u003e\n\u003cp\u003ePour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eamd64 : \u003ca href=\"http://ftp.debian.org/debian/dists/sid/main/installer-amd64/current/images/netboot/mini.iso\" rel=\"external\"\u003ehttp://ftp.debian.org/debian/dists/sid/main/installer-amd64/current/images/netboot/mini.iso\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ei386 : \u003ca href=\"http://ftp.debian.org/debian/dists/sid/main/installer-i386/current/images/netboot/mini.iso\" rel=\"external\"\u003ehttp://ftp.debian.org/debian/dists/sid/main/installer-i386/current/images/netboot/mini.iso\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour les autres architectures, parcourez l\u0026rsquo;arborescence correspondante à\nla vôtre dans le répertoire ftp suivant : \u003cbr\u003e\n\u003ca href=\"http://ftp.debian.org/debian/dists/sid/main/\" rel=\"external\"\u003ehttp://ftp.debian.org/debian/dists/sid/main/\u003c/a\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eDe temps à autre, il est possible que l\u0026rsquo;installateur échoue dans l\u0026rsquo;installation\nde la Sid. Dans ce cas-là, il faudra attendre une nouvelle version de l\u0026rsquo;image ISO.\n\u003cem\u003eOu, essayez l\u0026rsquo;un des projets ci-dessous.\u003c/em\u003e\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003ePour information, il existe quelques communautés différentes qui proposent aussi\nDebian Sid, déjà packagée, prête à être installé :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://antixlinux.com/updated-antix-sid-iso-files-available/\" rel=\"external\"\u003eantiX-Sid\u003c/a\u003e :\nune Debian Sid, sans systemd, principalement pour PC léger, ou très ancien\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://siduction.org/\" rel=\"external\"\u003eSiduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://xebian.org/\" rel=\"external\"\u003eXebian\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003ePar expérience, préférez la Xebian… elle fournit par défaut les \u003ca href=\"/fr/sys/debian/unstable-sid/#outils-apt\"\u003eoutils apt\u003c/a\u003e\nnécessaires. De plus, l\u0026rsquo;image ISO est plus souvent générée.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eQuoiqu\u0026rsquo;il en soit les conseils de \u003ca href=\"/fr/sys/debian/unstable-sid/#gestion\"\u003egestion\u003c/a\u003e que vous trouverez\nci-dessous, sont absolument valables. Tenez en compte !\u003c/p\u003e\n\u003ch3 id=\"install-ceres\"\u003eInstall Ceres\u003c/h3\u003e\n\u003cp\u003ePour la Devuan Ceres, le plus simple est de partir de l\u0026rsquo;\u003ca href=\"https://devuan.org/\" rel=\"external\"\u003einstallation de la\nstable actuelle\u003c/a\u003e, puis de modifier votre fichier \u003ccode\u003esources.list\u003c/code\u003e pour qu\u0026rsquo;il\ncontienne à minima cette ligne : \u003cbr\u003e\n\u003ccode\u003edeb http://deb.devuan.org/merged ceres main non-free contrib\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eCe qui signifie de commenter celles de votre précédente installation,\nvoire de les supprimer\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePour le faire proprement : \u003ccode\u003e# apt edit-sources\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis mettez à jour les dépôts et faites une mise à niveau :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# apt update\n:# apt full-upgrade\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"outils-apt\"\u003eOutils apt\u003c/h3\u003e\n\u003cp\u003eLes outils supplémentaires à installer \u003cstrong\u003eABSOLUMENT\u003c/strong\u003e sont des outils\ncomplémentaires à l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eapt-listbugs\u003c/code\u003e : outil qui lors d\u0026rsquo;une mise à jour vous avertira à-propos\nduquel logiciel a un bogue plus ou moins critique. Cet outil est \u003cstrong\u003ePRIMORDIAL\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapt-listchanges\u003c/code\u003e : outil qui vous informera après la mise à jour, des\nchangements importants fait sur untel logiciel.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eneedrestart\u003c/code\u003e : outil qui permet de savoir quel service doit absolument\nêtre redémarré après une mise à jour. Pas nécessaire, mais utile.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epackage-update-indicator\u003c/code\u003e : outil de suivi et notification de la disponibilité\nde paquets mis à jour. Pas nécessaire, mais utile.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eSi vous avez choisi d\u0026rsquo;installer la Xebian, les deux premiers outils sont\nfournis, par défaut.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"gestion\"\u003eGestion\u003c/h2\u003e\n\u003cp\u003eLorsque vous faites une mise à jour, s\u0026rsquo;il y a des bogues plus ou moins\ncritique, du fait d\u0026rsquo;avoir installé l\u0026rsquo;outil \u003cstrong\u003eapt-listbugs\u003c/strong\u003e, \u003cstrong\u003eapt\u003c/strong\u003e vous\navertira que tel logiciel a tel bogue, ayant tel niveau de criticité.\u003c/p\u003e\n\u003cp\u003eLe plus simple est, si vous avez un doute, que vous ne comprenez pas en quoi\nce bogue consiste, comment il impacte le système, alors répondez \u003cstrong\u003eABSOLUMENT\u003c/strong\u003e\npar l\u0026rsquo;appui sur la touche \u003ckbd\u003eP\u003c/kbd\u003e !\u003c/p\u003e\n\u003cp\u003eCela \u0026ldquo;épinglera\u0026rdquo; le logiciel en question, empêchant sa mise à jour jusqu\u0026rsquo;à\nune future mise à jour qui aura corrigé le bogue en question et vous permettra\nà ce moment futur de le mettre à jour sans aucun soucis.\u003c/p\u003e\n\u003cp\u003eTout épingleage sera enregistré dans le fichier\n\u003ccode\u003e/etc/apt/preferences.d/apt-listbugs\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;impact : à chaque logiciel, que vous aurez figé en état \u0026ldquo;Pin\u0026rdquo;, il vous\nfaudra arrêter ensuite la mise à jour en appuyant ensuite sur la touche\n\u003ckbd\u003eN\u003c/kbd\u003e… \u003cbr\u003e\nPuis relancer la mise à jour normalement.\u003c/p\u003e\n\u003cp\u003eLes logiciels \u0026ldquo;étiquettés\u0026rdquo;, ainsi par vos soins, ne vous seront plus soumis\nà l\u0026rsquo;analyse, et attendront une future mise à jour corrigeant le(s) bogue(s)\nen question.\u003c/p\u003e\n\u003cp\u003e⇒ À partir du moment où vous avez installé \u003cstrong\u003eapt-listbugs\u003c/strong\u003e, \u003cstrong\u003eapt\u003c/strong\u003e vous\navertira aussi lors d\u0026rsquo;une installation logicielle. S\u0026rsquo;il y a un bogue critique\nqui concerne le logiciel que vous cherchez à installer sur votre architecture,\nil est certainement prudent d\u0026rsquo;en tenir compte ; si cela concerne une autre\narchitecture, ne vous tracassez pas du bogue en question, et faites votre\ninstallation demandée/nécessaire. \u003cbr\u003e\nDans le cas où vous épinglez le logiciel lors de l\u0026rsquo;installation, à cause\nd\u0026rsquo;un bogue critique, vous ne pourrez donc pas installer le logiciel ; il\nvous faudra attendre une future mise à jour de celui-ci.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est un dilemne : à vous de faire votre choix. Étant donné que les messages\nd\u0026rsquo;avertissements sont en anglais, il peut en effet être délicat de les comprendre.\nNe faites pas l\u0026rsquo;impasse sur un message que vous ne comprenez pas, en prenant\nle risque d\u0026rsquo;installer ou de mettre à jour un logiciel.\u003c/p\u003e\n\u003cp\u003ePosez des questions au-travers des différentes \u003ca href=\"/fr/sys/debian/unstable-sid/#communaute\"\u003ecommunautés\u003c/a\u003e,\nqui généralement, seront capables de vous aider de manière adéquate.\u003c/p\u003e\n\u003cp\u003e⇒ Si \u003cstrong\u003eapt-listchanges\u003c/strong\u003e vous avertit d\u0026rsquo;un changement précis, tenez-en compte.\nÀ ce propos, si vous avez configuré votre système pour envoyer des courriels,\nvous recevrez un courriel vous informant desdits changements.\u003c/p\u003e\n\u003cp\u003e⇒ Pensez à redémarrer \u003cstrong\u003eabsolument\u003c/strong\u003e votre machine si un nouveau noyau a été\ninstallé. Malheureusement, parfois un nouveau noyau ne vous permettra pas\nd\u0026rsquo;utiliser correctement votre matériel, cela peut en effet arriver. Il vous\nfaudra veiller à garder et redémarrer sur un noyau précédent fonctionnel.\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eneedrestart\u003c/strong\u003e vous avertira de redémarrer tel ou tel service ; parfois,\nce sera votre session utilisateur qu\u0026rsquo;il faudra simplement redémarrer.\u003c/p\u003e\n\u003cp\u003e⇒ Régulièrement, utilisez l\u0026rsquo;option \u003ccode\u003eautoremove\u003c/code\u003e de l\u0026rsquo;outil \u003cstrong\u003eapt\u003c/strong\u003e afin\nde supprimer les dépendances qui ne seraient plus nécessaires à votre\nsystème suite à vos différentes mises à jours. \u003cem\u003eLire à ce propos le chapitre\n\u003ca href=\"/fr/sys/debian/unstable-sid/#gestion-dautoremove\"\u003ecorrespondant\u003c/a\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-hebdomadaire\"\u003eGestion Hebdomadaire\u003c/h3\u003e\n\u003cp\u003eUne fois par semaine, de préférence le Lundi - \u003cem\u003el\u0026rsquo;expérience m\u0026rsquo;ayant appris\nque c\u0026rsquo;est le jour le moins critique, dans le sens où je n\u0026rsquo;ai jamais planté\nune mise à jour d\u0026rsquo;une Sid ce jour-là ; par contre, cela m\u0026rsquo;est arrivé sur\nd\u0026rsquo;autres jours de la semaine\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eCe jour-là, utilisez juste l\u0026rsquo;option \u003ccode\u003eupgrade\u003c/code\u003e à l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"gestion-mensuelle\"\u003eGestion Mensuelle\u003c/h3\u003e\n\u003cp\u003eUne fois par mois, \u003cstrong\u003ececi est un impératif\u003c/strong\u003e - \u003cem\u003equi peut être fait une fois\npar semaine, mais généralement peu utile\u003c/em\u003e, utilisez l\u0026rsquo;option \u003ccode\u003efull-upgrade\u003c/code\u003e\nde l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePrenez conscience que l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003efull-upgrade\u003c/code\u003e peut avoir pour\nconséquence la suppression de certains logiciels installés, qui ne seront\npeut-être pas réinstallables par la suite.\u003c/div\u003e\n\n\u003ch3 id=\"gestion-dautoremove\"\u003eGestion d\u0026rsquo;autoremove\u003c/h3\u003e\n\u003cp\u003eParfois l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e peut vous informer d\u0026rsquo;un certain nombre de logiciels\nqui n\u0026rsquo;ont plus de dépendances utiles et qui peuvent être supprimés avec\nl\u0026rsquo;option \u003ccode\u003eautoremove\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCe sera particulièrement le cas lorsque vous aurez utiliser l\u0026rsquo;option\n\u003ccode\u003efull-upgrade\u003c/code\u003e pour mettre à jour votre version \u003cstrong\u003eUnstable\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eSi vous ne voulez pas que apt vous supprime particulièrement certains des\nlogiciels nommés dont vous pouvez avoir besoin, il faudra utiliser l\u0026rsquo;outil\n\u003ccode\u003eapt-mark\u003c/code\u003e au cas par cas en utilisant l\u0026rsquo;option \u003ccode\u003emanual\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ apt-mark manual nom-logiciel\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, une fois les logiciels marqués, vous pourrez utiliser l\u0026rsquo;option \u003ccode\u003eautoremove\u003c/code\u003e\navec l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl est utile de lire le manpage : \u003cbr\u003e\n\u003ccode\u003eman 8 apt-mark\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"dépannage\"\u003eDépannage\u003c/h3\u003e\n\u003cp\u003e⇒ Lire les journaux liés à l\u0026rsquo;activité d\u0026rsquo;apt, ils sont dans \u003ccode\u003e/var/log/apt\u003c/code\u003e\net se nomme \u003ccode\u003ehistory\u003c/code\u003e et \u003ccode\u003eterm\u003c/code\u003e. Le deuxième nécessite les droits admins\nmême pour la lecture, et reprend l\u0026rsquo;historique de l\u0026rsquo;activité tel qu\u0026rsquo;il est\naffiché dans le terminal/la console.\u003c/p\u003e\n\u003cp\u003e⇒ Pour savoir quels paquets sont épinglés, il y a deux manières :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;utilisation de l\u0026rsquo;outil \u003ccode\u003eapt-cache\u003c/code\u003e et de son option \u003ccode\u003epolicy\u003c/code\u003e, tel que :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-bash\" data-lang=\"bash\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFichiers du paquet :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e100\u003c/span\u003e /var/lib/dpkg/status\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     release \u003cspan style=\"color:#ef6155\"\u003ea\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003enow\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e500\u003c/span\u003e http://deb.devuan.org/merged ceres/non-free i386 Packages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     release \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.0.0,o\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,a\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eunstable,n\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eceres,l\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,c\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003enon-free,b\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ei386\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     origin deb.devuan.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e500\u003c/span\u003e http://deb.devuan.org/merged ceres/non-free amd64 Packages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     release \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.0.0,o\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,a\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eunstable,n\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eceres,l\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,c\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003enon-free,b\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eamd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     origin deb.devuan.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e500\u003c/span\u003e http://deb.devuan.org/merged ceres/contrib i386 Packages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     release \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.0.0,o\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,a\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eunstable,n\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eceres,l\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,c\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003econtrib,b\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ei386\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     origin deb.devuan.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e500\u003c/span\u003e http://deb.devuan.org/merged ceres/contrib amd64 Packages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     release \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.0.0,o\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,a\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eunstable,n\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eceres,l\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,c\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003econtrib,b\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eamd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     origin deb.devuan.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e500\u003c/span\u003e http://deb.devuan.org/merged ceres/main i386 Packages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     release \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.0.0,o\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,a\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eunstable,n\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eceres,l\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,c\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003emain,b\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ei386\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     origin deb.devuan.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e \u003cspan style=\"color:#f99b15\"\u003e500\u003c/span\u003e http://deb.devuan.org/merged ceres/main amd64 Packages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     release \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1.0.0,o\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,a\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eunstable,n\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eceres,l\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eDevuan,c\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003emain,b\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eamd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     origin deb.devuan.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePaquets épinglés :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     libigdgmm12 -\u0026gt; 22.0.2+ds1-1 avec la priorité \u003cspan style=\"color:#f99b15\"\u003e30000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e     libigdgmm12:i386 -\u0026gt; 22.0.2+ds1-1 avec la priorité \u003cspan style=\"color:#f99b15\"\u003e30000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eRemarquez la section \u0026ldquo;\u003cstrong\u003ePaquets épinglés :\u003c/strong\u003e\u0026rdquo; en fin d\u0026rsquo;invite.\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eet/ou afficher le fichier d\u0026rsquo;épingles\n\u003ccode\u003e/etc/apt/preferences.d/apt-listbugs\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Parfois du fait d\u0026rsquo;avoir épinglé un ou plusieurs logiciels, cela rend\nimpossible l\u0026rsquo;installation d\u0026rsquo;un autre logiciel avec un ou plusieurs messages\nd\u0026rsquo;erreurs lors de la tentative d\u0026rsquo;installation, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLecture des listes de paquets…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eConstruction de l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;arbre des dépendances…\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eLecture des informations d\u0026#39;\u003c/span\u003eétat…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCalcul de la mise à jour…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCertains paquets ne peuvent être installés. Ceci peut signifier\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eque vous avez demandé l\u003cspan style=\"color:#48b685\"\u003e\u0026#39;impossible, ou bien, si vous utilisez\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003ela distribution unstable, que certains paquets n\u0026#39;\u003c/span\u003eont pas encore\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eété créés ou ne sont pas sortis d\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Incoming.\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003eL\u0026#39;\u003c/span\u003einformation suivante devrait vous aider à résoudre la situation :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLes paquets suivants contiennent des dépendances non satisfaites :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e linux-headers-5.16.0-3-amd64 : Dépend : linux-compiler-gcc-11-x86\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eE: Impossible de corriger les problèmes, des paquets défectueux sont en mode \u003cspan style=\"color:#48b685\"\u003e\u0026#34;garder en l\u0026#39;état\u0026#34;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col\u003e\n\u003cli\u003eEssayez d\u0026rsquo;installer le paquet mentionné après le terme \u0026ldquo;Depend :\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eParfois il sera nécessaire de supprimer/renommer le fichier de\npreférences relatif à apt-listbugs, puis de retenter l\u0026rsquo;installation qui\navertira très certainement que le paquet dépendant est en défaut… \u003cbr\u003e\nà chacun d\u0026rsquo;analyser les erreurs remontées par apt-listbugs, pour décider\nsi le paquet en défaut peut quand même être installé, ce qui vous permettra\nd\u0026rsquo;installer le logiciel/paquet désiré.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"communauté\"\u003eCommunauté\u003c/h2\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas que leur coup de main est bénévole, souvent anonyme, alors\nsoyez le plus descriptif possible, fournissez une \u003cstrong\u003eEXACTE\u003c/strong\u003e copie du message\nen n\u0026rsquo;oubliant pas de décrire sur quelle architecture vous installez ou\nmettez à jour tel logiciel !\u003c/p\u003e\n\u003cp\u003ePlus vous serez précis, plus vous serez agréable, et plus vous aurez des\nchances d\u0026rsquo;être aidé. Et surtout, n\u0026rsquo;attendez pas \u003cstrong\u003eET\u003c/strong\u003e n\u0026rsquo;exigez \u003cstrong\u003eJAMAIS\u003c/strong\u003e\nqu\u0026rsquo;on vous aide absolument.\u003c/p\u003e\n\u003cp\u003eSoyez amical, cordial, agréable - même si la réponse ne vous plaît/convient pas.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDebian\n\u003cul\u003e\n\u003cli\u003ePour débutants : \u003ca href=\"https://debian-facile.org\" rel=\"external\"\u003ehttps://debian-facile.org\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePour confirmés : \u003ca href=\"https://www.debian-fr.org\" rel=\"external\"\u003ehttps://www.debian-fr.org\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eAntiX semble ne plus avoir de forum de communauté actif\u003c/li\u003e\n\u003cli\u003eDevuan a son propre forum, en langue anglaise : \u003ca href=\"https://dev1galaxy.org/\" rel=\"external\"\u003ehttps://dev1galaxy.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSiduction a son propre forum, en langue anglaise : \u003ca href=\"https://forum.siduction.org/\" rel=\"external\"\u003ehttps://forum.siduction.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eXebian a une communauté d\u0026rsquo;utilisateurs accessible seulement sur IRC, en anglais.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePour les débutants, concernant la version stable de Debian :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://debian-facile.org/projets/lescahiersdudebutant/\" rel=\"external\"\u003ehttps://debian-facile.org/projets/lescahiersdudebutant/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ePour les chevronnés : \u003ca href=\"https://debian-handbook.info/browse/fr-FR/stable/\" rel=\"external\"\u003ehttps://debian-handbook.info/browse/fr-FR/stable/\u003c/a\u003e\n\u003cem\u003e(documentation obsolète basée sur la Debian stable 11)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n",
            "summary": "Apprendre à gérer une Debian Unstable, appelée Sid - de même, pour la Devuan Ceres",
            "tags": ["Debian", "Unstable", "Sid", "Devuan", "Ceres"],
            "date_published": "2020-06-18T16:42:43+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:f00f535a-00df-a464-02df-37e2299e951e",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/checkrestart/",
            "title": "Checkrestart : retrouver les programmes à redémarrer / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description checkrestart est un programme conçu pour aider à trouver les processus qui ont besoin d\u0026rsquo;être redémarrés après une mise à jour.\ncheckrestart parcourt entièrement la table de fichiers du système, à la recherche de processus ayant des nœuds détachés du système de fichiers.\nArchitectures gérées : aarch64 alpha amd64 arm hppa i386 mips64 mips64el powerpc sparc64 Mainteneur : Sebastien Marie semarie@online.fr Openports : https://openports.pl/path/sysutils/checkrestart WWW: https://github.com/semarie/checkrestart Installation Installez le paquet checkrestart.\nUtilisation Très simplement : # checkrestart\nExemple :# checkrestart 76195 pflogd 47538 pflogd 54214 slaacd 50500 slaacd 41162 slaacd Il faut donc redémarrer les services en question, qui dans cet exemple sont pflogd et slaacd.\nDocumentation man 8 checkrestart man 8 checkrestart checkrestart - une aide pour trouver les programmes qui ont besoin d\u0026rsquo;être redémarrés.\nSynopsis checkrestart [-v] [-M core] [-N system] [-W swap]\nDescription checkrestart est un programme conçu pour aider à trouver les processus qui ont besoin d\u0026rsquo;être redémarrés après une mise à jour.\ncheckrestart parcourt entièrement la table des fichiers sur le système à la recherche de nœuds de processus VTEXT détachés du système de fichiers.\nPar défaut, checkrestart affichera l\u0026rsquo;identifiant du processus et le nom de l\u0026rsquo;exécutable du processus en cours.\nLes options sont les suivantes :\n-v : mode verbeux. checkrestart affichera en plus l\u0026rsquo;inode et le point de montage du nœud non lié. -M core : extrait des valeurs associées à une liste de noms selon le cœur spécifié au lieu du noyau. -N system : extrait la liste de noms depuis le système spécifié au lieu du noyau. -W swap : extrait l\u0026rsquo;information swap depuis le fichier spécifié au lieu du noyau. Cas d\u0026rsquo;utilisation typique :\ndémarrez un programme fonctionnant longtemps plus tard, mettez à jour vos paquets via pkg_add -u si un programme est mis à jour, le programme correspondant en fonctionnement est toujours l\u0026rsquo;ancienne version (sans les correctifs de sécurité, par exemple) checkrestart vous dira quels processus sont derrière ce programme. Voir aussi fstat(1). Histoire Le nom checkrestart vient d\u0026rsquo;un outil similaire sur Debian qui est relié à lsof(1) FR pour aboutir au même résultat.\nAuteurs checkrestart a été écrit par Sebastien Marie semarie@online.fr.\nAvertissements Seuls les nœuds VTEXT sont rapportés par checkrestart. Certains programmes qui utilisent d\u0026rsquo;anciennes bibliothèques ne sont pas rapportés du fait d\u0026rsquo;un manque de support dans le noyau.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003echeckrestart\u003c/strong\u003e est un programme conçu pour aider à trouver les\nprocessus qui ont besoin d\u0026rsquo;être redémarrés après une mise à jour.\u003c/p\u003e\n\u003cp\u003echeckrestart parcourt entièrement la table de fichiers du système, à la\nrecherche de processus ayant des nœuds détachés du système de fichiers.\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eArchitectures gérées : aarch64 alpha amd64 arm hppa i386 mips64 mips64el\npowerpc sparc64\u003c/li\u003e\n\u003cli\u003eMainteneur : Sebastien Marie \u003ca href=\"mailto:semarie@online.fr\" rel=\"external\"\u003esemarie@online.fr\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eOpenports : \u003ca href=\"https://openports.pl/path/sysutils/checkrestart\" rel=\"external\"\u003ehttps://openports.pl/path/sysutils/checkrestart\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWWW: \u003ca href=\"https://github.com/semarie/checkrestart\" rel=\"external\"\u003ehttps://github.com/semarie/checkrestart\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003echeckrestart\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eTrès simplement : \u003ccode\u003e# checkrestart\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"exemple\"\u003eExemple\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# checkrestart\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e76195\u003c/span\u003e   pflogd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e47538\u003c/span\u003e   pflogd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e54214\u003c/span\u003e   slaacd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e50500\u003c/span\u003e   slaacd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e41162\u003c/span\u003e   slaacd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl faut donc \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#red%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eredémarrer les services\u003c/a\u003e\n\nen question, qui dans cet exemple sont \u003ccode\u003epflogd\u003c/code\u003e et \u003ccode\u003eslaacd\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/checkrestart/#man-8-checkrestart\"\u003eman 8 checkrestart\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-8-checkrestart\"\u003eman 8 checkrestart\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003echeckrestart\u003c/strong\u003e - une aide pour trouver les programmes qui ont besoin\nd\u0026rsquo;être redémarrés.\u003c/p\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003echeckrestart\u003c/strong\u003e [\u003cstrong\u003e-v\u003c/strong\u003e] [\u003cstrong\u003e-M\u003c/strong\u003e core] [\u003cstrong\u003e-N\u003c/strong\u003e system] [\u003cstrong\u003e-W\u003c/strong\u003e swap]\u003c/p\u003e\n\u003ch4 id=\"description-1\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003echeckrestart\u003c/strong\u003e est un programme conçu pour aider à trouver les\nprocessus qui ont besoin d\u0026rsquo;être redémarrés après une mise à jour.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003echeckrestart\u003c/strong\u003e parcourt entièrement la table des fichiers sur le\nsystème à la recherche de nœuds de processus VTEXT détachés du système\nde fichiers.\u003c/p\u003e\n\u003cp\u003ePar défaut, \u003cstrong\u003echeckrestart\u003c/strong\u003e affichera l\u0026rsquo;identifiant du processus et le\nnom de l\u0026rsquo;exécutable du processus en cours.\u003c/p\u003e\n\u003cp\u003eLes options sont les suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e-v\u003c/strong\u003e : mode verbeux. \u003cstrong\u003echeckrestart\u003c/strong\u003e affichera en plus l\u0026rsquo;inode et\nle point de montage du nœud non lié.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e-M\u003c/strong\u003e core : extrait des valeurs associées à une liste de noms selon\nle cœur spécifié au lieu du noyau.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e-N\u003c/strong\u003e system : extrait la liste de noms depuis le système spécifié au\nlieu du noyau.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e-W\u003c/strong\u003e swap : extrait l\u0026rsquo;information swap depuis le fichier spécifié au\nlieu du noyau.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCas d\u0026rsquo;utilisation typique :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edémarrez un programme fonctionnant longtemps\u003c/li\u003e\n\u003cli\u003eplus tard, mettez à jour vos paquets via \u003ccode\u003epkg_add -u\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esi un programme est mis à jour, le programme correspondant en\nfonctionnement est toujours l\u0026rsquo;ancienne version (sans les correctifs\nde sécurité, par exemple)\u003c/li\u003e\n\u003cli\u003echeckrestart vous dira quels processus sont derrière ce programme.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/fstat\" rel=\"external\"\u003efstat(1)\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"histoire\"\u003eHistoire\u003c/h4\u003e\n\u003cp\u003eLe nom \u003cstrong\u003echeckrestart\u003c/strong\u003e vient d\u0026rsquo;un\n\u003ca href=\"https://manpages.debian.org/buster/debian-goodies/checkrestart.1.en.html\" rel=\"external\"\u003eoutil similaire sur Debian\u003c/a\u003e\nqui est relié à \u003ca href=\"https://manpages.debian.org/buster/lsof/lsof.8.en.html\" rel=\"external\"\u003elsof(1)\u003c/a\u003e\n\u003cem\u003e\u003ca href=\"http://www.linuxcertif.com/man/8/lsof/\" rel=\"external\"\u003eFR\u003c/a\u003e\u003c/em\u003e pour aboutir au même\nrésultat.\u003c/p\u003e\n\u003ch4 id=\"auteurs\"\u003eAuteurs\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003echeckrestart\u003c/strong\u003e a été écrit par Sebastien Marie \u003ca href=\"mailto:semarie@online.fr\" rel=\"external\"\u003esemarie@online.fr\u003c/a\u003e.\u003c/p\u003e\n\u003ch4 id=\"avertissements\"\u003eAvertissements\u003c/h4\u003e\n\u003cp\u003eSeuls les nœuds VTEXT sont rapportés par \u003cstrong\u003echeckrestart\u003c/strong\u003e. Certains\nprogrammes qui utilisent d\u0026rsquo;anciennes bibliothèques ne sont pas rapportés\ndu fait d\u0026rsquo;un manque de support dans le noyau.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "checkrestart : une aide pour trouver les programmes qui ont besoin d'être redémarrés sous OpenBSD",
            "tags": ["OpenBSD", "checkrestart"],
            "date_published": "2020-06-18T10:33:38+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:7e7b3fd5-2c18-e9cd-4db5-9cd892cb5d30",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-ffs2/",
            "title": "FFS2 : Système de Fichiers v2 sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Depuis OpenBSD 6.7, le système de fichiers FFS2 - pour Enhanced Fast Filesystem - est disponible, dans les contextes suivants :\npar défaut, lors d\u0026rsquo;une installation neuve d\u0026rsquo;OpenBSD 6.7 ou supérieure ce qui inclut la -current suivant la 6.7, quelque soit la taille de la partition. par défaut, lors d\u0026rsquo;une création d\u0026rsquo;une nouvelle partition d\u0026rsquo;une taille supérieure à 1 To - depuis OpenBSD 4.2. ou lors d\u0026rsquo;une création manuelle d\u0026rsquo;une nouvelle partition en utilisant newfs(8) avec l\u0026rsquo;option -O2, pour les tailles plus petites. Toutes les architectures supportées par le projet OpenBSD en bénéficient.\nBénéfices FFS2 est plus rapide que sa version précédente FFS pour créer le système de fichier, mais aussi pour l\u0026rsquo;analyser avec l\u0026rsquo;outil fsck(8). FFS2 utilise une horloge de datation sur 64 bits il n\u0026rsquo;est donc pas soumis au bogue de l\u0026rsquo;an 2038. FFS2 supporte des partitions beaucoup plus grandes attention, les super grandes partitions ne sont pas recommandées, car elles demandent, par exemple, plus de mémoire lors d\u0026rsquo;analyse avec fsck() surtout si de nombreux inodes sont utilisés. Convertir FFS ⇒ FFS2 AttentionAVANT toute manipulation de ce type, il est hautement recommandé de faire une sauvegarde de toutes vos données ; vous êtes averti ! Le plus simple pour convertir une partition est de faire une nouvelle installation avec une image de la version 6.7 ou supérieure.\nNéanmoins, il est possible de le faire en quelques petites étapes simples :\nil est recommandé d\u0026rsquo;être en mode utilisateur unique (single user mode) # umount # dump # newfs -O2 # restore # mount InfoAttention, les commandes présentées ci-dessus ne sont pas complètes, dans le sens où elle ne précise pas le disque ou la partition à cibler ; il est important de lire les manpages correspondants pour les utiliser correctement.\ndump(8) : https://man.openbsd.org/dump.8 newfs(8) : https://man.openbsd.org/newfs.8 restore(8) : https://man.openbsd.org/restore.8 Pour finir, redémarrez la machine…\nEt, voilà !\nHistoire FFS2 est apparu la première fois dans OpenBSD 4.2 - Changelog 4.2 Ajout du support de FFS, le 13 Avril 2007 - cf: CVSWeb newfs n°1.57 FFS2 devient le FS par défaut pour les grands systèmes de fichiers, ayant un bloc d\u0026rsquo;entier supérieur à 512 octets - cf: CVSWeb newfs n°1.82 cf : source\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDepuis OpenBSD 6.7, le système de fichiers FFS2 - pour \u003cem\u003eEnhanced Fast Filesystem\u003c/em\u003e -\nest disponible, dans les contextes suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epar défaut, lors d\u0026rsquo;une installation neuve d\u0026rsquo;OpenBSD 6.7 ou supérieure\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003ece qui inclut la -current suivant la 6.7, quelque soit la taille\nde la partition\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003epar défaut, lors d\u0026rsquo;une création d\u0026rsquo;une nouvelle partition d\u0026rsquo;une taille\nsupérieure à 1 To - \u003cem\u003edepuis OpenBSD 4.2\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eou lors d\u0026rsquo;une création manuelle d\u0026rsquo;une nouvelle partition en utilisant\n\u003ca href=\"https://man.openbsd.org/newfs.8\" rel=\"external\"\u003e\u003ccode\u003enewfs\u003c/code\u003e(8)\u003c/a\u003e avec l\u0026rsquo;option \u003ccode\u003e-O2\u003c/code\u003e,\npour les tailles plus petites.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eToutes les \u003ca href=\"https://www.openbsd.org/plat.html\" rel=\"external\"\u003earchitectures supportées\u003c/a\u003e\npar le projet OpenBSD en bénéficient.\u003c/p\u003e\n\u003ch2 id=\"bénéfices\"\u003eBénéfices\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFFS2 est plus rapide que sa version précédente FFS pour créer le\nsystème de fichier, mais aussi pour l\u0026rsquo;analyser avec l\u0026rsquo;outil\n\u003ca href=\"https://man.openbsd.org/fsck.8\" rel=\"external\"\u003e\u003ccode\u003efsck\u003c/code\u003e(8)\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eFFS2 utilise une horloge de datation sur 64 bits\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eil n\u0026rsquo;est donc pas soumis au \u003ca href=\"https://fr.wikipedia.org/wiki/Bug_de_l%27an_2038\" rel=\"external\"\u003ebogue de l\u0026rsquo;an 2038\u003c/a\u003e\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eFFS2 supporte des partitions beaucoup plus grandes\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eattention, les super grandes partitions ne sont pas recommandées,\ncar elles demandent, par exemple, plus de mémoire lors d\u0026rsquo;analyse avec\n\u003ccode\u003efsck()\u003c/code\u003e surtout si de nombreux inodes sont utilisés\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"convertir-ffs--ffs2\"\u003eConvertir FFS ⇒ FFS2\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eAVANT toute manipulation de ce type, il est \u003cstrong\u003ehautement recommandé de\nfaire une sauvegarde de toutes vos données\u003c/strong\u003e ; vous êtes averti !\u003c/div\u003e\n\n\u003cp\u003eLe plus simple pour convertir une partition est de faire une nouvelle\ninstallation avec une image de la version 6.7 ou supérieure.\u003c/p\u003e\n\u003cp\u003eNéanmoins, il est possible de le faire en quelques petites étapes simples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eil est recommandé d\u0026rsquo;être en mode utilisateur unique \u003cem\u003e(single user mode)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# umount\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# dump\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# newfs -O2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# restore\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# mount\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eAttention, les commandes présentées ci-dessus ne sont pas complètes,\ndans le sens où elle ne précise pas le disque ou la partition à cibler ;\nil est important de lire les manpages correspondants pour les utiliser\ncorrectement.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edump(8) : \u003ca href=\"https://man.openbsd.org/dump.8\" rel=\"external\"\u003ehttps://man.openbsd.org/dump.8\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003enewfs(8) :  \u003ca href=\"https://man.openbsd.org/newfs.8\" rel=\"external\"\u003ehttps://man.openbsd.org/newfs.8\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003erestore(8) : \u003ca href=\"https://man.openbsd.org/restore.8\" rel=\"external\"\u003ehttps://man.openbsd.org/restore.8\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003cp\u003ePour finir, redémarrez la machine…\u003c/p\u003e\n\u003cp\u003eEt, voilà !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"histoire\"\u003eHistoire\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFFS2 est apparu la première fois dans\n\u003ca href=\"https://www.openbsd.org/42.html\" rel=\"external\"\u003eOpenBSD 4.2\u003c/a\u003e - \u003ca href=\"https://www.openbsd.org/plus42.html\" rel=\"external\"\u003eChangelog 4.2\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eAjout du support de FFS, le 13 Avril 2007 - cf:\n\u003ca href=\"https://cvsweb.openbsd.org/src/sbin/newfs/newfs.c?rev=1.57\u0026amp;content-type=text/x-cvsweb-markup\" rel=\"external\"\u003eCVSWeb newfs n°1.57\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eFFS2 devient le FS par défaut pour les grands systèmes de fichiers,\nayant un bloc d\u0026rsquo;entier supérieur à 512 octets - cf:\n\u003ca href=\"https://cvsweb.openbsd.org/src/sbin/newfs/newfs.c?rev=1.82\u0026amp;content-type=text/x-cvsweb-markup\" rel=\"external\"\u003eCVSWeb newfs n°1.82\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003ecf : \u003ca href=\"https://marc.info/?l=openbsd-misc\u0026amp;m=159061305709736\u0026amp;w=2\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comprendre le système de fichiers FFS2 d'OpenBSD",
            "tags": ["OpenBSD", "Astuce", "FFS"],
            "date_published": "2020-05-30T18:48:27+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:b569679a-cfa8-ed48-e110-49d33db9c9b9",
            "url": "http://doc.huc.fr.eu.org/fr/web/httpd/httpd-delivre-fichiers-compresses/",
            "title": "httpd : délivrer des fichiers statiques compressés (+ slowcgi)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD intègre par défaut dans le système de base :\nun serveur web, nommé httpd, depuis 5.7 - que j\u0026rsquo;ai présenté plus ou moins succinctement ici un serveur CGI, nommé slowcgi, depuis 5.4\nSite web : https://bsd.plumbing/\nOpenBSD : 6.6, 6.7\nPrincipe : si le client web informe qu\u0026rsquo;il accepte l\u0026rsquo;encodage de compression aux formats deflate, gzip, br, alors httpd passe la main à slowcgi qui délivre le contenu compressé correspondant.\nAttentionIl ne s\u0026rsquo;agit en aucun cas de la compression à la volée ! Le problème est que le serveur httpd n\u0026rsquo;est pas capable de gérer la délivrance de contenu statique compressé.\nL\u0026rsquo;astuce est d\u0026rsquo;utiliser le serveur CGI slowcgi, intégré lui-aussi dans le système de base, pour assumer la délivrance de ce contenu statique compressé.\nEn effet, par le biais de script CGI - ici, en shell - nous allons pouvoir assumer la délivrance de ces contenus statiques suivants :\nFormats de fichiers gérés : atom, css, html, js, json, svg, txt, xml aux deux formats de compression : que sont gzip, et brotli. Installation Il est nécessaire de télécharger mon script sbw.cgi.\nUne fois téléchargé, à vous de le mettre dans le répertoire cgi-bin du chroot web. Le mieux étant d\u0026rsquo;utiliser la commande install suivante :\ninstall -o www -g bin -m 0550 sbw.cgi /var/www/cgi-bin/sbw.cgi qui nous permet de l\u0026rsquo;installer proprement avec les droits minimum, strictement nécessaire, attribué à l\u0026rsquo;utilisateur web www, au groupe bin.\nDépendances Le script nécessite l\u0026rsquo;installation de plusieurs binaires et quelques bibliothèques à l\u0026rsquo;intérieur du chroot web pour fonctionner correctement.\nIl faut donc veiller à copier :\nle shell en premier, ainsi que les binaires cat, date et sha256, qui se trouvent tous dans le répertoire système /bin.\nles binaires basename, logger 1 , stat, qui se trouvent être dans le répertoire système /usr/bin\nla bibliothèque C partagée /usr/lib/libc.so.xx.0 2 la bibliothèque d\u0026rsquo;exécution /usr/libexec/ld.so\nvers leurs répertoires respectifs dans le chroot web /var/www/.\nSi tous doivent être assujettis à l\u0026rsquo;utilisateur root et groupe bin :\nchacun des binaires doit avoir des droits 0555, par exemple :\npour sh : install -o root -g bin -m 0555 /bin/sh /var/www/bin/ pour stat : install -o root -g bin -m 0555 /usr/bin/stat /var/www/usr/bin/ et chacune des bibliothèques, des droits 0444 :\npour la libc : install -o root -g bin -m 0444 /usr/lib/libc.so.xx.0 /var/www/usr/lib/ pour ld.so : install -o root -g bin -m 0444 /usr/libexec/ld.so /var/www/usr/libexec/ Cela nécessite de créer avant les répertoires correspondant dans le chroot web !\nMais comme je suis quelqu\u0026rsquo;un de très gentil, retrouvez mon script de gestion des dépendances.\n1 De l\u0026rsquo;intérêt du binaire logger : bien sûr que normalement, idéalement, nous n\u0026rsquo;avons pas besoin du logger, mais il a pour propos de journaliser certaines actions, qui en cas d\u0026rsquo;échec, sont intéressantes à faire écrire dans les journaux /var/log/{daemon,messages}.\nDe même, si la variable debug est paramétrée sur 1, dans la fonction principale, alors le logger restituera les valeurs correspondantes aux différentes variables, à fin d\u0026rsquo;analyse : s\u0026rsquo;assurer que telle variable reçoit bien une valeur, dans tel contexte, et si oui, quelle valeur !\n2 La bibliothèque C partagée, entre chaque version d\u0026rsquo;OpenBSD, change aussi de nom. Ainsi, pour OpenBSD :\nv6.7 : libc.so.96.0 v6.6 : libc.so.95.1 Ce détail est important et peut difficilement être scripté. Donc, lors de changement de version d\u0026rsquo;OpenBSD, il faut bien veiller à modifier le script pour lui définir le nouveau nom de la bibliothèque, sinon il ne fonctionnera pas !\nAstuceL\u0026rsquo;astuce pour savoir quelles sont les dépendances liées à un binaire est d\u0026rsquo;utiliser la commande ldd sur le binaire en question. Configuration httpd Il est nécessaire d\u0026rsquo;ajouter dans votre contexte server, les déclarations location suivantes :\nlocation \u0026#34;/*.atom\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } location \u0026#34;/*.css\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } location \u0026#34;/*.html\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } location \u0026#34;/*.js\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } location \u0026#34;/*.json\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } location \u0026#34;/*.svg\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } location \u0026#34;/*.txt\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } location \u0026#34;/*.xml\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; } Quant au cas du fichier \u0026quot;/etc/httpd.d/sbw.conf, il renferme le contenu des déclarations fastcgi suivantes :\nroot \u0026#34;/cgi-bin/sbw.cgi\u0026#34; fastcgi param realroot \u0026#34;/htdocs/domaine.tld/www\u0026#34; fastcgi param cachecontrol \u0026#34;1814400\u0026#34; fastcgi param file404 \u0026#34;/404.html\u0026#34; Explications :\nIl importe de définir au moins :\nroot pour lui signifier le chemin relatif au chroot web, du script CGI à exécuter. le paramètre realroot : bien indiquer la racine vers votre espace web, au sein du chroot web. les autres paramètres sont certes optionnels mais néanmoins utiles à envoyer au script CGI, surtout celui de la gestion du cache. slowcgi Le serveur slowgci ne nécessite aucune configuration. Il nécessite seulement d\u0026rsquo;être activé et démarré avec l\u0026rsquo;outil de contrôle rcctl.\nHistoire Des failles En effet, l\u0026rsquo;histoire du protocole HTTP nous a révélé deux failles majeures liées à la compression à la volée, ou compression dynamique de contenu : CRIME et BREACH - qui est dérivée de la première. Ces deux failles peuvent même impacter TLS .\nMême si la plupart des clients web ont été corrigés pour s\u0026rsquo;efforcer d\u0026rsquo;atténuer ces failles, il n\u0026rsquo;est clairement pas recommandé d\u0026rsquo;utiliser la méthode de compression à la volée, que savent très bien gérer la plupart des serveurs HTTP.\nParmi les parades, a été l\u0026rsquo;adoption depuis HTTP 1.1 du transfert par encodage de bloc - la fameuse entête Transfer-Encoding: chunked - de même, il est fortement recommandé de mettre en place une politique Referrer afin de n\u0026rsquo;autoriser que la délivrance de contenu compressé QUE depuis le domaine en cours, et de la refuser depuis tout autre domaine duquel du contenu est appelé (CSS, JS, fonts, json, etc.).\nRelative à httpd L\u0026rsquo;auteur Reyk Floeter se refuse à la prise en charge de contenu compressé. Et, même si une requête a été faite pour délivrer du contenu déjà compressé, ce n\u0026rsquo;est pas prêt d\u0026rsquo;être intégré.\nbrotli Le format brotli est un format de compression inventé par une équipe de l\u0026rsquo;entreprise Google. Il est considéré comme étant le successeur de gzip car plus rapide et un meilleur taux de compression.\nEn savoir plus :\nhttps://brotli.org/ Est-ce que votre client web le supporte : https://caniuse.com/#search=brotli À savoir que curl gére le format brotli, depuis la sortie de sa version 7.57.0, par l\u0026rsquo;usage de l\u0026rsquo;option --compressed, voire de l\u0026rsquo;option -H - option qui permet de gérer finement les entêtes HTTP. (cf : lire son manpage)\nclients non supportés L\u0026rsquo;outil curl sous OpenBSD semble ne pas supporter le format de compression, bien que celui-ci soit intégré dans le code de source de l\u0026rsquo;outil. De même, les clients web console que sont lynx, et w3m ne prennent pas en charge brotli, quelque soit l\u0026rsquo;OS. Firefox Ahhh, fichu Firefox, qui depuis la version 64, ne gére plus nativement les flux de syndication Atom et RSS.\nEn fait, c\u0026rsquo;est plus subtil qu\u0026rsquo;il n\u0026rsquo;y paraît. Si vous délivrez le contenu Atom et RSS avec le mime type text/xml, puisqu\u0026rsquo;après tout, tous les deux sont bel et bien des fichiers XML, alors Firefox acceptera de les lire nativement et de vous les afficher. Il ne les mettra pas en forme, mais il vous affichera le contenu.\nSi vous les délivrer avec leur propre type de contenu, à savoir respectivement application/atom+xml et application/rss+xml, tous les deux normés par une RFC (Requests for comments) ou l\u0026rsquo;autre, alors Firefox vous demandera quoi en faire !\nUne aberration sans nom !!!\nLa petite histoire Pour la petit histoire, Xavier Cartron @prx est l\u0026rsquo;auteur original de cette idée de délivrer du contenu statique compressé.\nLe travail que j\u0026rsquo;ai effectué se base sur sa première version de script CGI shell. Mais elle ne me satisfaisait pas, pour plusieurs raisons, car il se contente à délivrer au format gzip, QUE SI gzip est demandé.\nIl a eu l\u0026rsquo;idée géniale d\u0026rsquo;ajouter la gestion de l\u0026rsquo;entête ETag, qui sert à fixer un identifiant par ressource délivrée. C\u0026rsquo;est dans ce contexte, que le binaire sha256 est utile.\nAyant entendu parler du format de compression brotli, j\u0026rsquo;ai donc repris/continué l\u0026rsquo;écriture afin de pouvoir délivrer du contenu statique compressé précédemment avec ce format.\nEnsuite, j\u0026rsquo;ai ajouté le code nécessaire pour la gestion des entêtes nécessaires :\nContent-Length : pour envoyer le poids du document quelque soit sa version ; c\u0026rsquo;est dans ce contexte que le binaire stat est nécessaire.\nLast-Modified : pour récupèrer la date de modification du document à délivrer ; d\u0026rsquo;aucun considère que cette entête est plus pertinente que ETag. C\u0026rsquo;est dans ce contexte que les binaires date et stats sont utiles.\nTransfer-Encoding : pour envoyer le document à délivrer dans le bon format de compression, si besoin est.\nPuis, j\u0026rsquo;ai écrit le code nécessaire pour détecter si les dépendances utiles étaient bien dans le chroot web, autrement le script ne peut fonctionner. Si les dépendances ne sont pas installées, alors le serveur renvoie une erreur 500, avec un message HTML décryptant l\u0026rsquo;erreur.\nAttention : le script n\u0026rsquo;installe pas et ne peut pas installer les dépendances, du fait d\u0026rsquo;être dans le chroot web, il ne peut voir ce qui se passe au-delà !\nPuis, après quelques recherches sur le web, j\u0026rsquo;ai compris que le format de compression deflate qui peut être demandé par certains clients web, est compris dans le format de compression gzip, de là, la prise en charge.\nMais j\u0026rsquo;étais confronté à des dysfonctionnements que je n\u0026rsquo;arrivais pas à comprendre et encore moins à résoudre. Et, là deux \u0026ldquo;choses\u0026rdquo; m\u0026rsquo;ont sérieusement aider à avancer - car, à moment donné, ne m\u0026rsquo;en sentant plus les capacités, j\u0026rsquo;ai tout simplement laissé tomber, n\u0026rsquo;y arrivant pas, ne trouvant pas l\u0026rsquo;aide nécessaire pour avancer - :\nSolène Rapenne, de l\u0026rsquo;équipe d\u0026rsquo;OpenBSD, m\u0026rsquo;a aidé à comprendre que je faisais l\u0026rsquo;erreur d\u0026rsquo;envoyer en trop des retours à la ligne, alors qu\u0026rsquo;il m\u0026rsquo;en faut un seul, au bon moment, celui entre l\u0026rsquo;envoi des différentes entêtes et l\u0026rsquo;envoi du document lui-même, qu\u0026rsquo;il soit compressé ou non. l\u0026rsquo;idée d\u0026rsquo;implémenter une variable debug et d\u0026rsquo;utiliser le binaire logger pour m\u0026rsquo;assurer des différents retours. Une astuce que m\u0026rsquo;a donné Solène est l\u0026rsquo;usage en local de cette commande :\nenv HTTP_ACCEPT_ENCODING=br realroot=/var/www/htdocs/domaine.tld/dev/ PATH_INFO=index.html /var/www/cgi-bin/sbw.cgi | less m\u0026rsquo;expliquant qu\u0026rsquo;il est possible d\u0026rsquo;interroger localement directement le script CGI, en lui envoyant les différentes valeurs possibles lors de l\u0026rsquo;appel… via les variables d\u0026rsquo;environnements.\nIdée géniale !\nÀ ce propos, étant donné que nous avons installé le script shell CGI sbw.cgi avec des droits utilisateurs 0550, vous aurez le droit à cette petite erreur :\nenv: /var/www/cgi-bin/sbw2.cgi: Permission denied il suffit de changer le droit d\u0026rsquo;exécution pour les autres ;-) (0551, ou +x)\nJ\u0026rsquo;ai amélioré la détection du mime type en l\u0026rsquo;obtenant à partir du fichier appelé sur le système - qui nécessite l\u0026rsquo;usage du binaire basename - et la gestion des types de contenu des flux de syndication Atom ou RSS.\nPour finir, j\u0026rsquo;ai écrit le code nécessaire pour détecter si l\u0026rsquo;agent utilisateur était Firefox.\nSi oui, pour récupèrer son numéro de version, car étant donné que les flux de syndication ne sont plus correctement supportés, un petit pack était nécessaire pour lui délivrer les flux Atom et RSS au format \u0026ldquo;trompeur\u0026rdquo; text/xml. Ainsi, Firefox accepte de le lire au-lieu de demander à l\u0026rsquo;ouvrir avec une autre application. J\u0026rsquo;ai écrit la première mouture de ce hack nécessitant l\u0026rsquo;ajout des binaires grep et awk - solution qui ne me satisfaisait pas, mais fonctionnelle. Et, suite à la réflexion de l\u0026rsquo;utilisateur @eol, sur le forum de la communauté française d\u0026rsquo;\u0026ldquo;OpenBSD pour tous\u0026rdquo;, j\u0026rsquo;ai remplacé par un travail sur l\u0026rsquo;expansion des variables en shell.\nEt, voilà !\nActuellement, @prx a réécrit son script shell en langage C :\nl\u0026rsquo;avantage est qu\u0026rsquo;il n\u0026rsquo;y a besoin d\u0026rsquo;aucune dépendance, et que c\u0026rsquo;est \u0026ldquo;protégé\u0026rdquo; par les mesures de sécurité sur les appels système que sont pledge(2) et unveil(2).\nnéanmoins, il ne gère QUE la compression gzip ; de même certaines petites choses ne sont pas gérées : pas de gestion de l\u0026rsquo;entête Last-Modified, ni du support brotli ou deflate, ou du moins pas directement|automatiquement.\nDocumentation En savoir plus sur la mise en place d\u0026rsquo;une politique Referrer : HTTP : Referrer (header) manpage install slowcgi(8) , rcctl(8) pledge(2) , unveil(2) Wikipédia BREACH WP ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenBSD\u003c/strong\u003e intègre par défaut dans le système de base :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eun serveur web, nommé \u003cstrong\u003ehttpd\u003c/strong\u003e, depuis 5.7 - \u003cem\u003eque j\u0026rsquo;ai présenté plus\nou moins succinctement \n\u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003eici\u003c/a\u003e\n\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eun serveur CGI, nommé \u003cstrong\u003eslowcgi\u003c/strong\u003e, depuis 5.4\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSite web : \u003ca href=\"https://bsd.plumbing/\" rel=\"external\"\u003ehttps://bsd.plumbing/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpenBSD : \u003cstrong\u003e6.6, 6.7\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003ePrincipe\u003c/strong\u003e : si le client web informe qu\u0026rsquo;il accepte l\u0026rsquo;encodage de compression\naux formats deflate, gzip, br, alors \u003cstrong\u003ehttpd\u003c/strong\u003e passe la main à \u003cstrong\u003eslowcgi\u003c/strong\u003e\nqui délivre le contenu compressé correspondant.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eIl ne s\u0026rsquo;agit en aucun cas de la compression à la volée !\u003c/div\u003e\n\n\u003cp\u003eLe problème est que le serveur \u003cstrong\u003ehttpd\u003c/strong\u003e n\u0026rsquo;est pas capable de gérer la\ndélivrance de contenu statique compressé.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;astuce est d\u0026rsquo;utiliser le serveur CGI \u003cstrong\u003eslowcgi\u003c/strong\u003e, intégré lui-aussi dans\nle système de base, pour assumer la délivrance de ce contenu statique compressé.\u003c/p\u003e\n\u003cp\u003eEn effet, par le biais de script CGI - \u003cem\u003eici, en shell\u003c/em\u003e - nous allons pouvoir\nassumer la délivrance de ces contenus statiques suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFormats de fichiers gérés : \u003cstrong\u003eatom\u003c/strong\u003e, \u003cstrong\u003ecss\u003c/strong\u003e, \u003cstrong\u003ehtml\u003c/strong\u003e, \u003cstrong\u003ejs\u003c/strong\u003e, \u003cstrong\u003ejson\u003c/strong\u003e,\n\u003cstrong\u003esvg\u003c/strong\u003e, \u003cstrong\u003etxt\u003c/strong\u003e, \u003cstrong\u003exml\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eaux deux formats de compression : que sont \u003cstrong\u003egzip\u003c/strong\u003e, et \u003cstrong\u003ebrotli\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eIl est nécessaire de \u003ca href=\"https://framagit.org/hucste/tools/-/raw/master/OpenBSD/slowcgi/sbw.cgi\" rel=\"external\"\u003etélécharger mon script \u003cstrong\u003esbw.cgi\u003c/strong\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eUne fois téléchargé, à vous de le mettre dans le répertoire \u003ccode\u003ecgi-bin\u003c/code\u003e du\nchroot web. Le mieux étant d\u0026rsquo;utiliser la commande \u003ccode\u003einstall\u003c/code\u003e suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o www -g bin -m \u003cspan style=\"color:#f99b15\"\u003e0550\u003c/span\u003e sbw.cgi /var/www/cgi-bin/sbw.cgi\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003equi nous permet de l\u0026rsquo;installer proprement avec les droits minimum, strictement\nnécessaire, attribué à l\u0026rsquo;utilisateur web \u003ccode\u003ewww\u003c/code\u003e, au groupe \u003ccode\u003ebin\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"dépendances\"\u003eDépendances\u003c/h3\u003e\n\u003cp\u003eLe script nécessite l\u0026rsquo;installation de plusieurs binaires et quelques bibliothèques\nà l\u0026rsquo;intérieur du chroot web pour fonctionner correctement.\u003c/p\u003e\n\u003cp\u003eIl faut donc veiller à copier :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ele shell en premier, ainsi que les binaires \u003cstrong\u003ecat\u003c/strong\u003e, \u003cstrong\u003edate\u003c/strong\u003e et \u003cstrong\u003esha256\u003c/strong\u003e,\nqui se trouvent tous dans le répertoire système \u003ccode\u003e/bin\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles binaires \u003cstrong\u003ebasename\u003c/strong\u003e, \u003cstrong\u003elogger\u003c/strong\u003e \u003csup\u003e\u003cspan class=\"orange\"\u003e1\u003c/span\u003e\n\u003c/sup\u003e,\n\u003cstrong\u003estat\u003c/strong\u003e, qui se trouvent être  dans le répertoire système \u003ccode\u003e/usr/bin\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela bibliothèque C partagée \u003ccode\u003e/usr/lib/libc.so.xx.0\u003c/code\u003e\n\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela bibliothèque d\u0026rsquo;exécution \u003ccode\u003e/usr/libexec/ld.so\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003evers leurs répertoires respectifs dans le chroot web \u003ccode\u003e/var/www/\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSi tous doivent être assujettis à l\u0026rsquo;utilisateur \u003ccode\u003eroot\u003c/code\u003e et groupe \u003ccode\u003ebin\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003echacun des binaires doit avoir des droits 0555, par exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour \u003cstrong\u003esh\u003c/strong\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g bin -m \u003cspan style=\"color:#f99b15\"\u003e0555\u003c/span\u003e /bin/sh /var/www/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003epour \u003cstrong\u003estat\u003c/strong\u003e  :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g bin -m \u003cspan style=\"color:#f99b15\"\u003e0555\u003c/span\u003e /usr/bin/stat /var/www/usr/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eet chacune des bibliothèques, des droits 0444 :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour la \u003cstrong\u003elibc\u003c/strong\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g bin -m \u003cspan style=\"color:#f99b15\"\u003e0444\u003c/span\u003e /usr/lib/libc.so.xx.0 /var/www/usr/lib/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003epour \u003cstrong\u003eld.so\u003c/strong\u003e :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g bin -m \u003cspan style=\"color:#f99b15\"\u003e0444\u003c/span\u003e /usr/libexec/ld.so /var/www/usr/libexec/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCela nécessite de créer avant les répertoires correspondant dans le chroot web !\u003c/p\u003e\n\u003cp\u003eMais comme je suis quelqu\u0026rsquo;un de très gentil, retrouvez mon\n\u003ca href=\"https://framagit.org/hucste/tools/-/blob/master/OpenBSD/chroot_deps\" rel=\"external\"\u003escript de gestion des dépendances\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003csup\u003e\u003cspan class=\"orange\"\u003e1\u003c/span\u003e\n\u003c/sup\u003e De l\u0026rsquo;intérêt du binaire \u003ccode\u003elogger\u003c/code\u003e :\nbien sûr que normalement, idéalement, nous n\u0026rsquo;avons pas besoin du logger, mais\nil a pour propos de journaliser certaines actions, qui en cas d\u0026rsquo;échec, sont\nintéressantes à faire écrire dans les journaux \u003ccode\u003e/var/log/{daemon,messages}\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDe même, si la variable \u003ccode\u003edebug\u003c/code\u003e est paramétrée sur \u003ccode\u003e1\u003c/code\u003e, dans la fonction\nprincipale, alors le logger restituera les valeurs correspondantes aux\ndifférentes variables, à fin d\u0026rsquo;analyse : s\u0026rsquo;assurer que telle variable reçoit\nbien une valeur, dans tel contexte, et si oui, quelle valeur !\u003c/p\u003e\n\u003cp\u003e\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e La bibliothèque C partagée, entre\nchaque version d\u0026rsquo;OpenBSD, change aussi de nom. Ainsi, pour OpenBSD :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ev6.7 : \u003ccode\u003elibc.so.96.0\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ev6.6 : \u003ccode\u003elibc.so.95.1\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCe détail est important et peut difficilement être scripté. Donc, lors de\nchangement de version d\u0026rsquo;OpenBSD, il faut bien veiller à modifier le script\npour lui définir le nouveau nom de la bibliothèque, sinon il ne fonctionnera\npas !\u003c/p\u003e\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eL\u0026rsquo;astuce pour savoir quelles sont les dépendances liées à un binaire est\nd\u0026rsquo;utiliser la commande \u003ccode\u003eldd\u003c/code\u003e sur le binaire en question.\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire d\u0026rsquo;ajouter dans votre contexte \u003ccode\u003eserver\u003c/code\u003e, les déclarations\n\u003ccode\u003elocation\u003c/code\u003e suivantes :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003elocation \u0026#34;/*.atom\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\nlocation \u0026#34;/*.css\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\nlocation \u0026#34;/*.html\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\nlocation \u0026#34;/*.js\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\nlocation \u0026#34;/*.json\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\nlocation \u0026#34;/*.svg\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\nlocation \u0026#34;/*.txt\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\nlocation \u0026#34;/*.xml\u0026#34; { include \u0026#34;/etc/httpd.d/sbw.conf\u0026#34; }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eQuant au cas du fichier \u003ccode\u003e \u0026quot;/etc/httpd.d/sbw.conf\u003c/code\u003e, il renferme le contenu des\ndéclarations \u003ccode\u003efastcgi\u003c/code\u003e suivantes :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eroot \u0026#34;/cgi-bin/sbw.cgi\u0026#34;\nfastcgi param realroot \u0026#34;/htdocs/domaine.tld/www\u0026#34;\nfastcgi param cachecontrol \u0026#34;1814400\u0026#34;\nfastcgi param file404 \u0026#34;/404.html\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003eIl importe de définir au moins :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eroot\u003c/strong\u003e pour lui signifier le chemin relatif au chroot web, du script\nCGI à exécuter.\u003c/li\u003e\n\u003cli\u003ele paramètre \u003cstrong\u003erealroot\u003c/strong\u003e : bien indiquer la racine vers votre espace\nweb, au sein du chroot web.\u003c/li\u003e\n\u003cli\u003eles autres paramètres sont certes optionnels mais néanmoins utiles à\nenvoyer au script CGI, surtout celui de la gestion du cache.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"slowcgi\"\u003eslowcgi\u003c/h3\u003e\n\u003cp\u003eLe serveur \u003cstrong\u003eslowgci\u003c/strong\u003e ne nécessite aucune configuration. Il nécessite\nseulement d\u0026rsquo;être activé et démarré avec l\u0026rsquo;outil de contrôle \u003ccode\u003ercctl\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"histoire\"\u003eHistoire\u003c/h2\u003e\n\u003ch3 id=\"des-failles\"\u003eDes failles\u003c/h3\u003e\n\u003cp\u003eEn effet, l\u0026rsquo;histoire du protocole \u003cabbr title=\"HyperText Transfert Protocol\"\u003eHTTP\u003c/abbr\u003e\n nous\na révélé deux failles majeures liées à la compression à la volée, ou compression\ndynamique de contenu : \u003cstrong\u003eCRIME\u003c/strong\u003e et \u003cstrong\u003eBREACH\u003c/strong\u003e - qui est dérivée de la première. \u003cbr\u003e\nCes deux failles peuvent même impacter \u003cabbr title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n.\u003c/p\u003e\n\u003cp\u003eMême si la plupart des clients web ont été corrigés pour s\u0026rsquo;efforcer d\u0026rsquo;atténuer\nces failles, il n\u0026rsquo;est clairement pas recommandé d\u0026rsquo;utiliser la méthode de\ncompression à la volée, que savent très bien gérer la plupart des serveurs HTTP.\u003c/p\u003e\n\u003cp\u003eParmi les parades, a été l\u0026rsquo;adoption depuis HTTP 1.1 du transfert par encodage\nde bloc - \u003cem\u003ela fameuse entête \u003ccode\u003eTransfer-Encoding: chunked\u003c/code\u003e\u003c/em\u003e - de même, il est\nfortement recommandé de mettre en place une politique \u003cstrong\u003eReferrer\u003c/strong\u003e afin de\nn\u0026rsquo;autoriser que la délivrance de contenu compressé QUE depuis le domaine\nen cours, et de la refuser depuis tout autre domaine duquel du contenu est\nappelé (CSS, JS, fonts, json, etc.).\u003c/p\u003e\n\u003ch3 id=\"relative-à-httpd\"\u003eRelative à httpd\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;auteur Reyk Floeter se \u003ca href=\"https://github.com/reyk/httpd/issues/21\" rel=\"external\"\u003erefuse à la prise en charge de contenu compressé\u003c/a\u003e.\nEt, même si une \u003ca href=\"https://github.com/reyk/httpd/issues/80\" rel=\"external\"\u003erequête\u003c/a\u003e a été faite pour délivrer du contenu déjà compressé,\nce n\u0026rsquo;est pas prêt d\u0026rsquo;être intégré.\u003c/p\u003e\n\u003ch3 id=\"brotli\"\u003ebrotli\u003c/h3\u003e\n\u003cp\u003eLe format \u003cstrong\u003ebrotli\u003c/strong\u003e est un format de compression inventé par une équipe\nde l\u0026rsquo;entreprise Google. Il est considéré comme étant le successeur de gzip\ncar plus rapide et un meilleur taux de compression.\u003c/p\u003e\n\u003cp\u003eEn savoir plus :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://brotli.org/\" rel=\"external\"\u003ehttps://brotli.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eEst-ce que votre client web le supporte : \u003ca href=\"https://caniuse.com/#search=brotli\" rel=\"external\"\u003ehttps://caniuse.com/#search=brotli\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eÀ savoir que \u003cstrong\u003ecurl\u003c/strong\u003e gére le format brotli, depuis la sortie de sa version\n7.57.0, par l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003e--compressed\u003c/code\u003e, voire de l\u0026rsquo;option \u003ccode\u003e-H\u003c/code\u003e  -\n\u003cem\u003eoption qui permet de gérer finement les entêtes HTTP\u003c/em\u003e. \u003cem\u003e(cf : lire son \u003ca href=\"https://curl.haxx.se/docs/manpage.html\" rel=\"external\"\u003emanpage\u003c/a\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003ch4 id=\"clients-non-supportés\"\u003eclients non supportés\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;outil \u003cstrong\u003ecurl\u003c/strong\u003e sous OpenBSD semble ne pas supporter le format de compression,\nbien que celui-ci soit intégré dans le code de source de l\u0026rsquo;outil.\u003c/li\u003e\n\u003cli\u003eDe même, les clients web console que sont \u003cstrong\u003elynx\u003c/strong\u003e, et \u003cstrong\u003ew3m\u003c/strong\u003e ne prennent\npas en charge brotli, quelque soit l\u0026rsquo;OS.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"firefox\"\u003eFirefox\u003c/h3\u003e\n\u003cp\u003eAhhh, fichu Firefox, qui depuis la version 64, \u003ca href=\"https://support.mozilla.org/fr/kb/remplacer-lecteur-de-flux-firefox\" rel=\"external\"\u003ene gére plus nativement les flux\u003c/a\u003e\nde syndication Atom et RSS.\u003c/p\u003e\n\u003cp\u003eEn fait, c\u0026rsquo;est plus subtil qu\u0026rsquo;il n\u0026rsquo;y paraît. Si vous délivrez le contenu\nAtom et RSS avec le mime type \u003cstrong\u003etext/xml\u003c/strong\u003e, puisqu\u0026rsquo;après tout, tous les deux\nsont bel et bien des fichiers XML, alors Firefox acceptera de les lire\nnativement et de vous les afficher. Il ne les mettra pas en forme, mais\nil vous affichera le contenu.\u003c/p\u003e\n\u003cp\u003eSi vous les délivrer avec leur propre type de contenu, à savoir respectivement\n\u003cstrong\u003eapplication/atom+xml\u003c/strong\u003e et \u003cstrong\u003eapplication/rss+xml\u003c/strong\u003e, tous les deux normés par\nune \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eRFC \u003cem\u003e(Requests for comments)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ou l\u0026rsquo;autre, alors Firefox vous demandera quoi en faire !\u003c/p\u003e\n\u003cp\u003eUne aberration sans nom !!!\u003c/p\u003e\n\u003ch3 id=\"la-petite-histoire\"\u003eLa petite histoire\u003c/h3\u003e\n\u003cp\u003ePour la petit histoire, Xavier Cartron @prx est l\u0026rsquo;auteur original de cette\nidée de délivrer du contenu statique compressé.\u003c/p\u003e\n\u003cp\u003eLe travail que j\u0026rsquo;ai effectué se base sur sa première version de script CGI\nshell. Mais elle ne me satisfaisait pas, pour plusieurs raisons, car il\nse contente à délivrer au format gzip, QUE SI gzip est demandé.\u003c/p\u003e\n\u003cp\u003eIl a eu l\u0026rsquo;idée géniale d\u0026rsquo;ajouter la gestion de l\u0026rsquo;entête \u003ccode\u003eETag\u003c/code\u003e, qui sert à\nfixer un identifiant par ressource délivrée. C\u0026rsquo;est dans ce contexte, que\nle binaire \u003cstrong\u003esha256\u003c/strong\u003e est utile.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAyant entendu parler du format de compression \u003ca href=\"/fr/web/httpd/httpd-delivre-fichiers-compresses/#brotli\"\u003ebrotli\u003c/a\u003e, j\u0026rsquo;ai donc\nrepris/continué l\u0026rsquo;écriture afin de pouvoir délivrer du contenu statique\ncompressé précédemment avec ce format.\u003c/p\u003e\n\u003cp\u003eEnsuite, j\u0026rsquo;ai ajouté le code nécessaire pour la gestion des entêtes nécessaires :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eContent-Length\u003c/code\u003e : pour envoyer le poids du document quelque soit sa version ;\n\u003cem\u003ec\u0026rsquo;est dans ce contexte que le binaire \u003cstrong\u003estat\u003c/strong\u003e est nécessaire\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eLast-Modified\u003c/code\u003e : pour récupèrer la date de modification du document à\ndélivrer ; d\u0026rsquo;aucun considère que cette entête est plus pertinente que \u003cstrong\u003eETag\u003c/strong\u003e. \u003cbr\u003e\n\u003cem\u003eC\u0026rsquo;est dans ce contexte que les binaires \u003cstrong\u003edate\u003c/strong\u003e et \u003cstrong\u003estats\u003c/strong\u003e sont utiles\u003c/em\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eTransfer-Encoding\u003c/code\u003e : pour envoyer le document à délivrer dans le bon\nformat de compression, si besoin est.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis, j\u0026rsquo;ai écrit le code nécessaire pour détecter si les dépendances utiles\nétaient bien dans le chroot web, autrement le script ne peut fonctionner.\nSi les dépendances ne sont pas installées, alors le serveur renvoie une\nerreur 500, avec un message HTML décryptant l\u0026rsquo;erreur.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAttention\u003c/strong\u003e :  le script n\u0026rsquo;installe pas et ne peut pas installer les\ndépendances, du fait d\u0026rsquo;être dans le chroot web, il ne peut voir ce qui se\npasse au-delà !\u003c/p\u003e\n\u003cp\u003ePuis, après quelques recherches sur le web, j\u0026rsquo;ai compris que le format de\ncompression \u003cstrong\u003edeflate\u003c/strong\u003e qui peut être demandé par certains clients web, est\ncompris dans le format de compression gzip, de là, la prise en charge.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eMais j\u0026rsquo;étais confronté à des dysfonctionnements que je n\u0026rsquo;arrivais pas à\ncomprendre et encore moins à résoudre. Et, là deux \u0026ldquo;choses\u0026rdquo; m\u0026rsquo;ont sérieusement\naider à avancer - \u003cem\u003ecar, à moment donné, ne m\u0026rsquo;en sentant plus les capacités,\nj\u0026rsquo;ai tout simplement laissé tomber, n\u0026rsquo;y arrivant pas, ne trouvant pas l\u0026rsquo;aide\nnécessaire pour avancer\u003c/em\u003e - :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSolène Rapenne, de l\u0026rsquo;équipe d\u0026rsquo;OpenBSD, m\u0026rsquo;a aidé à comprendre que je faisais\nl\u0026rsquo;erreur d\u0026rsquo;envoyer en trop des retours à la ligne, alors qu\u0026rsquo;il m\u0026rsquo;en faut\nun seul, au bon moment, celui entre l\u0026rsquo;envoi des différentes entêtes\net l\u0026rsquo;envoi du document lui-même, qu\u0026rsquo;il soit compressé ou non.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;idée d\u0026rsquo;implémenter une variable \u003ccode\u003edebug\u003c/code\u003e et d\u0026rsquo;utiliser le binaire \u003ccode\u003elogger\u003c/code\u003e\npour m\u0026rsquo;assurer des différents retours.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne astuce que m\u0026rsquo;a donné Solène est l\u0026rsquo;usage en local de cette commande :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eenv \u003cspan style=\"color:#ef6155\"\u003eHTTP_ACCEPT_ENCODING\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003ebr \u003cspan style=\"color:#ef6155\"\u003erealroot\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/var/www/htdocs/domaine.tld/dev/ \u003cspan style=\"color:#ef6155\"\u003ePATH_INFO\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eindex.html /var/www/cgi-bin/sbw.cgi | less\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003em\u0026rsquo;expliquant qu\u0026rsquo;il est possible d\u0026rsquo;interroger localement directement le script\nCGI, en lui envoyant les différentes valeurs possibles lors de l\u0026rsquo;appel…\nvia les variables d\u0026rsquo;environnements.\u003cbr\u003e\n\u003cstrong\u003eIdée géniale !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eÀ ce propos, étant donné que nous avons installé le script shell CGI \u003cstrong\u003esbw.cgi\u003c/strong\u003e\navec des droits utilisateurs \u003cstrong\u003e0550\u003c/strong\u003e, vous aurez le droit à cette petite\nerreur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eenv: /var/www/cgi-bin/sbw2.cgi: Permission denied\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eil suffit de changer le droit d\u0026rsquo;exécution pour les autres ;-) \u003cem\u003e(\u003ccode\u003e0551\u003c/code\u003e, ou \u003ccode\u003e+x\u003c/code\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eJ\u0026rsquo;ai amélioré la détection du mime type en l\u0026rsquo;obtenant à partir du fichier\nappelé sur le système - \u003cem\u003equi nécessite l\u0026rsquo;usage du binaire \u003cstrong\u003ebasename\u003c/strong\u003e\u003c/em\u003e -\net la gestion des types de contenu des flux de syndication Atom ou RSS.\u003c/p\u003e\n\u003cp\u003ePour finir, j\u0026rsquo;ai écrit le code nécessaire pour détecter si l\u0026rsquo;agent utilisateur\nétait \u003ca href=\"/fr/web/httpd/httpd-delivre-fichiers-compresses/#firefox\"\u003eFirefox\u003c/a\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi oui, pour récupèrer son numéro de version, \u003cem\u003ecar étant donné que les flux\nde syndication ne sont plus correctement supportés\u003c/em\u003e, un petit pack était\nnécessaire pour lui délivrer les flux Atom et RSS au format \u0026ldquo;trompeur\u0026rdquo;\n\u003cstrong\u003etext/xml\u003c/strong\u003e. Ainsi, Firefox accepte de le lire au-lieu de demander à l\u0026rsquo;ouvrir\navec une autre application.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit la première mouture de ce hack nécessitant l\u0026rsquo;ajout des binaires\n\u003ccode\u003egrep\u003c/code\u003e et  \u003ccode\u003eawk\u003c/code\u003e - \u003cem\u003esolution qui ne me satisfaisait pas, mais fonctionnelle\u003c/em\u003e. \u003cbr\u003e\nEt, \u003cdel\u003esuite à la \u003ca href=\"https://forum.openbsd.fr.eu.org/showthread.php?tid=2620\u0026amp;pid=20898#pid20898\" rel=\"external\"\u003eréflexion de l\u0026rsquo;utilisateur @eol, sur le forum de la communauté\nfrançaise d\u0026rsquo;\u0026ldquo;OpenBSD pour tous\u0026rdquo;\u003c/a\u003e\u003c/del\u003e, j\u0026rsquo;ai remplacé par un travail sur l\u0026rsquo;expansion\ndes variables en shell.\u003c/p\u003e\n\u003cp\u003eEt, voilà !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eActuellement, @prx a réécrit son script shell en langage C :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;avantage est qu\u0026rsquo;il n\u0026rsquo;y a besoin d\u0026rsquo;aucune dépendance, et que c\u0026rsquo;est \u0026ldquo;protégé\u0026rdquo;\npar les mesures de sécurité sur les appels système que sont pledge(2)\net unveil(2).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003enéanmoins, il ne gère QUE la compression gzip ; de même certaines petites\nchoses ne sont pas gérées : pas de gestion de l\u0026rsquo;entête \u003cstrong\u003eLast-Modified\u003c/strong\u003e,\nni du support brotli ou deflate, ou du moins pas directement|automatiquement.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eEn savoir plus sur la mise en place d\u0026rsquo;une politique Referrer : \n\u003ca class=\"inside\" href=\"/fr/web/http/referrer/\" title=\"Lien interne vers l\u0026#39;article : 'HTTP : Referrer (header)'\"\u003eHTTP : Referrer (header)\u003c/a\u003e\n\n\u003c/p\u003e\n\u003ch3 id=\"manpage\"\u003emanpage\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/install\" title=\"Page du Manuel OpenBSD pour : install\"\u003einstall\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/slowcgi.8\" title=\"Page du Manuel OpenBSD pour : slowcgi\"\u003eslowcgi(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/rcctl.8\" title=\"Page du Manuel OpenBSD pour : rcctl\"\u003ercctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/pledge.2\" title=\"Page du Manuel OpenBSD pour : pledge\"\u003epledge(2)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/unveil.2\" title=\"Page du Manuel OpenBSD pour : unveil\"\u003eunveil(2)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"wikipédia\"\u003eWikipédia\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/BREACH\" title=\"Article Wikipédia : BREACH\"\u003eBREACH \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Délivrer du contenu compressé (au format deflate, gzip, brotli) de fichiers statiques (html, xml, css, js, json, …) par le biais du couple des serveurs natifs httpd+slowcgi sous OpenBSD",
            "tags": ["httpd", "slowcgi", "OpenBSD", "CGI", "deflate", "gzip", "brotli"],
            "date_published": "2020-05-28T20:00:11+02:00",
            "date_modified": "2025-11-18T16:07:44+01:00"
        },{
            "id": "urn:uuid:0985752e-3797-a298-6ad6-8a3b69c8cc62",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/megatools/",
            "title": "megatools : logiciel CLI pour Mega sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Megatools est une collection de programmes pour accéder aux services de Mega depuis la ligne de commande depuis votre machine ou serveur.\nMegatools vous permet de copier des fichiers individuels voire une arborescence de répertoires vers et depuis le nuage informatique. Vous pouvez aussi permettre le téléchargement de flux, tels la prévisualisation de vidéos et de fichiers audio, sans avoir le besoin de télécharger le fichier en entier.\nMegatools est robuste et optimisé pour les opérations rapides - autant que les serveurs Mega le permettent. Les exigences de mémoire et d\u0026rsquo;utilisation de CPU sont réduites au minimum.\nArchitectures gérées : aarch64 alpha amd64 arm hppa i386 mips64 mips64el powerpc sparc64 Mainteneur : Anthony J. Bentley Openports : https://openports.pl/path/net/megatools WWW: https://megatools.megous.com Installation Installez le paquet megatools.\nConfiguration le fichier de configuration personnel est ~/.megarc. Voici à quoi il ressemble, au minimum :\n[Login] Username = identifiant Password = mot-de-passe Pour rappel, merci de lire le man megarc pour connaître les différentes options de configuration possibles.\nUtilisation La première chose à tester, une fois votre configuration faite, est la commande megadf qui permet de tester si la connexion se fait bien avec le service, ainsi que l\u0026rsquo;authentification avec ; tel que, pour l\u0026rsquo;exemple :\n:$ megadf Total: 53687091200 Used: 1163522967 Free: 52523568233 Ainsi la commande retourne l\u0026rsquo;espace total, celui utilisé et celui qui est disponible.\nCette vidéo vous permet en quelques minutes de comprendre l\u0026rsquo;usage des différentes commandes. ATTENTION la commande megasync, mentionnée dans la vidéo, a été remplacée par la commande megacopy**.\nDépannage ERROR: You must specify your mega.nz username (email) Vous avez oublié de spécifier votre identifiant de connexion, généralement votre courriel.\nERROR: Can\u0026rsquo;t login to mega.nz Il est très probable que le mot de passe ou l\u0026rsquo;identifiant que vous fournissez ne soit pas le bon.\nRésultat, vous ne pouvez pas vous connecter au service de Mega.\nYou need to provide non-empty password! Vous n\u0026rsquo;avez pas spécifié de mot de passe - donc pas de connexion au service.\nDocumentation manpages Une fois le paquet installé, sont accessibles les différents manpages sur votre OS :\nmegacopy(1) : pour synchroniser un ou plusieurs fichiers megadf(1) : voir le quota et l\u0026rsquo;utilisation de votre espace megadl(1) : pour télécharger un fichier depuis un lien \u0026ldquo;public\u0026rdquo; Mega - ne nécessite pas d\u0026rsquo;authentification megaget(1) : pour télécharger un fichier megals(1) : lister les fichiers présents sur votre espace Mega megamkdir(1) : créer un répertoire à distance sur votre espace Mega megaput(1) : téléverser un ou plusieurs fichiers sur votre espace Mega megarc(5) : obtenir les informations utiles pour configurer son propre fichier de configuration. megareg(1 : pour créer et vérifier un compte megarm(1) : pour supprimer un ou plusieurs fichiers ou répertoires à distance de votre espace Mega. megatools(7) : le manpage principal Ils sont ainsi accessibles sur Internet à l\u0026rsquo;adresse suivante : https://megatools.megous.com/man/megatools.html\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMegatools\u003c/strong\u003e est une collection de programmes pour accéder aux services\nde Mega depuis la ligne de commande depuis votre machine ou serveur.\u003c/p\u003e\n\u003cp\u003eMegatools vous permet de copier des fichiers individuels voire une\narborescence de répertoires vers et depuis le nuage informatique. Vous\npouvez aussi permettre le téléchargement de flux, tels la prévisualisation\nde vidéos et de fichiers audio, sans avoir le besoin de télécharger le\nfichier en entier.\u003c/p\u003e\n\u003cp\u003eMegatools est robuste et optimisé pour les opérations rapides - autant\nque les serveurs Mega le permettent. Les exigences de mémoire et\nd\u0026rsquo;utilisation de CPU sont réduites au minimum.\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eArchitectures gérées : aarch64 alpha amd64 arm hppa i386 mips64 mips64el powerpc sparc64\u003c/li\u003e\n\u003cli\u003eMainteneur : Anthony J. Bentley\u003c/li\u003e\n\u003cli\u003eOpenports : \u003ca href=\"https://openports.pl/path/net/megatools\" rel=\"external\"\u003ehttps://openports.pl/path/net/megatools\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWWW: \u003ca href=\"https://megatools.megous.com\" rel=\"external\"\u003ehttps://megatools.megous.com\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003emegatools\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier de configuration personnel est \u003ccode\u003e~/.megarc\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoici à quoi il ressemble, au minimum :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[Login]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eUsername\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003eidentifiant\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePassword\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003emot-de-passe\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003ePour rappel, merci de lire le \u003ccode\u003eman megarc\u003c/code\u003e pour connaître les\ndifférentes options de configuration possibles.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eLa première chose à tester, une fois votre \u003ca href=\"/fr/sys/openbsd/megatools/#configuration\"\u003econfiguration\u003c/a\u003e\nfaite, est la commande \u003ccode\u003emegadf\u003c/code\u003e qui permet de tester si la connexion se\nfait bien avec le service, ainsi que l\u0026rsquo;authentification avec ; tel que,\npour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ megadf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTotal: \u003cspan style=\"color:#f99b15\"\u003e53687091200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsed:  \u003cspan style=\"color:#f99b15\"\u003e1163522967\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFree:  \u003cspan style=\"color:#f99b15\"\u003e52523568233\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi la commande retourne l\u0026rsquo;espace total, celui utilisé et celui qui\nest disponible.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eCette \u003ca href=\"https://megatools.megous.com/showcase.mp4\" rel=\"external\"\u003evidéo\u003c/a\u003e vous permet en\nquelques minutes de comprendre l\u0026rsquo;usage des différentes commandes. \u003cbr\u003e\n\u003cstrong\u003eATTENTION\u003c/strong\u003e la commande \u003ccode\u003emegasync\u003c/code\u003e, mentionnée dans la vidéo, a été\nremplacée par la commande \u003ccode\u003emegacopy\u003c/code\u003e**.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"error-you-must-specify-your-meganz-username-email\"\u003eERROR: You must specify your mega.nz username (email)\u003c/h3\u003e\n\u003cp\u003eVous avez oublié de spécifier votre identifiant de connexion,\ngénéralement votre courriel.\u003c/p\u003e\n\u003ch3 id=\"error-cant-login-to-meganz\"\u003eERROR: Can\u0026rsquo;t login to mega.nz\u003c/h3\u003e\n\u003cp\u003eIl est très probable que le mot de passe ou l\u0026rsquo;identifiant que vous\nfournissez ne soit pas le bon.\u003c/p\u003e\n\u003cp\u003eRésultat, vous ne pouvez pas vous connecter au service de Mega.\u003c/p\u003e\n\u003ch3 id=\"you-need-to-provide-non-empty-password\"\u003eYou need to provide non-empty password!\u003c/h3\u003e\n\u003cp\u003eVous n\u0026rsquo;avez pas spécifié de mot de passe - donc pas de connexion au service.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003emanpages\u003c/h3\u003e\n\u003cp\u003eUne fois le paquet installé, sont accessibles les différents manpages sur votre OS :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-copy.html\" rel=\"external\"\u003emegacopy(1)\u003c/a\u003e\u003c/strong\u003e :  pour synchroniser un ou plusieurs fichiers\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-df.html\" rel=\"external\"\u003emegadf(1)\u003c/a\u003e\u003c/strong\u003e : voir le quota et l\u0026rsquo;utilisation de votre espace\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-dl.html\" rel=\"external\"\u003emegadl(1)\u003c/a\u003e\u003c/strong\u003e : pour télécharger un fichier depuis un lien \u0026ldquo;public\u0026rdquo; Mega - ne nécessite pas d\u0026rsquo;authentification\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-get.html\" rel=\"external\"\u003emegaget(1)\u003c/a\u003e\u003c/strong\u003e : pour télécharger un fichier\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-ls.html\" rel=\"external\"\u003emegals(1)\u003c/a\u003e\u003c/strong\u003e : lister les fichiers présents sur votre espace Mega\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-mkdir.html\" rel=\"external\"\u003emegamkdir(1)\u003c/a\u003e\u003c/strong\u003e : créer un répertoire à distance sur votre espace Mega\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-put.html\" rel=\"external\"\u003emegaput(1)\u003c/a\u003e\u003c/strong\u003e : téléverser un ou plusieurs fichiers sur votre espace Mega\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megarc.html\" rel=\"external\"\u003emegarc(5)\u003c/a\u003e\u003c/strong\u003e : obtenir les informations utiles pour configurer son propre fichier de configuration.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-reg.html\" rel=\"external\"\u003emegareg(1\u003c/a\u003e\u003c/strong\u003e : pour créer et vérifier un compte\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools-rm.html\" rel=\"external\"\u003emegarm(1)\u003c/a\u003e\u003c/strong\u003e : pour supprimer un ou plusieurs fichiers ou répertoires à distance de votre espace Mega.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://megatools.megous.com/man/megatools.html\" rel=\"external\"\u003emegatools(7)\u003c/a\u003e\u003c/strong\u003e :  le \u003cstrong\u003emanpage principal\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIls sont ainsi accessibles sur Internet à l\u0026rsquo;adresse suivante : \u003cbr\u003e\n\u003ca href=\"https://megatools.megous.com/man/megatools.html\" rel=\"external\"\u003ehttps://megatools.megous.com/man/megatools.html\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "megatools est une collection d'outils à utiliser sous OpenBSD pour les services du nuage informatique MEGA",
            "tags": ["OpenBSD", "megatools"],
            "date_published": "2020-05-26T16:19:00+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:70fc2401-c178-a51c-a1af-4d8aa926e10f",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tor-browser/",
            "title": "Tor Browser / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Tor Browser est une version personnalisée de Firefox-ESR spécifiquement préparée pour surfer sur Internet via le réseau anonyme Tor.\nSa configuration a pour but d\u0026rsquo;atténuer les attaques contre l\u0026rsquo;anonymisation d\u0026rsquo;un client, incluant le fait de déterminer son adresse IP et l\u0026rsquo;empreinte du navigateur. D\u0026rsquo;autres aspects de Firefox ont aussi été corrigés pour éviter autant que possible les failles de confidentialité.\nPar défaut, sont inclus les modules NoScript, HTTPS Everywhere, TorButton, et Tor-Launcher. Notez que du fait de l\u0026rsquo;utilisation du module NoScript, l\u0026rsquo;utilisation de Javascript est bloqué par défaut.\nTor Browser utilise sa propre instance différente du port du serveur Tor , exécutée sur un autre port que celui du serveur.\nAttentionNote : Le port d\u0026rsquo;OpenBSD n\u0026rsquo;inclut pas encore le composant nommé \u0026ldquo;Pluggable Transports (PT)\u0026rdquo;. De fait, toutes les fonctionnalités ne sont pas encore disponibles, telle l\u0026rsquo;utilisation par obfsproxy. Architectures gérées : amd64 i386 Mainteneur : Caspar Schutijser Openport : https://openports.pl/path/meta/tor-browser WWW: https://www.torproject.org Installation Installez le meta-paquet tor-browser.\nConfiguration Par défaut, Tor Browser enregistre sa configuration dans votre répertoire personnel ~/TorBrowser-Data/.\nLe sous-répertoire Data sert à enregistrer ses propres données :\nData/Browser : la configuration liée au client web Data/tor_data : lié au service daemon Tor Data/torrc : enregistre l\u0026rsquo;instance Tor - par exemple, la configuration des ponts (briges), … Modules DangerATTENTION : ajouter des modules supplémentaires n\u0026rsquo;est pas recommandé ; le risque fort est de \u0026ldquo;mettre en péril\u0026rdquo; les mesures de protection liées à Tor Browser, assurez-vous ABSOLUMENT d\u0026rsquo;en avoir la stricte nécessité ! KeePassXC-Browser AttentionCe module de confidentialité semble ne pas fonctionner avec Tor Browser. Depuis OpenBSD 6.6, le logiciel de confidentialité KeePassXC est installable.\nPour fonctionner correctement, il est nécessaire d\u0026rsquo;installer le module KeePassXC-Browser.\nhttps://addons.mozilla.org/fr/firefox/addon/keepassxc-browser/ Lire la page KeePassXC pour avoir plus d\u0026rsquo;informations concernant le module KeePassXC-Browser Documentation Après l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier /usr/local/share/doc/pkg-readmes/tor-browser.\nLa documentation officielle - en anglais - :\nhttps://2019.www.torproject.org/docs/documentation.html.en le manuel : https://tb-manual.torproject.org/fr/ le wiki : https://trac.torproject.org/projects/tor/wiki à-propos de PT : https://2019.www.torproject.org/docs/pluggable-transports.html.en Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eTor Browser\u003c/strong\u003e est une version personnalisée de\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/firefox-esr/\" title=\"Lien interne vers l\u0026#39;article : 'Firefox ESR / OpenBSD'\"\u003eFirefox-ESR\u003c/a\u003e\n\nspécifiquement préparée pour surfer sur Internet via le réseau anonyme Tor.\u003c/p\u003e\n\u003cp\u003eSa configuration a pour but d\u0026rsquo;atténuer les attaques contre\nl\u0026rsquo;anonymisation d\u0026rsquo;un client, incluant le fait de déterminer son adresse\nIP et l\u0026rsquo;empreinte du navigateur. D\u0026rsquo;autres aspects de Firefox ont aussi\nété corrigés pour éviter autant que possible les failles de confidentialité.\u003c/p\u003e\n\u003cp\u003ePar défaut, sont inclus les modules \u003cstrong\u003eNoScript\u003c/strong\u003e, \u003cstrong\u003eHTTPS Everywhere\u003c/strong\u003e,\n\u003cstrong\u003eTorButton\u003c/strong\u003e, et \u003cstrong\u003eTor-Launcher\u003c/strong\u003e. Notez que du fait de l\u0026rsquo;utilisation\ndu module NoScript, l\u0026rsquo;utilisation de Javascript est bloqué par défaut.\u003c/p\u003e\n\u003cp\u003eTor Browser utilise sa propre instance différente du port du serveur\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tor/\" title=\"Lien interne vers l\u0026#39;article : 'Tor : service d\u0026#39;anonymat par onion routage / OpenBSD'\"\u003eTor\u003c/a\u003e\n, exécutée sur un autre port\nque celui du serveur.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e : Le port d\u0026rsquo;OpenBSD n\u0026rsquo;inclut pas encore le composant nommé\n\u0026ldquo;Pluggable Transports (PT)\u0026rdquo;. De fait, toutes les fonctionnalités ne sont\npas encore disponibles, telle l\u0026rsquo;utilisation par \u003ccode\u003eobfsproxy\u003c/code\u003e.\u003c/div\u003e\n\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eArchitectures gérées : amd64 i386\u003c/li\u003e\n\u003cli\u003eMainteneur : Caspar Schutijser\u003c/li\u003e\n\u003cli\u003eOpenport : \u003ca href=\"https://openports.pl/path/meta/tor-browser\" rel=\"external\"\u003ehttps://openports.pl/path/meta/tor-browser\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eWWW: \u003ca href=\"https://www.torproject.org\" rel=\"external\"\u003ehttps://www.torproject.org\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\nmeta-paquet \u003ccode\u003etor-browser\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePar défaut, \u003cstrong\u003eTor Browser\u003c/strong\u003e enregistre sa configuration dans votre\nrépertoire personnel \u003ccode\u003e~/TorBrowser-Data/\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLe sous-répertoire \u003ccode\u003eData\u003c/code\u003e sert à enregistrer ses propres données :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eData/Browser\u003c/code\u003e : la configuration liée au client web\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eData/tor_data\u003c/code\u003e : lié au service daemon Tor\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eData/torrc\u003c/code\u003e : enregistre l\u0026rsquo;instance Tor - par exemple, la\nconfiguration des ponts (briges), …\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"modules\"\u003eModules\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : ajouter des modules supplémentaires n\u0026rsquo;est pas recommandé ;\nle risque fort est de \u0026ldquo;mettre en péril\u0026rdquo; les mesures de protection liées\nà \u003cstrong\u003eTor Browser\u003c/strong\u003e, assurez-vous ABSOLUMENT d\u0026rsquo;en avoir la stricte nécessité !\u003c/div\u003e\n\n\u003ch4 id=\"keepassxc-browser\"\u003eKeePassXC-Browser\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCe module de confidentialité semble ne pas fonctionner avec Tor Browser.\u003c/div\u003e\n\n\u003cp\u003eDepuis OpenBSD 6.6, le logiciel de confidentialité\n\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/keepassxc/\" title=\"Lien interne vers l\u0026#39;article : 'KeepassXC : outil de gestion de données sensibles / OpenBSD'\"\u003eKeePassXC\u003c/a\u003e\n\u003c/strong\u003e est installable.\u003c/p\u003e\n\u003cp\u003ePour fonctionner correctement, il est nécessaire d\u0026rsquo;installer le module\n\u003cstrong\u003eKeePassXC-Browser\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://addons.mozilla.org/fr/firefox/addon/keepassxc-browser/\" rel=\"external\"\u003ehttps://addons.mozilla.org/fr/firefox/addon/keepassxc-browser/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLire la page \u003cstrong\u003eKeePassXC\u003c/strong\u003e pour avoir plus d\u0026rsquo;informations concernant le\nmodule \u003ca class=\"inside\" href=\"/fr/sys/openbsd/keepassxc/#keepassxc-browser\" title=\"Lien interne vers l\u0026#39;article : 'KeepassXC : outil de gestion de données sensibles / OpenBSD'\"\u003eKeePassXC-Browser\u003c/a\u003e\n\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eAprès l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de \u003cstrong\u003elire le fichier\u003c/strong\u003e\n\u003ccode\u003e/usr/local/share/doc/pkg-readmes/tor-browser\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eLa documentation officielle - \u003cem\u003een anglais\u003c/em\u003e - :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://2019.www.torproject.org/docs/documentation.html.en\" rel=\"external\"\u003ehttps://2019.www.torproject.org/docs/documentation.html.en\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ele manuel : \u003ca href=\"https://tb-manual.torproject.org/fr/\" rel=\"external\"\u003ehttps://tb-manual.torproject.org/fr/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ele wiki : \u003ca href=\"https://trac.torproject.org/projects/tor/wiki\" rel=\"external\"\u003ehttps://trac.torproject.org/projects/tor/wiki\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eà-propos de PT : \u003ca href=\"https://2019.www.torproject.org/docs/pluggable-transports.html.en\" rel=\"external\"\u003ehttps://2019.www.torproject.org/docs/pluggable-transports.html.en\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le navigateur web 'Tor Browser' pour surfer anonymement sur le web, par le biais du réseau Tor, sous OpenBSD",
            "tags": ["OpenBSD", "Tor"],
            "date_published": "2020-05-24T10:39:47+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:06e9dcf1-fda8-998a-1255-83e68af8e6d8",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/keepassxc/",
            "title": "KeepassXC : outil de gestion de données sensibles / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description KeePassXC est un dérivé communautaire de KeePassX, le port multi-plateforme de KeePass pour Windows. Chaque fonctionnalité travaille sur ces plateformes et fait l\u0026rsquo;objet de tests approfondis afin de fournir aux utilisateurs les mêmes apparences et sensations sur chacun des systèmes d\u0026rsquo;exploitation supportés. Cela inclut la bien-aimée fonctionnalité Auto-Type.\nPar défaut, la basse de données est toujours chiffrée avec l\u0026rsquo;algorithme de chiffrement AES (alias Rijndael) de norme industrielle, utilisant une clé de 256 bits. KeePassXC utilise un format de basse de données compatible avec KeePass Password Safe. Votre porte-monnaie fonctionne hors-ligne et ne requiert pas de connexion Internet.\nLes principales fonctionnalités :\nUn enregistrement des mots de passes et autres données confidentielles avec les chiffrements AES, Twofish ou ChaCha20 Un format de fichier compatible avec KeePass2, KeePassX, MacPass, KeeWeb et beaucoup d\u0026rsquo;autres (KDBX 3.1 et 4.0) Intégration de l\u0026rsquo;agent SSH Auto-Type sur toutes les plateformes supportés pour remplir automatiquement les formulaires de connexions La prise en charge de fichier Clé et du challenge de réponse YubiKey pour une sécurité accrue. La génération de TOTP (incluant Steam Guard) L\u0026rsquo;import CVS depuis d\u0026rsquo;autres gestionnaires de mots de passse (tel que LastPass) Une interface en ligne de commande CLI Un générateur de mots de passe ou de passphrase unique Une mesure de la force du mot de passe La fonctionnalité de fusion de base de données Une recharge automatique lorsque la base de données a été changée WWW: https://keepassxc.org\nInstallation Disponible depuis OpenBSD 6.6 !\nActuellement, il existe 4 versions que vous pouvez installer :\nkeepassxc : la version de base keepassxc-browser : la version d\u0026rsquo;intégration avec les navigateurs internet keepassxc-browser-yubikey : la version d\u0026rsquo;intégration pour les navigateurs et pour fonctionner avec les clés USB de sécurité de type Yubikey keepassxc-yubikey : la version fonctionnant avec les clés de type Yubikey AttentionLa fonction communiquant avec une clé Yubikey ne fonctionne qu\u0026rsquo;à partir d\u0026rsquo;OpenBSD 6.7 ! Configuration AttentionNe pas confondre les paramètres de configuration de l\u0026rsquo;outil KeePassXC et ceux de la base de données. Paramètres La gestion des paramètres, une fois KeePassXC ouvert, se fait par le biais du menu Outils \u0026gt; Paramètres.\nIntégrations aux navigateurs Cliquez sur l\u0026rsquo;icône Intégration aux navigateurs, puis dans la partie droite de la fenêtre cliquez sur la case à cocher [ ] Activer l\u0026rsquo;intégration aux navigateurs.\nUne fois activée, les onglets Général et Avancé sont accessibles.\n⇒ L\u0026rsquo;onglet Général précise qu\u0026rsquo;il faut télécharger le module KeePassXC-Browser correspondant au client web que vous utilisez. Une fois téléchargé, il faut activer l\u0026rsquo;intégration pour le(s) navigateur(s) en question.\nInfoSous OpenBSD, les trois navigateurs web :\nFirefox , Chromium , et Tor-Browser … sont disponibles.\n⇒ L\u0026rsquo;onglet \u0026ldquo;Avancé\u0026rdquo; permet, entres autres, la prise en charge correcte de la communication entre KeePassXC et le navigateur web. Activez les cases à cocher suivantes :\n[ ] Utiliser une application proxy entre KeePassXC et l\u0026rsquo;extension pour un navigateur web [ ] Utiliser un proxy personnalisé, puis dans le champ de rechercher [ Parcourir… ], choisissez /usr/local/bin/keepassxc-proxy Dans les deux contextes, il existe d\u0026rsquo;autres options que vous pouvez activer ou non…\nAgent SSH Cliquez sur l\u0026rsquo;icône \u0026ldquo;Agent SSH\u0026rdquo;, puis dans la partie droite de la fenêtre, cliquez sur la case à cocher [ ] Activer l\u0026rsquo;agent SSH (redémarrage nécessaire).\nInfoLe redémarrage en question est celui de l\u0026rsquo;application ; fermez-la pour l\u0026rsquo;ouvrir à nouveau. Intégration au Secret Service InfoLe Service Secret de Freedesktop semble être le service de gestion de confidentialité des données sensibles normé par un des standards de Freedesktop. Dans les faits, il gére votre porte monnaie de session X, et bien d\u0026rsquo;autres éléments de sécurité, dont la communication avec ses éléments. Cliquez sur l\u0026rsquo;icône `Intégration au Secret Service, puis dans la partie droite de la fenêtre cliquez sur la case à cocher [ ] Activer l\u0026rsquo;intégration de KeePassXC à Freedsktop.org Secret Service.\nUne fois activée, les onglets Général et Autorisation sont accessibles.\n⇒ L\u0026rsquo;onglet Général, outre les options diverses, donne un aperçu des bases de données KP visibles, sous le dénominateur Groupes de la base de données visibles :\nCe groupe contient trois colonnes :\nFile Name : Nom du fichier de base de données Group : le groupe dans lequel peut être attribué le fichier de base de données en question Manage : pour gérer le fichier de base de données : Une icône bleue en forme de fichier pour éditer la base de données lorsqu\u0026rsquo;elle est cliquée, l\u0026rsquo;application va dans le menu d\u0026rsquo;édition des paramètres de la base de données. une icône en forme de cadenas ouvert - afin de verrouiller ou non la base de donnée. ⇒ L\u0026rsquo;onglet *Autorisation donne un aperçu des applications qui sont autorisées de communiquer avec la base de données.\nDeux colonnes :\nApplication : le nom des applications Manage : permet de gérer les autorisations liées à l\u0026rsquo;application Paramètres de la base de données Les paramètres de la base de données sont accessibles par le menu Base de données \u0026gt; Paramètres de la base de données…\nSécurité Deux onglets sont accessibles :\nClé maître Paramètres de chiffrement ⇒ L\u0026rsquo;onglet Clé maître permet de gérer le mot de passe lié à la base de données en cours.\nUn bouton [ Ajouter une protection supplémentaire… ], qui lorsqu\u0026rsquo;il est cliqué, donnera accès à la gestion :\nde protection par \u0026ldquo;Fichier-clé\u0026rdquo; de challenge par question-réponse Yubikey. ⇒ L\u0026rsquo;onglet Paramètres de chiffrement permet le paramétrage d\u0026rsquo;un temps de déchiffrement de la base de données avant son possible accès, ainsi que de choisir le format de celle-ci.\nIntégration au Secret Service Le menu Entrées visibles permet de rendre visible ou non les données qui sont dans la base de données.\nIntégration aux navigateurs Ce menu permet de gérer les \u0026ldquo;Paramètres de KeePassXC-Browser\u0026rdquo; sur la base de données, ainsi que les \u0026ldquo;Clés stockées\u0026rdquo;, relatives à la communication entre KeePassXC et votre client web, par le biais du module KeePassXC-Browser.\nParamètres avancés En bas, à gauche, de la fenêtre de KeePassXC, dans les paramètres de la base de données se trouve une case à cocher [ ] Paramètres avancés.\nLa cocher modifie l\u0026rsquo;apparence du menu Sécurité des paramètres de la base de données, et tout particulièrement dans l\u0026rsquo;onglet Paramètres de chiffrement qui permet ainsi de modifier plus finement certaines options, tel l\u0026rsquo;algorithme de chiffrement, la fonction de dérivation, le cycle de transformation, l\u0026rsquo;utilisation mémoire, et le nombre de processus.\nDangerNe touchez à ces paramètres que si vous comprenez, en connaissance de cause, les implications de tels changements. Utilisation Générateur de mot de passe Le générateur de mot de passe ou de passphrase est accessible par le menu Outils \u0026gt; Générateur de mot de passe.\nKeePassXC-Browser Une fois ce module installé, et KeePassXC configuré pour communiquer avec navigateur web, cliquez sur l\u0026rsquo;icône du module pour gérer la communication avec KeePassXC. Celui-ci vous demandera la première fois de créer une clé de communication qui sera enregistrée dans les paramètres de la base de données de KeePassXC.\nLe bouton vert [ Paramètres ] permet de gérer les paramètres du module Le bouton jaune [ Choisir des champs d\u0026rsquo;identification personnalisés pour cette page ] permet de paramétrer les champs de connexion sur une page web alternativement un bouton bleu : [ Connecter ] : quand il n\u0026rsquo;y a jamais eu d\u0026rsquo;association de touche, afin de la créer. [ Recharger ] permet de recharger la clé de communication entre KeePassXC et le module KeePassXC-Browser ce qui nécessite que KeePassXC soit en fonctionnement. Mises en garde AttentionIl semble y avoir un souci empêchant le bon fonctionnement de communication entre le module KeePassXC-Browser et KeePassXC si votre session utilise ck-launch.\nModifiez votre fichier personnel .xsession pour redémarrer votre session sans !\nMessages d\u0026rsquo;erreurs KeePassXC-Browser n\u0026rsquo;est pas configuré. Appuyez sur le bouton Connecter pour se connecter à KeePassXC. : ce message est affiché lors du premier usage du module. Cliquez sur le bouton [ Connecter ] pour créer une association de touches.\nÉchec du chiffrement du message. KeePassXC est-il lancé ? : Vérifiez que le logiciel KeePassXC soit activé !\nImpossible de se connecter à KeePassXC. Vérifiez que l’intégration au navigateur soit activée dans les paramètres de KeePassXC. signifie que le module KeePassXC-Browser ne peut se connecter à la base de données KeePassXC.\nSoit vous n\u0026rsquo;avez pas paramétré correctement KeePassXC pour qu\u0026rsquo;ils puissent communiquer ensemble, soit KeePassXC est tout simplement inactif. L’échange de clé a échoué. : l\u0026rsquo;échange de la clé de communication entre le module KeePassXC-Browser et KeePassXC n\u0026rsquo;arrive pas à se faire.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://keepassxc.org\" rel=\"external\"\u003eKeePassXC\u003c/a\u003e\u003c/strong\u003e est un dérivé communautaire de\nKeePassX, le port multi-plateforme de KeePass pour Windows. Chaque\nfonctionnalité travaille sur ces plateformes et fait l\u0026rsquo;objet de tests\napprofondis afin de fournir aux utilisateurs les mêmes apparences et\nsensations sur chacun des systèmes d\u0026rsquo;exploitation supportés. Cela inclut\nla bien-aimée fonctionnalité \u003cstrong\u003eAuto-Type\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003ePar défaut, la basse de données est toujours chiffrée avec l\u0026rsquo;algorithme\nde chiffrement AES (alias Rijndael) de norme industrielle, utilisant une\nclé de 256 bits. KeePassXC utilise un format de basse de données\ncompatible avec KeePass Password Safe. Votre porte-monnaie fonctionne\nhors-ligne et ne requiert pas de connexion Internet.\u003c/p\u003e\n\u003cp\u003eLes principales fonctionnalités :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUn enregistrement des mots de passes et autres données confidentielles\navec les chiffrements AES, Twofish ou ChaCha20\u003c/li\u003e\n\u003cli\u003eUn format de fichier compatible avec KeePass2, KeePassX, MacPass,\nKeeWeb et beaucoup d\u0026rsquo;autres (KDBX 3.1 et 4.0)\u003c/li\u003e\n\u003cli\u003eIntégration de l\u0026rsquo;agent SSH\u003c/li\u003e\n\u003cli\u003eAuto-Type sur toutes les plateformes supportés pour remplir\nautomatiquement les formulaires de connexions\u003c/li\u003e\n\u003cli\u003eLa prise en charge de fichier Clé et du challenge de réponse\nYubiKey pour une sécurité accrue.\u003c/li\u003e\n\u003cli\u003eLa génération de TOTP (incluant Steam Guard)\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;import CVS depuis d\u0026rsquo;autres gestionnaires de mots de passse (tel que\nLastPass)\u003c/li\u003e\n\u003cli\u003eUne interface en ligne de commande CLI\u003c/li\u003e\n\u003cli\u003eUn générateur de mots de passe ou de passphrase unique\u003c/li\u003e\n\u003cli\u003eUne mesure de la force du mot de passe\u003c/li\u003e\n\u003cli\u003eLa fonctionnalité de fusion de base de données\u003c/li\u003e\n\u003cli\u003eUne recharge automatique lorsque la base de données a été changée\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eWWW: \u003ca href=\"https://keepassxc.org\" rel=\"external\"\u003ehttps://keepassxc.org\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eDisponible depuis OpenBSD 6.6 !\u003c/p\u003e\n\u003cp\u003eActuellement, il existe 4 versions que vous pouvez\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ekeepassxc\u003c/code\u003e : la version de base\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ekeepassxc-browser\u003c/code\u003e : la version d\u0026rsquo;intégration avec les navigateurs internet\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ekeepassxc-browser-yubikey\u003c/code\u003e : la version d\u0026rsquo;intégration pour les navigateurs\net pour fonctionner avec les clés USB de sécurité de type Yubikey\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ekeepassxc-yubikey\u003c/code\u003e : la version fonctionnant avec les clés de type Yubikey\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eLa fonction communiquant avec une clé Yubikey ne fonctionne qu\u0026rsquo;à partir\nd\u0026rsquo;OpenBSD 6.7 !\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNe pas confondre les \u003ca href=\"/fr/sys/openbsd/keepassxc/#paramètres\"\u003eparamètres de configuration\u003c/a\u003e de l\u0026rsquo;outil\nKeePassXC et \u003ca href=\"/fr/sys/openbsd/keepassxc/#paramètres-de-la-base-de-données\"\u003eceux de la base de données\u003c/a\u003e.\u003c/div\u003e\n\n\u003ch3 id=\"paramètres\"\u003eParamètres\u003c/h3\u003e\n\u003cp\u003eLa gestion des paramètres, une fois KeePassXC ouvert, se fait par le\nbiais du menu \u003cstrong\u003e\u003cu\u003eO\u003c/u\u003eutils \u0026gt; \u003cu\u003eP\u003c/u\u003earamètres\u003c/strong\u003e.\u003c/p\u003e\n\u003ch4 id=\"intégrations-aux-navigateurs\"\u003eIntégrations aux navigateurs\u003c/h4\u003e\n\u003cp\u003eCliquez sur l\u0026rsquo;icône \u003cstrong\u003eIntégration aux navigateurs\u003c/strong\u003e, puis dans la partie\ndroite de la fenêtre cliquez sur la case à cocher\n\u003cstrong\u003e[ ] Activer l\u0026rsquo;intégration aux navigateurs\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUne fois activée, les onglets \u003cstrong\u003eGénéral\u003c/strong\u003e et \u003cstrong\u003eAvancé\u003c/strong\u003e sont accessibles.\u003c/p\u003e\n\u003cp\u003e⇒ L\u0026rsquo;onglet \u003cstrong\u003eGénéral\u003c/strong\u003e précise qu\u0026rsquo;il faut télécharger le module\n\u003cstrong\u003eKeePassXC-Browser\u003c/strong\u003e correspondant au client web que vous utilisez.\nUne fois téléchargé, il faut activer l\u0026rsquo;intégration pour le(s) navigateur(s)\nen question.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eSous OpenBSD, les trois navigateurs web :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/firefox/\" title=\"Lien interne vers l\u0026#39;article : 'Firefox / OpenBSD'\"\u003eFirefox\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/chromium/\" title=\"Lien interne vers l\u0026#39;article : 'Chromium / OpenBSD'\"\u003eChromium\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003eet \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tor-browser/\" title=\"Lien interne vers l\u0026#39;article : 'Tor Browser / OpenBSD'\"\u003eTor-Browser\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e… sont disponibles.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003e⇒ L\u0026rsquo;onglet \u0026ldquo;Avancé\u0026rdquo; permet, entres autres, la prise en charge correcte\nde la communication entre KeePassXC et le navigateur web. Activez les\ncases à cocher suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e[ ] Utiliser une application proxy entre KeePassXC et l\u0026rsquo;extension pour un navigateur web\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e[ ] Utiliser un proxy personnalisé\u003c/strong\u003e, puis\u003c/li\u003e\n\u003cli\u003edans le champ de rechercher [ Parcourir… ], choisissez \u003ccode\u003e/usr/local/bin/keepassxc-proxy\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eDans les deux contextes, il existe d\u0026rsquo;autres options que vous pouvez\nactiver ou non…\u003c/em\u003e\u003c/p\u003e\n\u003ch4 id=\"agent-ssh\"\u003eAgent SSH\u003c/h4\u003e\n\u003cp\u003eCliquez sur l\u0026rsquo;icône \u0026ldquo;Agent SSH\u0026rdquo;, puis dans la partie droite de la fenêtre,\ncliquez sur la case à cocher \u003cstrong\u003e[ ] Activer l\u0026rsquo;agent SSH\u003c/strong\u003e \u003cem\u003e(redémarrage nécessaire)\u003c/em\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eLe redémarrage en question est celui de l\u0026rsquo;application ; fermez-la pour\nl\u0026rsquo;ouvrir à nouveau.\u003c/div\u003e\n\n\u003ch4 id=\"intégration-au-secret-service\"\u003eIntégration au Secret Service\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eLe \u003cstrong\u003eService Secret de Freedesktop\u003c/strong\u003e semble être le service de gestion\nde confidentialité des données sensibles normé par un des standards de\nFreedesktop. Dans les faits, il gére votre porte monnaie de session X,\net bien d\u0026rsquo;autres éléments de sécurité, dont la communication avec ses\néléments.\u003c/div\u003e\n\n\u003cp\u003eCliquez sur l\u0026rsquo;icône \u003cstrong\u003e`Intégration au Secret Service\u003c/strong\u003e, puis dans la\npartie droite de la fenêtre cliquez sur la case à cocher\n\u003cstrong\u003e[ ] Activer l\u0026rsquo;intégration de KeePassXC à Freedsktop.org Secret Service\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUne fois activée, les onglets \u003cstrong\u003eGénéral\u003c/strong\u003e et \u003cstrong\u003eAutorisation\u003c/strong\u003e sont\naccessibles.\u003c/p\u003e\n\u003cp\u003e⇒ L\u0026rsquo;onglet \u003cstrong\u003eGénéral\u003c/strong\u003e, outre les options diverses, donne un aperçu des\nbases de données KP visibles, sous le dénominateur\n\u003cstrong\u003eGroupes de la base de données visibles :\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCe groupe contient trois colonnes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eFile Name\u003c/strong\u003e : Nom du fichier de base de données\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGroup\u003c/strong\u003e : le groupe dans lequel peut être attribué le fichier de base\nde données en question\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eManage\u003c/strong\u003e : pour gérer le fichier de base de données :\n\u003cul\u003e\n\u003cli\u003eUne icône bleue en forme de fichier pour éditer la base de données\n\u003cul\u003e\n\u003cli\u003elorsqu\u0026rsquo;elle est cliquée, l\u0026rsquo;application va dans le menu d\u0026rsquo;édition\ndes \u003ca href=\"/fr/sys/openbsd/keepassxc/#paramètres-de-la-base-de-données\"\u003eparamètres de la base de données\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eune icône en forme de cadenas ouvert - afin de verrouiller ou non\nla base de donnée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ L\u0026rsquo;onglet *\u003cem\u003eAutorisation\u003c/em\u003e donne un aperçu des applications qui sont\nautorisées de communiquer avec la base de données.\u003c/p\u003e\n\u003cp\u003eDeux colonnes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eApplication\u003c/strong\u003e : le nom des applications\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eManage\u003c/strong\u003e : permet de gérer les autorisations liées à l\u0026rsquo;application\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"paramètres-de-la-base-de-données\"\u003eParamètres de la base de données\u003c/h3\u003e\n\u003cp\u003eLes paramètres de la base de données sont accessibles par le menu\n\u003cstrong\u003e\u003cu\u003eB\u003c/u\u003ease de données \u0026gt; Paramètres de la base de \u003cu\u003ed\u003c/u\u003eonnées…\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"sécurité\"\u003eSécurité\u003c/h4\u003e\n\u003cp\u003eDeux onglets sont accessibles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eClé maître\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eParamètres de chiffrement\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ L\u0026rsquo;onglet \u003cstrong\u003eClé maître\u003c/strong\u003e permet de gérer le mot de passe lié à la base\nde données en cours.\u003c/p\u003e\n\u003cp\u003eUn bouton \u003cstrong\u003e[ Ajouter une protection supplémentaire… ]\u003c/strong\u003e, qui lorsqu\u0026rsquo;il\nest cliqué, donnera accès à la gestion :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ede protection par \u0026ldquo;Fichier-clé\u0026rdquo;\u003c/li\u003e\n\u003cli\u003ede challenge par question-réponse Yubikey.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ L\u0026rsquo;onglet \u003cstrong\u003eParamètres de chiffrement\u003c/strong\u003e permet le paramétrage d\u0026rsquo;un\ntemps de déchiffrement de la base de données avant son possible accès,\nainsi que de choisir le format de celle-ci.\u003c/p\u003e\n\u003ch4 id=\"intégration-au-secret-service-1\"\u003eIntégration au Secret Service\u003c/h4\u003e\n\u003cp\u003eLe menu \u003cstrong\u003eEntrées visibles\u003c/strong\u003e permet de rendre visible ou non les données\nqui sont dans la base de données.\u003c/p\u003e\n\u003ch4 id=\"intégration-aux-navigateurs\"\u003eIntégration aux navigateurs\u003c/h4\u003e\n\u003cp\u003eCe menu permet de gérer les \u0026ldquo;Paramètres de KeePassXC-Browser\u0026rdquo; sur la\nbase de données, ainsi que les \u0026ldquo;Clés stockées\u0026rdquo;, relatives à la\ncommunication entre KeePassXC et votre client web, par le biais du module\nKeePassXC-Browser.\u003c/p\u003e\n\u003ch4 id=\"paramètres-avancés\"\u003eParamètres avancés\u003c/h4\u003e\n\u003cp\u003eEn bas, à gauche, de la fenêtre de KeePassXC, dans les paramètres de la\nbase de données se trouve une case à cocher \u003cstrong\u003e[ ] Paramètres avancés\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLa cocher modifie l\u0026rsquo;apparence du menu \u003cstrong\u003e\u003ca href=\"/fr/sys/openbsd/keepassxc/#sécurité\"\u003eSécurité\u003c/a\u003e\u003c/strong\u003e\ndes paramètres de la base de données, et tout particulièrement dans\nl\u0026rsquo;onglet \u003cstrong\u003eParamètres de chiffrement\u003c/strong\u003e qui permet ainsi de modifier plus\nfinement certaines options, tel l\u0026rsquo;algorithme de chiffrement, la\nfonction de dérivation, le cycle de transformation, l\u0026rsquo;utilisation mémoire,\net le nombre de processus.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cstrong\u003eNe touchez à ces paramètres que si vous comprenez, en connaissance de\ncause, les implications de tels changements\u003c/strong\u003e.\u003c/div\u003e\n\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"générateur-de-mot-de-passe\"\u003eGénérateur de mot de passe\u003c/h3\u003e\n\u003cp\u003eLe générateur de mot de passe ou de passphrase est accessible par le menu\n\u003cstrong\u003e\u003cu\u003eO\u003c/u\u003eutils \u0026gt; Générateur de mot de \u003cu\u003ep\u003c/u\u003easse\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"keepassxc-browser\"\u003eKeePassXC-Browser\u003c/h2\u003e\n\u003cp\u003eUne fois ce module installé, et KeePassXC configuré pour communiquer avec\nnavigateur web, cliquez sur l\u0026rsquo;icône du module pour gérer la communication\navec KeePassXC. Celui-ci vous demandera la première fois de créer une\nclé de communication qui sera enregistrée dans les paramètres de la base\nde données de KeePassXC.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLe bouton vert \u003cspan class=\"kpxc-green\"\u003e[ Paramètres ]\u003c/span\u003e permet de\ngérer les paramètres du module\u003c/li\u003e\n\u003cli\u003eLe bouton jaune \u003cspan class=\"kpxc-yellow\"\u003e[ Choisir des champs d\u0026rsquo;identification personnalisés pour cette page ]\u003c/span\u003e\npermet de paramétrer les champs de connexion sur une page web\u003c/li\u003e\n\u003cli\u003ealternativement un bouton bleu :\n\u003cul\u003e\n\u003cli\u003e\u003cspan class=\"kpxc-blue\"\u003e[ Connecter ]\u003c/span\u003e : quand il n\u0026rsquo;y a jamais\neu d\u0026rsquo;association de touche, afin de la créer.\u003c/li\u003e\n\u003cli\u003e\u003cspan class=\"kpxc-blue\"\u003e[ Recharger ]\u003c/span\u003e permet de recharger la\nclé de communication entre KeePassXC et le module KeePassXC-Browser\n\u003cul\u003e\n\u003cli\u003ece qui nécessite que KeePassXC soit en fonctionnement.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mises-en-garde\"\u003eMises en garde\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl semble y avoir un souci empêchant le bon fonctionnement de communication\nentre le module KeePassXC-Browser et KeePassXC si votre session utilise\n\u003ccode\u003eck-launch\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eModifiez votre fichier personnel \u003ccode\u003e.xsession\u003c/code\u003e pour redémarrer votre session\nsans !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"messages-derreurs\"\u003eMessages d\u0026rsquo;erreurs\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eKeePassXC-Browser n\u0026rsquo;est pas configuré. Appuyez sur le bouton Connecter pour se connecter à KeePassXC.\u003c/strong\u003e :\nce message est affiché lors du premier usage du module. Cliquez sur\nle bouton [ Connecter ] pour créer une association de touches.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cspan class=\"kpxc-red\"\u003eÉchec du chiffrement du message. KeePassXC est-il lancé ?\u003c/span\u003e :\nVérifiez que le logiciel KeePassXC soit activé !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cspan class=\"kpxc-red\"\u003eImpossible de se connecter à KeePassXC. Vérifiez que\nl’intégration au navigateur soit activée dans les paramètres de KeePassXC.\u003c/span\u003e\nsignifie que \u003cstrong\u003ele module KeePassXC-Browser ne peut se connecter à la\nbase de données KeePassXC\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSoit vous n\u0026rsquo;avez pas \u003ca href=\"/fr/sys/openbsd/keepassxc/#integrations-aux-navigateurs\"\u003eparamétré correctement KeePassXC\u003c/a\u003e\npour qu\u0026rsquo;ils puissent communiquer ensemble,\u003c/li\u003e\n\u003cli\u003esoit KeePassXC est tout simplement inactif.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cspan class=\"kpxc-red\"\u003eL’échange de clé a échoué.\u003c/span\u003e : l\u0026rsquo;échange\nde la clé de communication entre le module KeePassXC-Browser et\nKeePassXC n\u0026rsquo;arrive pas à se faire.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer des données privées et confidentielles, sous OpenBSD, grâce à l'outil KeepassXC.",
            "tags": ["OpenBSD", "KeepassXC", "confidentialité"],
            "date_published": "2020-05-23T15:02:22+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:2c1646d3-0969-b4c1-8790-45aa8c72a286",
            "url": "http://doc.huc.fr.eu.org/fr/web/httpd/relayd-log/",
            "title": "Relayd : Journalisation (Log)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD intègre par défaut dans le système de base, depuis 5.7, le serveur de relais nommé relayd.\nSite web : https://bsd.plumbing/\nOpenBSD : 6.6, 6.7\nLe but de cet article est de savoir comment mettre en place une journalisation du flux HTTP(S) qui passe au-travers de relayd.\nC\u0026rsquo;est très simple !\nConfiguration Par défault, le fichier de configuration : /etc/relayd.conf Configuration Globale Dans un premier temps, nous devons déclarer le paramètre global log dans le fichier de configuration de relayd. relayd.conf(5)#log Les déclarations de journal suivantes ont pour signification les suivantes :\nlog state changes ou log host checks sont utiles pour suivre l\u0026rsquo;état de l\u0026rsquo;hôte ou les contrôles effectués dessus. les états peuvent être de type : up si l\u0026rsquo;état de santé de l\u0026rsquo;hôte est positif down si celui est arrété ou si les contrôles ne sont pas bons. en état unknown si l\u0026rsquo;hôte est désactivé ou n\u0026rsquo;a pas encore été contrôlé. log connection nous permet de journaliser les connexions TCP, si relayd est configuré en tant que relai(s) 1 . À noter l\u0026rsquo;ajout de l\u0026rsquo;option errors pour le cas où nous voulons journaliser que les erreurs de connexions TCP. 1 En effet, relayd peut aussi être configuré en tant que routeur ou serveur de redirection.\nRègles de filtrage Toujours dans le contexte du fichier de configuration de relayd, les relais ont la possibilité de filtrer les connexions par le biais de paramètres de filtrage spécifiques.\nAinsi nous utiliserons l\u0026rsquo;action de correspondance match sur laquelle nous appliquons l\u0026rsquo;option de journalisation log. relayd.conf(5)#match Cette action de correspondance s\u0026rsquo;appliquera sur un type d\u0026rsquo;action ; actuellement, 5 types d\u0026rsquo;actions sont définies :\ncookie : une action qui a lieu sur un cookie. 2 relayd.conf(5)#cookie header : une action ciblant le protocol d\u0026rsquo;entête HTTP - les fameuses headers relayd.conf(5)#header path : une action qui analyse le chemin de l\u0026rsquo;URL demandée. 2 relayd.conf(5)#path query : une action pour chercher la partie query de l\u0026rsquo;URL demandée. 2 relayd.conf(5)#query url : l\u0026rsquo;action récupérant l\u0026rsquo;URL complète… 2 relayd.conf(5)#url 2 seulement disponible sur une requête HTTP.\nExemple de configuration L\u0026rsquo;exemple ci-dessous nous montre cinq règles de filtrage :\nles quatre premières ayant lieu sur une correspondance d\u0026rsquo;entête la dernière journalisant l\u0026rsquo;URL dans son ensemble. ### ips externe auth ip4 = \u0026#34;addresse-ipv4-public\u0026#34; ### manage logs log state changes log connection #log connection errors http protocol \u0026#34;hw\u0026#34; { match header log \u0026#34;Host\u0026#34; match header log \u0026#34;X-Forwarded-For\u0026#34; match header log \u0026#34;User-Agent\u0026#34; match header log \u0026#34;Referer\u0026#34; match url log block (…) } relay \u0026#34;www\u0026#34; { listen on $ip4 port 80 protocol hw forward to 127.0.0.1 port 80 } Journaux Là encore, tout simplement, une fois la configuration établie, validée, et le service relayd fonctionnel, les différents journaux se retrouvent principalement dans :\n/var/log/daemon, /var/log/message. Exemple log daemon :$ grep relayd /var/log/daemon May 17 16:37:21 sh1 relayd[25237]: relay www, session 13 (2 active), 0, 192.168.1.1 -\u0026gt; :80, done May 17 16:37:21 sh1 relayd[45869]: relay www, session 7 (2 active), 0, 192.168.1.1 -\u0026gt; :80, done May 17 16:37:21 sh1 relayd[45869]: relay www, session 8 (1 active), 0, 192.168.1.1 -\u0026gt; :80, done May 17 16:37:22 sh1 relayd[25237]: relay www, session 14 (1 active), 0, 192.168.1.1 -\u0026gt; :80, done May 17 17:01:19 sh1 relayd[45869]: relay www, session 9 (1 active), 0, 207.180.140.98 -\u0026gt; :80, Forbidden (403 Forbidden), [\u0026lt;em\u0026gt;Stop scanning for PHP: none\u0026lt;/em\u0026gt;!, User-Agent: polaris] GET: Invalid argument May 17 17:01:19 sh1 relayd[45869]: relay www, session 10 (1 active), 0, 207.180.140.98 -\u0026gt; :80, done May 17 17:02:43 sh1 relayd[7531]: relay www, session 13 (1 active), 0, 84.161.80.36 -\u0026gt; :80, Forbidden (403 Forbidden), [\u0026lt;em\u0026gt;Stop scanning for an admin interface: none\u0026lt;/em\u0026gt;!, Host: 88.136.16.221] [\u0026lt;em\u0026gt;Stop scanning for an admin interface: none\u0026lt;/em\u0026gt;!, User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36] [\u0026lt;em\u0026gt;Stop scanning for an admin interface: none\u0026lt;/em\u0026gt;!, 88.136.16.221/phpmyadmin/] GET: Invalid argument Cet exemple nous restitue :\ndes connexions réussies done des connexions échouées, ici de type erreur 403, bloquées selon des règles de filtrage bloquantes block - non expliquées ici Exemple log message :$ grep relayd /var/log/messages May 17 16:22:23 sh1 relayd[7531]: relay www, session 11 (1 active), 0, 37.49.230.25 -\u0026gt; :80, Forbidden (403 Forbidden), [\u0026lt;em\u0026gt;Stop scanning for PHP: none\u0026lt;/em\u0026gt;!, User-Agent: Uirusu/2.0] GET: Invalid argument May 17 17:01:19 sh1 relayd[45869]: relay www, session 9 (1 active), 0, 207.180.140.98 -\u0026gt; :80, Forbidden (403 Forbidden), [\u0026lt;em\u0026gt;Stop scanning for PHP: none\u0026lt;/em\u0026gt;!, User-Agent: polaris] GET: Invalid argument May 17 17:02:43 sh1 relayd[7531]: relay www, session 13 (1 active), 0, 84.161.80.36 -\u0026gt; :80, Forbidden (403 Forbidden), [\u0026lt;em\u0026gt;Stop scanning for an admin interface: none\u0026lt;/em\u0026gt;!, Host: 88.136.16.221] [\u0026lt;em\u0026gt;Stop scanning for an admin interface: none\u0026lt;/em\u0026gt;!, User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36] [\u0026lt;em\u0026gt;Stop scanning for an admin interface: none\u0026lt;/em\u0026gt;!, 88.136.16.221/phpmyadmin/] GET: Invalid argument Cet exemple nous montre 3 écritures de journalisation de règles bloquantes, provoquant une erreur 403, sur des critères de filtrage non expliqués ici.\nDocumentations Manpages relayd.conf(5) ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenBSD\u003c/strong\u003e intègre par défaut dans le système de base, depuis 5.7, le\nserveur de relais nommé \u003cstrong\u003erelayd\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSite web : \u003ca href=\"https://bsd.plumbing/\" rel=\"external\"\u003ehttps://bsd.plumbing/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpenBSD : \u003cstrong\u003e6.6, 6.7\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLe but de cet article est de savoir comment mettre en place une journalisation\ndu flux HTTP(S) qui passe au-travers de \u003cstrong\u003erelayd\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est très simple !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePar défault, le fichier de configuration : \u003ccode\u003e/etc/relayd.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"configuration-globale\"\u003eConfiguration Globale\u003c/h3\u003e\n\u003cp\u003eDans un premier temps, nous devons déclarer le paramètre global \u003ccode\u003elog\u003c/code\u003e  dans\nle fichier de configuration de \u003cstrong\u003erelayd\u003c/strong\u003e. \u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/relayd.conf.5#log\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)#log\u003c/a\u003e\n\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eLes déclarations de journal suivantes ont pour signification les suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elog state changes\u003c/code\u003e ou \u003ccode\u003elog host checks\u003c/code\u003e sont utiles pour suivre l\u0026rsquo;état\nde l\u0026rsquo;hôte ou les contrôles effectués dessus.\n\u003cul\u003e\n\u003cli\u003eles états peuvent être de type :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eup\u003c/code\u003e si l\u0026rsquo;état de santé de l\u0026rsquo;hôte est positif\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edown\u003c/code\u003e si celui est arrété ou si les contrôles ne sont pas bons.\u003c/li\u003e\n\u003cli\u003een état \u003ccode\u003eunknown\u003c/code\u003e si l\u0026rsquo;hôte est désactivé ou n\u0026rsquo;a pas encore été\ncontrôlé.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elog connection\u003c/code\u003e nous permet de journaliser les connexions TCP, \u003cstrong\u003esi relayd\nest configuré en tant que relai(s)\u003c/strong\u003e \u003csup\u003e\u003cspan class=\"orange\"\u003e1\u003c/span\u003e\n\u003c/sup\u003e.\nÀ noter l\u0026rsquo;ajout de l\u0026rsquo;option \u003ccode\u003eerrors\u003c/code\u003e pour le cas où nous voulons journaliser\nque les erreurs de connexions TCP.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003csup\u003e\u003cspan class=\"orange\"\u003e1\u003c/span\u003e\n\u003c/sup\u003e \u003cem\u003eEn effet, \u003cstrong\u003erelayd\u003c/strong\u003e peut aussi\nêtre configuré en tant que routeur ou serveur de redirection\u003c/em\u003e.\u003c/p\u003e\n\u003ch3 id=\"règles-de-filtrage\"\u003eRègles de filtrage\u003c/h3\u003e\n\u003cp\u003eToujours dans le contexte du fichier de configuration de \u003cstrong\u003erelayd\u003c/strong\u003e, les\nrelais ont la possibilité de filtrer les connexions par le biais de paramètres\nde filtrage spécifiques.\u003c/p\u003e\n\u003cp\u003eAinsi nous utiliserons l\u0026rsquo;action de correspondance \u003ccode\u003ematch\u003c/code\u003e sur laquelle\nnous appliquons l\u0026rsquo;option de journalisation \u003ccode\u003elog\u003c/code\u003e. \u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/relayd.conf.5#match\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)#match\u003c/a\u003e\n\u003c/em\u003e \u003cbr\u003e\nCette action de correspondance s\u0026rsquo;appliquera sur un type d\u0026rsquo;action ;\nactuellement, 5 types d\u0026rsquo;actions sont définies :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecookie\u003c/code\u003e : une action qui a lieu sur un cookie. \u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e\n\u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/relayd.conf.5#cookie\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)#cookie\u003c/a\u003e\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eheader\u003c/code\u003e : une action ciblant le protocol d\u0026rsquo;entête HTTP - les fameuses \u003cstrong\u003eheader\u003c/strong\u003es\n\u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/relayd.conf.5#header\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)#header\u003c/a\u003e\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epath\u003c/code\u003e : une action qui analyse le chemin de l\u0026rsquo;URL demandée.\n\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e \u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/relayd.conf.5#path\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)#path\u003c/a\u003e\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003equery\u003c/code\u003e : une action pour chercher la partie query de l\u0026rsquo;URL demandée.\n\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e \u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/relayd.conf.5#query\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)#query\u003c/a\u003e\n\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eurl\u003c/code\u003e : l\u0026rsquo;action récupérant l\u0026rsquo;URL complète… \u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e\n\u003cem\u003e\n\u003ca class=\"\" href=\"https://man.openbsd.org/relayd.conf.5#url\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)#url\u003c/a\u003e\n\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e \u003cem\u003eseulement disponible sur une requête HTTP.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"exemple-de-configuration\"\u003eExemple de configuration\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;exemple ci-dessous nous montre cinq règles de filtrage :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles quatre premières ayant lieu sur une correspondance d\u0026rsquo;entête\u003c/li\u003e\n\u003cli\u003ela dernière journalisant l\u0026rsquo;URL dans son ensemble.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### ips externe auth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eip4\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;addresse-ipv4-public\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### manage logs\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog state changes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elog connection\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#log connection errors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehttp protocol \u003cspan style=\"color:#48b685\"\u003e\u0026#34;hw\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    match header log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Host\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    match header log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;X-Forwarded-For\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    match header log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;User-Agent\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    match header log \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Referer\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    match url log\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    block\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erelay \u003cspan style=\"color:#48b685\"\u003e\u0026#34;www\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    listen on \u003cspan style=\"color:#ef6155\"\u003e$ip4\u003c/span\u003e port \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    protocol hw\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    forward to 127.0.0.1 port \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"journaux\"\u003eJournaux\u003c/h2\u003e\n\u003cp\u003eLà encore, tout simplement, une fois la configuration établie, validée,\net le service relayd fonctionnel, les différents journaux se retrouvent\nprincipalement dans :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/var/log/daemon\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/var/log/message\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"exemple-log-daemon\"\u003eExemple log daemon\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ grep relayd /var/log/daemon\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 16:37:21 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e25237\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 192.168.1.1 -\u0026gt; :80, \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 16:37:21 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e45869\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 192.168.1.1 -\u0026gt; :80, \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 16:37:21 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e45869\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 192.168.1.1 -\u0026gt; :80, \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 16:37:22 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e25237\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e14\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 192.168.1.1 -\u0026gt; :80, \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 17:01:19 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e45869\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 207.180.140.98 -\u0026gt; :80, Forbidden \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\u003e Forbidden\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e PHP: none\u0026lt;/em\u0026gt;!, User-Agent: polaris\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e GET: Invalid argument\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 17:01:19 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e45869\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 207.180.140.98 -\u0026gt; :80, \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 17:02:43 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e7531\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 84.161.80.36 -\u0026gt; :80, Forbidden \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\u003e Forbidden\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e an admin interface: none\u0026lt;/em\u0026gt;!, Host: 88.136.16.221\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e an admin interface: none\u0026lt;/em\u0026gt;!, User-Agent: Mozilla/5.0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eWindows NT 10.0; WOW64\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e AppleWebKit/537.36 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eKHTML, like Gecko\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Chrome/51.0.2704.103 Safari/537.36\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e an admin interface: none\u0026lt;/em\u0026gt;!, 88.136.16.221/phpmyadmin/\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e GET: Invalid argument\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet exemple nous restitue :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edes connexions réussies \u003ccode\u003edone\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edes connexions échouées, ici de type erreur 403, bloquées selon des règles\nde filtrage bloquantes \u003ccode\u003eblock\u003c/code\u003e - \u003cem\u003enon expliquées ici\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"exemple-log-message\"\u003eExemple log message\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ grep relayd /var/log/messages\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 16:22:23 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e7531\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 37.49.230.25 -\u0026gt; :80, Forbidden \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\u003e Forbidden\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e PHP: none\u0026lt;/em\u0026gt;!, User-Agent: Uirusu/2.0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e GET: Invalid argument\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 17:01:19 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e45869\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e9\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 207.180.140.98 -\u0026gt; :80, Forbidden \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\u003e Forbidden\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e PHP: none\u0026lt;/em\u0026gt;!, User-Agent: polaris\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e GET: Invalid argument\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMay \u003cspan style=\"color:#f99b15\"\u003e17\u003c/span\u003e 17:02:43 sh1 relayd\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e7531\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: relay www, session \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e active\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, 0, 84.161.80.36 -\u0026gt; :80, Forbidden \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e403\u003c/span\u003e Forbidden\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e an admin interface: none\u0026lt;/em\u0026gt;!, Host: 88.136.16.221\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e an admin interface: none\u0026lt;/em\u0026gt;!, User-Agent: Mozilla/5.0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eWindows NT 10.0; WOW64\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e AppleWebKit/537.36 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eKHTML, like Gecko\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Chrome/51.0.2704.103 Safari/537.36\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;em\u0026gt;Stop scanning \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e an admin interface: none\u0026lt;/em\u0026gt;!, 88.136.16.221/phpmyadmin/\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e GET: Invalid argument\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet exemple nous montre 3 écritures de journalisation de règles bloquantes,\nprovoquant une erreur 403, sur des critères de filtrage non expliqués ici.\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.conf.5\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Mettre en place et visualiser la journalisation dans relayd, serveur relai(s) sous OpenBSD",
            "tags": ["relayd", "log", "OpenBSD", "astuce"],
            "date_published": "2020-05-17T13:09:05+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:32994929-231b-f63d-8e2f-fcaf9a687979",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/ovh-over-the-box-v2a/",
            "title": "OVH Over the Box V2A",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Ici, il n\u0026rsquo;est pas question d\u0026rsquo;installation, mais juste de l\u0026rsquo;aperçu du retour de dmesg de ce mini-pc fourni par OVH, nommé \u0026ldquo;Over The Box V2A\u0026rdquo;.\nNeofetch : OpenBSD 6.8 sur mini-pc OVH Over-the-Box V2A dmesg OpenBSD 6.8 (GENERIC.MP) #98: Sun Oct 4 18:13:26 MDT 2020 deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP real mem = 2036154368 (1941MB) avail mem = 1959460864 (1868MB) random: good seed from bootblocks mpath0 at root scsibus0 at mpath0: 256 targets mainbus0 at root bios0 at mainbus0: SMBIOS rev. 3.0 @ 0x7b8f3000 (51 entries) bios0: vendor American Megatrends Inc. version \u0026#34;5.11\u0026#34; date 12/04/2017 bios0: OVH SAS Over TheBox V2A acpi0 at bios0: ACPI 5.0 acpi0: sleep states S0 S4 S5 acpi0: tables DSDT FACP APIC FPDT FIDT MCFG SSDT SSDT SSDT UEFI SSDT HPET SSDT SSDT SSDT LPIT BCFG PRAM BGRT CSRT WDAT acpi0: wakeup devices XHC1(S4) acpitimer0 at acpi0: 3579545 Hz, 24 bits acpimadt0 at acpi0 addr 0xfee00000: PC-AT compat cpu0 at mainbus0: apid 0 (boot processor) cpu0: Intel(R) Atom(TM) x5-Z8350 CPU @ 1.44GHz, 1440.28 MHz, 06-4c-04 cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN cpu0: 1MB 64b/line 16-way L2 cache cpu0: smt 0, core 0, package 0 mtrr: Pentium Pro MTRR support, 8 var ranges, 88 fixed ranges cpu0: apic clock running at 79MHz cpu0: mwait min=64, max=64, C-substates=0.2.0.0.0.0.3.3, IBE cpu1 at mainbus0: apid 2 (application processor) cpu1: Intel(R) Atom(TM) x5-Z8350 CPU @ 1.44GHz, 1439.96 MHz, 06-4c-04 cpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN cpu1: 1MB 64b/line 16-way L2 cache cpu1: smt 0, core 1, package 0 cpu2 at mainbus0: apid 4 (application processor) cpu2: Intel(R) Atom(TM) x5-Z8350 CPU @ 1.44GHz, 1439.97 MHz, 06-4c-04 cpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN cpu2: 1MB 64b/line 16-way L2 cache cpu2: smt 0, core 2, package 0 cpu3 at mainbus0: apid 6 (application processor) cpu3: Intel(R) Atom(TM) x5-Z8350 CPU @ 1.44GHz, 1439.97 MHz, 06-4c-04 cpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN cpu3: 1MB 64b/line 16-way L2 cache cpu3: smt 0, core 3, package 0 ioapic0 at mainbus0: apid 1 pa 0xfec00000, version 20, 115 pins acpimcfg0 at acpi0 acpimcfg0: addr 0xe0000000, bus 0-255 acpihpet0 at acpi0: 14318179 Hz acpiprt0 at acpi0: bus 0 (PCI0) acpiprt1 at acpi0: bus 1 (RP01) acpiprt2 at acpi0: bus -1 (RP02) acpiprt3 at acpi0: bus -1 (RP03) acpiprt4 at acpi0: bus -1 (RP04) \u0026#34;INT33A4\u0026#34; at acpi0 not configured chvgpio0 at acpi0 GPO1 uid 2 addr 0xfed88000/0x8000 irq 48, 59 pins chvgpio1 at acpi0 GPO3 uid 4 addr 0xfed98000/0x8000 irq 91, 55 pins chvgpio2 at acpi0 GPO2 uid 3 addr 0xfed90000/0x8000 irq 50, 24 pins chvgpio3 at acpi0 GPO0 uid 1 addr 0xfed80000/0x8000 irq 49, 56 pins dwiic0 at acpi0 I2C7 addr 0x91728000/0x1000 irq 38 iic0 at dwiic0 \u0026#34;INT33F4\u0026#34; at iic0 addr 0x34 not configured acpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001 \u0026#34;TXE8086\u0026#34; at acpi0 not configured \u0026#34;INT3496\u0026#34; at acpi0 not configured sdhc0 at acpi0 SDHB addr 0x9173a000/0x1000 irq 46 sdhc0: SDHC 3.0, 200 MHz base clock sdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, ddr52, dma \u0026#34;RTL8723\u0026#34; at acpi0 not configured sdhc1 at acpi0 SDHC addr 0x91738000/0x1000 irq 47, gpio sdhc1: SDHC 3.0, 200 MHz base clock sdmmc1 at sdhc1: 4-bit, sd high-speed, mmc high-speed, ddr52, dma \u0026#34;80862286\u0026#34; at acpi0 not configured \u0026#34;808622C0\u0026#34; at acpi0 not configured \u0026#34;80862288\u0026#34; at acpi0 not configured \u0026#34;80862289\u0026#34; at acpi0 not configured \u0026#34;8086228A\u0026#34; at acpi0 not configured \u0026#34;8086228A\u0026#34; at acpi0 not configured \u0026#34;JEHE8888\u0026#34; at acpi0 not configured \u0026#34;8086228E\u0026#34; at acpi0 not configured \u0026#34;8086228E\u0026#34; at acpi0 not configured \u0026#34;8086228E\u0026#34; at acpi0 not configured dwiic1 at acpi0 I2C1 addr 0x91734000/0x1000 irq 32 iic1 at dwiic1 \u0026#34;TXN27501\u0026#34; at iic1 addr 0x6b not configured \u0026#34;TXN24292\u0026#34; at iic1 addr 0x55 not configured dwiic2 at acpi0 I2C2 addr 0x91732000/0x1000 irq 33 iic2 at dwiic2 \u0026#34;10EC5670\u0026#34; at iic2 addr 0x1c not configured \u0026#34;INTCF1D\u0026#34; at acpi0 not configured \u0026#34;JAHC2333\u0026#34; at acpi0 not configured \u0026#34;JAHC8563\u0026#34; at acpi0 not configured dwiic3 at acpi0 I2C4 addr 0x9172e000/0x1000 irq 35 iic3 at dwiic3 dwiic4 at acpi0 I2C5 addr 0x9172c000/0x1000 irq 36 iic4 at dwiic4 dwiic5 at acpi0 I2C6 addr 0x9172a000/0x1000 irq 37 iic5 at dwiic5 \u0026#34;808622A8\u0026#34; at acpi0 not configured \u0026#34;ADMA22A8\u0026#34; at acpi0 not configured \u0026#34;TIMC22A8\u0026#34; at acpi0 not configured \u0026#34;HAD022A8\u0026#34; at acpi0 not configured acpihid0 at acpi0: HIDDacpihid0: exec of HEBC failed acpihid0: exec of HEBC failed acpicmos0 at acpi0 \u0026#34;JEHE2333\u0026#34; at acpi0 not configured acpibtn0 at acpi0: PWRB chvgpio4 at acpi0 GPO4 uid 5 \u0026#34;8086229C\u0026#34; at acpi0 not configured \u0026#34;INTCFD9\u0026#34; at acpi0 not configured \u0026#34;INT33BD\u0026#34; at acpi0 not configured \u0026#34;ACPI000C\u0026#34; at acpi0 not configured \u0026#34;INT3400\u0026#34; at acpi0 not configured \u0026#34;INT3403\u0026#34; at acpi0 not configured \u0026#34;INT3403\u0026#34; at acpi0 not configured \u0026#34;INT3406\u0026#34; at acpi0 not configured \u0026#34;INT3403\u0026#34; at acpi0 not configured acpicpu0 at acpi0: C3(10@1000 mwait.1@0x64), C2(10@500 mwait.1@0x58), C1(1000@1 mwait.1), PSS acpicpu1 at acpi0: C3(10@1000 mwait.1@0x64), C2(10@500 mwait.1@0x58), C1(1000@1 mwait.1), PSS acpicpu2 at acpi0: C3(10@1000 mwait.1@0x64), C2(10@500 mwait.1@0x58), C1(1000@1 mwait.1), PSS acpicpu3 at acpi0: C3(10@1000 mwait.1@0x64), C2(10@500 mwait.1@0x58), C1(1000@1 mwait.1), PSS acpipwrres0 at acpi0: ID3C, resource for ISP3 acpipwrres1 at acpi0: WWPR, resource for HS03, MDM1 acpipwrres2 at acpi0: WWPR, resource for HS13, MDM1 acpipwrres3 at acpi0: WWPR, resource for SSC1, MDM3 acpipwrres4 at acpi0: WWPR, resource for SSCW, MDM3 acpipwrres5 at acpi0: WWPR, resource for HSC1, MDM2 acpipwrres6 at acpi0: WWPR, resource for HSC3, MDM4 acpipwrres7 at acpi0: CLK3, resource for RTEK, RTK1 acpipwrres8 at acpi0: CLK4 acpipwrres9 at acpi0: CLK2, resource for NFC2 acpipwrres10 at acpi0: CLK1 acpipwrres11 at acpi0: CLK0 acpipwrres12 at acpi0: CLK1 acpipwrres13 at acpi0: USBC, resource for XHC1, OTG1 acpipwrres14 at acpi0: P28X acpipwrres15 at acpi0: P18X acpipwrres16 at acpi0: P12X acpipwrres17 at acpi0: P28P acpipwrres18 at acpi0: P18P acpipwrres19 at acpi0: P19X acpipwrres20 at acpi0: P06X acpipwrres21 at acpi0: P12A acpipwrres22 at acpi0: P28T acpipwrres23 at acpi0: P18D acpipwrres24 at acpi0: P18T acpipwrres25 at acpi0: P3P3 acpipwrres26 at acpi0: P12T acpipwrres27 at acpi0: P28W acpipwrres28 at acpi0: P18W acpipwrres29 at acpi0: P12W acpipwrres30 at acpi0: P33W acpipwrres31 at acpi0: P33X acpipwrres32 at acpi0: P4BW acpitz0 at acpi0: critical temperature is 90 degC acpivideo0 at acpi0: GFX0 acpivout0 at acpivideo0: DD01 acpivout1 at acpivideo0: DD02 acpivout2 at acpivideo0: DD03 acpivout3 at acpivideo0: DD04 acpivout4 at acpivideo0: DD05 acpivout5 at acpivideo0: DD06 acpivout6 at acpivideo0: DD07 acpivout7 at acpivideo0: DD08 cpu0: using VERW MDS workaround cpu0: Enhanced SpeedStep 1440 MHz: speeds: 1920, 1840, 1760, 1680, 1600, 1520, 1440, 1360, 1280, 1200, 1120, 1040, 960, 880, 800, 720, 640, 560, 480 MHz pci0 at mainbus0 bus 0 pchb0 at pci0 dev 0 function 0 \u0026#34;Intel Braswell Host\u0026#34; rev 0x36 inteldrm0 at pci0 dev 2 function 0 \u0026#34;Intel HD Graphics\u0026#34; rev 0x36 drm0 at inteldrm0 inteldrm0: msi, CHERRYVIEW, gen 8 \u0026#34;Intel Braswell Power\u0026#34; rev 0x36 at pci0 dev 11 function 0 not configured sdhc2 at pci0 dev 16 function 0 vendor \u0026#34;Intel\u0026#34;, unknown product 0x2294 rev 0x36: apic 1 int 16 sdhc2: SDHC 3.0, 200 MHz base clock sdmmc2 at sdhc2: 8-bit, sd high-speed, mmc high-speed, ddr52, dma xhci0 at pci0 dev 20 function 0 \u0026#34;Intel Braswell xHCI\u0026#34; rev 0x36: msi, xHCI 1.0 usb0 at xhci0: USB revision 3.0 uhub0 at usb0 configuration 1 interface 0 \u0026#34;Intel xHCI root hub\u0026#34; rev 3.00/1.00 addr 1 \u0026#34;Intel Braswell USB OTG\u0026#34; rev 0x36 at pci0 dev 22 function 0 not configured \u0026#34;Intel Braswell TXE\u0026#34; rev 0x36 at pci0 dev 26 function 0 not configured ppb0 at pci0 dev 28 function 0 \u0026#34;Intel Braswell PCIE\u0026#34; rev 0x36: msi pci1 at ppb0 bus 1 re0 at pci1 dev 0 function 0 \u0026#34;Realtek 8168\u0026#34; rev 0x07: RTL8168E/8111E-VL (0x2c80), msi, address 24:1c:04:08:8c:05 rgephy0 at re0 phy 7: RTL8169S/8110S/8211 PHY, rev. 5 pcib0 at pci0 dev 31 function 0 \u0026#34;Intel Braswell PCU LPC\u0026#34; rev 0x36 isa0 at pcib0 isadma0 at isa0 com0 at isa0 port 0x3f8/8 irq 4: ns16550a, 16 byte fifo com1 at isa0 port 0x2f8/8 irq 3: ns8250, no fifo com2 at isa0 port 0x3e8/8 irq 5: ns8250, no fifo pckbc0 at isa0 port 0x60/5 irq 1 irq 12 pckbd0 at pckbc0 (kbd slot) wskbd0 at pckbd0: console keyboard pcppi0 at isa0 port 0x61 spkr0 at pcppi0 vmm0 at mainbus0: VMX/EPT (using slow L1TF mitigation) efifb at mainbus0 not configured sdmmc0: can\u0026#39;t enable card sdmmc1: can\u0026#39;t enable card scsibus1 at sdmmc2: 2 targets, initiator 0 sd0 at scsibus1 targ 1 lun 0: \u0026lt;Samsung, 8GME4R, 0000\u0026gt; removable sd0: 7456MB, 512 bytes/sector, 15269888 sectors umass0 at uhub0 port 2 configuration 1 interface 0 \u0026#34;ASMedia AS2115\u0026#34; rev 2.10/0.01 addr 2 umass0: using SCSI over Bulk-Only scsibus2 at umass0: 2 targets, initiator 0 sd1 at scsibus2 targ 1 lun 0: \u0026lt;ASMT, 2115, 0\u0026gt; serial.174c1153000000000000 sd1: 122104MB, 512 bytes/sector, 250069680 sectors uhub1 at uhub0 port 4 configuration 1 interface 0 \u0026#34;Genesys Logic USB2.0 Hub\u0026#34; rev 2.00/85.36 addr 3 vscsi0 at root scsibus3 at vscsi0: 256 targets softraid0 at root scsibus4 at softraid0: 256 targets root on sd0a (2f18100544c5d963.a) swap on sd0b dump on sd0b inteldrm0: 1024x768, 32bpp wsdisplay0 at inteldrm0 mux 1: console (std, vt100 emulation), using wskbd0 wsdisplay0: screen 1-5 added (std, vt100 emulation) hw.sensors $ sysctl hw.sensors hw.sensors.cpu0.temp0=43.00 degC hw.sensors.acpitz0.temp0=0.00 degC (zone temperature) ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIci, il n\u0026rsquo;est pas question d\u0026rsquo;installation, mais juste de l\u0026rsquo;aperçu du retour\nde \u003ccode\u003edmesg\u003c/code\u003e de ce mini-pc fourni par OVH, nommé \u0026ldquo;Over The Box V2A\u0026rdquo;.\u003c/p\u003e\n\u003cdiv class=\"row justify-content-center align-items-center\"\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/OVH-OTB-V2A-neofetch-6.8.png\" title=\"Neofetch : OpenBSD 6.8 sur mini-pc OVH Over-the-Box V2A\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/OVH-OTB-V2A-neofetch-6.8_hu_bea05ea2a809b2d.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Neofetch : OpenBSD 6.8 sur mini-pc OVH Over-the-Box V2A\" height=\"136\" loading=\"lazy\" src=\"/images/openbsd/OVH-OTB-V2A-neofetch-6.8_hu_7533571fab611a2a.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eNeofetch : OpenBSD 6.8 sur mini-pc OVH Over-the-Box V2A\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\u003ch2 id=\"dmesg\"\u003edmesg\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOpenBSD 6.8 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eGENERIC.MP\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e#98: Sun Oct  4 18:13:26 MDT 2020\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/GENERIC.MP\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereal \u003cspan style=\"color:#ef6155\"\u003emem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2036154368\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1941MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eavail \u003cspan style=\"color:#ef6155\"\u003emem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1959460864\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1868MB\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erandom: good seed from bootblocks\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003empath0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus0 at mpath0: \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emainbus0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0 at mainbus0: SMBIOS rev. 3.0 @ 0x7b8f3000 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e51\u003c/span\u003e entries\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0: vendor American Megatrends Inc. version \u003cspan style=\"color:#48b685\"\u003e\u0026#34;5.11\u0026#34;\u003c/span\u003e date 12/04/2017\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebios0: OVH SAS Over TheBox V2A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0 at bios0: ACPI 5.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: sleep states S0 S4 S5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: tables DSDT FACP APIC FPDT FIDT MCFG SSDT SSDT SSDT UEFI SSDT HPET SSDT SSDT SSDT LPIT BCFG PRAM BGRT CSRT WDAT\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpi0: wakeup devices XHC1\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS4\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpitimer0 at acpi0: \u003cspan style=\"color:#f99b15\"\u003e3579545\u003c/span\u003e Hz, \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e bits\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimadt0 at acpi0 addr 0xfee00000: PC-AT compat\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0 at mainbus0: apid \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eboot processor\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: Intel\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eR\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Atom\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e x5-Z8350 CPU @ 1.44GHz, 1440.28 MHz, 06-4c-04\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: 1MB 64b/line 16-way L2 cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: smt 0, core 0, package \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emtrr: Pentium Pro MTRR support, \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e var ranges, \u003cspan style=\"color:#f99b15\"\u003e88\u003c/span\u003e fixed ranges\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: apic clock running at 79MHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: mwait \u003cspan style=\"color:#ef6155\"\u003emin\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e64, \u003cspan style=\"color:#ef6155\"\u003emax\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e64, C-substates\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0.2.0.0.0.0.3.3, IBE\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1 at mainbus0: apid \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eapplication processor\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1: Intel\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eR\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Atom\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e x5-Z8350 CPU @ 1.44GHz, 1439.96 MHz, 06-4c-04\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1: 1MB 64b/line 16-way L2 cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu1: smt 0, core 1, package \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2 at mainbus0: apid \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eapplication processor\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2: Intel\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eR\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Atom\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e x5-Z8350 CPU @ 1.44GHz, 1439.97 MHz, 06-4c-04\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2: 1MB 64b/line 16-way L2 cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu2: smt 0, core 2, package \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3 at mainbus0: apid \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eapplication processor\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3: Intel\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eR\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e Atom\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eTM\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e x5-Z8350 CPU @ 1.44GHz, 1439.97 MHz, 06-4c-04\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,PBE,SSE3,PCLMUL,DTES64,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,SSE4.1,SSE4.2,MOVBE,POPCNT,DEADLINE,AES,RDRAND,NXE,RDTSCP,LONG,LAHF,3DNOWP,PERF,ITSC,TSC_ADJUST,SMEP,ERMS,MD_CLEAR,IBRS,IBPB,STIBP,SENSOR,ARAT,MELTDOWN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3: 1MB 64b/line 16-way L2 cache\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu3: smt 0, core 3, package \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eioapic0 at mainbus0: apid \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e pa 0xfec00000, version 20, \u003cspan style=\"color:#f99b15\"\u003e115\u003c/span\u003e pins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimcfg0 at acpi0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpimcfg0: addr 0xe0000000, bus 0-255\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpihpet0 at acpi0: \u003cspan style=\"color:#f99b15\"\u003e14318179\u003c/span\u003e Hz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt0 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ePCI0\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt1 at acpi0: bus \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP01\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt2 at acpi0: bus -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP02\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt3 at acpi0: bus -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP03\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpiprt4 at acpi0: bus -1 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eRP04\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT33A4\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echvgpio0 at acpi0 GPO1 uid \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e addr 0xfed88000/0x8000 irq 48, \u003cspan style=\"color:#f99b15\"\u003e59\u003c/span\u003e pins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echvgpio1 at acpi0 GPO3 uid \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e addr 0xfed98000/0x8000 irq 91, \u003cspan style=\"color:#f99b15\"\u003e55\u003c/span\u003e pins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echvgpio2 at acpi0 GPO2 uid \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e addr 0xfed90000/0x8000 irq 50, \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e pins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echvgpio3 at acpi0 GPO0 uid \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e addr 0xfed80000/0x8000 irq 49, \u003cspan style=\"color:#f99b15\"\u003e56\u003c/span\u003e pins\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwiic0 at acpi0 I2C7 addr 0x91728000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e38\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic0 at dwiic0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT33F4\u0026#34;\u003c/span\u003e at iic0 addr 0x34 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipci0 at acpi0 PCI0: 0x00000000 0x00000011 0x00000001\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;TXE8086\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT3496\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc0 at acpi0 SDHB addr 0x9173a000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e46\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc0: SDHC 3.0, \u003cspan style=\"color:#f99b15\"\u003e200\u003c/span\u003e MHz base clock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdmmc0 at sdhc0: 4-bit, sd high-speed, mmc high-speed, ddr52, dma\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;RTL8723\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc1 at acpi0 SDHC addr 0x91738000/0x1000 irq 47, gpio\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc1: SDHC 3.0, \u003cspan style=\"color:#f99b15\"\u003e200\u003c/span\u003e MHz base clock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdmmc1 at sdhc1: 4-bit, sd high-speed, mmc high-speed, ddr52, dma\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;80862286\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;808622C0\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;80862288\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;80862289\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;8086228A\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;8086228A\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;JEHE8888\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;8086228E\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;8086228E\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;8086228E\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwiic1 at acpi0 I2C1 addr 0x91734000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e32\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic1 at dwiic1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;TXN27501\u0026#34;\u003c/span\u003e at iic1 addr 0x6b not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;TXN24292\u0026#34;\u003c/span\u003e at iic1 addr 0x55 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwiic2 at acpi0 I2C2 addr 0x91732000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e33\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic2 at dwiic2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;10EC5670\u0026#34;\u003c/span\u003e at iic2 addr 0x1c not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INTCF1D\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;JAHC2333\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;JAHC8563\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwiic3 at acpi0 I2C4 addr 0x9172e000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e35\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic3 at dwiic3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwiic4 at acpi0 I2C5 addr 0x9172c000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e36\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic4 at dwiic4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edwiic5 at acpi0 I2C6 addr 0x9172a000/0x1000 irq \u003cspan style=\"color:#f99b15\"\u003e37\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eiic5 at dwiic5\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;808622A8\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ADMA22A8\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;TIMC22A8\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HAD022A8\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpihid0 at acpi0: HIDDacpihid0: exec of HEBC failed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpihid0: exec of HEBC failed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicmos0 at acpi0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;JEHE2333\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpibtn0 at acpi0: PWRB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003echvgpio4 at acpi0 GPO4 uid \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;8086229C\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INTCFD9\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT33BD\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;ACPI000C\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT3400\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT3403\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT3403\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT3406\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;INT3403\u0026#34;\u003c/span\u003e at acpi0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu0 at acpi0: C3\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@1000 mwait.1@0x64\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@500 mwait.1@0x58\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C1\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1000@1 mwait.1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, PSS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu1 at acpi0: C3\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@1000 mwait.1@0x64\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@500 mwait.1@0x58\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C1\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1000@1 mwait.1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, PSS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu2 at acpi0: C3\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@1000 mwait.1@0x64\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@500 mwait.1@0x58\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C1\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1000@1 mwait.1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, PSS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpicpu3 at acpi0: C3\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@1000 mwait.1@0x64\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C2\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e10@500 mwait.1@0x58\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, C1\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e1000@1 mwait.1\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, PSS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres0 at acpi0: ID3C, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e ISP3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres1 at acpi0: WWPR, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e HS03, MDM1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres2 at acpi0: WWPR, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e HS13, MDM1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres3 at acpi0: WWPR, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e SSC1, MDM3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres4 at acpi0: WWPR, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e SSCW, MDM3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres5 at acpi0: WWPR, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e HSC1, MDM2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres6 at acpi0: WWPR, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e HSC3, MDM4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres7 at acpi0: CLK3, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e RTEK, RTK1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres8 at acpi0: CLK4\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres9 at acpi0: CLK2, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e NFC2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres10 at acpi0: CLK1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres11 at acpi0: CLK0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres12 at acpi0: CLK1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres13 at acpi0: USBC, resource \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e XHC1, OTG1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres14 at acpi0: P28X\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres15 at acpi0: P18X\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres16 at acpi0: P12X\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres17 at acpi0: P28P\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres18 at acpi0: P18P\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres19 at acpi0: P19X\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres20 at acpi0: P06X\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres21 at acpi0: P12A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres22 at acpi0: P28T\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres23 at acpi0: P18D\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres24 at acpi0: P18T\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres25 at acpi0: P3P3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres26 at acpi0: P12T\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres27 at acpi0: P28W\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres28 at acpi0: P18W\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres29 at acpi0: P12W\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres30 at acpi0: P33W\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres31 at acpi0: P33X\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpipwrres32 at acpi0: P4BW\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpitz0 at acpi0: critical temperature is \u003cspan style=\"color:#f99b15\"\u003e90\u003c/span\u003e degC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivideo0 at acpi0: GFX0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout0 at acpivideo0: DD01\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout1 at acpivideo0: DD02\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout2 at acpivideo0: DD03\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout3 at acpivideo0: DD04\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout4 at acpivideo0: DD05\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout5 at acpivideo0: DD06\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout6 at acpivideo0: DD07\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eacpivout7 at acpivideo0: DD08\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: using VERW MDS workaround\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecpu0: Enhanced SpeedStep \u003cspan style=\"color:#f99b15\"\u003e1440\u003c/span\u003e MHz: speeds: 1920, 1840, 1760, 1680, 1600, 1520, 1440, 1360, 1280, 1200, 1120, 1040, 960, 880, 800, 720, 640, 560, \u003cspan style=\"color:#f99b15\"\u003e480\u003c/span\u003e MHz\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci0 at mainbus0 bus \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epchb0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Braswell Host\u0026#34;\u003c/span\u003e rev 0x36\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einteldrm0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel HD Graphics\u0026#34;\u003c/span\u003e rev 0x36\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrm0 at inteldrm0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einteldrm0: msi, CHERRYVIEW, gen \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Braswell Power\u0026#34;\u003c/span\u003e rev 0x36 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc2 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e vendor \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel\u0026#34;\u003c/span\u003e, unknown product 0x2294 rev 0x36: apic \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e int \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdhc2: SDHC 3.0, \u003cspan style=\"color:#f99b15\"\u003e200\u003c/span\u003e MHz base clock\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdmmc2 at sdhc2: 8-bit, sd high-speed, mmc high-speed, ddr52, dma\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003exhci0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Braswell xHCI\u0026#34;\u003c/span\u003e rev 0x36: msi, xHCI 1.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eusb0 at xhci0: USB revision 3.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub0 at usb0 configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel xHCI root hub\u0026#34;\u003c/span\u003e rev 3.00/1.00 addr \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Braswell USB OTG\u0026#34;\u003c/span\u003e rev 0x36 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Braswell TXE\u0026#34;\u003c/span\u003e rev 0x36 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e26\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eppb0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e28\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Braswell PCIE\u0026#34;\u003c/span\u003e rev 0x36: msi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epci1 at ppb0 bus \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ere0 at pci1 dev \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Realtek 8168\u0026#34;\u003c/span\u003e rev 0x07: RTL8168E/8111E-VL \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x2c80\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, msi, address 24:1c:04:08:8c:05\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ergephy0 at re0 phy 7: RTL8169S/8110S/8211 PHY, rev. \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epcib0 at pci0 dev \u003cspan style=\"color:#f99b15\"\u003e31\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Intel Braswell PCU LPC\u0026#34;\u003c/span\u003e rev 0x36\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eisa0 at pcib0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eisadma0 at isa0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom0 at isa0 port 0x3f8/8 irq 4: ns16550a, \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e byte fifo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom1 at isa0 port 0x2f8/8 irq 3: ns8250, no fifo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecom2 at isa0 port 0x3e8/8 irq 5: ns8250, no fifo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epckbc0 at isa0 port 0x60/5 irq \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e irq \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epckbd0 at pckbc0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ekbd slot\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewskbd0 at pckbd0: console keyboard\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epcppi0 at isa0 port 0x61\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003espkr0 at pcppi0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmm0 at mainbus0: VMX/EPT \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eusing slow L1TF mitigation\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eefifb at mainbus0 not configured\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esdmmc0: can\u003cspan style=\"color:#48b685\"\u003e\u0026#39;t enable card\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003esdmmc1: can\u0026#39;\u003c/span\u003et enable card\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus1 at sdmmc2: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e targets, initiator \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0 at scsibus1 targ \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e lun 0: \u0026lt;Samsung, 8GME4R, 0000\u0026gt; removable\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0: 7456MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e15269888\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumass0 at uhub0 port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ASMedia AS2115\u0026#34;\u003c/span\u003e rev 2.10/0.01 addr \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumass0: using SCSI over Bulk-Only\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus2 at umass0: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e targets, initiator \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd1 at scsibus2 targ \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e lun 0: \u0026lt;ASMT, 2115, 0\u0026gt; serial.174c1153000000000000\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd1: 122104MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e250069680\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub1 at uhub0 port \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Genesys Logic USB2.0 Hub\u0026#34;\u003c/span\u003e rev 2.00/85.36 addr \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evscsi0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus3 at vscsi0: \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esoftraid0 at root\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003escsibus4 at softraid0: \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e targets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot on sd0a \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e2f18100544c5d963.a\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e swap on sd0b dump on sd0b\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einteldrm0: 1024x768, 32bpp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsdisplay0 at inteldrm0 mux 1: console \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003estd, vt100 emulation\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, using wskbd0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewsdisplay0: screen 1-5 added \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003estd, vt100 emulation\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"hwsensors\"\u003ehw.sensors\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$  sysctl hw.sensors  \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.cpu0.temp0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e43.00 degC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehw.sensors.acpitz0.temp0\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0.00 degC \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ezone temperature\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n",
            "summary": "Aperçu de dmesg sur le mini-pc OVH Over the Box V2A",
            "tags": ["OVH", "Over The Box", "V2A", "dmesg", "sensors"],
            "date_published": "2020-05-14T16:57:10+02:00",
            "date_modified": "2023-04-30T17:05:08+02:00"
        },{
            "id": "urn:uuid:83199337-66a8-85a8-23c4-32183efcc3cc",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/dino/",
            "title": "Dino (client XMPP)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Dino est un client de communication chat moderne et open-source, sous X. Il se concentre sur le fait de fournir une expérience propre et fiable Jabber/XMPP tout en gardant à l\u0026rsquo;esprit votre confidentialité.\nDino est sécurisé par défaut : vos communications sont toujours chiffrées. Une fois que vous avez activé le chiffrement de bout à bout via OMEMO ou OpenPGP, seuls vous et vos correspondants peuvent lire vos messages, pas même un administrateur de serveurs.\nSite officiel : http://dino.im/ Disponible : à partir d\u0026rsquo;OpenBSD 6.7\nInstallation installez le paquet dino.\nConfiguration La première chose que demande Dino est sa configuration. Un clic sur le gros bouton rouge [ Configurer le compte ] permet soit de configurer un nouveau compte XMPP, soit de se connecter à un compte existant.\nUne fenêtre titrée \u0026ldquo;Ajouter un compte\u0026rdquo; s\u0026rsquo;ouvre, et vous demande un JID - un Identifiant Jabber.\nSi vous n\u0026rsquo;avez pas de compte Jabber, cliquez sur le bouton [ Créer un compte ] Si vous avez un compte Jabber, écrivez-le dans le champ JID ; le bouton [ Suivant ] s\u0026rsquo;activera. Cliquez dessus, la fenêtre vous demandera le mot de passe correspondant. Une fois la connexion achevée, la fenêtre vous félicitera avec un message \u0026ldquo;Terminé\u0026rdquo;. Utilisation La fenêtre est très minimaliste. Les menus sont situés dans le haut de la fenêtre sous forme de symbole.\nEn haut à gauche :\n+ : permet de choisir les menus Commencer une conversation et Rejoindre un salon le symbole en forme de trois barres parallèles horizontales est le menu principal et sert à gérer les comptes, les préférences, principalement. En haut à droite :\nl\u0026rsquo;icône en forme de deux personnes : active la fenêtre pour voir les différents membres d\u0026rsquo;un salon ; celle-ci n\u0026rsquo;est visible que sur les salons. l\u0026rsquo;icône de recherche : pour rechercher différents messages dans les différents fils de discussion. et le deuxième symbole de menu en forme de trois barres parallèles : soit donne accès aux détails du salon, soit donne les détails liés à votre interlocuteur. (à suivre)\nDocumentation ⇒ Articles :\nprésentation officielle, et traduction FR. Historique J\u0026rsquo;ai écrit historiquement de manière collaborative cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eDino est un client de communication chat moderne et open-source, sous X.\nIl se concentre sur le fait de fournir une expérience propre et fiable\nJabber/XMPP tout en gardant à l\u0026rsquo;esprit votre confidentialité.\u003c/p\u003e\n\u003cp\u003eDino est sécurisé par défaut : vos communications sont toujours chiffrées.\nUne fois que vous avez activé le chiffrement de bout à bout via OMEMO ou\nOpenPGP, seuls vous et vos correspondants peuvent lire vos messages, pas\nmême un administrateur de serveurs.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite officiel : \u003ca href=\"http://dino.im/\" rel=\"external\"\u003ehttp://dino.im/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDisponible : à partir d\u0026rsquo;OpenBSD 6.7\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003edino\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLa première chose que demande Dino est sa configuration. Un clic sur le\ngros bouton rouge [ Configurer le compte ] permet soit de configurer un\nnouveau compte XMPP, soit de se connecter à un compte existant.\u003c/p\u003e\n\u003cp\u003eUne fenêtre titrée \u0026ldquo;Ajouter un compte\u0026rdquo; s\u0026rsquo;ouvre, et vous demande un\n\u003cabbr title=\"Jabber IDentifiant\"\u003eJID\u003c/abbr\u003e\n - un Identifiant Jabber.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi vous n\u0026rsquo;avez pas de compte Jabber, cliquez sur le bouton\n[ Créer un compte ]\u003c/li\u003e\n\u003cli\u003eSi vous avez un compte Jabber, écrivez-le dans le champ JID ; le\nbouton [ Suivant ] s\u0026rsquo;activera. Cliquez dessus, la fenêtre vous\ndemandera le mot de passe correspondant. Une fois la connexion achevée,\nla fenêtre vous félicitera avec un message \u0026ldquo;Terminé\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eLa fenêtre est très minimaliste. Les menus sont situés dans le haut de\nla fenêtre sous forme de symbole.\u003c/p\u003e\n\u003cp\u003eEn haut à gauche :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e+\u003c/code\u003e : permet de choisir les menus \u003cstrong\u003eCommencer une conversation\u003c/strong\u003e et\n\u003cstrong\u003eRejoindre un salon\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele symbole en forme de trois barres parallèles horizontales est le\nmenu principal et sert à gérer les comptes, les préférences,\nprincipalement.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEn haut à droite :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;icône en forme de deux personnes : active la fenêtre pour voir les\ndifférents membres d\u0026rsquo;un salon ; celle-ci n\u0026rsquo;est visible que sur les\nsalons.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;icône de recherche : pour rechercher différents messages dans les\ndifférents fils de discussion.\u003c/li\u003e\n\u003cli\u003eet le deuxième symbole de menu en forme de trois barres parallèles :\n\u003cul\u003e\n\u003cli\u003esoit donne accès aux détails du salon,\u003c/li\u003e\n\u003cli\u003esoit donne les détails liés à votre interlocuteur.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e(à suivre)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003e⇒ Articles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://dino.im/blog/2020/01/dino-0.1-release/\" rel=\"external\"\u003eprésentation officielle\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003eet \u003ca href=\"https://news.jabberfr.org/2020/01/release-de-dino-0-1/\" rel=\"external\"\u003etraduction FR\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement de manière collaborative cette documentation\nsur le wiki de la communauté  \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le client XMMP, nommé Dino, sous OpenBSD",
            "tags": ["OpenBSD", "Dino", "XMPP"],
            "date_published": "2020-05-13T16:08:31+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:5fcc6bb2-262a-53da-63dd-6a03e26951ef",
            "url": "http://doc.huc.fr.eu.org/fr/web/httpd/relayd-cache-httpd/",
            "title": "Relayd : Mise en cache web pour httpd",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD intègre par défaut dans le système de base, depuis 5.7 :\nun serveur web, nommé httpd - que j\u0026rsquo;ai présenté plus ou moins succinctement ici un serveur relay, nommé relayd\nSite web : https://bsd.plumbing/\nOpenBSD : 6.6, 6.7\nLe problème est que le serveur httpd n\u0026rsquo;est pas capable de gérer la mise en cache de contenu statique.\nNous passons donc le relais au serveur relayd qui lui en est capable - par contre, il le fait de manière globale, çad non spécifique à un domaine en particulier -\nConfiguration Les explications de configuration du serveur httpd ont été abordés sur cet autre article : Relayd : Gestion des entêtes pour httpd (cf : l'exemple de configuration )\nC\u0026rsquo;est exactement le même principe.\nrelayd Le fichier de configuration est /etc/relayd.conf, par défaut. Dans le contexte du protocole http, en lui donnant un nom - le nom importe peu, mais est réutilisé plus tard, dans le contexte des déclarations de relais :\nnous ciblons tous les fichiers contenant normalement du contenu statique, en analysant les requêtes - c\u0026rsquo;est généralement le cas pour les fichiers, tels que : les images (GIF, JPG, PNG, SVG) les fichiers CSS et JS, et les fichiers HTML, et XML (Atom, RSS, etc). nous leur appliquons une politique d\u0026rsquo;étiquetage, par l\u0026rsquo;usage de l\u0026rsquo;option tag. Là, encore le nom donné importe peu pourvu que vous réutilisiez le même dans le cadre de l\u0026rsquo;entête header de réponse. puis nous retournons une entête de réponse Cache-Control ciblant l\u0026rsquo;étiquette. Puis nous appliquons le protocole http déclaré a un relay cible.\nrelayd : exemple ip4 = \u0026#34;public-address-ipv4\u0026#34; http protocol \u0026#34;hw\u0026#34; { match request path \u0026#34;/*.atom\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.css\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.gif\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.html\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.ico\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.jpg\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.js\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.png\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.rss\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.svg\u0026#34; tag \u0026#34;CACHE\u0026#34; match request path \u0026#34;/*.xml\u0026#34; tag \u0026#34;CACHE\u0026#34; match response tagged \u0026#34;CACHE\u0026#34; header set \u0026#34;Cache-Control\u0026#34; value \u0026#34;public, max-age=86400\u0026#34; tcp { nodelay, sack, socket buffer 65536, backlog 100 } pass } relay \u0026#34;www\u0026#34; { listen on $ip4 port 80 protocol hw forward to 127.0.0.1 port 80 } Documentations Manpages httpd(8) , httpd.conf(5) Autres documentations L\u0026rsquo;article de Xavier Cartron @prx : \u0026quot;Optimisation du cache et de la bande passante\u0026quot; ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenBSD\u003c/strong\u003e intègre par défaut dans le système de base, depuis 5.7 :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eun serveur web, nommé \u003cstrong\u003ehttpd\u003c/strong\u003e - que j\u0026rsquo;ai présenté plus ou moins\nsuccinctement \n\u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003eici\u003c/a\u003e\n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eun serveur relay, nommé \u003cstrong\u003erelayd\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSite web : \u003ca href=\"https://bsd.plumbing/\" rel=\"external\"\u003ehttps://bsd.plumbing/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpenBSD : \u003cstrong\u003e6.6, 6.7\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLe problème est que le serveur \u003cstrong\u003ehttpd\u003c/strong\u003e n\u0026rsquo;est pas capable de gérer la\nmise en cache de contenu statique.\u003c/p\u003e\n\u003cp\u003eNous passons donc le relais au serveur \u003cstrong\u003erelayd\u003c/strong\u003e qui lui en est capable -\n\u003cem\u003epar contre, il le fait de manière globale, \u003cabbr title=\"c'est-à-dire\"\u003eçad\u003c/abbr\u003e\n\nnon spécifique à un domaine en particulier\u003c/em\u003e -\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLes explications de configuration du serveur \u003cstrong\u003ehttpd\u003c/strong\u003e ont été abordés\nsur cet autre article : \u003ca class=\"inside\" href=\"/fr/web/httpd/relayd-headers-httpd/#httpd\" title=\"Lien interne vers l\u0026#39;article : 'Relayd : Gestion des entêtes pour httpd'\"\u003eRelayd : Gestion des entêtes pour httpd\u003c/a\u003e \u003cbr\u003e\n\u003cem\u003e(cf : \u003ca class=\"inside\" href=\"/fr/web/httpd/relayd-headers-httpd/#httpd-exemple\" title=\"Lien interne vers l\u0026#39;article : 'Relayd : Gestion des entêtes pour httpd'\"\u003el'exemple de configuration\u003c/a\u003e\n)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est exactement le même principe.\u003c/p\u003e\n\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration est \u003ccode\u003e/etc/relayd.conf\u003c/code\u003e, par défaut.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans le contexte du protocole http, en lui donnant un nom - \u003cem\u003ele nom importe\npeu, mais est réutilisé plus tard, dans le contexte des déclarations\nde relais\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003enous ciblons tous les fichiers contenant normalement du contenu statique,\nen analysant les requêtes - \u003cbr\u003e\nc\u0026rsquo;est généralement le cas pour les fichiers, tels que :\n\u003cul\u003e\n\u003cli\u003eles images (GIF, JPG, PNG, SVG)\u003c/li\u003e\n\u003cli\u003eles fichiers CSS et JS,\u003c/li\u003e\n\u003cli\u003eet les fichiers HTML, et XML (Atom, RSS, etc).\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003enous leur appliquons une politique d\u0026rsquo;étiquetage, par l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003etag\u003c/code\u003e.\n\u003cem\u003eLà, encore le nom donné importe peu pourvu que vous réutilisiez le même\ndans le cadre de l\u0026rsquo;entête \u003ccode\u003eheader\u003c/code\u003e de réponse.\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003epuis nous retournons une entête de réponse \u003ccode\u003eCache-Control\u003c/code\u003e ciblant l\u0026rsquo;étiquette.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis nous appliquons le protocole http déclaré a un relay cible.\u003c/p\u003e\n\u003ch4 id=\"relayd--exemple\"\u003erelayd : exemple\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eip4 = \u0026#34;public-address-ipv4\u0026#34;\n\nhttp protocol \u0026#34;hw\u0026#34; {\n\n    match request path \u0026#34;/*.atom\u0026#34; tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.css\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.gif\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.html\u0026#34; tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.ico\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.jpg\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.js\u0026#34;   tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.png\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.rss\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.svg\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n    match request path \u0026#34;/*.xml\u0026#34;  tag \u0026#34;CACHE\u0026#34;\n\n    match response tagged \u0026#34;CACHE\u0026#34; header set \u0026#34;Cache-Control\u0026#34; value \u0026#34;public, max-age=86400\u0026#34;\n\n    tcp { nodelay, sack, socket buffer 65536, backlog 100 }\n\n    pass\n\n}\n\nrelay \u0026#34;www\u0026#34; {\n    listen on $ip4 port 80\n    protocol hw\n    forward to 127.0.0.1 port 80\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.8\" title=\"Page du Manuel OpenBSD pour : httpd\"\u003ehttpd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.conf.5\" title=\"Page du Manuel OpenBSD pour : httpd.conf\"\u003ehttpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"autres-documentations\"\u003eAutres documentations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cdel\u003eL\u0026rsquo;article de Xavier Cartron @prx : \u003cstrong\u003e\u0026quot;\u003ca href=\"https://ybad.name/ah/doku.php/4-httpd/relayd#optimisation-du-cache-et-de-la-bande-passante\" rel=\"external\"\u003eOptimisation du cache et de la bande passante\u003c/a\u003e\u0026quot;\u003c/strong\u003e\u003c/del\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment mettre en place du cache de contenu statique avec httpd \u0026 relayd, serveurs natifs sous OpenBSD",
            "tags": ["relayd", "Cache", "httpd", "HTTP", "OpenBSD"],
            "date_published": "2020-05-07T16:49:36+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:4ac2b6ae-2cc2-f212-f092-b915baacde23",
            "url": "http://doc.huc.fr.eu.org/fr/web/httpd/relayd-headers-httpd/",
            "title": "Relayd : Gestion des entêtes pour httpd",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD intègre par défaut dans le système de base, depuis 5.7 :\nun serveur web, nommé httpd - que j\u0026rsquo;ai présenté plus ou moins succinctement ici un serveur relay, nommé relayd\nSite web : https://bsd.plumbing/\nOpenBSD : 6.6, 6.7\nLe problème est que le serveur httpd n\u0026rsquo;est pas capable de gérer les entêtes HTTP (en anglais : header ), et que l\u0026rsquo;auteur ne le veut pas.\nNous passons donc le relais au serveur relayd qui lui est capable de les gérer - par contre, il le fait de manière globale, çad non spécifique à un domaine en particulier -\nConfiguration Étant donné que relayd est en frontal d\u0026rsquo;httpd, nous allons modifier la configuration des deux fichiers de configuration relatifs.\nrelayd va recevoir tout le traffic à destination des ports web, 80, voire 443, si TLS et le rediriger en local sur les ports correspondant. Bien sûr, il est possible d\u0026rsquo;agir sur chacune des piles réseaux des protocoles IPv4 et IPv6. quant à lui, httpd ne fera qu\u0026rsquo;interroger la boucle locale sur les ports redirigés. Ne pas oublier de redémarrer les services correspondants après modifier de la configuration !\nhttpd Le fichier de configuration est /etc/httpd.conf, par défaut. Dans le contexte server, il y a deux, trois modifications importantes à faire :\nl\u0026rsquo;option d\u0026rsquo;écoute listen on doit écouter localhost - cf : listen on l\u0026rsquo;option de journalisation log est à modifier pour que le style soit paramétré sur forwarder - cf : style InfoSachez que certains écrivent une redirection vers le port 8080, au lieu de 80. Bien-sûr, cela fonctionne ; c\u0026rsquo;est à votre convenance. Seule l\u0026rsquo;entête HSTS est géré différement :\nhttpd: HSTS L\u0026rsquo;entête HSTS se modifie, non pas en déclarant une entête, comme pour les autres, mais en utilisant tout simplement l\u0026rsquo;option hsts (cf : hsts).\nElle se gère bien sûr dans le contexte de protocole HTTPS , via TLS .\nPour l\u0026rsquo;instant, nous n\u0026rsquo;aborderons pas ce sujet ; d\u0026rsquo;autant que je fais les présentations dans mon article de présentation d'httpd .\nhttpd: exemple server \u0026#34;domain.tld\u0026#34; { listen on 127.0.0.1 port 80 listen on ::1 port 80 # enable hsts only if you use TLS for HTTPS hsts { max-age 63072000 preload subdomains } location \u0026#34;/.well-known/acme-challenge/*\u0026#34; { root \u0026#34;/acme\u0026#34; request strip 2 } location \u0026#34;/\u0026#34; { directory index index.html } log { access \u0026#34;domain.tld/access.log\u0026#34; error \u0026#34;domain.tld/errors.log\u0026#34; style forwarded } root \u0026#34;/htdocs/domain.tld/www\u0026#34; } httpd: log Voici un exemple de log :\ndomain.tld 127.0.0.1 - - [06/May/2020:04:08:51 +0200] \u0026#34;GET / HTTP/1.1\u0026#34; 200 0 \u0026#34;\u0026#34; \u0026#34;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\u0026#34; 66.249.79.202 - domain.tld 127.0.0.1 - - [06/May/2020:09:48:36 +0200] \u0026#34;GET /robots.txt HTTP/1.1\u0026#34; 200 0 \u0026#34;\u0026#34; \u0026#34;Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)\u0026#34; 5.196.87.174 - domain.tld 127.0.0.1 - - [06/May/2020:10:29:29 +0200] \u0026#34;GET / HTTP/1.1\u0026#34; 200 0 \u0026#34;\u0026#34; \u0026#34;Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)\u0026#34; 54.36.148.31 - Nous remarquons bien que l\u0026rsquo;adresse IP du client est précisé en fin de ligne. C\u0026rsquo;est ce que permet le paramètre de style de journal forwarder.\nrelayd Le fichier de configuration est /etc/relayd.conf, par défaut. Dans les faits :\nNous déclarons un protocole http en lui donnant un nom - le nom importe peu, mais est réutilisé plus tard, dans le contexte des déclarations de relais. les filtres de correspondance match pour créer les réponses d\u0026rsquo;entêtes header. les deux premières déclarations sont nécessaires pour capturer les valeurs serveurs suivantes afin de les rediriger correctement : $SERVER_ADDR:$SERVER_PORT pour l\u0026rsquo;option X-Forwarded-By, $REMOTE_ADDR pour l\u0026rsquo;option X-Forwarded-For. puis nous relaierons en paramétrant, dans les déclarations relay correspondantes : l\u0026rsquo;option d\u0026rsquo;écoute listen, sur l\u0026rsquo;adresse IP public et le port www et, nous ciblons le protocole http nommé afin que les règles sur les entêtes soient appliquées dans chacun des contextes de relais, et, redirigerons à l\u0026rsquo;aide de l\u0026rsquo;option forward vers l\u0026rsquo;interface de bouclage local, et le port désiré, correspondant à celui sur lequel écoute httpd. relayd: Httpoxy Certains des plus attentifs remarqueront dans l\u0026rsquo;exemple ci-dessous la déclaration de l\u0026rsquo;entête suivante : \\\nmatch request header remove \u0026quot;Proxy\u0026quot;\nCelle-ci est utile pour lutter contre la faille Httpoxy qui affecte les applications CGI, PHP, dans le contexte d\u0026rsquo;une connexion HTTP .\nC\u0026rsquo;est reconnue comme étant la meilleure façon de bloquer cette faille. L\u0026rsquo;autre angle de protection efficace est de fournir des connexions HTTPS , qui apparemment ne sont pas assujetties à cette faille.\nrelayd: exemple ip4 = \u0026#34;ipv4_public_address\u0026#34; ip6 = \u0026#34;ipv6_public_address\u0026#34; http protocol \u0026#34;hw\u0026#34; { match request header set \u0026#34;X-Forwarded-By\u0026#34; value \u0026#34;$SERVER_ADDR:$SERVER_PORT\u0026#34; match request header set \u0026#34;X-Forwarded-For\u0026#34; value \u0026#34;$REMOTE_ADDR\u0026#34; match request header remove \u0026#34;Proxy\u0026#34; match response header set \u0026#34;Cache-Control\u0026#34; value \u0026#34;max-age=1814400\u0026#34; match response header set \u0026#34;Content-Security-Policy\u0026#34; value \u0026#34;upgrade-insecure-requests; default-src https: \u0026#39;self\u0026#39;\u0026#34; match response header set \u0026#34;Permissions-Policy\u0026#34; value \u0026#34;fullscreen=(), geolocation=(), microphone()\u0026#34; match response header set \u0026#34;Frame-Options\u0026#34; value \u0026#34;SAMEORIGIN\u0026#34; match response header set \u0026#34;Referrer-Policy\u0026#34; value \u0026#34;strict-origin\u0026#34; match response header set \u0026#34;Server\u0026#34; value \u0026#34;OpenBSD Relayd+httpd\u0026#34; match response header set \u0026#34;X-Content-Type-Options\u0026#34; value \u0026#34;nosniff\u0026#34; match response header set \u0026#34;X-Download-Options\u0026#34; value \u0026#34;noopen\u0026#34; match response header set \u0026#34;X-Frame-Options\u0026#34; value \u0026#34;SAMEORIGIN\u0026#34; match response header set \u0026#34;X-Powered-By\u0026#34; value \u0026#34;!\u0026#34; match response header set \u0026#34;X-Robots-Tag\u0026#34; value \u0026#34;index, nofollow\u0026#34; match response header set \u0026#34;X-Xss-Protection\u0026#34; value \u0026#34;1; mode=block\u0026#34; tcp { nodelay, sack, socket buffer 65536, backlog 100 } pass } relay \u0026#34;www\u0026#34; { listen on $ip4 port 80 protocol hw forward to 127.0.0.1 port 80 } relay \u0026#34;www6\u0026#34; { listen on $ip6 port 80 protocol hw forward to ::1 port 80 } Documentations Manpages httpd(8) , httpd.conf(5) relayd(8) , relayd.conf(5) , relayctl(8) Autres documentations Pour en savoir plus sur les entêtes : Content-Security-Policy : CSP : Content Security Policy (header) Cross-origin Resource Sharing : CORS : Cross-origin Resource Sharing (header) Frame-Options : X-Frame-Options (header) HSTS : HSTS : HTTP Strict Transport Security (header) Referrer : HTTP : Referrer (header) X-Content-Type-Options : X-Content-Type-Options (header) X-Frame-Options : X-Frame-Options (header) X-Xss-Protection : X-XSS-Protection (header) ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenBSD\u003c/strong\u003e intègre par défaut dans le système de base, depuis 5.7 :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eun serveur web, nommé \u003cstrong\u003ehttpd\u003c/strong\u003e - que j\u0026rsquo;ai présenté plus ou moins\nsuccinctement \n\u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003eici\u003c/a\u003e\n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eun serveur relay, nommé \u003cstrong\u003erelayd\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSite web : \u003ca href=\"https://bsd.plumbing/\" rel=\"external\"\u003ehttps://bsd.plumbing/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpenBSD : \u003cstrong\u003e6.6, 6.7\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eLe problème est que le serveur \u003cstrong\u003ehttpd\u003c/strong\u003e n\u0026rsquo;est pas capable de gérer les\nentêtes \u003cabbr title=\"HyperText Transfert Protocol\"\u003eHTTP\u003c/abbr\u003e\n \u003cem\u003e(en anglais : \u003ca class=\"tag\" href=\"/fr/tags/header\"\u003eheader\u003c/a\u003e\n)\u003c/em\u003e,\net que \u003ca href=\"https://marc.info/?l=openbsd-misc\u0026amp;m=142407262812306\u0026amp;w=2\" rel=\"external\"\u003el\u0026rsquo;auteur ne le veut pas\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eNous passons donc le relais au serveur \u003cstrong\u003erelayd\u003c/strong\u003e qui lui est capable de\nles gérer - \u003cem\u003epar contre, il le fait de manière globale, \u003cabbr title=\"c'est-à-dire\"\u003eçad\u003c/abbr\u003e\n\nnon spécifique à un domaine en particulier\u003c/em\u003e -\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eÉtant donné que \u003cstrong\u003erelayd\u003c/strong\u003e est en frontal d\u0026rsquo;\u003cstrong\u003ehttpd\u003c/strong\u003e, nous allons modifier\nla configuration des deux fichiers de configuration relatifs.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003erelayd\u003c/strong\u003e va recevoir tout le traffic à destination des ports web, 80,\nvoire 443, si \u003cabbr title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n et le rediriger\nen local sur les ports correspondant. Bien sûr, il est possible d\u0026rsquo;agir\nsur chacune des piles réseaux des protocoles IPv4 et IPv6.\u003c/li\u003e\n\u003cli\u003equant à lui, \u003cstrong\u003ehttpd\u003c/strong\u003e ne fera qu\u0026rsquo;interroger la boucle locale sur les\nports redirigés.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNe pas oublier de redémarrer les services correspondants après modifier\nde la configuration !\u003c/p\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration est \u003ccode\u003e/etc/httpd.conf\u003c/code\u003e, par défaut.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans le contexte \u003ccode\u003eserver\u003c/code\u003e, il y a deux, trois modifications importantes à\nfaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;option d\u0026rsquo;écoute \u003ccode\u003elisten on\u003c/code\u003e doit écouter localhost - \u003cem\u003ecf : \u003ca href=\"https://man.openbsd.org/httpd.conf#listen\" rel=\"external\"\u003elisten on\u003c/a\u003e\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option de journalisation \u003ccode\u003elog\u003c/code\u003e est à modifier pour que le \u003ccode\u003estyle\u003c/code\u003e soit\nparamétré sur \u003ccode\u003eforwarder\u003c/code\u003e - \u003cem\u003ecf : \u003ca href=\"https://man.openbsd.org/httpd.conf#style\" rel=\"external\"\u003estyle\u003c/a\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSachez que certains écrivent une redirection vers le port 8080, au lieu de 80.\nBien-sûr, cela fonctionne ; c\u0026rsquo;est à votre convenance.\u003c/div\u003e\n\n\u003cp\u003eSeule l\u0026rsquo;entête \u003cabbr title=\"HTTP Strict Transport Security\"\u003eHSTS\u003c/abbr\u003e\n est géré différement :\u003c/p\u003e\n\u003ch4 id=\"httpd-hsts\"\u003ehttpd: HSTS\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;entête \u003cstrong\u003eHSTS\u003c/strong\u003e se modifie, non pas en déclarant une entête, comme pour les\nautres, mais en utilisant tout simplement l\u0026rsquo;option \u003ccode\u003ehsts\u003c/code\u003e \u003cem\u003e(cf : \u003ca href=\"https://man.openbsd.org/httpd.conf#hsts\" rel=\"external\"\u003ehsts\u003c/a\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eElle se gère bien sûr dans le contexte de protocole\n\u003cabbr title=\"HyperText Transport Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n,\nvia \u003cabbr title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePour l\u0026rsquo;instant, nous n\u0026rsquo;aborderons pas ce sujet ; d\u0026rsquo;autant que je fais les\nprésentations dans mon article de \u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/#tls\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003eprésentation d'httpd\u003c/a\u003e\n.\u003c/em\u003e\u003c/p\u003e\n\u003ch4 id=\"httpd-exemple\"\u003ehttpd: exemple\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eserver \u0026#34;domain.tld\u0026#34; {\n\n    listen on 127.0.0.1 port 80\n    listen on ::1 port 80\n\n    # enable hsts only if you use TLS for HTTPS\n    hsts {\n        max-age 63072000\n        preload\n        subdomains\n    }\n\n    location \u0026#34;/.well-known/acme-challenge/*\u0026#34; {\n        root \u0026#34;/acme\u0026#34;\n        request strip 2\n    }\n\n    location \u0026#34;/\u0026#34; {\n        directory index index.html\n    }\n\n    log {\n        access \u0026#34;domain.tld/access.log\u0026#34;\n        error  \u0026#34;domain.tld/errors.log\u0026#34;\n        style forwarded\n    }\n\n    root \u0026#34;/htdocs/domain.tld/www\u0026#34;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch4 id=\"httpd-log\"\u003ehttpd: log\u003c/h4\u003e\n\u003cp\u003eVoici un exemple de log :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003edomain.tld 127.0.0.1 - - [06/May/2020:04:08:51 +0200] \u0026#34;GET / HTTP/1.1\u0026#34; 200 0 \u0026#34;\u0026#34; \u0026#34;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)\u0026#34; 66.249.79.202 -\ndomain.tld 127.0.0.1 - - [06/May/2020:09:48:36 +0200] \u0026#34;GET /robots.txt HTTP/1.1\u0026#34; 200 0 \u0026#34;\u0026#34; \u0026#34;Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)\u0026#34; 5.196.87.174 -\ndomain.tld 127.0.0.1 - - [06/May/2020:10:29:29 +0200] \u0026#34;GET / HTTP/1.1\u0026#34; 200 0 \u0026#34;\u0026#34; \u0026#34;Mozilla/5.0 (compatible; AhrefsBot/6.1; +http://ahrefs.com/robot/)\u0026#34; 54.36.148.31 -\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNous remarquons bien que l\u0026rsquo;adresse IP du client est précisé en fin de ligne. \u003cbr\u003e\nC\u0026rsquo;est ce que permet le paramètre de style de journal \u003ccode\u003eforwarder\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"relayd\"\u003erelayd\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration est \u003ccode\u003e/etc/relayd.conf\u003c/code\u003e, par défaut.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans les faits :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNous déclarons un protocole \u003cstrong\u003ehttp\u003c/strong\u003e en lui donnant un nom - \u003cem\u003ele nom importe\npeu, mais est réutilisé plus tard, dans le contexte des déclarations\nde relais\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eles filtres de correspondance \u003ccode\u003ematch\u003c/code\u003e pour créer les réponses d\u0026rsquo;entêtes \u003ccode\u003eheader\u003c/code\u003e.\n\u003cul\u003e\n\u003cli\u003eles deux premières déclarations sont nécessaires pour capturer les\nvaleurs serveurs suivantes afin de les rediriger correctement :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e$SERVER_ADDR:$SERVER_PORT\u003c/code\u003e pour l\u0026rsquo;option \u003ccode\u003eX-Forwarded-By\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$REMOTE_ADDR\u003c/code\u003e pour l\u0026rsquo;option \u003ccode\u003eX-Forwarded-For\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003epuis nous relaierons en paramétrant, dans les déclarations \u003ccode\u003erelay\u003c/code\u003e correspondantes :\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;option d\u0026rsquo;écoute \u003ccode\u003elisten\u003c/code\u003e, sur l\u0026rsquo;adresse IP public et le port www et,\u003c/li\u003e\n\u003cli\u003enous ciblons le protocole \u003cstrong\u003ehttp\u003c/strong\u003e nommé afin que les règles sur les\nentêtes soient appliquées dans chacun des contextes de relais, et,\u003c/li\u003e\n\u003cli\u003eredirigerons à l\u0026rsquo;aide de l\u0026rsquo;option \u003ccode\u003eforward\u003c/code\u003e vers l\u0026rsquo;interface de bouclage\nlocal, et le port désiré, correspondant à celui sur lequel écoute\n\u003cstrong\u003ehttpd\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"relayd-httpoxy\"\u003erelayd: Httpoxy\u003c/h4\u003e\n\u003cp\u003eCertains des plus attentifs remarqueront dans l\u0026rsquo;exemple ci-dessous la déclaration\nde l\u0026rsquo;entête suivante : \\\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ematch request header remove \u0026quot;Proxy\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCelle-ci est utile pour lutter contre la faille \u003cstrong\u003e\u003ca href=\"https://httpoxy.org/\" rel=\"external\"\u003eHttpoxy\u003c/a\u003e\u003c/strong\u003e qui affecte\nles applications CGI, PHP, dans le contexte d\u0026rsquo;une connexion \u003cabbr title=\"HyperText Transfert Protocol\"\u003eHTTP\u003c/abbr\u003e\n.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est reconnue comme étant la meilleure façon de bloquer cette faille. \u003cbr\u003e\nL\u0026rsquo;autre angle de protection efficace est de fournir des connexions \u003cabbr title=\"HyperText Transfert Protocol Secure\"\u003eHTTPS\u003c/abbr\u003e\n,\nqui apparemment ne sont pas assujetties à cette faille.\u003c/p\u003e\n\u003ch4 id=\"relayd-exemple\"\u003erelayd: exemple\u003c/h4\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eip4 = \u0026#34;ipv4_public_address\u0026#34;\nip6 = \u0026#34;ipv6_public_address\u0026#34;\n\nhttp protocol \u0026#34;hw\u0026#34; {\n    match request header set \u0026#34;X-Forwarded-By\u0026#34;   value \u0026#34;$SERVER_ADDR:$SERVER_PORT\u0026#34;\n    match request header set \u0026#34;X-Forwarded-For\u0026#34;  value \u0026#34;$REMOTE_ADDR\u0026#34;\n\n    match request header remove \u0026#34;Proxy\u0026#34;\n\n    match response header set \u0026#34;Cache-Control\u0026#34;           value \u0026#34;max-age=1814400\u0026#34;\n    match response header set \u0026#34;Content-Security-Policy\u0026#34; value \u0026#34;upgrade-insecure-requests; default-src https: \u0026#39;self\u0026#39;\u0026#34;\n    match response header set \u0026#34;Permissions-Policy\u0026#34;      value \u0026#34;fullscreen=(), geolocation=(), microphone()\u0026#34;\n    match response header set \u0026#34;Frame-Options\u0026#34;           value \u0026#34;SAMEORIGIN\u0026#34;\n    match response header set \u0026#34;Referrer-Policy\u0026#34;         value \u0026#34;strict-origin\u0026#34;\n    match response header set \u0026#34;Server\u0026#34;                  value \u0026#34;OpenBSD Relayd+httpd\u0026#34;\n\n    match response header set \u0026#34;X-Content-Type-Options\u0026#34; value \u0026#34;nosniff\u0026#34;\n    match response header set \u0026#34;X-Download-Options\u0026#34;     value \u0026#34;noopen\u0026#34;\n    match response header set \u0026#34;X-Frame-Options\u0026#34;        value \u0026#34;SAMEORIGIN\u0026#34;\n    match response header set \u0026#34;X-Powered-By\u0026#34;           value \u0026#34;!\u0026#34;\n    match response header set \u0026#34;X-Robots-Tag\u0026#34;           value \u0026#34;index, nofollow\u0026#34;\n    match response header set \u0026#34;X-Xss-Protection\u0026#34;       value \u0026#34;1; mode=block\u0026#34;\n\n    tcp { nodelay, sack, socket buffer 65536, backlog 100 }\n\n    pass\n}\n\nrelay \u0026#34;www\u0026#34; {\n    listen on $ip4 port 80\n    protocol hw\n    forward to 127.0.0.1 port 80\n}\n\nrelay \u0026#34;www6\u0026#34; {\n    listen on $ip6 port 80\n    protocol hw\n    forward to ::1 port 80\n}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.8\" title=\"Page du Manuel OpenBSD pour : httpd\"\u003ehttpd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.conf.5\" title=\"Page du Manuel OpenBSD pour : httpd.conf\"\u003ehttpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.conf.5\" title=\"Page du Manuel OpenBSD pour : relayd.conf\"\u003erelayd.conf(5)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayctl.8\" title=\"Page du Manuel OpenBSD pour : relayctl\"\u003erelayctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"autres-documentations\"\u003eAutres documentations\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ePour en savoir plus sur les entêtes :\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eContent-Security-Policy\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/http/csp/\" title=\"Lien interne vers l\u0026#39;article : 'CSP : Content Security Policy (header)'\"\u003eCSP : Content Security Policy (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eCross-origin Resource Sharing\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/http/cors/\" title=\"Lien interne vers l\u0026#39;article : 'CORS : Cross-origin Resource Sharing (header)'\"\u003eCORS : Cross-origin Resource Sharing (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFrame-Options\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/http/x-frame-options/\" title=\"Lien interne vers l\u0026#39;article : 'X-Frame-Options (header)'\"\u003eX-Frame-Options (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHSTS\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/ssl/hsts/\" title=\"Lien interne vers l\u0026#39;article : 'HSTS : HTTP Strict Transport Security (header)'\"\u003eHSTS : HTTP Strict Transport Security (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReferrer\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/http/referrer/\" title=\"Lien interne vers l\u0026#39;article : 'HTTP : Referrer (header)'\"\u003eHTTP : Referrer (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eX-Content-Type-Options\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/http/x-content-type-options/\" title=\"Lien interne vers l\u0026#39;article : 'X-Content-Type-Options (header)'\"\u003eX-Content-Type-Options (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eX-Frame-Options\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/http/x-frame-options/\" title=\"Lien interne vers l\u0026#39;article : 'X-Frame-Options (header)'\"\u003eX-Frame-Options (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eX-Xss-Protection\u003c/strong\u003e : \n\u003ca class=\"inside\" href=\"/fr/web/http/x-xss-protection/\" title=\"Lien interne vers l\u0026#39;article : 'X-XSS-Protection (header)'\"\u003eX-XSS-Protection (header)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment gérer les entêtes HTTP avec le couple serveur relay+web, httpd \u0026 relayd, serveurs natifs sous OpenBSD",
            "tags": ["relayd", "Header", "httpd", "HTTP", "OpenBSD"],
            "date_published": "2020-05-06T15:00:23+02:00",
            "date_modified": "2020-05-07T18:20:36+02:00"
        },{
            "id": "urn:uuid:02b7463e-a296-2a32-21e5-d00c5c64100e",
            "url": "http://doc.huc.fr.eu.org/fr/sys/devuan/opensmtpd-client-auth/",
            "title": "Devuan : Opensmtpd Client Auth",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenSMTPD est une libre implémentation du protocole SMTP tel que défini dans la RFC 5321 , avec quelques extensions standards additionnels. Il permet à des machines ordinaire d\u0026rsquo;échanger des mails avec d\u0026rsquo;autres systèmes \u0026ldquo;parlant\u0026rdquo; le protocole SMTP .\nOpenSMTPD fait partie du système de base du système d\u0026rsquo;exploitation OpenBSD. Il a été \u0026ldquo;porté\u0026rdquo; sur d\u0026rsquo;autres OS, tel Devuan.\nInformations :\nSite web : https://www.opensmtpd.org Q : Pourquoi utiliser OpenSMTPD ?\nParce qu\u0026rsquo;OpenSMTPD est :\nfacile à configurer : un seul fichier texte ! reconnu comme étant fiable ET sécurisé. Fonctionnel et testé sur :\nDebian Sid, Devuan Ceres Linux Mint Installation apt install opensmtpd\nle journal se trouve être : /var/log/mail.log Configuration Le fichier de configuration principal est : /etc/smtpd.conf Pour envoyer un mail par SMTP à un service de mails nécessitant une identification, il est nécessaire de créer dans un premier temps, un fichier secrets avec les droits adéquats sur votre système, ensuite il nous reste à configurer le fichier smtpd.conf.\nFichier secrets Création du fichier de secrets :\n:$ mkdir -p .config/mail :$ touch .config/mail/secrets :$ chmod 0640 .config/mail/secrets Ensuite, il est nécessaire de le remplir de telle manière : identifiant username:password\nn'écrivez pas TEXTUELLEMENT cette information , remplacez-là par les informations ci-dessous :\noù identifiant est l\u0026rsquo;identifiant que vous choisissez soigneusement, et qui vous servira plus tard dans la configuration du fichier smtpd.conf ; username est votre identifiant de connexion mail au service mail de votre fournisseur - généralement votre adresse mail - ; password étant le mot de passe lié à votre identification mail. AttentionIl est possible de nommer autrement ce fichier secrets, et de le mettre ailleurs dans votre système de fichier ; comprenez-le principe et modifier en conséquence.\nDe même, je vous encourage fortement à ne mettre QUE des droits 0440 sur le fichier - par défaut : 0640.\nMême si l\u0026rsquo;accès au fichier par smtpd peut sans soucis être fait avec vos droits personnels $USER:$USER, il est préférable de mettre à minima les droits du groupe opensmtpd.\n:# chown $USER:opensmtpd .config/mail/secrets :$ chmod 0440 .config/mail/secrets Note à-propos d\u0026rsquo;un home chiffré : veillez absolument à copier/déplacer ce fichier vers /etc/mail/, autrement le service correspondant ne démarrera pas, puisqu\u0026rsquo;il ne peut/pourra pas avoir accès au fichier à ce moment-là !\nFichier smtpd.conf Maintenant modifions le fichier /etc/smtpd.conf\n# $OpenBSD: smtpd.conf,v 1.10 2018/05/24 11:40:17 gilles Exp $ # This is the smtpd server system-wide configuration file. # See smtpd.conf(5) for more information. table aliases file:/etc/aliases table secrets file:/home/votre-id/.config/mail/secrets queue compression # To accept external mail, replace with: listen on all listen on localhost action \u0026#34;local\u0026#34; maildir alias \u0026lt;aliases\u0026gt; action \u0026#34;relay\u0026#34; relay host smtp+tls://identifiant@serveur:587 auth \u0026lt;secrets\u0026gt; mail-from \u0026#34;@your-domain.tld\u0026#34; # Uncomment the following to accept external mail for domain \u0026#34;example.org\u0026#34; # # match from any for domain \u0026#34;example.org\u0026#34; action \u0026#34;local\u0026#34; match for local action \u0026#34;local\u0026#34; match from local for any action \u0026#34;relay\u0026#34; Explications\nPar rapport à la version originale, nous avons donc rajouté :\nla ligne table secrets qui appelle le fichier .config/mail/secrets - ou son équivalent, si vous l\u0026rsquo;avez personnalisé…\nla ligne action relay qui nous permet de définir l\u0026rsquo;action nécessaire vers l\u0026rsquo;hôte relais par lequel nous enverrons les mails…\nREMARQUEZ l\u0026rsquo;écriture identifiant@serveur :\nc\u0026rsquo;est justement là qu\u0026rsquo;il faut remplacer la chaîne identifiant par celle que vous avez créée dans votre fichier secrets. quant à la chaîne serveur, il faut la remplacer par l\u0026rsquo;adresse du serveur de mail, par exemple : mail.gandi.net`. la chaîne smtp+tls est le protocol que nous utilisons pour nous connecter au service de l\u0026rsquo;hôte mail relais… il est bien sûr possible d\u0026rsquo;utiliser les autres protocoles, tel que :\nlmtp pour se connecter avec une session LMTP .\nsmtp pour essayer de se connecter avec une session STARTTLS si possible\nsmtp+tls pour obliger une connexion par le biais d\u0026rsquo;une session STARTTLS .\nsmtp+notls pour se connecter \u0026ldquo;en clair\u0026rdquo;, sans chiffrement\nsmtps pour se connecter en forçant la connexion TLS port par défaut : 465. si rien n\u0026rsquo;est spécifié, alors la connexion se fera sur le port 25.\nla chaîne auth permet de spécifier la table secrets fournissant les données d\u0026rsquo;identification mail nécessaires.\nla chaîne mail-from nous permet de spécifier le nom de domaine - ce qui permet d\u0026rsquo;éviter l\u0026rsquo;erreur Sender address rejected: Domain not found ; il faut bien sûr que ce domaine vous appartienne…\nla ligne match … action \u0026quot;relay\u0026quot; est l\u0026rsquo;action qui sera déclenchée lors de l\u0026rsquo;envoi de mails à l\u0026rsquo;extérieur !\nGestion des alias Un mot sur la gestion des alias système !\nIl est intéressant de gérer l\u0026rsquo;alias relatif à votre compte root voire celui de votre utilisateur principal…\nÉditez le fichier /etc/aliases, avec des droits administrateurs. Vers la fin du fichier, modifiez root en lui indiquant vers quelle adresse mail vous désirez que les messages systèmes adressés au compte root vous soit envoyés !\nFaites de même pour votre utilisateur système ;)\nN\u0026rsquo;oubliez pas de recharger la base des aliases, grâce à l\u0026rsquo;usage de la commande newaliases !\nUtilisation AttentionAvant de redémarrer le service opensmtpd pour qu\u0026rsquo;il prenne en compte les modifications faites, il nous faut tester l\u0026rsquo;écriture de la configuration : :# smtpd -n\nqui devrait réponde par : configuration OK informant ainsi que tout va bien…\nSinon, rééditez le fichier de configuration à la ligne indiquée en premier ; c\u0026rsquo;est d\u0026rsquo;elle que vient l\u0026rsquo;erreur principale !\nIl est nécessaire de redémarrer le service : # service opensmtpd restart, ou # /etc/init.d/opensmtpd restart - si vous utilisez openrc en tant que gestionnaire de service !\nEnvois InfoL\u0026rsquo;outil mail fait partie du paquet mailutils ! Soit :\necho \u0026quot;Test d'envois de mail on $(hostname); date: $(date)\u0026quot; | mail -s \u0026quot;Test de mail\u0026quot; adresse_mail_à_qui_envoyer ou, echo \u0026quot;Test d'envois de mail on $(hostname); date: $(date)\u0026quot; | mail -s \u0026quot;Test de mail\u0026quot; root Dans un cas, comme dans l\u0026rsquo;autre, le journal vous indiquera l\u0026rsquo;équivalent, en cas de réussite, d\u0026rsquo;un tel message :\n(…) Apr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp connected address=local host=*** Apr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp message msgid=85868a25 size=474 nrcpt=1 proto=ESMTP Apr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp envelope evpid=85868a25fcb1569a from=\u0026lt;my-id@***\u0026gt; to=\u0026lt;my-id@***\u0026gt; Apr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp disconnected reason=quit Apr 27 09:16:51 pc-z smtpd[1718]: 09cca27892fa38ea mta delivery evpid=85868a25fcb1569a from=\u0026lt;my-id@huc.fr.eu.org\u0026gt; to=\u0026lt;email@nom-de-domaine.tld\u0026gt; rcpt=\u0026lt;my-id@***\u0026gt; source=\u0026#34;192.168.47.47\u0026#34; relay=\u0026#34;80.67.160.70 (lautre.net)\u0026#34; delay=4s result=\u0026#34;Ok\u0026#34; stat=\u0026#34;250 2.0.0 Ok: queued as 53C92112839\u0026#34; Apr 27 09:17:02 pc-z smtpd[1718]: 09cca27892fa38ea mta disconnected reason=quit messages=2 (…) À partir de maintenant, vous pourrez envoyer depuis votre console ou vos scripts shell des mails avec authentification SMTP !\nErreurs Retrouvez les différentes erreurs possibles sur mon article OpenBSD : Configurer smtpd.conf pour l\u0026#39;authentification (depuis OpenBSD ≥ 6.4)\nDocumentations Le protocol SMTP est défini par la RFC 5321 :\nRFC 5321 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT Manpages smtpd.conf(5) Wikipédia Local_Mail_Transfer_Protocol WP ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenSMTPD\u003c/strong\u003e est une libre implémentation du protocole SMTP tel que défini dans\nla \u003ca href=\"https://www.rfc-editor.org/info/rfc5321\" title=\"RFC Editor : Information à-propos de la RFC 5321\"\u003eRFC 5321\u003c/a\u003e\n, avec quelques extensions standards additionnels. \u003cbr\u003e\nIl permet à des machines ordinaire d\u0026rsquo;échanger des mails avec d\u0026rsquo;autres systèmes\n\u0026ldquo;parlant\u0026rdquo; le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Mail Transfer Protocol\"\u003eSMTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOpenSMTPD\u003c/strong\u003e fait partie du système de base du système d\u0026rsquo;exploitation\nOpenBSD. Il a été \u0026ldquo;porté\u0026rdquo; sur d\u0026rsquo;autres OS, tel Devuan.\u003c/p\u003e\n\u003cp\u003eInformations :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://www.opensmtpd.org\" rel=\"external\"\u003ehttps://www.opensmtpd.org\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cabbr title=\"Question\"\u003eQ\u003c/abbr\u003e\n : \u003cstrong\u003ePourquoi utiliser OpenSMTPD ?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eParce qu\u0026rsquo;OpenSMTPD est :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003efacile à \u003ca href=\"/fr/sys/devuan/opensmtpd-client-auth/#configuration\"\u003econfigurer\u003c/a\u003e\u003c/strong\u003e : un seul fichier texte !\u003c/li\u003e\n\u003cli\u003ereconnu comme étant fiable ET sécurisé.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eFonctionnel et testé sur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDebian Sid, Devuan Ceres\u003c/li\u003e\n\u003cli\u003eLinux Mint\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003eapt install opensmtpd\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele journal se trouve être : \u003ccode\u003e/var/log/mail.log\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration principal est : \u003ccode\u003e/etc/smtpd.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour envoyer un mail par \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Mail Transfer Protocol\"\u003eSMTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n à un service de mails nécessitant\nune identification, il est nécessaire de créer dans un premier temps, un fichier\n\u003ccode\u003esecrets\u003c/code\u003e avec les droits adéquats sur votre système, ensuite il nous reste à\nconfigurer le fichier \u003ccode\u003esmtpd.conf\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"fichier-secrets\"\u003eFichier secrets\u003c/h3\u003e\n\u003cp\u003eCréation du fichier de secrets :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ mkdir -p .config/mail\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ touch .config/mail/secrets\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ chmod \u003cspan style=\"color:#f99b15\"\u003e0640\u003c/span\u003e .config/mail/secrets\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, il est nécessaire de le remplir de telle manière : \u003cbr\u003e\n\u003ccode\u003eidentifiant username:password\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cspan class=\"red\"\u003en'écrivez pas TEXTUELLEMENT cette information\u003c/span\u003e\n,\nremplacez-là par les informations ci-dessous :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eoù \u003ccode\u003eidentifiant\u003c/code\u003e est l\u0026rsquo;identifiant que vous choisissez soigneusement,\net qui vous servira plus tard dans la configuration du fichier\n\u003ccode\u003esmtpd.conf\u003c/code\u003e ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusername\u003c/code\u003e est votre identifiant de connexion mail au service mail de\nvotre fournisseur - \u003cem\u003egénéralement votre adresse mail\u003c/em\u003e - ;\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epassword\u003c/code\u003e étant le mot de passe lié à votre identification mail.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl est possible de nommer autrement ce fichier secrets, et de le mettre\nailleurs dans votre système de fichier ; comprenez-le principe et\nmodifier en conséquence.\u003c/p\u003e\n\u003cp\u003eDe même, je vous encourage fortement à ne mettre QUE des droits \u003cstrong\u003e0440\u003c/strong\u003e\nsur le fichier - \u003cem\u003epar défaut : 0640\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eMême si l\u0026rsquo;accès au fichier par smtpd peut sans soucis être fait avec vos\ndroits personnels \u003ccode\u003e$USER:$USER\u003c/code\u003e, il est préférable de mettre à minima les\ndroits du groupe \u003ccode\u003eopensmtpd\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# chown $USER:opensmtpd .config/mail/secrets\n:$ chmod 0440 .config/mail/secrets\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eNote à-propos d\u0026rsquo;un home chiffré\u003c/strong\u003e : veillez absolument à copier/déplacer\nce fichier vers /etc/mail/, autrement le service correspondant ne démarrera\npas, puisqu\u0026rsquo;il ne peut/pourra pas avoir accès au fichier à ce moment-là !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"fichier-smtpdconf\"\u003eFichier smtpd.conf\u003c/h3\u003e\n\u003cp\u003eMaintenant modifions le fichier \u003ccode\u003e/etc/smtpd.conf\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   $OpenBSD: smtpd.conf,v 1.10 2018/05/24 11:40:17 gilles Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# This is the smtpd server system-wide configuration file.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# See smtpd.conf(5) for more information.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable aliases file:/etc/aliases\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable secrets file:/home/votre-id/.config/mail/secrets\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003equeue compression\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# To accept external mail, replace with: listen on all\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elisten on localhost\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eaction \u0026#34;local\u0026#34; maildir alias \u0026lt;aliases\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eaction \u0026#34;relay\u0026#34; relay host smtp+tls://identifiant@serveur:587 auth \u0026lt;secrets\u0026gt; mail-from \u0026#34;@your-domain.tld\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Uncomment the following to accept external mail for domain \u0026#34;example.org\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# match from any for domain \u0026#34;example.org\u0026#34; action \u0026#34;local\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch for local action \u0026#34;local\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch from local for any action \u0026#34;relay\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePar rapport à la version originale, nous avons donc rajouté :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ela ligne  \u003ccode\u003etable secrets\u003c/code\u003e qui appelle le fichier \u003ccode\u003e.config/mail/secrets\u003c/code\u003e -\n\u003cem\u003eou son équivalent, si vous l\u0026rsquo;avez personnalisé\u003c/em\u003e…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela ligne \u003ccode\u003eaction relay\u003c/code\u003e qui nous permet de définir l\u0026rsquo;action nécessaire\nvers l\u0026rsquo;hôte relais par lequel nous enverrons les mails…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eREMARQUEZ l\u0026rsquo;écriture  \u003ccode\u003eidentifiant@serveur\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ec\u0026rsquo;est justement là qu\u0026rsquo;il faut remplacer la chaîne \u003ccode\u003eidentifiant\u003c/code\u003e\npar celle que vous avez créée dans votre fichier \u003ccode\u003esecrets\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003equant à la chaîne \u003ccode\u003eserveur\u003c/code\u003e, il faut la remplacer par l\u0026rsquo;adresse\ndu serveur de mail, par exemple : \u003ccode\u003e \u003c/code\u003email.gandi.net`.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela chaîne \u003ccode\u003esmtp+tls\u003c/code\u003e est le protocol que nous utilisons pour nous\nconnecter au service de l\u0026rsquo;hôte mail relais… \u003cbr\u003e\nil est bien sûr possible d\u0026rsquo;utiliser les autres protocoles, tel\nque :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003elmtp\u003c/code\u003e pour se connecter avec une session \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Local Mail Transfer Protocol\"\u003eLMTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esmtp\u003c/code\u003e pour essayer de se connecter avec une session \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Start TLS\"\u003eSTARTTLS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nsi possible\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esmtp+tls\u003c/code\u003e pour obliger une connexion par le biais d\u0026rsquo;une\nsession \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Start TLS\"\u003eSTARTTLS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esmtp+notls\u003c/code\u003e pour se connecter \u0026ldquo;en clair\u0026rdquo;, sans chiffrement\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003esmtps\u003c/code\u003e pour se connecter en forçant la connexion\n\n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \u003cabbr lang=\"en\" title=\"Transport Layer Secure\"\u003eTLS\u003c/abbr\u003e\n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n            \n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eport par défaut : 465\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003esi rien n\u0026rsquo;est spécifié, alors la connexion se fera sur le port\n25.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela chaîne \u003ccode\u003eauth\u003c/code\u003e permet de spécifier la table \u003ccode\u003esecrets\u003c/code\u003e fournissant\nles données d\u0026rsquo;identification  mail nécessaires.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela chaîne \u003ccode\u003email-from\u003c/code\u003e nous permet de spécifier le nom de domaine -\nce qui permet d\u0026rsquo;éviter l\u0026rsquo;erreur\n\u003ccode\u003eSender address rejected: Domain not found\u003c/code\u003e ; \u003cbr\u003e\n\u003cem\u003eil faut bien sûr que ce domaine vous appartienne…\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ela ligne \u003ccode\u003ematch … action \u0026quot;relay\u0026quot;\u003c/code\u003e est l\u0026rsquo;action qui sera déclenchée\nlors de l\u0026rsquo;envoi de mails à l\u0026rsquo;extérieur !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gestion-des-alias\"\u003eGestion des alias\u003c/h3\u003e\n\u003cp\u003eUn mot sur la gestion des alias système !\u003c/p\u003e\n\u003cp\u003eIl est intéressant de gérer l\u0026rsquo;alias relatif à votre compte \u003ccode\u003eroot\u003c/code\u003e voire celui\nde votre utilisateur principal…\u003c/p\u003e\n\u003cp\u003eÉditez le fichier \u003ccode\u003e/etc/aliases\u003c/code\u003e, avec des droits administrateurs. \u003cbr\u003e\nVers la fin du fichier, modifiez \u003ccode\u003eroot\u003c/code\u003e en lui indiquant vers quelle adresse\nmail vous désirez que les messages systèmes adressés au compte root vous soit\nenvoyés !\u003c/p\u003e\n\u003cp\u003eFaites de même pour votre utilisateur système ;)\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de recharger la base des aliases, grâce à l\u0026rsquo;usage de la\ncommande \u003ccode\u003enewaliases\u003c/code\u003e !\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eAvant de redémarrer le service \u003cstrong\u003eopensmtpd\u003c/strong\u003e pour qu\u0026rsquo;il prenne en compte les\nmodifications faites, il nous faut tester l\u0026rsquo;écriture de la configuration : \u003cbr\u003e\n\u003ccode\u003e:# smtpd -n\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003equi devrait réponde par : \u003ccode\u003econfiguration OK\u003c/code\u003e \u003cbr\u003e\ninformant ainsi que tout va bien…\u003c/p\u003e\n\u003cp\u003eSinon, rééditez le fichier de configuration à la ligne indiquée en premier ;\nc\u0026rsquo;est d\u0026rsquo;elle que vient l\u0026rsquo;erreur principale !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl est nécessaire de redémarrer le service : \u003cbr\u003e\n\u003ccode\u003e# service opensmtpd restart\u003c/code\u003e, ou \u003cbr\u003e\n\u003ccode\u003e# /etc/init.d/opensmtpd restart\u003c/code\u003e - \u003cbr\u003e\nsi vous utilisez \u003cstrong\u003eopenrc\u003c/strong\u003e en tant que gestionnaire de service !\u003c/p\u003e\n\u003ch3 id=\"envois\"\u003eEnvois\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eL\u0026rsquo;outil \u003cstrong\u003email\u003c/strong\u003e fait partie du paquet \u003cstrong\u003emailutils\u003c/strong\u003e !\u003c/div\u003e\n\n\u003cp\u003eSoit :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eecho \u0026quot;Test d'envois de mail on $(hostname); date: $(date)\u0026quot; | mail -s \u0026quot;Test de mail\u0026quot; adresse_mail_à_qui_envoyer\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eou, \u003ccode\u003eecho \u0026quot;Test d'envois de mail on $(hostname); date: $(date)\u0026quot; | mail -s \u0026quot;Test de mail\u0026quot; root\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans un cas, comme dans l\u0026rsquo;autre, le journal vous indiquera\nl\u0026rsquo;équivalent, en cas de réussite, d\u0026rsquo;un tel message :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003e(…)\nApr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp connected address=local host=***\nApr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp message msgid=85868a25 size=474 nrcpt=1 proto=ESMTP\nApr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp envelope evpid=85868a25fcb1569a from=\u0026lt;my-id@***\u0026gt; to=\u0026lt;my-id@***\u0026gt;\nApr 27 09:16:47 pc-z smtpd[1718]: 09cca279ca1178e4 smtp disconnected reason=quit\nApr 27 09:16:51 pc-z smtpd[1718]: 09cca27892fa38ea mta delivery evpid=85868a25fcb1569a from=\u0026lt;my-id@huc.fr.eu.org\u0026gt; to=\u0026lt;email@nom-de-domaine.tld\u0026gt; rcpt=\u0026lt;my-id@***\u0026gt; source=\u0026#34;192.168.47.47\u0026#34; relay=\u0026#34;80.67.160.70 (lautre.net)\u0026#34; delay=4s result=\u0026#34;Ok\u0026#34; stat=\u0026#34;250 2.0.0 Ok: queued as 53C92112839\u0026#34;\nApr 27 09:17:02 pc-z smtpd[1718]: 09cca27892fa38ea mta disconnected reason=quit messages=2\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eÀ partir de maintenant, vous pourrez envoyer depuis votre console ou vos\nscripts shell des mails avec authentification SMTP !\u003c/p\u003e\n\u003ch3 id=\"erreurs\"\u003eErreurs\u003c/h3\u003e\n\u003cp\u003eRetrouvez les différentes erreurs possibles sur mon article\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/smtpd-config-auth/#gestion-des-erreurs\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Configurer smtpd.conf pour l\u0026#39;authentification (depuis OpenBSD ≥ 6.4)'\"\u003eOpenBSD : Configurer smtpd.conf pour l\u0026#39;authentification (depuis OpenBSD ≥ 6.4)\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003eLe protocol SMTP est défini par la RFC 5321 :\u003c/p\u003e\n\n\u003ch3 id=\"rfc-5321\"\u003eRFC 5321\u003c/h3\u003e\n\u003cdl class=\"rfc\"\u003e\n\t\u003cdt\u003eIETF Tools\u003c/dt\u003e\n\t\u003cdd\u003e\n\t\t\u003ca href=\"https://tools.ietf.org/html/rfc5321\" title=\"RFC 5321 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc5321\" title=\"RFC 5321 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc5321.txt\" title=\"RFC 5321 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\t\u003cdt\u003eRFC Editor\u003c/dt\u003e\n\t\u003cdd\u003e\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc5321.html\" title=\"RFC 5321 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc5321.txt.pdf\" title=\"RFC 5321 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc5321.txt\" title=\"RFC 5321 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/smtpd.conf.5\" title=\"Page du Manuel OpenBSD pour : smtpd.conf\"\u003esmtpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"wikipédia\"\u003eWikipédia\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Local_Mail_Transfer_Protocol\" title=\"Article Wikipédia : Local_Mail_Transfer_Protocol\"\u003eLocal_Mail_Transfer_Protocol \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Installer OpenSMTPD sous Devuan et le configurer en tant que client avec authentification",
            "tags": ["Devuan", "OpenSMPTD", "smtp", "client", "mail", "auth"],
            "date_published": "2020-04-27T09:19:56+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:c5153753-5dfb-2c3e-3bf4-3362cb51ed07",
            "url": "http://doc.huc.fr.eu.org/fr/sys/devuan/openntpd/",
            "title": "Devuan : utiliser le client de synchronisation de temps OpenNTPD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenNTPD est un service qui peut être utilisé pour synchroniser l\u0026rsquo;horloge système depuis les serveurs de temps, utilisant le protocole NTP (Network Time Protocol) .\nOpenNTPD fait partie du système de base du système d\u0026rsquo;exploitation OpenBSD. Il a été \u0026ldquo;porté\u0026rdquo; sur d\u0026rsquo;autres OS, tel Devuan.\nInstallation Par le biais de l\u0026rsquo;outil apt : apt install openntpd\nConfiguration Le fichier de configuration se trouve être dans : /etc/opennptd/ntpd.conf Par défaut, il est paramétré pour fonctionner, sans aucune modification nécessaire.\n# $OpenBSD: ntpd.conf,v 1.14 2015/07/15 20:28:37 ajacoutot Exp $ # sample ntpd configuration file, see ntpd.conf(5) # Addresses to listen on (ntpd does not listen by default) #listen on * #listen on 127.0.0.1 #listen on ::1 # sync to a single server #server ntp.example.org # use a random selection of NTP Pool Time Servers # see http://support.ntp.org/bin/view/Servers/NTPPoolServers #servers pool.ntp.org # Choose servers announced from Debian NTP Pool servers 0.debian.pool.ntp.org servers 1.debian.pool.ntp.org servers 2.debian.pool.ntp.org servers 3.debian.pool.ntp.org # use a specific local timedelta sensor (radio clock, etc) #sensor nmea0 # use all detected timedelta sensors #sensor * Explications\nÀ-propos des options :\nserver permet de cibler un serveur de temps, en particulier servers permet de cibler un ensemble de serveur de temps - préférez cet usage sensor permet d\u0026rsquo;utiliser les sondes de temps locales Utilisation Contrôles Pour vérifier que la configuration soit bonne, il faut utiliser l\u0026rsquo;option -n tel que :\n# openntpd -n `configuration OK Si la configuration du fichier n\u0026rsquo;est pas bonne, la commande vous avertira en conséquence ; à vous, de corriger le fichier de configuration si nécessaire.\nL\u0026rsquo;utilitaire qui nous permet de contrôler le service de temps est ntpctl.\nL\u0026rsquo;option -s all - ou sa version abrégée : -sa - permet d\u0026rsquo;afficher les informations disponibles. # ntpctl -sa 4/4 peers valid, clock unsynced, clock offset is -552.476ms peer wt tl st next poll offset delay jitter 82.64.42.185 from pool 0.debian.pool.ntp.org 1 10 2 6s 32s 0.203ms 60.784ms 31.533ms 194.177.34.116 from pool 0.debian.pool.ntp.org 1 10 3 9s 32s 2.000ms 54.595ms 17.411ms 212.129.10.70 from pool 0.debian.pool.ntp.org 1 10 2 9s 33s 5.552ms 51.518ms 4.078ms 162.159.200.1 from pool 0.debian.pool.ntp.org 1 10 3 7s 33s -0.176ms 55.383ms 17.593ms InfoPour connaître les différents options utiles, je vous renvoie au manpage ntpctl correspondant. Service Le nom du service étant openntpd, il se gère avec l\u0026rsquo;outil service, sans soucis particulier.\nservice openntpd commande\ncommande est bien sûr une des actions possibles sur un service, tel start, stop, restart par exemple. Dépannage Il peut arriver au démarrage qu\u0026rsquo;il y ait un décalage de temps, plus ou moins conséquent.\nL\u0026rsquo;usage de l\u0026rsquo;option -s permettra de résoudre :\n# openntpd -s -d adjtimex returns frequency of 0.000000ppm /var/lib/openntpd/db/ntpd.drift is empty ntp engine ready reply from 212.83.179.156: offset -522.890034 delay 0.054365, next query 7s set local clock to Sat Apr 25 12:09:03 CEST 2020 (offset -522.890034s) reply from 5.135.3.88: negative delay -522.825725s, next query 3203s reply from 46.105.237.136: negative delay -522.823915s, next query 3197s reply from 185.21.216.198: negative delay -522.821620s, next query 3012s reply from 51.15.175.180: negative delay -522.821769s, next query 3010s reply from 37.187.104.44: negative delay -522.820949s, next query 3031s reply from 46.235.141.130: negative delay -522.816360s, next query 3274s reply from 162.159.200.1: negative delay -522.816819s, next query 3030s reply from 5.39.60.244: negative delay -522.816297s, next query 3254s reply from 95.81.173.155: negative delay -522.812132s, next query 3176s reply from 51.15.191.239: negative delay -522.810759s, next query 3017s reply from 5.39.60.244: negative delay -522.809750s, next query 3082s reply from 51.158.147.92: negative delay -522.805041s, next query 3250s reply from 212.85.158.10: negative delay -522.800165s, next query 3041s reply from 88.212.196.95: negative delay -522.784156s, next query 3179s reply from 156.38.0.219: negative delay -522.657588s, next query 3023s reply from 212.83.179.156: offset -0.004612 delay 0.049539, next query 7s reply from 212.83.179.156: offset -0.007646 delay 0.049241, next query 9s peer 212.83.179.156 now valid Contrainte Apparemment l\u0026rsquo;option de contrainte constraints bien appréciée sous OpenBSD n\u0026rsquo;est pas utilisable !\nInfoL\u0026rsquo;option de contrainte permet de s\u0026rsquo;assurer que les requêtes de temps se fassent sur le protocole HTTPS , via TLS . peer not valid Il peut arriver lorsque vous utilisez le contrôleur ntp, il vous soit notifié qu\u0026rsquo;un ou plusieurs des pairs soi(en)t non valides, tel que par exemple :\nwt tl st next poll offset delay jitter 95.81.173.8 from pool 0.debian.pool.ntp.org 1 4 2 8s 9s ---- peer not valid ---- Patientez encore un peu que les retours des requêtes ntp se soient faites. Normalement lors de l\u0026rsquo;interrogation suivante, cela ne devrait plus être le cas.\nAutrement, vérifiez que les serveurs NTP enregistrés dans le fichier de configuration soient bien écrits, joignables et fonctionnels.\nDocumentation Le protocol NTP est défini dans la version :\n3 par la RFC 1305 4 par la RFC 5905 RFC 1305 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT RFC 5905 IETF Tools HTML, PDF, TXT RFC Editor HTML, PDF, TXT Manpages Du fait que les outils viennent de l\u0026rsquo;univers OpenBSD, je vous renvoie aux manpages compétents correspondants :\nntpd(8) , ntpd.conf(5) , ntpctl(8) ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenNTPD\u003c/strong\u003e est un service qui peut être utilisé pour synchroniser l\u0026rsquo;horloge\nsystème depuis les serveurs de temps, utilisant le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eNTP \u003cem\u003e(Network Time Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOpenNTPD\u003c/strong\u003e fait partie du système de base du système d\u0026rsquo;exploitation OpenBSD.\nIl a été \u0026ldquo;porté\u0026rdquo; sur d\u0026rsquo;autres OS, tel Devuan.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003ePar le biais de l\u0026rsquo;outil \u003ccode\u003eapt\u003c/code\u003e : \u003ccode\u003eapt install openntpd\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration se trouve être dans : \u003ccode\u003e/etc/opennptd/ntpd.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePar défaut, il est paramétré pour fonctionner, sans aucune modification nécessaire.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: ntpd.conf,v 1.14 2015/07/15 20:28:37 ajacoutot Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sample ntpd configuration file, see ntpd.conf(5)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Addresses to listen on (ntpd does not listen by default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#listen on *\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#listen on 127.0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#listen on ::1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sync to a single server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#server ntp.example.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# use a random selection of NTP Pool Time Servers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# see http://support.ntp.org/bin/view/Servers/NTPPoolServers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#servers pool.ntp.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Choose servers announced from Debian NTP Pool\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eservers 0.debian.pool.ntp.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eservers 1.debian.pool.ntp.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eservers 2.debian.pool.ntp.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eservers 3.debian.pool.ntp.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# use a specific local timedelta sensor (radio clock, etc)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#sensor nmea0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# use all detected timedelta sensors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#sensor *\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eÀ-propos des options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eserver\u003c/code\u003e permet de cibler un serveur de temps, en particulier\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eservers\u003c/code\u003e permet de cibler un ensemble de serveur de temps - \u003cem\u003epréférez cet usage\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esensor\u003c/code\u003e permet d\u0026rsquo;utiliser les sondes de temps locales\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"contrôles\"\u003eContrôles\u003c/h3\u003e\n\u003cp\u003ePour vérifier que la configuration soit bonne, il faut utiliser l\u0026rsquo;option\n\u003ccode\u003e-n\u003c/code\u003e tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# openntpd -n\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003econfiguration OK\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi la configuration du fichier n\u0026rsquo;est pas bonne, la commande vous avertira\nen conséquence ; à vous, de corriger le fichier de configuration si nécessaire.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;utilitaire qui nous permet de contrôler le service de temps est \u003ccode\u003entpctl\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;option \u003ccode\u003e-s all\u003c/code\u003e - \u003cem\u003eou sa version abrégée\u003c/em\u003e : \u003ccode\u003e-sa\u003c/code\u003e - permet d\u0026rsquo;afficher\nles informations disponibles.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ntpctl -sa\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e4/4 peers valid, clock unsynced, clock offset is -552.476ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epeer\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   wt tl st  next  poll          offset       delay      jitter\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e82.64.42.185 from pool 0.debian.pool.ntp.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e    6s   32s         0.203ms    60.784ms    31.533ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e194.177.34.116 from pool 0.debian.pool.ntp.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e    9s   32s         2.000ms    54.595ms    17.411ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e212.129.10.70 from pool 0.debian.pool.ntp.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e    9s   33s         5.552ms    51.518ms     4.078ms\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e162.159.200.1 from pool 0.debian.pool.ntp.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e    7s   33s        -0.176ms    55.383ms    17.593ms\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePour connaître les différents options utiles, je vous renvoie au\nmanpage \u003ca href=\"/fr/sys/devuan/openntpd/#manpages\"\u003entpctl\u003c/a\u003e correspondant.\u003c/div\u003e\n\n\u003ch3 id=\"service\"\u003eService\u003c/h3\u003e\n\u003cp\u003eLe nom du service étant \u003cstrong\u003eopenntpd\u003c/strong\u003e, il se gère avec l\u0026rsquo;outil \u003ccode\u003eservice\u003c/code\u003e,\nsans soucis particulier.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eservice openntpd commande\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecommande\u003c/code\u003e est bien sûr une des actions possibles sur un service, tel \u003ccode\u003estart\u003c/code\u003e,\n\u003ccode\u003estop\u003c/code\u003e, \u003ccode\u003erestart\u003c/code\u003e par exemple.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003eIl peut arriver au démarrage qu\u0026rsquo;il y ait un décalage de temps, plus ou moins\nconséquent.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;usage de  l\u0026rsquo;option \u003ccode\u003e-s\u003c/code\u003e permettra de résoudre :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# openntpd -s -d\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eadjtimex returns frequency of 0.000000ppm\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/var/lib/openntpd/db/ntpd.drift is empty\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003entp engine ready\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 212.83.179.156: offset -522.890034 delay 0.054365, next query 7s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eset local clock to Sat Apr \u003cspan style=\"color:#f99b15\"\u003e25\u003c/span\u003e 12:09:03 CEST \u003cspan style=\"color:#f99b15\"\u003e2020\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eoffset -522.890034s\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 5.135.3.88: negative delay -522.825725s, next query 3203s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 46.105.237.136: negative delay -522.823915s, next query 3197s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 185.21.216.198: negative delay -522.821620s, next query 3012s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 51.15.175.180: negative delay -522.821769s, next query 3010s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 37.187.104.44: negative delay -522.820949s, next query 3031s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 46.235.141.130: negative delay -522.816360s, next query 3274s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 162.159.200.1: negative delay -522.816819s, next query 3030s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 5.39.60.244: negative delay -522.816297s, next query 3254s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 95.81.173.155: negative delay -522.812132s, next query 3176s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 51.15.191.239: negative delay -522.810759s, next query 3017s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 5.39.60.244: negative delay -522.809750s, next query 3082s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 51.158.147.92: negative delay -522.805041s, next query 3250s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 212.85.158.10: negative delay -522.800165s, next query 3041s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 88.212.196.95: negative delay -522.784156s, next query 3179s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 156.38.0.219: negative delay -522.657588s, next query 3023s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 212.83.179.156: offset -0.004612 delay 0.049539, next query 7s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ereply from 212.83.179.156: offset -0.007646 delay 0.049241, next query 9s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epeer 212.83.179.156 now valid\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"contrainte\"\u003eContrainte\u003c/h3\u003e\n\u003cp\u003eApparemment l\u0026rsquo;option de contrainte \u003ccode\u003econstraints\u003c/code\u003e bien appréciée sous OpenBSD\nn\u0026rsquo;est pas utilisable !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eL\u0026rsquo;option de contrainte permet de s\u0026rsquo;assurer que les requêtes de temps se\nfassent sur le protocole \u003cabbr title=\"HyperText Transfert Protocole Secure\"\u003eHTTPS\u003c/abbr\u003e\n,\nvia \u003cabbr title=\"Transport Layer Security\"\u003eTLS\u003c/abbr\u003e\n.\u003c/div\u003e\n\n\u003ch3 id=\"peer-not-valid\"\u003epeer not valid\u003c/h3\u003e\n\u003cp\u003eIl peut arriver lorsque vous utilisez le contrôleur ntp, il vous soit notifié\nqu\u0026rsquo;un ou plusieurs des pairs soi(en)t non valides, tel que par exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   wt tl st  next  poll          offset       delay      jitter\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e95.81.173.8 from pool 0.debian.pool.ntp.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e    8s    9s             ---- peer not valid ----\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePatientez encore un peu que les retours des requêtes ntp se soient faites. \u003cbr\u003e\nNormalement lors de l\u0026rsquo;interrogation suivante, cela ne devrait plus être le cas.\u003c/p\u003e\n\u003cp\u003eAutrement, vérifiez que les serveurs NTP enregistrés dans le fichier de\nconfiguration soient bien écrits, joignables et fonctionnels.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eLe protocol NTP est défini dans la version :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e3\u003c/strong\u003e par la \u003ca href=\"/fr/sys/devuan/openntpd/#rfc-1305\"\u003eRFC 1305\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e4\u003c/strong\u003e par la \u003ca href=\"/fr/sys/devuan/openntpd/#rfc-5905\"\u003eRFC 5905\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\n\u003ch3 id=\"rfc-1305\"\u003eRFC 1305\u003c/h3\u003e\n\u003cdl class=\"rfc\"\u003e\n\t\u003cdt\u003eIETF Tools\u003c/dt\u003e\n\t\u003cdd\u003e\n\t\t\u003ca href=\"https://tools.ietf.org/html/rfc1305\" title=\"RFC 1305 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc1305\" title=\"RFC 1305 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc1305.txt\" title=\"RFC 1305 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\t\u003cdt\u003eRFC Editor\u003c/dt\u003e\n\t\u003cdd\u003e\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc1305.html\" title=\"RFC 1305 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc1305.txt.pdf\" title=\"RFC 1305 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc1305.txt\" title=\"RFC 1305 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\n\n\u003ch3 id=\"rfc-5905\"\u003eRFC 5905\u003c/h3\u003e\n\u003cdl class=\"rfc\"\u003e\n\t\u003cdt\u003eIETF Tools\u003c/dt\u003e\n\t\u003cdd\u003e\n\t\t\u003ca href=\"https://tools.ietf.org/html/rfc5905\" title=\"RFC 5905 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/pdf/rfc5905\" title=\"RFC 5905 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://tools.ietf.org/rfc/rfc5905.txt\" title=\"RFC 5905 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\t\u003cdt\u003eRFC Editor\u003c/dt\u003e\n\t\u003cdd\u003e\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc5905.html\" title=\"RFC 5905 : au format HTML\"\u003eHTML\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/pdfrfc/rfc5905.txt.pdf\" title=\"RFC 5905 : au format PDF\"\u003ePDF\u003c/a\u003e,\n\t\t\u003ca href=\"https://www.rfc-editor.org/rfc/rfc5905.txt\" title=\"RFC 5905 : au format Text\"\u003eTXT\u003c/a\u003e\n\t\u003c/dd\u003e\n\u003c/dl\u003e\n\u003c/p\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cp\u003eDu fait que les outils viennent de l\u0026rsquo;univers OpenBSD, je vous renvoie aux\nmanpages compétents correspondants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/ntpd.8\" title=\"Page du Manuel OpenBSD pour : ntpd\"\u003entpd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/ntpd.conf.5\" title=\"Page du Manuel OpenBSD pour : ntpd.conf\"\u003entpd.conf(5)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/ntpctl.8\" title=\"Page du Manuel OpenBSD pour : ntpctl\"\u003entpctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser sous Devuan le client de synchronisation de temps OpenNTPD",
            "tags": ["Devuan", "OpenNTPD", "ntp", "client", "temps"],
            "date_published": "2020-04-25T12:17:36+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:14169976-e569-3497-1dc2-dce14c6c83d3",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-opensearch/",
            "title": "Hugo : Opensearch",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Opensearch est un format de description qui permet à un site de décrire un moteur de recherche pour lui-même, afin que toute application cliente, tel un navigateur web, puisse faire une recherche dans le site en question.\nLa plupart des navigateurs vous proposeront l\u0026rsquo;ajout de votre site en tant que moteur de recherche si vous gérez l\u0026rsquo;autopublication.\nHugo, par défaut, ne génére pas de descriptif Opensearch. Nous allons devoir modifier la configuration pour créer un nouveau format de sortie personnalisé.\nDocumentation Un petit tour sur la documentation officielle Hugo :\nHugo Documentation : Templates \u0026gt; Output formats Ainsi que sur la documentation officielle d\u0026rsquo;Opensearch :\nhttps://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md Configuration Le fichier de configuration principal : config.toml Il est nécessaire de modifier le fichier de configuration pour :\ncréer un nouveau type de média créer un nouveau format de sortie créer le modèle pour le fichier Opensearch. MediaType Le type mime lié au format de description d\u0026rsquo;Opensearch est : application/opensearchdescription+xml.\nHugo \u0026gt;= 0.20 Depuis Hugo 0.20, il faut ajouter :\n[mediaTypes] [mediaTypes.\u0026#34;application/opensearchdescription+xml\u0026#34;] suffix = \u0026#34;xml\u0026#34; Là, nous avons donc implémenté un nouveau type de format ayant pour mime type : application/opensearchdescription+xml, et pour nom d\u0026rsquo;extension : xml.\nHugo \u0026gt;= 0.44 Depuis Hugo 0.44, pour que cela fonctionne correctement il faut ajouter :\n[mediaTypes] [mediaTypes.\u0026#34;application/opensearchdescription+xml\u0026#34;] suffixes = [\u0026#34;xml\u0026#34;] AstuceSi votre ancienne configuration précédait la 0.44, il faut adapter/transformer la variable suffix en suffixes = ['xml'] ! OuputFormat La déclaration du format de sortie, à ajouter :\n[outputs] [outputFormats.OpenSearch] baseName = \u0026#34;opensearch\u0026#34; isHTML = false isPlainText = false mediaType = \u0026#34;application/opensearchdescription+xml\u0026#34; noUgly = true Puis, il faut ajouter \u0026quot;OpenSearch\u0026quot; à votre variable home, tel que :\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;OpenSearch\u0026#34;] Template Le modèle peut simplement être créé dans le répertoire layouts/_default/index.opensearch.xml.\nSi le site est multilangue, les liens alternatifs vers la version de langue correspondante à l\u0026rsquo;entrée du site sont générés. InfoATTENTION : le modèle présenté gère un site multilingue. Tenez-en compte, en supprimant les déclarations de langue, si ce n\u0026rsquo;est pas votre cas. {{ printf `\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; ?\u0026gt;` | safeHTML }} \u0026lt;OpenSearchDescription xmlns=\u0026#34;http://a9.com/-/spec/opensearch/1.1/\u0026#34; xmlns:ie=\u0026#34;http://schemas.microsoft.com/Search/2008/\u0026#34; xmlns:moz=\u0026#34;http://www.mozilla.org/2006/browser/search/\u0026#34;\u0026gt; \u0026lt;Attribution\u0026gt;© {{ $.Date.Format \u0026#34;2006\u0026#34; | safeHTML }} {{ site.Author.name }}; http://creativecommons.org/publicdomain/zero/1.0/legalcode.{{ site.Language.Lang }}\u0026lt;/Attribution\u0026gt; \u0026lt;Contact\u0026gt;{{ site.Author.email | safeHTML }}\u0026lt;/Contact\u0026gt; \u0026lt;Description\u0026gt;{{ i18n \u0026#34;opensearchDescription\u0026#34; }}\u0026lt;/Description\u0026gt; \u0026lt;Developer\u0026gt;{{ site.Author.name | safeHTML }}\u0026lt;/Developer\u0026gt; \u0026lt;InputEncoding\u0026gt;utf-8\u0026lt;/InputEncoding\u0026gt; \u0026lt;Image width=\u0026#34;64\u0026#34; height=\u0026#34;64\u0026#34; type=\u0026#34;image/png\u0026#34;\u0026gt;{{ site.BaseURL }}img/Logo-64px.png\u0026lt;/Image\u0026gt; \u0026lt;Image width=\u0026#34;16\u0026#34; height=\u0026#34;16\u0026#34; type=\u0026#34;image/vnd.microsoft.icon\u0026#34;\u0026gt;{{ site.BaseURL }}img/favicon.ico\u0026lt;/Image\u0026gt; \u0026lt;Language\u0026gt;{{ site.LanguageCode }}\u0026lt;/Language\u0026gt; \u0026lt;LongName\u0026gt;{{ site.Title }} :: {{ site.Language.Lang }}\u0026lt;/LongName\u0026gt; \u0026lt;OutputEncoding\u0026gt;UTF-8\u0026lt;/OutputEncoding\u0026gt; \u0026lt;ShortName\u0026gt;Websearch\u0026lt;/ShortName\u0026gt; \u0026lt;SyndicationRight\u0026gt;open\u0026lt;/SyndicationRight\u0026gt; \u0026lt;ie:PreviewUrl type=\u0026#34;text/html\u0026#34; method=\u0026#34;GET\u0026#34; template=\u0026#34;{{ site.BaseURL }}{{ site.Language.Lang }}/tags/{searchTerms}/\u0026#34;/\u0026gt; \u0026lt;moz:SearchForm\u0026gt;{{ site.BaseURL }}{{ site.Language.Lang }}/tags/{searchTerms}/\u0026lt;/moz:SearchForm\u0026gt; \u0026lt;Url template=\u0026#34;{{ site.BaseURL }}{{ site.Language.Lang }}/tags/{searchTerms}/\u0026#34; type=\u0026#34;text/html\u0026#34; /\u0026gt; \u0026lt;Url rel=\u0026#34;self\u0026#34; template=\u0026#34;{{ site.BaseURL }}opensearch.xml\u0026#34; type=\u0026#34;application/opensearchdescription+xml\u0026#34; /\u0026gt; \u0026lt;/OpenSearchDescription\u0026gt; autopublication L\u0026rsquo;autopublication est la méthode qui permet d\u0026rsquo;informer les clients web du format de description Opensearch.\nAttentionVeillez à ce que la valeur de l\u0026rsquo;attribut title corresponde à celle de l\u0026rsquo;élément ShortName ! Atom Si vous avez modifié votre configuration de Hugo pour générer un flux Atom il vous faudra le modifier pour ajouter ce qui suit :\n\u0026lt;link href=\u0026#34;{{ site.BaseURL }}/opensearch.xml\u0026#34; rel=\u0026#34;search\u0026#34; type=\u0026#34;application/opensearchdescription+xml\u0026#34; title=\u0026#34;Websearch\u0026#34; /\u0026gt; HTML Ajouter un élément link, tel que :\n\u0026lt;link rel=\u0026#34;search\u0026#34; href=\u0026#34;/opensearch.xml\u0026#34; title=\u0026#34;Websearch\u0026#34; type=\u0026#34;application/opensearchdescription+xml\u0026#34;\u0026gt; RSS Si vous générez votre flux RSS , veillez à le modifier pour ajouter :\nla déclaration de l\u0026rsquo;attribut xmlns:atom=\u0026quot;http://www.w3.org/2005/Atom\u0026quot; dans votre élément rss, tel que : \u0026lt;rss version=\u0026#34;2.0\u0026#34; xmlns:atom=\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u0026gt; afin de pouvoir déclarer un élément atom:link, tel que : \u0026lt;atom:link href=\u0026#34;{{ site.BaseURL }}/opensearch.xml\u0026#34; rel=\u0026#34;search\u0026#34; type=\u0026#34;application/opensearchdescription+xml\u0026#34; title=\u0026#34;Websearch\u0026#34; /\u0026gt; Remerciements Encore un merci sincère @solene qui m\u0026rsquo;a fait connaître Opensearch.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpensearch\u003c/strong\u003e est un format de description qui permet à un site de décrire\nun moteur de recherche pour lui-même, afin que toute application cliente,\ntel un navigateur web, puisse faire une recherche dans le site en question.\u003c/p\u003e\n\u003cp\u003eLa plupart des navigateurs vous proposeront l\u0026rsquo;ajout de votre site en tant\nque moteur de recherche si vous gérez l\u0026rsquo;\u003ca href=\"/fr/web/hugo/hugo-opensearch/#autopublication\"\u003eautopublication\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHugo\u003c/strong\u003e, par défaut, ne génére pas de descriptif Opensearch. Nous allons\ndevoir modifier la \u003ca href=\"/fr/web/hugo/hugo-opensearch/#configuration\"\u003econfiguration\u003c/a\u003e pour créer un nouveau format\nde sortie personnalisé.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eUn petit tour sur la documentation officielle Hugo :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/templates/output-formats/\" title=\"Lien vers la page du site officiel Hugo : Templates \u0026gt; Output formats\"\u003eHugo Documentation : Templates \u0026gt; Output formats\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAinsi que sur la documentation officielle d\u0026rsquo;Opensearch :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md\" rel=\"external\"\u003ehttps://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration principal : \u003ccode\u003econfig.toml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl est nécessaire de modifier le fichier de configuration pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecréer un nouveau \u003ca href=\"/fr/web/hugo/hugo-opensearch/#mediatype\"\u003etype de média\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ecréer un nouveau \u003ca href=\"/fr/web/hugo/hugo-opensearch/#ouputformat\"\u003eformat de sortie\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ecréer le \u003ca href=\"/fr/web/hugo/hugo-opensearch/#template\"\u003emodèle\u003c/a\u003e pour le fichier Opensearch.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"mediatype\"\u003eMediaType\u003c/h3\u003e\n\u003cp\u003eLe type mime lié au format de description d\u0026rsquo;Opensearch est : \u003ccode\u003eapplication/opensearchdescription+xml\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"hugo--020\"\u003eHugo \u0026gt;= 0.20\u003c/h4\u003e\n\u003cp\u003eDepuis Hugo 0.20, il faut ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/opensearchdescription+xml\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esuffix\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLà, nous avons donc implémenté un nouveau type de format ayant pour mime type : \u003ccode\u003eapplication/opensearchdescription+xml\u003c/code\u003e, et pour nom d\u0026rsquo;extension : \u003ccode\u003exml\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"hugo--044\"\u003eHugo \u0026gt;= 0.44\u003c/h4\u003e\n\u003cp\u003eDepuis Hugo 0.44, pour que cela fonctionne correctement il faut ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/opensearchdescription+xml\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esuffixes\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;xml\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eSi votre ancienne configuration précédait la 0.44, il faut adapter/transformer\nla variable \u003ccode\u003esuffix\u003c/code\u003e en \u003ccode\u003esuffixes = ['xml']\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"ouputformat\"\u003eOuputFormat\u003c/h3\u003e\n\u003cp\u003eLa déclaration du format de sortie, à ajouter  :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eOpenSearch\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebaseName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;opensearch\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisHTML\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisPlainText\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediaType\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/opensearchdescription+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003enoUgly\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, il faut ajouter \u003ccode\u003e\u0026quot;OpenSearch\u0026quot;\u003c/code\u003e à votre variable \u003ccode\u003ehome\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;OpenSearch\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"template\"\u003eTemplate\u003c/h3\u003e\n\u003cp\u003eLe modèle peut simplement être créé dans le répertoire \u003ccode\u003elayouts/_default/index.opensearch.xml\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi le site est multilangue, les liens alternatifs vers la version de langue\ncorrespondante à l\u0026rsquo;entrée du site sont générés.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eATTENTION : le modèle présenté gère un site multilingue. \u003cbr\u003e\nTenez-en compte, en supprimant les déclarations de langue, si ce n\u0026rsquo;est pas\nvotre cas.\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ printf `\u003cspan style=\"color:#776e71\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; ?\u0026gt;\u003c/span\u003e` | safeHTML }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;OpenSearchDescription\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003exmlns=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://a9.com/-/spec/opensearch/1.1/\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003exmlns:ie=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://schemas.microsoft.com/Search/2008/\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003exmlns:moz=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://www.mozilla.org/2006/browser/search/\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Attribution\u0026gt;\u003c/span\u003e© {{ $.Date.Format \u0026#34;2006\u0026#34; | safeHTML }} {{ site.Author.name }}; http://creativecommons.org/publicdomain/zero/1.0/legalcode.{{ site.Language.Lang }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/Attribution\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Contact\u0026gt;\u003c/span\u003e{{ site.Author.email | safeHTML }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/Contact\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Description\u0026gt;\u003c/span\u003e{{ i18n \u0026#34;opensearchDescription\u0026#34; }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/Description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Developer\u0026gt;\u003c/span\u003e{{ site.Author.name | safeHTML }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/Developer\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;InputEncoding\u0026gt;\u003c/span\u003eutf-8\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/InputEncoding\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Image\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ewidth=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;64\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eheight=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;64\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/png\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e{{ site.BaseURL }}img/Logo-64px.png\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/Image\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Image\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ewidth=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;16\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eheight=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;16\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/vnd.microsoft.icon\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e{{ site.BaseURL }}img/favicon.ico\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/Image\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Language\u0026gt;\u003c/span\u003e{{ site.LanguageCode }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/Language\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;LongName\u0026gt;\u003c/span\u003e{{ site.Title }} :: {{ site.Language.Lang }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/LongName\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;OutputEncoding\u0026gt;\u003c/span\u003eUTF-8\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/OutputEncoding\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;ShortName\u0026gt;\u003c/span\u003eWebsearch\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/ShortName\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;SyndicationRight\u0026gt;\u003c/span\u003eopen\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/SyndicationRight\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;ie:PreviewUrl\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003emethod=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;GET\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etemplate=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ site.BaseURL }}{{ site.Language.Lang }}/tags/{searchTerms}/\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;moz:SearchForm\u0026gt;\u003c/span\u003e{{ site.BaseURL }}{{ site.Language.Lang }}/tags/{searchTerms}/\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/moz:SearchForm\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Url\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etemplate=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ site.BaseURL }}{{ site.Language.Lang }}/tags/{searchTerms}/\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;Url\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etemplate=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ site.BaseURL }}opensearch.xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/opensearchdescription+xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/OpenSearchDescription\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"autopublication\"\u003eautopublication\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;autopublication est la méthode qui permet d\u0026rsquo;informer les clients web du\nformat de description Opensearch.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVeillez à ce que la valeur de l\u0026rsquo;attribut \u003ccode\u003etitle\u003c/code\u003e corresponde à celle de\nl\u0026rsquo;élément \u003ccode\u003eShortName\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"atom\"\u003eAtom\u003c/h3\u003e\n\u003cp\u003eSi vous avez modifié votre configuration de Hugo pour générer un flux\n\u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-feed/#atom\" title=\"Lien interne vers l\u0026#39;article : 'Hugo : Feed Atom, JSON, RSS'\"\u003eAtom\u003c/a\u003e\n\nil vous faudra le modifier pour ajouter ce qui suit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003elink\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ site.BaseURL }}/opensearch.xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/opensearchdescription+xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Websearch\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"html\"\u003eHTML\u003c/h3\u003e\n\u003cp\u003eAjouter un élément \u003ccode\u003elink\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003elink\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/opensearch.xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Websearch\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/opensearchdescription+xml\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"rss\"\u003eRSS\u003c/h3\u003e\n\u003cp\u003eSi vous générez votre flux \u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-feed/#rss\" title=\"Lien interne vers l\u0026#39;article : 'Hugo : Feed Atom, JSON, RSS'\"\u003eRSS\u003c/a\u003e\n,\nveillez à le modifier pour ajouter :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela déclaration de l\u0026rsquo;attribut \u003ccode\u003exmlns:atom=\u0026quot;http://www.w3.org/2005/Atom\u0026quot;\u003c/code\u003e\ndans votre élément \u003ccode\u003erss\u003c/code\u003e, tel que :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003erss\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eversion\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;2.0\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003exmlns:atom\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eafin de pouvoir déclarer un élément \u003ccode\u003eatom:link\u003c/code\u003e, tel que :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eatom:link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ site.BaseURL }}/opensearch.xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/opensearchdescription+xml\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Websearch\u0026#34;\u003c/span\u003e /\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eEncore un merci sincère @\u003ca href=\"https://dataswamp.org/~solene/\" rel=\"external\"\u003esolene\u003c/a\u003e qui m\u0026rsquo;a fait\nconnaître Opensearch.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment mettre en place le format de description Opensearch dans Hugo !",
            "tags": ["Hugo", "Opensearch", "search"],
            "date_published": "2020-04-14T16:54:07+02:00",
            "date_modified": "2025-11-13T14:12:52+01:00"
        },{
            "id": "urn:uuid:9370ce52-5591-c5b9-3dc5-f67e14de90bf",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/fswebcam/",
            "title": "fswebcam / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description fswebcam est une une petite application simple de gestion de webcam. Elle peut capturer des images depuis différentes sources et effectuer des manipulations simples sur les images capturées. Les images peuvent être sauvegardées au format JPG ou PNG.\nSite officiel : http://www.sanslogic.co.uk/fswebcam/ Installation Installez le paquet fswebcam.\nConfiguration Configuration Système Il est nécessaire de capturer le périphérique vidéo ! [[tips:webcam|capturer le périphérique vidéo]]\nAstuceSi votre webcam a une entrée micro, il peut être possible de paramétrer l\u0026rsquo;audio en tenant compte de cette [[tips:audio-son#enregistrement-audio|information]]… Utilisation Voici un exemple :\n$ fswebcam -r 1280x960 --save \u0026#34;/tmp/webcam-$(date +%Y-%m-%d-%H-%M-%S).jpg\u0026#34; --- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened. No input was specified, using the first. Adjusting resolution from 1280x960 to 960x720. --- Capturing frame... Captured frame in 0.00 seconds. --- Processing captured image... Writing JPEG image to \u0026#39;/tmp/webcam-2020-03-18-13-24-42.jpg \u0026#39;. Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003efswebcam\u003c/strong\u003e est une une petite application simple de gestion de webcam.\nElle peut capturer des images depuis différentes sources et effectuer\ndes manipulations simples sur les images capturées. Les images peuvent\nêtre sauvegardées au format JPG ou PNG.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite officiel : \u003ca href=\"http://www.sanslogic.co.uk/fswebcam/\" rel=\"external\"\u003ehttp://www.sanslogic.co.uk/fswebcam/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003ccode\u003efswebcam\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"configuration-système\"\u003eConfiguration Système\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de capturer le périphérique vidéo !\n[[tips:webcam|capturer le périphérique vidéo]]\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eSi votre webcam a une entrée micro, il peut être possible de paramétrer\nl\u0026rsquo;audio en tenant compte de cette [[tips:audio-son#enregistrement-audio|information]]…\u003c/div\u003e\n\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eVoici un exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ fswebcam -r 1280x960 --save \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/tmp/webcam-\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edate +%Y-%m-%d-%H-%M-%S\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e.jpg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--- Opening /dev/video0...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying source module v4l2...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/video0 opened.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNo input was specified, using the first.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAdjusting resolution from 1280x960 to 960x720.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--- Capturing frame...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCaptured frame in 0.00 seconds.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e--- Processing captured image...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWriting JPEG image to \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/tmp/webcam-2020-03-18-13-24-42.jpg\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "fswebcam, une application simple et légère de gestion de webcam sous OpenBSD",
            "tags": ["OpenBSD", "fswebcam"],
            "date_published": "2020-03-18T15:34:01+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:4de21288-5284-eb81-0afe-8b2601defb70",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/switch-lan-wan/",
            "title": "OpenWRT: Switch LAN WAN (astuce)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Par défaut, WAN est sur le port 0 et LAN accessible sur les autres ports, le port 1 étant celui par défaut. Ce qui signifie matériellement que votre câble Ethernet qui vient de votre FAIbox est connecté sur le port 0, et celui qui va vers votre réseau Lan est connecté sur le port 1.\nIl peut être intéressant de faire en sorte que sur votre routeur :\nle port par défaut dédié à LAN soit le port 0 le port dédié à WAN soit le dernier port disponible. InfoJe prend pour contexte celui du routeur Ubiquity EdgeRouter X . Adaptez à votre routeur… :p Configuration LuCI Si l\u0026rsquo;interface d\u0026rsquo;administration LuCI est installée, allez dans le menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Switch\u0026rsquo;.\nConcernant le premier VLAN : mettre LAN4 sur off sur le deuxième VLAN : positionner LAN4 sur untagged. Réseau Le fichier de configuration aura cette aspect :\n$ cat /etc/config/network (…) config switch_vlan option device \u0026#39;switch0\u0026#39; option vlan \u0026#39;1\u0026#39; option ports \u0026#39;0 1 2 3 6t\u0026#39; config switch_vlan option device \u0026#39;switch0\u0026#39; option vlan \u0026#39;2\u0026#39; option ports \u0026#39;4 6t\u0026#39; (…) Services Il faudra redémarrer le service network et recharger le service firewall.\n# /etc/init.d/network restart # /etc/init.d/firewall reload\nPuis connecter les cables Ethernet pour :\nle réseau LAN sur le port 0 vers votre FAIBox, sur le port 4. Et, voilà !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePar défaut, \u003cstrong\u003eWAN\u003c/strong\u003e est sur le port \u003cstrong\u003e0\u003c/strong\u003e et \u003cstrong\u003eLAN\u003c/strong\u003e accessible sur les autres\nports, le port \u003cstrong\u003e1\u003c/strong\u003e étant celui par défaut. Ce qui signifie matériellement que\nvotre câble Ethernet qui vient de votre FAIbox est connecté sur le port 0, et\ncelui qui va vers votre réseau Lan est connecté sur le port 1.\u003c/p\u003e\n\u003cp\u003eIl peut être intéressant de faire en sorte que sur votre routeur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele port par défaut dédié à \u003cstrong\u003eLAN\u003c/strong\u003e soit le port \u003cstrong\u003e0\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003ele port dédié à \u003cstrong\u003eWAN\u003c/strong\u003e soit le dernier port disponible.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eJe prend pour contexte celui du routeur\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/ubiquiti-edgerouteur-x/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eUbiquity EdgeRouter X\u003c/a\u003e\n. \u003cbr\u003e\nAdaptez à votre routeur… :p\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"luci\"\u003eLuCI\u003c/h3\u003e\n\u003cp\u003eSi l\u0026rsquo;interface d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e est installée, allez dans le menu\n\u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Switch\u0026rsquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConcernant le premier VLAN : mettre \u003cstrong\u003eLAN4\u003c/strong\u003e sur \u003ccode\u003eoff\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esur le deuxième VLAN : positionner \u003cstrong\u003eLAN4\u003c/strong\u003e sur \u003ccode\u003euntagged\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"réseau\"\u003eRéseau\u003c/h3\u003e\n\u003cp\u003eLe fichier de configuration aura cette aspect :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e$ cat /etc/config/network\n(…)\nconfig switch_vlan\n    option device \u0026#39;switch0\u0026#39;\n    option vlan \u0026#39;1\u0026#39;\n    option ports \u0026#39;0 1 2 3 6t\u0026#39;\n\nconfig switch_vlan\n    option device \u0026#39;switch0\u0026#39;\n    option vlan \u0026#39;2\u0026#39;\n    option ports \u0026#39;4 6t\u0026#39;\n(…)\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"services\"\u003eServices\u003c/h2\u003e\n\u003cp\u003eIl faudra redémarrer le service \u003ccode\u003enetwork\u003c/code\u003e et recharger le service \u003ccode\u003efirewall\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# /etc/init.d/network restart\u003c/code\u003e \u003cbr\u003e\n\u003ccode\u003e# /etc/init.d/firewall reload\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis connecter les cables Ethernet pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele réseau LAN sur le port 0\u003c/li\u003e\n\u003cli\u003evers votre FAIBox, sur le port 4.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt, voilà !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "OpenWRT : comment basculer les interfaces LAN et WAN pour un résultat physique plus logique. LAN : port 0 ; WAN : dernier port !",
            "tags": ["OpenWRT", "switch", "astuce"],
            "date_published": "2020-02-29T20:03:21+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:a15243ac-c81c-540e-155f-ada67aeb977f",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/ubiquiti-edgerouter-x/",
            "title": "OpenWRT : Ubiquiti EdgeRouter X",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Le routeur EdgeRouter X fait partie de la gamme EdgeMax des produits fabriqués par la société Ubiquiti. C\u0026rsquo;est un routeur 5 ports Gigabits, sans Wifi.\nCet article a pour propos de montrer l\u0026rsquo;installation d\u0026rsquo;OpenWRT sur ce petit routeur.\nOpenWRT : v19.07.1 Documentations https://openwrt.org/toh/ubiquiti/edgerouter_x_er-x_ka https://forum.openwrt.org/t/ubiquiti-edgerouter-x-loading-openwrt-and-performance-numbers/27470 https://openwrt.org/docs/guide-user/services/webserver/http.uhttpd Documentations tierces En apprendre un peu plus sur OpenWRT Ubiquiti :: firmware officiel Réseau_local_virtuel WP Installation Actuellement, l\u0026rsquo;installation du firmware peut se faire depuis une console SSH. (si vous souhaitez la faire par TFTP, lisez cet article - en anglais -)\nRecommandations Par défaut le routeur est fourni avec EdgeOS ; le compte est ubnt.\nVeillez à :\nvous connecter sur le port 1 ; avoir une adresse IP dans le segment réseau privé de classe C, à savoir 192.168.1.x. En effet, le routeur a pour défaut l\u0026rsquo;adresse IP*(v4)* : 192.168.1.1. Faux départ En premier lieu, téléchargeons le firmware :\n:$ ftp http://downloads.openwrt.org/releases/19.07.1/targets/ramips/mt7621/openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin Trying 2a01:4f8:150:6449::2... Requesting http://downloads.openwrt.org/releases/19.07.1/targets/ramips/mt7621/openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin 100% |************************************************************************************************************************************************************************************************************| 3461 KB 00:04 3545054 bytes received in 4.55 seconds (761.55 KB/s) Et, envoie sur le routeur en SSH : :$ scp openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin ubnt@192.168.1.1:/tmp\npuis on se connecte en SSH au routeur :\n:$ ssh ubnt@192.168.1.1 ubnt@ubnt:/$ cd tmp ubnt@ubnt:/tmp$ add system image openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin Checking upgrade image...Upgrade image does not support the device. Upgrade failed. /tmp :$ C\u0026rsquo;est (mal?)heureusement un problème connu et identifié sur le forum d\u0026rsquo;OpenWRT. L\u0026rsquo;explication étant que le noyau fourni est trop gros.\nIl nous faut télécharger la version fournie par cet autre initiative.\nTéléchargement AstuceIl est possible de faire directement le téléchargement du firmware depuis le routeur après s\u0026rsquo;être déplacé dans le répertoire /tmp. Téléchargeons le premier firmware :\n:$ ftp https://downloads.opennet-initiative.de/ubnt/edgeos/openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar Trying 2001:638:804:2228:216:3eff:fe76:4703... Requesting https://downloads.opennet-initiative.de/ubnt/edgeos/openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar 100% |************************************************************************************************************************************************************************************************************| 2890 KB 00:03 2959360 bytes received in 3.85 seconds (749.99 KB/s) On l\u0026rsquo;envoie sur le routeur en SSH, puis on s\u0026rsquo;y connecte pour l\u0026rsquo;installer :\n:$ scp openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar ubnt@192.168.1.1:/tmp ubnt@ubnt:/$ cd tmp ubnt@ubnt:/tmp$ add system image openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar Checking upgrade image...Done Preparing to upgrade...Done Copying upgrade image.../usr/bin/ubnt-upgrade: line 569: [: too many arguments Done Removing old image...Done Checking upgrade image...Done Copying config data...Done Finishing upgrade...Done Upgrade completed show system image The system currently has the following image(s) installed: … (default boot) v1.9.7+hotfix.3.5013617.170830.0227 (running image) #A reboot is needed to boot default image, which is now are custom OpenWRT Il est maintenant nécessaire de redémarrer le routeur :\n:# reboot Proceed with reboot? [confirm]y #Reboot time was rather fast. Less then 1m. Une minute plus tard, il est normalement possible de se connecter en SSH au routeur, mais cette fois-ci avec l\u0026rsquo;identifiant root.\nDans l\u0026rsquo;état, la version du firmware est minimaliste, sans aucune interface d'administration web . Il faut connaître les méandres du système et tout configurer à la main - ce qui peut devenir très vite délicat et dangereux.\nLe port 0 du routeur est le port dédié au traffic WAN (World Area Network) , et les autres, à minima au traffic LAN (Local Area Network) . En suite, il est préférable d\u0026rsquo;installer l\u0026rsquo;image plus complète du firmware OpenWRT - et de répéter le processus d\u0026rsquo;installation, cela vous permettra entres autres d\u0026rsquo;avoir l\u0026rsquo;interface web d\u0026rsquo;administration LuCI.\nConfiguration Peut-être apprécierez-vous de savoir comment :\nsécuriser l\u0026#39;accès web par SSH créer un nouvel utilisateur pour avoir un accès sécurisé Peut-être apprécierez-vous l\u0026rsquo;astuce suivante :\nOpenWRT : opkg upgrade (astuce) OpenWRT: Switch LAN WAN (astuce) Pour le mettre à jour correctement, ça se passe là :\nOpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade) Notes Parefeu AttentionDans la section Routing/NAT Offloading, depuis la version 19.07.x, bien que la fonction expérimentale \u0026lsquo;Software flow offloading\u0026rsquo; ne pose pas problème, la fonctionnalité expérimentale \u0026lsquo;Hardware flow offloading\u0026rsquo; ne fonctionne plus correctement - ce qui a pour conséquence de bloquer tout traffic. Celle-ci semble à nouveau fonctionner depuis la version 19.07.7, sinon basculer vers l\u0026rsquo;ancienne version 18.06 ! ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe routeur \u003cstrong\u003e\u003ca href=\"https://www.ui.com/edgemax/edgerouter-x/\" rel=\"external\"\u003eEdgeRouter X\u003c/a\u003e\u003c/strong\u003e fait partie de la gamme \u003cstrong\u003eEdgeMax\u003c/strong\u003e des produits\nfabriqués par la société \u003cstrong\u003e\u003ca href=\"https://www.ui.com\" rel=\"external\"\u003eUbiquiti\u003c/a\u003e\u003c/strong\u003e. C\u0026rsquo;est un routeur 5 ports Gigabits,\nsans Wifi.\u003c/p\u003e\n\u003cp\u003eCet article a pour propos de montrer l\u0026rsquo;installation d\u0026rsquo;OpenWRT sur ce petit routeur.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenWRT : v19.07.1\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/toh/ubiquiti/edgerouter_x_er-x_ka\" rel=\"external\"\u003ehttps://openwrt.org/toh/ubiquiti/edgerouter_x_er-x_ka\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://forum.openwrt.org/t/ubiquiti-edgerouter-x-loading-openwrt-and-performance-numbers/27470\" rel=\"external\"\u003ehttps://forum.openwrt.org/t/ubiquiti-edgerouter-x-loading-openwrt-and-performance-numbers/27470\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/services/webserver/http.uhttpd\" rel=\"external\"\u003ehttps://openwrt.org/docs/guide-user/services/webserver/http.uhttpd\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"documentations-tierces\"\u003eDocumentations tierces\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eEn apprendre un peu plus sur \n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/about/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Présentation du projet'\"\u003eOpenWRT\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.ui.com/download/edgemax/edgerouter-x\" rel=\"external\"\u003eUbiquiti :: firmware officiel\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/R%c3%a9seau_local_virtuel\" title=\"Article Wikipédia : Réseau_local_virtuel\"\u003eRéseau_local_virtuel \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eActuellement, l\u0026rsquo;installation du firmware peut se faire depuis une console SSH. \u003cbr\u003e\n\u003cem\u003e(si vous souhaitez la faire par TFTP, lisez cet \u003ca href=\"http://sector5d.org/openwrt-on-the-ubiquiti-edgerouter-x.html\" rel=\"external\"\u003earticle\u003c/a\u003e - en anglais -)\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"recommandations\"\u003eRecommandations\u003c/h3\u003e\n\u003cp\u003ePar défaut le routeur est fourni avec EdgeOS ; le compte est \u003cstrong\u003eubnt\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eVeillez à :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003evous connecter sur le port 1 ;\u003c/li\u003e\n\u003cli\u003eavoir une adresse IP dans le segment réseau privé de classe C, à savoir 192.168.1.x.\nEn effet, le routeur a pour défaut l\u0026rsquo;adresse IP*(v4)* : 192.168.1.1.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"faux-départ\"\u003eFaux départ\u003c/h3\u003e\n\u003cp\u003eEn premier lieu, téléchargeons le firmware :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ftp http://downloads.openwrt.org/releases/19.07.1/targets/ramips/mt7621/openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 2a01:4f8:150:6449::2...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRequesting http://downloads.openwrt.org/releases/19.07.1/targets/ramips/mt7621/openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e100% |************************************************************************************************************************************************************************************************************|  \u003cspan style=\"color:#f99b15\"\u003e3461\u003c/span\u003e KB    00:04\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e3545054\u003c/span\u003e bytes received in 4.55 seconds \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e761.55 KB/s\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, envoie sur le routeur en SSH : \u003cbr\u003e\n\u003ccode\u003e:$ scp openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin ubnt@192.168.1.1:/tmp\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003epuis on se connecte en SSH au routeur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ssh ubnt@192.168.1.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eubnt@ubnt:/$ cd tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eubnt@ubnt:/tmp$ add system image openwrt-19.07.1-ramips-mt7621-ubnt-erx-initramfs-kernel.bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking upgrade image...Upgrade image does not support the device. Upgrade failed.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eC\u0026rsquo;est (mal?)heureusement un \u003ca href=\"https://forum.openwrt.org/t/ubiquiti-edgerouter-x-unable-to-create-initramfs-factory-tar/39739/4\" rel=\"external\"\u003eproblème connu\u003c/a\u003e et identifié sur le forum d\u0026rsquo;OpenWRT.\nL\u0026rsquo;explication étant que le noyau fourni est trop gros.\u003c/p\u003e\n\u003cp\u003eIl nous faut télécharger la version fournie par cet autre \u003ca href=\"https://wiki.opennet-initiative.de/wiki/Ubiquiti_EdgeRouter\" rel=\"external\"\u003einitiative\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"téléchargement\"\u003eTéléchargement\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eIl est possible de faire directement le téléchargement du firmware\ndepuis le routeur après s\u0026rsquo;être déplacé dans le répertoire \u003ccode\u003e/tmp\u003c/code\u003e.\u003c/div\u003e\n\n\u003cp\u003eTéléchargeons le premier firmware :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ftp https://downloads.opennet-initiative.de/ubnt/edgeos/openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 2001:638:804:2228:216:3eff:fe76:4703...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRequesting https://downloads.opennet-initiative.de/ubnt/edgeos/openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e100% |************************************************************************************************************************************************************************************************************|  \u003cspan style=\"color:#f99b15\"\u003e2890\u003c/span\u003e KB    00:03\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e2959360\u003c/span\u003e bytes received in 3.85 seconds \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e749.99 KB/s\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn l\u0026rsquo;envoie sur le routeur en SSH, puis on s\u0026rsquo;y connecte pour l\u0026rsquo;installer :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ scp openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar ubnt@192.168.1.1:/tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eubnt@ubnt:/$ cd tmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eubnt@ubnt:/tmp$ add system image openwrt-ramips-mt7621-ubnt-erx-initramfs-factory.tar\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Checking upgrade image...Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Preparing to upgrade...Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Copying upgrade image.../usr/bin/ubnt-upgrade: line 569: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e: too many arguments\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Removing old image...Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Checking upgrade image...Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Copying config data...Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Finishing upgrade...Done\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Upgrade completed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eshow system image\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   The system currently has the following image\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e installed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   …                 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003edefault boot\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   v1.9.7+hotfix.3.5013617.170830.0227 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003erunning image\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#A reboot is needed to boot default image, which is now are custom OpenWRT\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est maintenant nécessaire de redémarrer le routeur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# reboot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Proceed with reboot? \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003econfirm\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003ey\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#Reboot time was rather fast.  Less then 1m.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUne minute plus tard, il est normalement possible de se connecter en SSH au routeur,\nmais cette fois-ci avec l\u0026rsquo;identifiant \u003cstrong\u003eroot\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eDans l\u0026rsquo;état, la version du firmware est minimaliste, sans aucune\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/about/#install-luci\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Présentation du projet'\"\u003einterface d'administration web\u003c/a\u003e\n.\nIl faut \u003ca class=\"inside\" href=\"/fr/sys/openwrt/about/#description\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Présentation du projet'\"\u003econnaître les méandres du système\u003c/a\u003e\n\net tout configurer à la main - \u003cbr\u003e\n\u003cem\u003ece qui peut devenir très vite délicat et dangereux\u003c/em\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLe port 0 du routeur est le port dédié au traffic \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eWAN \u003cem\u003e(World Area Network)\u003c/em\u003e\u003c/span\u003e\n\n, et les\nautres, à minima au traffic \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eLAN \u003cem\u003e(Local Area Network)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEn suite, il est préférable d\u0026rsquo;installer l\u0026rsquo;\u003ca href=\"http://downloads.openwrt.org/releases/19.07.0/targets/ramips/mt7621/openwrt-19.07.0-ramips-mt7621-ubnt-erx-squashfs-sysupgrade.tar\" rel=\"external\"\u003eimage plus complète du firmware OpenWRT\u003c/a\u003e -\net de répéter le \u003ca href=\"/fr/sys/openwrt/ubiquiti-edgerouter-x/#téléchargement\"\u003eprocessus d\u0026rsquo;installation\u003c/a\u003e, cela\nvous permettra entres autres d\u0026rsquo;avoir l\u0026rsquo;interface web d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePeut-être apprécierez-vous de savoir comment :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/ssh/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003esécuriser l\u0026#39;accès web par SSH\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/sudo/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : sudo'\"\u003ecréer un nouvel utilisateur pour avoir un accès sécurisé\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePeut-être apprécierez-vous l\u0026rsquo;astuce suivante :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/opkg-upgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : opkg upgrade (astuce)'\"\u003eOpenWRT : opkg upgrade (astuce)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/switch-lan-wan/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT: Switch LAN WAN (astuce)'\"\u003eOpenWRT: Switch LAN WAN (astuce)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour le mettre à jour correctement, ça se passe là :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/sysupgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)'\"\u003eOpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)\u003c/a\u003e\n\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"notes\"\u003eNotes\u003c/h2\u003e\n\u003ch3 id=\"parefeu\"\u003eParefeu\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eDans la section \u003cstrong\u003eRouting/NAT Offloading\u003c/strong\u003e, depuis la version 19.07.x, bien que\nla fonction expérimentale \u0026lsquo;Software flow offloading\u0026rsquo; ne pose pas problème, la\nfonctionnalité expérimentale \u0026lsquo;Hardware flow offloading\u0026rsquo; ne fonctionne plus\ncorrectement - ce qui a pour conséquence de bloquer tout traffic. \u003cbr\u003e\nCelle-ci semble à nouveau fonctionner depuis la version 19.07.7, sinon\nbasculer vers l\u0026rsquo;ancienne version 18.06 !\u003c/div\u003e\n\n\u003chr\u003e\n\u003chr\u003e\n",
            "summary": "Installation et configuration d'OpenWRT sur un routeur Ubiquiti EdgeMax EdgeRouter X, par connexion SSH.",
            "tags": ["OpenWRT", "Ubiquiti", "routeur", "EdgeRouter"],
            "date_published": "2020-02-29T14:15:12+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:e2200d6c-635f-4b15-3422-2499de39af3a",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/ssh-tunnel/",
            "title": "OpenWRT : Tunnel SSH pour LuCI",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Abordons l\u0026rsquo;aspect de connexion SSH (Secure SHell) dans OpenWRT pour sécuriser l\u0026rsquo;accès à l\u0026rsquo;interface d\u0026rsquo;administration LuCI.\nInfoMerci de vous référez à mon article à-propos d\u0026rsquo;OpenWRT\nqui restitue quelques notions intéressantes à-propos du serveur SSH, de certains paramétrages clients nécessaires à faire, etc.\nConfiguration Tunnel SSH Par défaut, l\u0026rsquo;interface web LuCI n\u0026rsquo;est disponible QUE sur le protocole HTTP (HyperText Transfer Protocol) , et en plus à l\u0026rsquo;écoute partout ET sur toutes les interfaces !\nUne manière de protéger est de rediriger le flux web vers l\u0026rsquo;interface locale de bouclage puis dans un tunnel SSH.\nAprés s\u0026rsquo;être connecté en SSH à votre routeur OpenWRT :\nEn premier lieu, sur OpenWRT, il nous faut reconfigurer le serveur web uhttpd, pour lui dire de n\u0026rsquo;écouter QUE localement sur le port 80. Donc, éditez le fichier de configuration du serveur web /etc/config/uhttpd pour : mettre en commentaire les deux lignes : list listen_http 0.0.0.0:80 et list listen_https 0.0.0.0:443 ; ajoutez en début de ligne le symbole #. puis ajoutez : list listen_http 127.0.0.1:80\n(et si vous voulez interrogez localhost sur IPv6 : list listen_http [::1]:80) redémarrez le service web : /etc/init.d/uhttpd restart vérifiez que le service web n\u0026rsquo;écoute bien que le port 80 sur l\u0026rsquo;interface locale : $ netstat -ant | grep -E \u0026#34;:80\u0026#34; tcp 0 0 127.0.0.1:80 0.0.0.0:* LISTEN tcp 0 0 ::1:80 :::* LISTEN Ensuite, la commande par défaut pour encapsuler dans SSH, du côté de votre client SSH est :\nssh -L 127.0.0.1:8080:127.0.0.1:80 -p 22 id@ip-routeur\nOù : -p 22 est le numéro du port d\u0026rsquo;écoute par défaut du serveur SSH - par défaut, il n\u0026rsquo;est même pas nécessaire de l\u0026rsquo;écrire : si vous l\u0026rsquo;avez changé dans l\u0026rsquo;administration, pensez à le modifier ici, aussi ! id est l\u0026rsquo;identifiant de votre nouvel utilisateur . ip-routeur est bien sûr l\u0026rsquo;adresse IP(v4), côté LAN, de votre routeur OpenWRT ! Voici un exemple de configuration de votre fichier de config SSH du côté de votre client : Host luciweb Ciphers aes256-ctr Hostname 192.168.1.1 IdentityFile ~/.ssh/id_rsa LocalForward 127.0.0.1:8080 127.0.0.1:80 MACs hmac-sha2-256 Port 22 User identifiant Ainsi, vous n\u0026rsquo;aurez plus qu\u0026rsquo;à exécuter ainsi : $ ssh luciweb\nPour finir, dans votre navigateur web, écrivez l\u0026rsquo;URL suivante : localhost:8080 Voilà !\nShell Le fichier de configuration est situé dans : /etc/config/dropbear Le service de dropbear est lui accessible : /etc/init.d/dropbear. Dépannage Error: no matching cipher found. Their offer: aes128-ctr,aes256-ctr Le serveur SSH dropbear n\u0026rsquo;est pas capable de gérer des chiffrements forts autres que ceux restitués dans le message d\u0026rsquo;erreur.\nAjoutez à votre configuration client SSH : Ciphers aes256-ctr\nError: no matching host key type found. Their offer: ssh-rsa Le serveur SSH dropbear n\u0026rsquo;est pas capable de gérer des clés d\u0026rsquo;hôtes plus fortes autres que celles restituées dans le message d\u0026rsquo;erreur.\nAjoutez à votre configuration client SSH : HostKeyAlgorithms ssh-rsa\nError: no matching MAC found. Their offer: hmac-sha1,hmac-sha2-256 Le serveur SSH dropbear n\u0026rsquo;est pas capable de gérer des algorithmes forts, pour les MAC , autres que ceux restitués dans le message d\u0026rsquo;erreur.\nAjoutez à votre configuration client SSH : MACs hmac-sha2-256\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eAbordons l\u0026rsquo;aspect de connexion \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSSH \u003cem\u003e(Secure SHell)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n dans OpenWRT\npour sécuriser l\u0026rsquo;accès à l\u0026rsquo;interface d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eMerci de vous référez à mon article \u003ca class=\"inside\" href=\"/fr/sys/openwrt/about/#ssh\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Présentation du projet'\"\u003eà-propos d\u0026rsquo;OpenWRT\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003equi restitue quelques notions intéressantes à-propos du serveur SSH, de certains\nparamétrages clients nécessaires à faire, etc.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"tunnel-ssh\"\u003eTunnel SSH\u003c/h3\u003e\n\u003cp\u003ePar défaut, l\u0026rsquo;interface web LuCI n\u0026rsquo;est disponible QUE sur le protocole\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eHTTP \u003cem\u003e(HyperText Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, et en plus à l\u0026rsquo;écoute partout ET sur toutes les interfaces !\u003c/p\u003e\n\u003cp\u003eUne manière de protéger est de rediriger le flux web vers l\u0026rsquo;interface locale\nde bouclage puis dans un tunnel SSH.\u003c/p\u003e\n\u003cp\u003eAprés s\u0026rsquo;être connecté en SSH à votre routeur OpenWRT :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eEn premier lieu, sur OpenWRT, il nous faut reconfigurer le serveur web\n\u003cstrong\u003euhttpd\u003c/strong\u003e, pour lui dire de n\u0026rsquo;écouter QUE localement sur le port 80.\nDonc, éditez le fichier de configuration du serveur web \u003ccode\u003e/etc/config/uhttpd\u003c/code\u003e\npour :\n\u003cul\u003e\n\u003cli\u003emettre en commentaire les deux lignes : \u003ccode\u003elist listen_http 0.0.0.0:80\u003c/code\u003e\net \u003ccode\u003elist listen_https   0.0.0.0:443\u003c/code\u003e ; ajoutez en début de ligne\nle symbole \u003ccode\u003e#\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003epuis ajoutez : \u003ccode\u003elist listen_http  127.0.0.1:80\u003c/code\u003e\u003cbr\u003e\n\u003cem\u003e(et si vous voulez interrogez localhost sur IPv6 : \u003ccode\u003elist listen_http [::1]:80\u003c/code\u003e)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eredémarrez le service web : \u003ccode\u003e/etc/init.d/uhttpd restart\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003evérifiez que le service web n\u0026rsquo;écoute bien que le port 80 sur l\u0026rsquo;interface\nlocale :\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ netstat -ant | grep -E \u003cspan style=\"color:#48b685\"\u003e\u0026#34;:80\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etcp        \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e 127.0.0.1:80            0.0.0.0:*               LISTEN\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etcp        \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ::1:80                  :::*                    LISTEN\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003col start=\"2\"\u003e\n\u003cli\u003eEnsuite, la commande par défaut pour encapsuler dans SSH, du côté de\nvotre client SSH est :\u003cbr\u003e\n\u003ccode\u003essh -L 127.0.0.1:8080:127.0.0.1:80 -p 22 id@ip-routeur\u003c/code\u003e\u003cbr\u003e\nOù :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-p 22\u003c/code\u003e est le numéro du port d\u0026rsquo;écoute par défaut du serveur SSH -\n\u003cem\u003epar défaut, il n\u0026rsquo;est même pas nécessaire de l\u0026rsquo;écrire : si vous\nl\u0026rsquo;avez changé dans l\u0026rsquo;administration, pensez à le modifier ici, aussi !\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eid\u003c/code\u003e est l\u0026rsquo;identifiant de votre \n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/sudo/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : sudo'\"\u003enouvel utilisateur\u003c/a\u003e\n.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eip-routeur\u003c/code\u003e est bien sûr l\u0026rsquo;adresse IP(v4), côté LAN, de votre routeur OpenWRT !\u003c/li\u003e\n\u003cli\u003eVoici un exemple de configuration de votre fichier de config SSH du\ncôté de votre client :\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHost luciweb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eCiphers aes256-ctr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eHostname 192.168.1.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eIdentityFile ~/.ssh/id_rsa\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eLocalForward 127.0.0.1:8080 127.0.0.1:80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eMACs hmac-sha2-256\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ePort 22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eUser identifiant\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi, vous n\u0026rsquo;aurez plus qu\u0026rsquo;à exécuter ainsi : \u003ccode\u003e$ ssh luciweb\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour finir, dans votre navigateur web, écrivez l\u0026rsquo;URL suivante : \u003ccode\u003elocalhost:8080\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoilà !\u003c/p\u003e\n\u003ch3 id=\"shell\"\u003eShell\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration est situé dans : \u003ccode\u003e/etc/config/dropbear\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLe service de \u003cstrong\u003edropbear\u003c/strong\u003e est lui accessible : \u003ccode\u003e/etc/init.d/dropbear\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"error-no-matching-cipher-found-their-offer-aes128-ctraes256-ctr\"\u003eError: no matching cipher found. Their offer: aes128-ctr,aes256-ctr\u003c/h3\u003e\n\u003cp\u003eLe serveur SSH \u003cstrong\u003edropbear\u003c/strong\u003e n\u0026rsquo;est pas capable de gérer des chiffrements\nforts autres que ceux restitués dans le message d\u0026rsquo;erreur.\u003c/p\u003e\n\u003cp\u003eAjoutez à votre configuration client SSH : \u003ccode\u003eCiphers aes256-ctr\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"error-no-matching-host-key-type-found-their-offer-ssh-rsa\"\u003eError: no matching host key type found. Their offer: ssh-rsa\u003c/h3\u003e\n\u003cp\u003eLe serveur SSH \u003cstrong\u003edropbear\u003c/strong\u003e n\u0026rsquo;est pas capable de gérer des clés d\u0026rsquo;hôtes\nplus fortes autres que celles restituées dans le message d\u0026rsquo;erreur.\u003c/p\u003e\n\u003cp\u003eAjoutez à votre configuration client SSH : \u003ccode\u003eHostKeyAlgorithms ssh-rsa\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"error-no-matching-mac-found-their-offer-hmac-sha1hmac-sha2-256\"\u003eError: no matching MAC found. Their offer: hmac-sha1,hmac-sha2-256\u003c/h3\u003e\n\u003cp\u003eLe serveur SSH \u003cstrong\u003edropbear\u003c/strong\u003e n\u0026rsquo;est pas capable de gérer des algorithmes\nforts, pour les \u003cabbr title=\"Message Authentication Code\"\u003eMAC\u003c/abbr\u003e\n, autres\nque ceux restitués dans le message d\u0026rsquo;erreur.\u003c/p\u003e\n\u003cp\u003eAjoutez à votre configuration client SSH : \u003ccode\u003eMACs hmac-sha2-256\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Paramétrer OpenWRT pour permettre une connexion sécurisée par SSH à l'interface d'administration LuCI",
            "tags": ["OpenWRT", "SSH", "tunnel"],
            "date_published": "2020-02-26T15:44:44+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:2d002ab7-92ba-165b-0342-33cb962884a2",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/sudo/",
            "title": "OpenWRT : sudo",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Par défaut, OpenWRT est livré avec un seul compte, celui de l\u0026rsquo;administrateur root.\nNous allons créer un nouvel utilisateur sans privilège particulier qui aura le droit d\u0026rsquo;administrer le système par le biais de l\u0026rsquo;utilitaire sudo.\nInstallation En tant que root, exécutons les commandes d\u0026rsquo;installation suivantes :\n# opkg update # opkg install shadow-useradd sudo AstuceIl est possible d\u0026rsquo;installer aussi le paquet shadow-usermod qui permettra au besoin de modifier tout paramètre lié au compte utilisateur. Configuration configuration utilisateur Maintenant, configurons le compte utilisateur :\n# u=username où username est le nom d\u0026rsquo;utilisateur choisi - à vous de paramètrer à votre convenance… # useradd \u0026quot;${u}\u0026quot; # passwd \u0026quot;${u}\u0026quot; : afin de définir le mot-de-passe lié à l\u0026rsquo;utilisateur # mkdir -p /home/\u0026quot;${u}\u0026quot;/.ssh : pour créer le répertoire home principal, ainsi que le sous-répertoire .ssh qui pourra servir plus tard. # touch /home/\u0026quot;${u}\u0026quot;/.ssh/authorized_keys : créer le fichier vide nécessaire pour y copier les clés SSH publiques. # chown -R \u0026quot;${u}\u0026quot;:\u0026quot;${u}\u0026quot; /home/\u0026quot;${u}\u0026quot; : pour donner les droits d\u0026rsquo;utilisateurs sur son home. # chmod 0700 /home/\u0026quot;${u}\u0026quot; : pour n\u0026rsquo;autoriser que cet utilisateur dans son home. configuration sudo Je ne parlerais que de la méthode la plus sécurisée de configuration de sudo. Cette méthode permet de n\u0026rsquo;avoir qu\u0026rsquo;à utiliser le mot de passe de l\u0026rsquo;administrateur sans avoir à se connecter avec le compte administrateur. Une fois, connecté avec votre compte utilisateur, lors des besoins d\u0026rsquo;administration, il faudra précéder de la commande sudo toute autre commande nécessaire.\nAvec l\u0026rsquo;utilitaire visudo, nous allons éditer le fichier adéquate /etc/sudoers.\n# visudo\nPuis dirigez vous vers la fin du fichier pour décommenter les deux lignes suivantes, en supprimant le symbole # :\n# Defaults targetpw # Ask for the password of the target user # ALL ALL=(ALL) ALL # WARNING: only use this together with \u0026#39;Defaults targetpw\u0026#39; AstucePour ceux qui ne savent pas comment enregistrer avec l\u0026rsquo;éditeur visudo : tapez :wq! une fois que vous avez modifié le fichier afin d\u0026rsquo;écrire celui-ci et de quitter l\u0026rsquo;éditeur. Une fois l\u0026rsquo;écriture validée, il sera permis à votre utilisateur ego d\u0026rsquo;utiliser toute commande d\u0026rsquo;administration, telle que décrit ci-dessus.\nconfiguration ssh Profitez de ce moment particulier pour mettre votre clé d'authentification ssh , dans le fichier /home/ego/.ssh/authorized_keys.\nAttentionAssurez-vous de bien copier votre clé publique ! configuration sauvegarde système Pensez à éditer le fichier /etc/sysupgrade.conf afin d\u0026rsquo;ajouter :\nle répertoire home de votre utilisateur, /etc/sudoers.d/ (seulement si vous faites des ajouts dans ce répertoire) puis vérifier avec la commande sysupgrade -l que le répertoire est bien inclus.\nAinsi lors de votre futur mise à niveau d\u0026rsquo;OpenWRT, vos données personnelles seront sauvegardées !\nDocumentation https://openwrt.org/docs/guide-user/security/secure.access#create_a_non-privileged_user_in_openwrt ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePar défaut, OpenWRT est livré avec un seul compte, celui de l\u0026rsquo;administrateur \u003ccode\u003eroot\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eNous allons créer un nouvel utilisateur sans privilège particulier qui\naura le droit d\u0026rsquo;administrer le système par le biais de l\u0026rsquo;utilitaire \u003ccode\u003esudo\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eEn tant que \u003cstrong\u003eroot\u003c/strong\u003e, exécutons les commandes d\u0026rsquo;installation suivantes :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-ash\" data-lang=\"ash\"\u003e# opkg update\n# opkg install shadow-useradd sudo\n\u003c/code\u003e\u003c/pre\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eIl est possible d\u0026rsquo;installer aussi le paquet \u003ccode\u003eshadow-usermod\u003c/code\u003e qui permettra\nau besoin de modifier tout paramètre lié au compte utilisateur.\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"configuration-utilisateur\"\u003econfiguration utilisateur\u003c/h3\u003e\n\u003cp\u003eMaintenant, configurons le compte utilisateur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e# u=username\u003c/code\u003e où \u003ccode\u003eusername\u003c/code\u003e est le nom d\u0026rsquo;utilisateur choisi -\n\u003cem\u003eà vous de paramètrer à votre convenance…\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e# useradd \u0026quot;${u}\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e# passwd \u0026quot;${u}\u0026quot;\u003c/code\u003e : afin de définir le mot-de-passe lié à l\u0026rsquo;utilisateur\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e# mkdir -p /home/\u0026quot;${u}\u0026quot;/.ssh\u003c/code\u003e : pour créer le répertoire home principal,\nainsi que le sous-répertoire \u003ccode\u003e.ssh\u003c/code\u003e qui pourra servir plus tard.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e# touch /home/\u0026quot;${u}\u0026quot;/.ssh/authorized_keys\u003c/code\u003e : créer le fichier vide nécessaire\npour y copier les clés SSH publiques.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e# chown -R \u0026quot;${u}\u0026quot;:\u0026quot;${u}\u0026quot; /home/\u0026quot;${u}\u0026quot;\u003c/code\u003e : pour donner les droits d\u0026rsquo;utilisateurs\nsur son home.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e# chmod 0700 /home/\u0026quot;${u}\u0026quot;\u003c/code\u003e : pour n\u0026rsquo;autoriser que cet utilisateur dans son home.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"configuration-sudo\"\u003econfiguration sudo\u003c/h3\u003e\n\u003cp\u003eJe ne parlerais que de la méthode la plus sécurisée de configuration de \u003ccode\u003esudo\u003c/code\u003e. \u003cbr\u003e\nCette méthode permet de n\u0026rsquo;avoir qu\u0026rsquo;à utiliser le mot de passe de l\u0026rsquo;administrateur\nsans avoir à se connecter avec le compte administrateur.\nUne fois, connecté avec votre compte utilisateur, lors des besoins d\u0026rsquo;administration,\nil faudra précéder de la commande \u003ccode\u003esudo\u003c/code\u003e toute autre commande nécessaire.\u003c/p\u003e\n\u003cp\u003eAvec l\u0026rsquo;utilitaire \u003ccode\u003evisudo\u003c/code\u003e, nous allons éditer le fichier adéquate \u003ccode\u003e/etc/sudoers\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# visudo\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis dirigez vous vers la fin du fichier pour décommenter les deux lignes\nsuivantes, en supprimant le symbole \u003ccode\u003e#\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Defaults targetpw  # Ask for the password of the target user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ALL ALL=(ALL) ALL  # WARNING: only use this together with \u0026#39;Defaults targetpw\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003ePour ceux qui ne savent pas comment enregistrer avec l\u0026rsquo;éditeur \u003cstrong\u003evisudo\u003c/strong\u003e :\ntapez \u003ccode\u003e:wq!\u003c/code\u003e une fois que vous avez modifié le fichier afin d\u0026rsquo;écrire celui-ci\net de quitter l\u0026rsquo;éditeur.\u003c/div\u003e\n\n\u003cp\u003eUne fois l\u0026rsquo;écriture validée, il sera permis à votre utilisateur \u003ccode\u003eego\u003c/code\u003e d\u0026rsquo;utiliser\ntoute commande d\u0026rsquo;administration, telle que décrit ci-dessus.\u003c/p\u003e\n\u003ch3 id=\"configuration-ssh\"\u003econfiguration ssh\u003c/h3\u003e\n\u003cp\u003eProfitez de ce moment particulier pour mettre votre \u003ca class=\"inside\" href=\"/fr/sec/ssh/configuration-securisee/#nouvelle-cl%c3%a9-rsa--pkbdf\" title=\"Lien interne vers l\u0026#39;article : 'SSH : Configuration Sécurisée'\"\u003eclé d'authentification ssh\u003c/a\u003e\n,\ndans le fichier \u003ccode\u003e/home/ego/.ssh/authorized_keys\u003c/code\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eAssurez-vous de bien copier votre clé publique !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch3 id=\"configuration-sauvegarde-système\"\u003econfiguration sauvegarde système\u003c/h3\u003e\n\u003cp\u003ePensez à éditer le fichier \u003ccode\u003e/etc/sysupgrade.conf\u003c/code\u003e afin d\u0026rsquo;ajouter :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele répertoire home de votre utilisateur,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/sudoers.d/\u003c/code\u003e \u003cem\u003e(seulement si vous faites des ajouts dans ce répertoire)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003epuis vérifier avec la commande \u003ccode\u003esysupgrade -l\u003c/code\u003e que le répertoire est bien inclus.\u003c/p\u003e\n\u003cp\u003eAinsi lors de votre futur \n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/sysupgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)'\"\u003emise à niveau\u003c/a\u003e\n\nd\u0026rsquo;OpenWRT, vos données personnelles seront sauvegardées !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://openwrt.org/docs/guide-user/security/secure.access#create_a_non-privileged_user_in_openwrt\" rel=\"external\"\u003ehttps://openwrt.org/docs/guide-user/security/secure.access#create_a_non-privileged_user_in_openwrt\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment créer un utilisateur non privilégié, lui permettre d'avoir temporairement des droits privilégiés par le biais de sudo !?",
            "tags": ["OpenWRT", "sudo", "sysadmin"],
            "date_published": "2020-02-24T19:41:07+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:733f7407-6e28-3fe1-dce1-dfcf635484a8",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/opkg-upgrade/",
            "title": "OpenWRT : opkg upgrade (astuce)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenWRT a pour gestionnaire de paquet l\u0026rsquo;outil opkg.\nPour mettre à jour la liste des différents paquets, il n\u0026rsquo;est pas prévu de mettre à jour facilement ceux-ci en une seule ligne de commande, bien que l\u0026rsquo;option upgrade existe.\nDangerATTENTION : L\u0026rsquo;utilisation de l\u0026rsquo;option upgrade est hautement découragée. Pour comprendre la raison, merci de lire la page du wiki à ce propos ! Voici l\u0026rsquo;astuce :\n# for name in `opkg list-upgradable | awk \u0026#39;{print $1}\u0026#39;`; do opkg upgrade \u0026#34;${name}\u0026#34;; done Ou si comme moi, vous avez créé un utilisateur qui a le droit d\u0026rsquo;utiliser la commande sudo, faites simplement :\n$ for name in `sudo opkg list-upgradable | awk \u0026#39;{print $1}\u0026#39;`; do sudo opkg upgrade \u0026#34;${name}\u0026#34;; done Script Un petit scrip shell nommé opkgupgrade.sh :\n#!/bin/sh sudo opkg update for name in `sudo opkg list-upgradable | awk \u0026#39;{print $1}\u0026#39;`; do sudo opkg upgrade \u0026#34;${name}\u0026#34;; done Il n\u0026rsquo;y a plus qu\u0026rsquo;à l\u0026rsquo;appeler : \u0026lt;\n$ ./opkgupgrade.sh\nEt voilà !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOpenWRT a pour gestionnaire de paquet l\u0026rsquo;outil \u003ccode\u003eopkg\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour mettre à jour la liste des différents paquets, il n\u0026rsquo;est pas prévu de mettre\nà jour facilement ceux-ci en une seule ligne de commande, bien que l\u0026rsquo;option\n\u003ccode\u003eupgrade\u003c/code\u003e existe.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : L\u0026rsquo;utilisation de l\u0026rsquo;option \u003ccode\u003eupgrade\u003c/code\u003e est hautement découragée. \u003cbr\u003e\nPour comprendre la raison, merci de lire la\n\u003ca href=\"https://openwrt.org/meta/infobox/upgrade_packages_warning\" rel=\"external\"\u003epage du wiki à ce propos\u003c/a\u003e !\u003c/div\u003e\n\n\u003cp\u003eVoici l\u0026rsquo;astuce :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# for name in `opkg list-upgradable | awk \u0026#39;{print $1}\u0026#39;`; do opkg upgrade \u0026#34;${name}\u0026#34;; done\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOu si comme moi, vous avez créé un utilisateur qui a le droit d\u0026rsquo;utiliser la\ncommande \u003ccode\u003esudo\u003c/code\u003e, faites simplement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name in \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003esudo opkg list-upgradable | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e sudo opkg upgrade \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch3 id=\"script\"\u003eScript\u003c/h3\u003e\n\u003cp\u003eUn petit scrip shell nommé \u003ccode\u003eopkgupgrade.sh\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esudo opkg update\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e name in \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003esudo opkg list-upgradable | awk \u003cspan style=\"color:#48b685\"\u003e\u0026#39;{print $1}\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e sudo opkg upgrade \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl n\u0026rsquo;y a plus qu\u0026rsquo;à l\u0026rsquo;appeler : \u0026lt;\u003cbr\u003e\n\u003ccode\u003e$ ./opkgupgrade.sh\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEt voilà !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment mettre à jour l'ensemble de la liste des packages sous OpenWRT avec le gestionnaire opkg",
            "tags": ["OpenWRT", "upgrade", "opkg", "astuce", "sysadmin"],
            "date_published": "2020-02-24T19:17:42+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:b59e70e3-87e9-6bec-96f2-1481def1313e",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/reed-alert-openbsd/",
            "title": "Reed-alert : Monitorer simplement OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Reed-alert est un projet de monitoring simple sous OpenBSD, il n\u0026rsquo;enregistre aucune donnée ni ne produit des graphes de visualisation.\nÀ partir d\u0026rsquo;un fichier de configuration, il vérifie plusieurs états et si ceux-ci échouent alors il sera envoyé une alerte. Le langage utilisée est le Lisp.\nAuteure : Solène Rapenne\ndépôt Git : git://bitreich.org/reed-alert\nprésentation de reed-alert (en anglais)\nconstat au bout de cinq ans… (en anglais)\nInstallation Paquet L\u0026rsquo;installation est très simple en soit : # pkg_add reed-alert\nOpenBSD : 6.6 → 7.2 Version : 1.05 Vous pouvez préférer le code sur le dépôt git qui corrige quelques détails.\ngit :$ git clone git://bitreich.org/reed-alert :$ cd reed-alert :$ make sed \u0026#39;s,REEDDIR=,\u0026amp;/usr/local/share/reed-alert/,\u0026#39; reed-alert.in \u0026gt; reed-alert :$ doas make install mkdir -p /usr/local/share/reed-alert/ mkdir -p /usr/local/bin install -o root -g bin -m 755 reed-alert /usr/local/bin/reed-alert install -o root -g wheel -m 644 probes.lisp functions.lisp /usr/local/share/reed-alert// L\u0026rsquo;avantage du dépôt est qu\u0026rsquo;il fourni le fichier README très explicatif, ainsi que des fichiers d\u0026rsquo;exemples, ainsi qu\u0026rsquo;un outil de sortie au format HTML.\nDépendance le paquet ecl : # pkg_add ecl — qui est normalement installé en dépendance du paquet reed-alert. Configuration Le fichier README vous informe que vous pouvez copier l\u0026rsquo;un des deux fichiers exemples en fichier de configuration. Faisons simple, en admettons que nous soyons dans le répertoire de reed-alert : :$ touch config.lisp.\nIl vous faudra ensuite l\u0026rsquo;éditer avec votre éditeur de texte favori.\ncron AttentionAssurez-vous que la variable d\u0026rsquo;environnement PATH dans votre crontab comporte aussi le répertoire /usr/local/bin. Une fois que vous aurez tout configuré, et vérifiez que votre configuration soit sans erreur, n\u0026rsquo;hésitez pas à ouvrir la table de cron de l\u0026rsquo;utilisateur root pour y ajouter un job de surveillance, tel que :\n*/5 * * * * -ns reed-alert /repertoire-vers/reed-alert/config.lisp\noù :\nles deux options -ns sont spécifiques à la gestion cron - cf la partie Documentations\n/repertoire-vers/reed-alert/ correspond au répertoire où vous aurez créé/déposé votre fichier de configuration\ncette tâche s\u0026rsquo;exécutera toutes les 5 minutes ; à vous de voir, si cette période vous est utile/nécessaire, et de la modifier en conséquence.\nLangage C\u0026rsquo;est du Common LISP !\nHormis les variables et les preuves déjà prédéfinies, il est possible d\u0026rsquo;utiliser des concepts de condition, de boucles, d\u0026rsquo;imbriquer des dépendances, des niveaux d\u0026rsquo;échelles d\u0026rsquo;alertes, d\u0026rsquo;étendre/créer vos propres preuves. Tout cela est expliqué clairement dans le fichier README.\nVariables prédéfinies Il existe des variables prédéfinies, elles sont entourées du symbole modulo % et peuvent être utilisées partout dans votre fichier de configuration.\nVoici leurs noms et leur définition :\n%function% : le nom de la fonction qui sert de preuve\n%date% : la date actuelle au format YYYY/MM/DD hh:mm:ss\n%params% : les paramètres utilisés dans le contexte de la preuve\n%hostname% : le nom d\u0026rsquo;hôte\n%result% : l\u0026rsquo;erreur retournée (tel que la valeur excédant la limite, un fichier non trouvé, etc… )\n%desc% : une description arbitraire nommant une vérification ; par défaut, est une chaîne vide\n%level% : le type de la notification utilisé\n%os% : le système d\u0026rsquo;exploitation utilisé (FreeBSD/Linux/OpenBSD)\n%newline% : le caractère de nouvelle ligne\n%state% : les états \u0026ldquo;start\u0026rdquo; / \u0026ldquo;end\u0026rdquo; lorsqu\u0026rsquo;un problème est levé ou résolu.\nPreuve La preuve est en fait un type de vérification à effectuer. C\u0026rsquo;est un test !\nPar défaut, il est possible de vérifier :\ncommand : exécute une commande arbitraire, désirée par l\u0026rsquo;administrateur, et qui déclenchera une alerte si le code d\u0026rsquo;erreur est supérieur à zéro.\ncurl-http-status : exécute une requête HTTP et lève une alerte si le code de retour est différent de \u0026lsquo;OK\u0026rsquo; (code 200)\ndisk-usage : que la taille d\u0026rsquo;une partition n\u0026rsquo;excéde pas une certaine limite\nfile-exists : qu\u0026rsquo;un certain fichier existe\nfile-less-than\nfile-updated : qu\u0026rsquo;un certain fichier existe et qu\u0026rsquo;il a été mis à jour depuis un temps défini\nload-average-1 : que la charge moyenne durant la dernière minute n\u0026rsquo;excéde pas une certaine limite\nload-average-5 : que la charge moyenne durant les cinq dernières minutes n\u0026rsquo;excéde pas une certaine limite\nload-average-15 : que la charge moyenne durant les quinze dernières minutes n\u0026rsquo;excéde pas une certaine limite\nnumber-of-processes : le nombre de processus n\u0026rsquo;excède pas une certaine limite.\npid-running : le processus en question soit vivant, en spécifiant le fichier d\u0026rsquo;identifiant de processus.\nping : que l\u0026rsquo;hôte distant répond à deux ping.\nservice : qu\u0026rsquo;un service soit actif sur le système hôte\nssl-expiration : qu\u0026rsquo;un certificat SSL expire dans une période donnée en nombre de secondes.\nwrite-to-file : permet d\u0026rsquo;écrire du contenu dans un fichier ; le créera s\u0026rsquo;il n\u0026rsquo;existe pas localement.\nAttentionÉvitez d\u0026rsquo;utiliser ces mots clés dans vos propres variables, vous pourriez avoir à gérer des erreurs bien truculentes ! Je vous renvoie à la lecture du fichier README pour en savoir plus sur chacune de ces preuves.\nAjout de l\u0026rsquo;alerte La première chose à faire est d\u0026rsquo;ajouter une alerte - pour nous faciliter le propos, nous créerons une alerte mail.\nInfoSachez qu\u0026rsquo;il est possible de créer des alertes de type SMS, des alertes qui n\u0026rsquo;avertissent de rien, ou tout autre sorte d\u0026rsquo;alerte que vous pourriez inventer. Ajoutez basiquement : (alert mail \u0026quot;echo 'problem on %hostname%' | mail mail@domain.tld\u0026quot;)\nUne version plus élaborée : (alert mail \u0026quot;echo -n '[%state%] Problem with %function% %date% %params%' | mail -s '[%state%] alarm on %hostname%' mail@domain.tld\u0026quot;)\nSortie HTML La version du dépôt git fournit un outil de sortie au format HTML que l\u0026rsquo;on trouve dans le répertoire enfant extras/output2html.sh.\nVoici comment l\u0026rsquo;utiliser : $ reed-alert config.lisp | extras/output2html.sh \u0026gt; alert.html\nIl ne vous reste plus qu\u0026rsquo;à mettre/fournir ce fichier html sur un espace web pour obtenir la lecture de celui-ci.\nAstuceConfigurez votre crontab en ajoutant l\u0026rsquo;outil de sortie HTML. Exemples Pour rappel, allez lire les deux fichiers d\u0026rsquo;exemples fournis par le projet. Ils sont instructifs.\nCi-dessous, retrouvez des exemples de mon cru.\nExemple : curl-http-status AstucePour cibler un serveur délivrant sur le protocole\nHTTPS (HyperText Transfer Protocol Secure)\n, il est nécessaire de le cibler en le précédent du schéma suivant : https:// suivi du nom de domaine à cibler.\n⇒ version basique :\n(=\u0026gt; mail curl-http-status :url \u0026#34;huc.fr.eu.org\u0026#34; :timeout 3) (=\u0026gt; mail curl-http-status :url \u0026#34;openbsd.fr.eu.org\u0026#34; :timout 3) (=\u0026gt; mail curl-http-status :url \u0026#34;blog.openbsd.fr.eu.org\u0026#34; :timeout 3) ⇒ version élaborée :\n(loop for host in (list \u0026#34;huc.fr.eu.org\u0026#34; \u0026#34;openbsd.fr.eu.org\u0026#34; \u0026#34;blog.openbsd.fr.eu.org\u0026#34;) do (=\u0026gt; mail curl-http-status :url host :timeout 3)) ⇒ Exemple de retour :\nMAIL CURL-HTTP-STATUS URL https://huc.fr.eu.org TIMEOUT 3 SUCCESS SUCCESS NO 0 MAIL CURL-HTTP-STATUS URL https://openbsd.fr.eu.org TIMEOUT 3 SUCCESS SUCCESS NO 0 MAIL CURL-HTTP-STATUS URL https://blog.openbsd.fr.eu.org TIMEOUT 3 SUCCESS SUCCESS NO 0 Exemple : disk-usage Là, je vous ferais direct la version élaborée :\n(loop for path in (uiop:run-program \u0026#34;mount | awk -v pattern=\u0026#39;/\u0026#39; \u0026#39;$0 ~ pattern { print $3 }\u0026#39; \u0026#34; :output :lines) do (=\u0026gt; mail disk-usage :path path :limit 80)) Explication :\nLa boucle appele la commande mount qui est \u0026ldquo;filtrée\u0026rdquo; par la commande awk afin de ne restituer que le nom des partitions existantes, sur lesquelles sera appliqué le test de preuve. ⇒ Exemple de retour :\nMAIL DISK-USAGE PATH / LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /home LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /tmp LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /usr LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /usr/X11R6 LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /usr/local LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /usr/obj LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /usr/src LIMIT 80 SUCCESS SUCCESS NO 0 MAIL DISK-USAGE PATH /var LIMIT 80 SUCCESS SUCCESS NO 0 Exemple : ping ⇒ version basique :\n(=\u0026gt; mail ping :host \u0026#34;192.168.1.1\u0026#34; :desc \u0026#34;Ping 192.168.1.1\u0026#34;) (=\u0026gt; mail ping :host \u0026#34;huc.fr.eu.org\u0026#34; :desc \u0026#34;Ping huc.fr.eu.org\u0026#34;) (=\u0026gt; mail ping :host \u0026#34;openbsd.fr.eu.org\u0026#34; :desc \u0026#34;Ping openbsd.fr.eu.org\u0026#34;) (=\u0026gt; mail ping :host \u0026#34;blog.openbsd.fr.eu.org\u0026#34; :desc \u0026#34;Ping blog.openbsd.fr.eu.org\u0026#34;) ⇒ version élaborée :\n(loop for host in (list \u0026#34;192.168.1.1\u0026#34; \u0026#34;huc.fr.eu.org\u0026#34; \u0026#34;openbsd.fr.eu.org\u0026#34; \u0026#34;blog.openbsd.fr.eu.org\u0026#34;) do (=\u0026gt; mail ping :host host)) AstuceVous voulez personnaliser le message avec un texte prédéfini, tel quePing :, utilisez la fonction concatenate, en ajoutant une description dans la dernière ligne, tel que : :desc (concatenate 'string \u0026quot;Ping : \u0026quot; host) ⇒ Exemple de retour :\nMAIL PING HOST 192.168.1.1 Ping : 192.168.1.1 SUCCESS SUCCESS NO 0 MAIL PING HOST huc.fr.eu.org Ping : huc.fr.eu.org SUCCESS SUCCESS NO 0 MAIL PING HOST openbsd.fr.eu.org Ping : openbsd.fr.eu.org SUCCESS SUCCESS NO 0 MAIL PING HOST blog.openbsd.fr.eu.org Ping : blog.openbsd.fr.eu.org SUCCESS SUCCESS NO 0 Exemple : service ⇒ version basique :\n(=\u0026gt; mail service :name \u0026#34;ntpd\u0026#34;) (=\u0026gt; mail service :name \u0026#34;pflogd\u0026#34;) (=\u0026gt; mail service :name \u0026#34;smbd\u0026#34;) (=\u0026gt; mail service :name \u0026#34;smtpd\u0026#34;) (=\u0026gt; mail service :name \u0026#34;sshd\u0026#34;) (=\u0026gt; mail service :name \u0026#34;syslogd\u0026#34;) ⇒ version élaborée :\n(loop for name in (list \u0026#34;ntpd\u0026#34; \u0026#34;pflogd\u0026#34; \u0026#34;smbd\u0026#34; \u0026#34;sshd\u0026#34; \u0026#34;syslogd\u0026#34;) do (=\u0026gt; mail service :name name)) ⇒ Exemple de retour :\nMAIL SERVICE NAME ntpd SUCCESS SUCCESS NO 0 MAIL SERVICE NAME pflogd SUCCESS SUCCESS NO 0 MAIL SERVICE NAME smbd SUCCESS SUCCESS NO 0 MAIL SERVICE NAME sshd SUCCESS SUCCESS NO 0 MAIL SERVICE NAME syslogd SUCCESS SUCCESS NO 0 Vérification Pour vérifier l\u0026rsquo;écriture de votre fichier de configuration, une fois que celle-ci est terminée/modifiée, exécutez simplement en console : :$ reed-alert /repertoire-vers/reed-alert/config.lisp\nUne fois que votre vérification est faite, pensez à créer une tâche cron ;-)\nDépannage The character *** is not a valid dispatch macro character. Exemple :\nAn error occurred during initialization: Reader error in file #\u0026lt;input stream #P/path/reed-alert/config.lisp\u0026#34; 0xa5b677d1960\u0026gt;, position 173: The character Space is not a valid dispatch macro character. Vérifiez vos écritures. Vous avez certainement fait une erreur typographique…\necl or sbcl not found in PATH. Vous avez le message suivant :\necl or sbcl not found in PATH. you need at least one of them to use reed-alert Après vous être assuré d\u0026rsquo;avoir au moins installer le paquet ecl, ajoutez dans la variable d\u0026rsquo;environnement PATH de votre crontab le répertoire /usr/local/bin.\n\u0026rsquo;name\u0026rsquo; is not of type FUNCTION.. An error occurred during initialization: \u0026#34;name\u0026#34; is not of type FUNCTION. Vous utilisez une boucle ? Il y a de forte probabilité que vous ayez utilisé un nom de variable similaire à celui d\u0026rsquo;une fonction !\nNot a valid property list An error occurred during initialization: Not a valid property list (HOST Ping 192.168.1.3). Vous utilisez une boucle ? Vérifiez l\u0026rsquo;écriture de votre boucle, une des propriétés n\u0026rsquo;est pas correcte.\nUnexpected end of file on An error occurred during initialization: Unexpected end of file on #\u0026lt;input stream #P\u0026#34;/path/reed-alert/config.lisp\u0026#34;\u0026gt;. L\u0026rsquo;erreur ci-dessus est due à une mauvaise écriture dans votre fichier de configuration ! Donc, VÉRIFIEZ, vérifiez ET vérifiez encore, et encore ce que vous avez écrit : un simple oubli d\u0026rsquo;une parenthèse fermante, d\u0026rsquo;un apostrophe/guillemet peut en être la cause.\nDocumentations La copie du dépôt vous permettra de lire les fichiers suivants :\nREADME : À lire, très complet, il fournit en anglais, les différentes étapes d\u0026rsquo;installation, de paramétrage, et autres exemples.\nles fichiers d\u0026rsquo;exemple : example-simple.lisp et example-full.lisp.\ncrontab(5) Remerciements Solène Rapenne fait partie de l\u0026rsquo;équipe des développeurs d\u0026rsquo;OpenBSD. Informaticienne, elle développe dans plusieurs langages, dont le Lisp qui est la base du code de reed-alert, et à ses heures perdues professionnellement parlant absolument la fonction d\u0026rsquo;administrateur réseaux/système! :p ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eReed-alert\u003c/strong\u003e est un projet de monitoring simple sous OpenBSD, il\nn\u0026rsquo;enregistre aucune donnée ni ne produit des graphes de visualisation.\u003c/p\u003e\n\u003cp\u003eÀ partir d\u0026rsquo;un fichier de configuration, il vérifie plusieurs états et si\nceux-ci échouent alors il sera envoyé une alerte. Le langage utilisée est\nle Lisp.\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAuteure : \u003ca href=\"https://dataswamp.org/~solene/2018-01-17-reed-alert.html\" rel=\"external\"\u003eSolène Rapenne\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003edépôt Git : git://bitreich.org/reed-alert\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dataswamp.org/~solene/2018-01-17-reed-alert.html\" rel=\"external\"\u003eprésentation de reed-alert\u003c/a\u003e \u003cem\u003e(en anglais)\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca href=\"https://dataswamp.org/~solene/2022-02-10-five-years-of-reed-alert.html\" rel=\"external\"\u003econstat au bout de cinq ans\u003c/a\u003e… \u003cem\u003e(en anglais)\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003ch3 id=\"paquet\"\u003ePaquet\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;installation est très simple en soit : \u003ccode\u003e# pkg_add reed-alert\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : \u003cdel\u003e6.6\u003c/del\u003e → \u003cstrong\u003e7.2\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eVersion : \u003cstrong\u003e1.05\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous pouvez préférer le code sur le dépôt \u003ca href=\"/fr/monitor/reed-alert-openbsd/#git\"\u003egit\u003c/a\u003e qui corrige quelques\ndétails.\u003c/p\u003e\n\u003ch3 id=\"git\"\u003egit\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ git clone git://bitreich.org/reed-alert\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ cd reed-alert\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ make\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esed \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s,REEDDIR=,\u0026amp;/usr/local/share/reed-alert/,\u0026#39;\u003c/span\u003e reed-alert.in \u0026gt; reed-alert\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ doas make install\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p /usr/local/share/reed-alert/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p /usr/local/bin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g bin -m \u003cspan style=\"color:#f99b15\"\u003e755\u003c/span\u003e reed-alert /usr/local/bin/reed-alert\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einstall -o root -g wheel -m \u003cspan style=\"color:#f99b15\"\u003e644\u003c/span\u003e probes.lisp functions.lisp /usr/local/share/reed-alert//\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;avantage du dépôt est qu\u0026rsquo;il fourni le fichier \u003cstrong\u003eREADME\u003c/strong\u003e très explicatif,\nainsi que des fichiers d\u0026rsquo;exemples, ainsi qu\u0026rsquo;un\n\u003ca href=\"/fr/monitor/reed-alert-openbsd/#sortie-html\"\u003eoutil de sortie au format HTML\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"dépendance\"\u003eDépendance\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003ele paquet \u003cstrong\u003eecl\u003c/strong\u003e : \u003ccode\u003e# pkg_add ecl\u003c/code\u003e — \u003cem\u003equi est normalement installé en\ndépendance du paquet reed-alert\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier \u003ccode\u003eREADME\u003c/code\u003e vous informe que vous pouvez copier l\u0026rsquo;un des deux\nfichiers exemples en fichier de configuration.\nFaisons simple, en admettons que nous soyons dans le répertoire de \u003cstrong\u003ereed-alert\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003e:$ touch config.lisp\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl vous faudra ensuite l\u0026rsquo;éditer avec votre éditeur de texte favori.\u003c/p\u003e\n\u003ch3 id=\"cron\"\u003ecron\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eAssurez-vous que la variable d\u0026rsquo;environnement \u003ccode\u003ePATH\u003c/code\u003e dans votre crontab\ncomporte aussi le répertoire \u003ccode\u003e/usr/local/bin\u003c/code\u003e.\u003c/div\u003e\n\n\u003cp\u003eUne fois que vous aurez tout configuré, et \u003ca href=\"/fr/monitor/reed-alert-openbsd/#vérification\"\u003evérifiez\u003c/a\u003e\nque votre configuration soit sans erreur,  n\u0026rsquo;hésitez pas à ouvrir la table\nde cron de l\u0026rsquo;utilisateur \u003ccode\u003eroot\u003c/code\u003e pour y ajouter un job de surveillance,\ntel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e*/5 *   *   *   *   -ns reed-alert /repertoire-vers/reed-alert/config.lisp\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eoù :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eles deux options \u003ccode\u003e-ns\u003c/code\u003e sont spécifiques à la gestion cron - \u003cbr\u003e\n\u003cem\u003ecf la partie \u003ca href=\"/fr/monitor/reed-alert-openbsd/#documentations\"\u003eDocumentations\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e/repertoire-vers/reed-alert/\u003c/code\u003e correspond au répertoire où vous aurez\ncréé/déposé votre \u003ca href=\"/fr/monitor/reed-alert-openbsd/#configuration\"\u003efichier de configuration\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecette tâche s\u0026rsquo;exécutera toutes les 5 minutes ; à vous de voir, si cette\npériode vous est utile/nécessaire, et de la modifier en conséquence.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"langage\"\u003eLangage\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est du Common LISP !\u003c/p\u003e\n\u003cp\u003eHormis les variables et les preuves déjà prédéfinies, il est possible\nd\u0026rsquo;utiliser des concepts de condition, de boucles, d\u0026rsquo;imbriquer des dépendances,\ndes niveaux d\u0026rsquo;échelles d\u0026rsquo;alertes, d\u0026rsquo;étendre/créer vos propres preuves.\nTout cela est expliqué clairement dans le fichier \u003cstrong\u003eREADME\u003c/strong\u003e.\u003c/p\u003e\n\u003ch4 id=\"variables-prédéfinies\"\u003eVariables prédéfinies\u003c/h4\u003e\n\u003cp\u003eIl existe des variables prédéfinies, elles sont entourées du symbole modulo\n\u003ccode\u003e%\u003c/code\u003e et peuvent être utilisées partout dans votre fichier de configuration.\u003c/p\u003e\n\u003cp\u003eVoici leurs noms et leur définition :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%function%\u003c/code\u003e    : le nom de la fonction qui sert de preuve\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%date%\u003c/code\u003e        : la date actuelle au format YYYY/MM/DD hh:mm:ss\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%params%\u003c/code\u003e      : les paramètres utilisés dans le contexte de la preuve\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%hostname%\u003c/code\u003e    : le nom d\u0026rsquo;hôte\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%result%\u003c/code\u003e      : l\u0026rsquo;erreur retournée (tel que la valeur excédant la limite,\nun fichier non trouvé, etc… )\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%desc%\u003c/code\u003e        : une description arbitraire nommant une vérification ;\npar défaut, est une chaîne vide\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%level%\u003c/code\u003e       : le type de la notification utilisé\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%os%\u003c/code\u003e          : le système d\u0026rsquo;exploitation utilisé (FreeBSD/Linux/OpenBSD)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%newline%\u003c/code\u003e     : le caractère de nouvelle ligne\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003e%state%\u003c/code\u003e       : les états \u0026ldquo;start\u0026rdquo; / \u0026ldquo;end\u0026rdquo; lorsqu\u0026rsquo;un problème est levé ou\nrésolu.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"preuve\"\u003ePreuve\u003c/h4\u003e\n\u003cp\u003eLa preuve est en fait un type de vérification à effectuer. C\u0026rsquo;est un test !\u003c/p\u003e\n\u003cp\u003ePar défaut, il est possible de vérifier :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecommand\u003c/code\u003e : exécute une commande arbitraire, désirée par l\u0026rsquo;administrateur,\net qui déclenchera une alerte si le code d\u0026rsquo;erreur est supérieur à zéro.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ecurl-http-status\u003c/code\u003e : exécute une requête HTTP et lève une alerte si le\ncode de retour est différent de \u0026lsquo;OK\u0026rsquo; \u003cem\u003e(code 200)\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003edisk-usage\u003c/code\u003e : que la taille d\u0026rsquo;une partition n\u0026rsquo;excéde pas une certaine limite\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efile-exists\u003c/code\u003e : qu\u0026rsquo;un certain fichier existe\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efile-less-than\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efile-updated\u003c/code\u003e : qu\u0026rsquo;un certain fichier existe et qu\u0026rsquo;il a été mis à jour\ndepuis un temps défini\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eload-average-1\u003c/code\u003e : que la charge moyenne durant la dernière minute\nn\u0026rsquo;excéde pas une certaine limite\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eload-average-5\u003c/code\u003e : que la charge moyenne durant les cinq dernières minutes\nn\u0026rsquo;excéde pas une certaine limite\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eload-average-15\u003c/code\u003e : que la charge moyenne durant les quinze dernières\nminutes n\u0026rsquo;excéde pas une certaine limite\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003enumber-of-processes\u003c/code\u003e : le nombre de processus n\u0026rsquo;excède pas une certaine limite.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003epid-running\u003c/code\u003e : le processus en question soit vivant, en spécifiant le\nfichier d\u0026rsquo;identifiant de processus.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eping\u003c/code\u003e : que l\u0026rsquo;hôte distant répond à deux ping.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eservice\u003c/code\u003e : qu\u0026rsquo;un service soit actif sur le système hôte\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003essl-expiration\u003c/code\u003e : qu\u0026rsquo;un certificat SSL expire dans une période donnée\nen nombre de secondes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ewrite-to-file\u003c/code\u003e : permet d\u0026rsquo;écrire du contenu dans un fichier ; le créera\ns\u0026rsquo;il n\u0026rsquo;existe pas localement.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eÉvitez d\u0026rsquo;utiliser ces mots clés dans vos propres variables, vous pourriez\navoir à gérer des \u003ca href=\"/fr/monitor/reed-alert-openbsd/#dépannage\"\u003eerreurs\u003c/a\u003e bien truculentes !\u003c/div\u003e\n\n\u003cp\u003eJe vous renvoie à la lecture du fichier \u003cstrong\u003eREADME\u003c/strong\u003e pour en savoir plus\nsur chacune de ces preuves.\u003c/p\u003e\n\u003ch3 id=\"ajout-de-lalerte\"\u003eAjout de l\u0026rsquo;alerte\u003c/h3\u003e\n\u003cp\u003eLa première chose à faire est d\u0026rsquo;ajouter une alerte - pour nous faciliter\nle propos, nous créerons une alerte mail.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSachez qu\u0026rsquo;il est possible de créer des alertes de type SMS, des alertes\nqui n\u0026rsquo;avertissent de rien, ou tout autre sorte d\u0026rsquo;alerte que vous pourriez\ninventer.\u003c/div\u003e\n\n\u003cp\u003eAjoutez basiquement : \u003cbr\u003e\n\u003ccode\u003e(alert mail \u0026quot;echo 'problem on %hostname%' | mail mail@domain.tld\u0026quot;)\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUne version plus élaborée : \u003cbr\u003e\n\u003ccode\u003e(alert mail \u0026quot;echo -n '[%state%] Problem with %function% %date% %params%' | mail -s '[%state%] alarm on %hostname%' mail@domain.tld\u0026quot;)\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"sortie-html\"\u003eSortie HTML\u003c/h3\u003e\n\u003cp\u003eLa version du dépôt \u003ca href=\"/fr/monitor/reed-alert-openbsd/#git\"\u003egit\u003c/a\u003e fournit un outil de sortie au\nformat HTML que l\u0026rsquo;on trouve dans le répertoire enfant \u003ccode\u003eextras/output2html.sh\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eVoici comment l\u0026rsquo;utiliser : \u003cbr\u003e\n\u003ccode\u003e$ reed-alert config.lisp | extras/output2html.sh \u0026gt; alert.html\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl ne vous reste plus qu\u0026rsquo;à mettre/fournir ce fichier html sur un espace\nweb pour obtenir la lecture de celui-ci.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eConfigurez votre \u003ca href=\"/fr/monitor/reed-alert-openbsd/#cron\"\u003ecrontab\u003c/a\u003e en ajoutant l\u0026rsquo;outil de sortie HTML.\u003c/div\u003e\n\n\u003ch3 id=\"exemples\"\u003eExemples\u003c/h3\u003e\n\u003cp\u003ePour rappel, allez lire les deux fichiers d\u0026rsquo;exemples fournis par le projet.\nIls sont instructifs.\u003c/p\u003e\n\u003cp\u003eCi-dessous, retrouvez des exemples de mon cru.\u003c/p\u003e\n\u003ch4 id=\"exemple--curl-http-status\"\u003eExemple : \u003ccode\u003ecurl-http-status\u003c/code\u003e\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003ePour cibler un serveur délivrant sur le protocole\u003c/p\u003e\n\u003cp\u003e\u003cspan lang=\"en\"\u003eHTTPS \u003cem\u003e(HyperText Transfer Protocol Secure)\u003c/em\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e,\nil est nécessaire de le cibler en le précédent du schéma suivant :\n\u003ccode\u003ehttps://\u003c/code\u003e suivi du nom de domaine à cibler.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003e⇒ version basique :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-lisp\" data-lang=\"lisp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ecurl-http-status\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:url\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;huc.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:timeout\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ecurl-http-status\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:url\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;openbsd.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:timout\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ecurl-http-status\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:url\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;blog.openbsd.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:timeout\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ version élaborée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-lisp\" data-lang=\"lisp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(loop \u003cspan style=\"color:#ef6155\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ein\u003c/span\u003e (\u003cspan style=\"color:#fec418\"\u003elist\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;huc.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;openbsd.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;blog.openbsd.fr.eu.org\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    do\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ecurl-http-status\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:url\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:timeout\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Exemple de retour :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    CURL-HTTP-STATUS    URL https://huc.fr.eu.org TIMEOUT \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e         SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    CURL-HTTP-STATUS    URL https://openbsd.fr.eu.org TIMEOUT \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e         SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    CURL-HTTP-STATUS    URL https://blog.openbsd.fr.eu.org TIMEOUT \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e        SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"exemple--disk-usage\"\u003eExemple : \u003ccode\u003edisk-usage\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003eLà, je vous ferais direct la version élaborée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-lisp\" data-lang=\"lisp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(loop \u003cspan style=\"color:#ef6155\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003epath\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ein\u003c/span\u003e (\u003cspan style=\"color:#ef6155\"\u003euiop:run-program\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;mount | awk -v pattern=\u0026#39;/\u0026#39; \u0026#39;$0 ~ pattern { print $3 }\u0026#39; \u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:output\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:lines\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    do\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003edisk-usage\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:path\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003epath\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:limit\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eExplication\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa boucle appele la commande \u003ccode\u003emount\u003c/code\u003e qui est \u0026ldquo;filtrée\u0026rdquo; par la commande\n\u003ccode\u003eawk\u003c/code\u003e afin de ne restituer que le nom des partitions existantes, sur\nlesquelles sera appliqué le test de preuve.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Exemple de retour :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH / LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e         SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /home LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e         SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /tmp LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e      SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /usr LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e      SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /usr/X11R6 LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e        SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /usr/local LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e        SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /usr/obj LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e      SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /usr/src LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e      SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    DISK-USAGE  PATH /var LIMIT \u003cspan style=\"color:#f99b15\"\u003e80\u003c/span\u003e      SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"exemple--ping\"\u003eExemple : \u003ccode\u003eping\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003e⇒ version basique :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-lisp\" data-lang=\"lisp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eping\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:host\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;192.168.1.1\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:desc\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ping 192.168.1.1\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eping\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:host\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;huc.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:desc\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ping huc.fr.eu.org\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eping\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:host\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;openbsd.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:desc\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ping openbsd.fr.eu.org\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eping\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:host\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;blog.openbsd.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:desc\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Ping blog.openbsd.fr.eu.org\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ version élaborée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-lisp\" data-lang=\"lisp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(loop \u003cspan style=\"color:#ef6155\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ein\u003c/span\u003e (\u003cspan style=\"color:#fec418\"\u003elist\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;192.168.1.1\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;huc.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;openbsd.fr.eu.org\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;blog.openbsd.fr.eu.org\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    do\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eping\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:host\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eVous voulez personnaliser le message avec un texte prédéfini, tel que\u003ccode\u003ePing :\u003c/code\u003e,\nutilisez la fonction \u003ccode\u003econcatenate\u003c/code\u003e, en ajoutant une description dans la dernière\nligne, tel que : \u003cbr\u003e\n\u003ccode\u003e:desc (concatenate 'string \u0026quot;Ping : \u0026quot; host)\u003c/code\u003e\u003c/div\u003e\n\n\u003cp\u003e⇒ Exemple de retour :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    PING    HOST 192.168.1.1    Ping : 192.168.1.1  SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    PING    HOST huc.fr.eu.org  Ping : huc.fr.eu.org    SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    PING    HOST openbsd.fr.eu.org  Ping : openbsd.fr.eu.org    SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    PING    HOST blog.openbsd.fr.eu.org     Ping : blog.openbsd.fr.eu.org   SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"exemple--service\"\u003eExemple : \u003ccode\u003eservice\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003e⇒ version basique :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-lisp\" data-lang=\"lisp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eservice\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ntpd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eservice\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pflogd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eservice\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;smbd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eservice\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;smtpd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eservice\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sshd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eservice\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:name\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;syslogd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ version élaborée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-lisp\" data-lang=\"lisp\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e(loop \u003cspan style=\"color:#ef6155\"\u003efor\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ein\u003c/span\u003e (\u003cspan style=\"color:#fec418\"\u003elist\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ntpd\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pflogd\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;smbd\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sshd\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;syslogd\u0026#34;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    do\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#ef6155\"\u003e=\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003email\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eservice\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e:name\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ename\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Exemple de retour :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    SERVICE NAME ntpd       SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    SERVICE NAME pflogd         SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    SERVICE NAME smbd       SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    SERVICE NAME sshd       SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMAIL    SERVICE NAME syslogd        SUCCESS SUCCESS NO  \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"vérification\"\u003eVérification\u003c/h2\u003e\n\u003cp\u003ePour vérifier l\u0026rsquo;écriture de votre fichier de configuration, une fois que celle-ci\nest terminée/modifiée, exécutez simplement en console : \u003cbr\u003e\n\u003ccode\u003e:$ reed-alert /repertoire-vers/reed-alert/config.lisp\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUne fois que votre vérification est faite, pensez à \u003ca href=\"/fr/monitor/reed-alert-openbsd/#cron\"\u003ecréer une tâche cron\u003c/a\u003e\n;-)\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"the-character--is-not-a-valid-dispatch-macro-character\"\u003eThe character *** is not a valid dispatch macro character.\u003c/h3\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAn error occurred during initialization:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReader error in file \u003cspan style=\"color:#776e71\"\u003e#\u0026lt;input stream #P/path/reed-alert/config.lisp\u0026#34; 0xa5b677d1960\u0026gt;, position 173:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThe character Space is not a valid dispatch macro character.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVérifiez vos écritures. Vous avez certainement fait une erreur typographique…\u003c/p\u003e\n\u003ch3 id=\"ecl-or-sbcl-not-found-in-path\"\u003eecl or sbcl not found in PATH.\u003c/h3\u003e\n\u003cp\u003eVous avez le message suivant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecl or sbcl not found in PATH.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eyou need at least one of them to use reed-alert\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAprès vous être assuré d\u0026rsquo;avoir au moins \u003ca href=\"/fr/monitor/reed-alert-openbsd/#dépendance\"\u003einstaller le paquet ecl\u003c/a\u003e,\najoutez dans la variable d\u0026rsquo;environnement \u003ccode\u003ePATH\u003c/code\u003e de votre crontab le\nrépertoire \u003ccode\u003e/usr/local/bin\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"name-is-not-of-type-function\"\u003e\u0026rsquo;name\u0026rsquo; is not of type FUNCTION..\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAn error occurred during initialization:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e is not of type FUNCTION.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous utilisez une boucle ? \u003cbr\u003e\nIl y a de forte probabilité que vous ayez utilisé un nom de variable\nsimilaire à celui d\u0026rsquo;une fonction !\u003c/p\u003e\n\u003ch3 id=\"not-a-valid-property-list\"\u003eNot a valid property list\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAn error occurred during initialization:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNot a valid property list \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eHOST Ping  192.168.1.3\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous utilisez une boucle ? \u003cbr\u003e\nVérifiez l\u0026rsquo;écriture de votre boucle, une des propriétés n\u0026rsquo;est pas correcte.\u003c/p\u003e\n\u003ch3 id=\"unexpected-end-of-file-on\"\u003eUnexpected end of file on\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAn error occurred during initialization:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUnexpected end of file on \u003cspan style=\"color:#776e71\"\u003e#\u0026lt;input stream #P\u0026#34;/path/reed-alert/config.lisp\u0026#34;\u0026gt;.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;erreur ci-dessus est due à une mauvaise écriture dans votre fichier de\nconfiguration ! \u003cbr\u003e\nDonc, \u003cspan class=\"red\"\u003eVÉRIFIEZ, vérifiez ET vérifiez encore, et encore\n\u003c/span\u003e\n ce que vous avez écrit : un simple oubli d\u0026rsquo;une parenthèse\nfermante, d\u0026rsquo;un apostrophe/guillemet peut en être la cause.\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003eLa copie du dépôt vous permettra de lire les fichiers suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eREADME\u003c/code\u003e : À lire, très complet, il fournit en anglais, les différentes\nétapes d\u0026rsquo;installation, de paramétrage, et autres exemples.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eles fichiers d\u0026rsquo;exemple : \u003ccode\u003eexample-simple.lisp\u003c/code\u003e et \u003ccode\u003eexample-full.lisp\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/crontab.5\" title=\"Page du Manuel OpenBSD pour : crontab\"\u003ecrontab(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eSolène Rapenne fait partie de l\u0026rsquo;équipe des développeurs d\u0026rsquo;OpenBSD.\nInformaticienne, elle développe dans plusieurs langages, dont le Lisp qui\nest la base du code de \u003cstrong\u003ereed-alert\u003c/strong\u003e, et à ses heures perdues professionnellement\nparlant absolument la fonction d\u0026rsquo;administrateur réseaux/système! :p\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Mettre en place simplement du monitoring d'OpenBSD, en mode console/terminal, avec un simple fichier de configuration grâce au projet 'Reed-alert'",
            "tags": ["OpenBSD", "supervision"],
            "date_published": "2020-02-24T01:27:09+01:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:76c9a008-3294-6a71-fc04-66eb91d020e5",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/mate/",
            "title": "MATE (environnement de bureau graphique) / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description MATE est un environnement de bureau graphique.\nInstallation Installez la base et les quelques utilitaires (optionnels) : mate mate-extras\nConfiguration Démarrage session graphique Il est nécessaire de configurer votre fichier de session .xsession pour y inclure ceci :\nexec /usr/local/bin/ck-launch-session /usr/local/bin/mate-session\nGestionnaire d\u0026rsquo;énergie Afin de fonctionner correctement cette fonctionnalité, MATE a besoin que le service system-wide D-Bus soit opérationnel.\nVeuillez lire les informations sur la page ConsoleKit2 .\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMATE\u003c/strong\u003e est un environnement de bureau graphique.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n la base\net les quelques utilitaires\u003c/strong\u003e (\u003cem\u003eoptionnels\u003c/em\u003e) : \u003ccode\u003emate mate-extras\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"démarrage-session-graphique\"\u003eDémarrage session graphique\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de configurer votre fichier de session \u003ccode\u003e.xsession\u003c/code\u003e\npour y inclure ceci :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eexec /usr/local/bin/ck-launch-session /usr/local/bin/mate-session\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"gestionnaire-dénergie\"\u003eGestionnaire d\u0026rsquo;énergie\u003c/h3\u003e\n\u003cp\u003eAfin de fonctionner correctement cette fonctionnalité, MATE a besoin que\nle service \u003ccode\u003esystem-wide D-Bus\u003c/code\u003e soit opérationnel.\u003c/p\u003e\n\u003cp\u003eVeuillez lire les informations sur la page\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/consolekit/#d%c3%a9marrage-de-service-n%c3%a9cessaire\" title=\"Lien interne vers l\u0026#39;article : 'Consolekit2 (bus de messages) / OpenBSD'\"\u003eConsoleKit2\u003c/a\u003e\n.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le bureau graphique nommé 'MATE' sous OpenBSD",
            "tags": ["OpenBSD", "MATE"],
            "date_published": "2020-02-21T22:46:45+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:2dadac69-99e6-4978-147c-08270a89b6fc",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/slim/",
            "title": "SLiM / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description SLiM est un gestionnaire de session graphique indépendant du Bureau pour X11, dérivé de Login.app.\nIl clame être léger et simple, bien que complètement configurable au-travers de thèmes et d\u0026rsquo;un fichier option. Il convient pour les machines sur lesquelles la fonctionnalité de session à distance n\u0026rsquo;est pas nécessaire.\nDangerATTENTION : ce logiciel n\u0026rsquo;est plus maintenu officiellement depuis 2015 !\nDe plus, depuis OpenBSD 6.1, le gestionnaire de session officiel xenodm est embarqué !\nInstallation Il était possible d\u0026rsquo;installer le paquet slim ; les thèmes sont disponibles dans le paquet slim-themes.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/data-modul/slim\" rel=\"external\"\u003eSLiM\u003c/a\u003e\u003c/strong\u003e est un gestionnaire de\nsession graphique indépendant du Bureau pour X11, dérivé de Login.app.\u003c/p\u003e\n\u003cp\u003eIl clame être léger et simple, bien que complètement configurable\nau-travers de thèmes et d\u0026rsquo;un fichier option. Il convient pour les machines\nsur lesquelles la fonctionnalité de session à distance n\u0026rsquo;est pas nécessaire.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : ce logiciel n\u0026rsquo;est plus maintenu officiellement depuis 2015 !\u003c/p\u003e\n\u003cp\u003eDe plus, depuis OpenBSD 6.1, le gestionnaire de session officiel\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/xenodm/\" title=\"Lien interne vers l\u0026#39;article : 'xenodm : Gestionnaire de sessions X pour OpenBSD'\"\u003exenodm\u003c/a\u003e\nest embarqué !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eIl était possible d\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n\nle paquet \u003ccode\u003eslim\u003c/code\u003e ; les thèmes sont disponibles dans le paquet \u003ccode\u003eslim-themes\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le gestionnaire de session graphique, nommé 'SLiM', sous OpenBSD.",
            "tags": ["OpenBSD", "SLiM"],
            "date_published": "2020-02-21T22:13:29+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:938ff3b5-0d0a-d976-a730-c86b0045466d",
            "url": "http://doc.huc.fr.eu.org/fr/don/",
            "title": "Page de dons",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Vous appréciez mes articles pour la qualité, leur sérieux, et vous voulez faire un petit geste sympa, tel le prix d\u0026rsquo;un café, d\u0026rsquo;une bierre… Ou, juste pour me remercier, et m\u0026rsquo;encourager ;-) :p\nFaites un don, tout simplement.\nMerci d\u0026rsquo;avance :D\n⇒ Si vous le faites, et si vous le souhaitez votre nom, ou pseudo sera affiché ici, avec votre accord, à la date du don.\n⇒ Alors, si vous le désirez, faites-le moi savoir dans votre don ;)\nComment Ko-fi https://ko-fi.com/hucste Et, un Ko-fi pour Stéphane HUC Liberapay https://fr.liberapay.com/HucSte/donate Un don Liberapay pour Stéphane HUC Paypal https://paypal.me/hucste Un don Paypal pour Stéphane HUC Tipeee https://fr.tipeee.com/hucste Un soutien tipeee pour Stéphane HUC Qui 2020 ⇒ Au mois d\u0026rsquo;Octobre :\n@scorpus 2022 ⇒ Au mois de Novembre :\nun certain @Cascador Quoi 2020 L\u0026rsquo;équivalent d\u0026rsquo;une trappiste rochefort 10 : 5 € 2022 5 dizaines de roros ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVous appréciez mes articles pour la qualité, leur sérieux, et vous voulez\nfaire un petit geste sympa, tel le prix d\u0026rsquo;un café, d\u0026rsquo;une bierre… \u003cbr\u003e\nOu, juste pour me remercier, et m\u0026rsquo;encourager ;-) :p\u003c/p\u003e\n\u003cp\u003eFaites un don, tout simplement.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMerci d\u0026rsquo;avance\u003c/strong\u003e :D\u003c/p\u003e\n\u003cp\u003e⇒ Si vous le faites, et si vous le souhaitez votre nom, ou pseudo sera\naffiché ici, avec votre accord, à la date du don.\u003c/p\u003e\n\u003cp\u003e⇒ Alors, si vous le désirez, faites-le moi savoir dans votre don ;)\u003c/p\u003e\n\u003ch2 id=\"comment\"\u003eComment\u003c/h2\u003e\n\u003ch3 id=\"ko-fi\"\u003eKo-fi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://ko-fi.com/hucste\" rel=\"external\"\u003ehttps://ko-fi.com/hucste\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\n\u003cfigure class=\"pure-img\"\u003e\n    \u003ca href=\"/svg/qrcode/ko-fi.svg\" title=\"Et, un Ko-fi pour Stéphane HUC\"\u003e\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" class=\"qr-svg \" height=\"128\" viewBox=\"0 0 53 53\" width=\"128\"\u003e\n\u003cdefs\u003e\u003cstyle\u003erect{shape-rendering:crispEdges}\u003c/style\u003e\u003c/defs\u003e\n\u003cpath class=\"qr-4 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M16 4 h2 v1 h-2Z M19 4 h1 v1 h-1Z M24 4 h1 v1 h-1Z M28 4 h1 v1 h-1Z M30 4 h2 v1 h-2Z M36 4 h1 v1 h-1Z M13 5 h4 v1 h-4Z M20 5 h2 v1 h-2Z M23 5 h1 v1 h-1Z M25 5 h2 v1 h-2Z M29 5 h1 v1 h-1Z M31 5 h4 v1 h-4Z M37 5 h1 v1 h-1Z M14 6 h3 v1 h-3Z M19 6 h1 v1 h-1Z M21 6 h2 v1 h-2Z M24 6 h3 v1 h-3Z M29 6 h4 v1 h-4Z M36 6 h1 v1 h-1Z M13 7 h3 v1 h-3Z M17 7 h3 v1 h-3Z M21 7 h4 v1 h-4Z M26 7 h3 v1 h-3Z M30 7 h1 v1 h-1Z M32 7 h1 v1 h-1Z M35 7 h2 v1 h-2Z M13 8 h1 v1 h-1Z M19 8 h1 v1 h-1Z M21 8 h2 v1 h-2Z M29 8 h5 v1 h-5Z M36 8 h1 v1 h-1Z M14 9 h1 v1 h-1Z M17 9 h4 v1 h-4Z M22 9 h1 v1 h-1Z M29 9 h1 v1 h-1Z M33 9 h1 v1 h-1Z M35 9 h3 v1 h-3Z M14 11 h3 v1 h-3Z M20 11 h4 v1 h-4Z M31 11 h1 v1 h-1Z M34 11 h4 v1 h-4Z M39 11 h1 v1 h-1Z M14 12 h1 v1 h-1Z M17 12 h3 v1 h-3Z M33 12 h2 v1 h-2Z M37 12 h1 v1 h-1Z M39 12 h1 v1 h-1Z M5 13 h3 v1 h-3Z M11 13 h1 v1 h-1Z M13 13 h3 v1 h-3Z M20 13 h4 v1 h-4Z M25 13 h1 v1 h-1Z M30 13 h3 v1 h-3Z M34 13 h2 v1 h-2Z M38 13 h1 v1 h-1Z M40 13 h1 v1 h-1Z M45 13 h1 v1 h-1Z M47 13 h2 v1 h-2Z M4 14 h2 v1 h-2Z M8 14 h2 v1 h-2Z M13 14 h4 v1 h-4Z M18 14 h2 v1 h-2Z M26 14 h2 v1 h-2Z M33 14 h1 v1 h-1Z M39 14 h5 v1 h-5Z M4 15 h2 v1 h-2Z M7 15 h1 v1 h-1Z M12 15 h4 v1 h-4Z M21 15 h2 v1 h-2Z M24 15 h2 v1 h-2Z M28 15 h2 v1 h-2Z M33 15 h1 v1 h-1Z M36 15 h3 v1 h-3Z M40 15 h6 v1 h-6Z M47 15 h1 v1 h-1Z M6 16 h1 v1 h-1Z M8 16 h1 v1 h-1Z M12 16 h1 v1 h-1Z M16 16 h2 v1 h-2Z M22 16 h5 v1 h-5Z M35 16 h4 v1 h-4Z M41 16 h2 v1 h-2Z M44 16 h1 v1 h-1Z M5 17 h4 v1 h-4Z M12 17 h1 v1 h-1Z M17 17 h1 v1 h-1Z M19 17 h2 v1 h-2Z M22 17 h1 v1 h-1Z M25 17 h1 v1 h-1Z M28 17 h1 v1 h-1Z M30 17 h1 v1 h-1Z M32 17 h2 v1 h-2Z M36 17 h4 v1 h-4Z M42 17 h5 v1 h-5Z M48 17 h1 v1 h-1Z M4 18 h1 v1 h-1Z M8 18 h2 v1 h-2Z M12 18 h5 v1 h-5Z M19 18 h2 v1 h-2Z M22 18 h5 v1 h-5Z M28 18 h1 v1 h-1Z M31 18 h1 v1 h-1Z M35 18 h2 v1 h-2Z M44 18 h2 v1 h-2Z M47 18 h2 v1 h-2Z M5 19 h1 v1 h-1Z M8 19 h2 v1 h-2Z M11 19 h1 v1 h-1Z M13 19 h1 v1 h-1Z M16 19 h4 v1 h-4Z M22 19 h3 v1 h-3Z M28 19 h1 v1 h-1Z M34 19 h2 v1 h-2Z M37 19 h1 v1 h-1Z M39 19 h1 v1 h-1Z M44 19 h1 v1 h-1Z M48 19 h1 v1 h-1Z M4 20 h3 v1 h-3Z M11 20 h2 v1 h-2Z M19 20 h3 v1 h-3Z M23 20 h4 v1 h-4Z M30 20 h5 v1 h-5Z M36 20 h1 v1 h-1Z M40 20 h1 v1 h-1Z M42 20 h2 v1 h-2Z M46 20 h3 v1 h-3Z M4 21 h2 v1 h-2Z M8 21 h2 v1 h-2Z M11 21 h2 v1 h-2Z M14 21 h1 v1 h-1Z M16 21 h1 v1 h-1Z M19 21 h1 v1 h-1Z M23 21 h1 v1 h-1Z M27 21 h3 v1 h-3Z M32 21 h1 v1 h-1Z M34 21 h4 v1 h-4Z M41 21 h2 v1 h-2Z M46 21 h2 v1 h-2Z M6 22 h2 v1 h-2Z M9 22 h1 v1 h-1Z M12 22 h1 v1 h-1Z M14 22 h4 v1 h-4Z M20 22 h2 v1 h-2Z M25 22 h2 v1 h-2Z M29 22 h1 v1 h-1Z M33 22 h1 v1 h-1Z M36 22 h1 v1 h-1Z M38 22 h2 v1 h-2Z M41 22 h1 v1 h-1Z M43 22 h1 v1 h-1Z M45 22 h4 v1 h-4Z M4 23 h1 v1 h-1Z M6 23 h2 v1 h-2Z M9 23 h1 v1 h-1Z M11 23 h2 v1 h-2Z M14 23 h1 v1 h-1Z M16 23 h1 v1 h-1Z M20 23 h3 v1 h-3Z M24 23 h4 v1 h-4Z M29 23 h3 v1 h-3Z M33 23 h1 v1 h-1Z M35 23 h1 v1 h-1Z M38 23 h5 v1 h-5Z M48 23 h1 v1 h-1Z M4 24 h2 v1 h-2Z M13 24 h2 v1 h-2Z M18 24 h1 v1 h-1Z M20 24 h1 v1 h-1Z M35 24 h5 v1 h-5Z M45 24 h3 v1 h-3Z M4 25 h4 v1 h-4Z M17 25 h2 v1 h-2Z M20 25 h1 v1 h-1Z M22 25 h1 v1 h-1Z M33 25 h1 v1 h-1Z M38 25 h1 v1 h-1Z M46 25 h2 v1 h-2Z M6 26 h2 v1 h-2Z M14 26 h1 v1 h-1Z M20 26 h1 v1 h-1Z M29 26 h1 v1 h-1Z M37 26 h3 v1 h-3Z M45 26 h2 v1 h-2Z M48 26 h1 v1 h-1Z M5 27 h1 v1 h-1Z M14 27 h9 v1 h-9Z M30 27 h1 v1 h-1Z M33 27 h1 v1 h-1Z M35 27 h3 v1 h-3Z M39 27 h1 v1 h-1Z M46 27 h3 v1 h-3Z M5 28 h1 v1 h-1Z M7 28 h1 v1 h-1Z M13 28 h4 v1 h-4Z M21 28 h1 v1 h-1Z M29 28 h3 v1 h-3Z M39 28 h1 v1 h-1Z M45 28 h1 v1 h-1Z M47 28 h1 v1 h-1Z M8 29 h1 v1 h-1Z M11 29 h1 v1 h-1Z M13 29 h1 v1 h-1Z M16 29 h1 v1 h-1Z M18 29 h3 v1 h-3Z M22 29 h1 v1 h-1Z M26 29 h1 v1 h-1Z M28 29 h8 v1 h-8Z M37 29 h1 v1 h-1Z M42 29 h4 v1 h-4Z M47 29 h2 v1 h-2Z M7 30 h3 v1 h-3Z M13 30 h3 v1 h-3Z M18 30 h3 v1 h-3Z M24 30 h2 v1 h-2Z M27 30 h2 v1 h-2Z M30 30 h3 v1 h-3Z M38 30 h1 v1 h-1Z M41 30 h3 v1 h-3Z M5 31 h2 v1 h-2Z M11 31 h1 v1 h-1Z M13 31 h4 v1 h-4Z M20 31 h1 v1 h-1Z M23 31 h6 v1 h-6Z M30 31 h1 v1 h-1Z M33 31 h2 v1 h-2Z M36 31 h2 v1 h-2Z M39 31 h2 v1 h-2Z M42 31 h2 v1 h-2Z M45 31 h1 v1 h-1Z M47 31 h1 v1 h-1Z M5 32 h1 v1 h-1Z M8 32 h2 v1 h-2Z M12 32 h7 v1 h-7Z M20 32 h1 v1 h-1Z M22 32 h4 v1 h-4Z M27 32 h1 v1 h-1Z M32 32 h1 v1 h-1Z M34 32 h4 v1 h-4Z M43 32 h1 v1 h-1Z M8 33 h2 v1 h-2Z M11 33 h4 v1 h-4Z M16 33 h2 v1 h-2Z M22 33 h2 v1 h-2Z M25 33 h1 v1 h-1Z M27 33 h2 v1 h-2Z M31 33 h4 v1 h-4Z M36 33 h3 v1 h-3Z M40 33 h2 v1 h-2Z M43 33 h2 v1 h-2Z M46 33 h1 v1 h-1Z M48 33 h1 v1 h-1Z M4 34 h2 v1 h-2Z M7 34 h3 v1 h-3Z M12 34 h3 v1 h-3Z M18 34 h2 v1 h-2Z M21 34 h1 v1 h-1Z M23 34 h1 v1 h-1Z M27 34 h1 v1 h-1Z M30 34 h3 v1 h-3Z M35 34 h2 v1 h-2Z M40 34 h1 v1 h-1Z M44 34 h5 v1 h-5Z M4 35 h6 v1 h-6Z M11 35 h1 v1 h-1Z M14 35 h1 v1 h-1Z M16 35 h1 v1 h-1Z M18 35 h2 v1 h-2Z M22 35 h1 v1 h-1Z M24 35 h2 v1 h-2Z M28 35 h1 v1 h-1Z M30 35 h1 v1 h-1Z M32 35 h5 v1 h-5Z M38 35 h2 v1 h-2Z M41 35 h4 v1 h-4Z M46 35 h1 v1 h-1Z M48 35 h1 v1 h-1Z M6 36 h4 v1 h-4Z M12 36 h1 v1 h-1Z M16 36 h2 v1 h-2Z M19 36 h1 v1 h-1Z M21 36 h4 v1 h-4Z M28 36 h4 v1 h-4Z M33 36 h2 v1 h-2Z M37 36 h1 v1 h-1Z M39 36 h7 v1 h-7Z M47 36 h2 v1 h-2Z M5 37 h1 v1 h-1Z M7 37 h1 v1 h-1Z M9 37 h1 v1 h-1Z M11 37 h1 v1 h-1Z M13 37 h1 v1 h-1Z M15 37 h1 v1 h-1Z M19 37 h2 v1 h-2Z M23 37 h2 v1 h-2Z M26 37 h2 v1 h-2Z M29 37 h2 v1 h-2Z M33 37 h1 v1 h-1Z M35 37 h1 v1 h-1Z M37 37 h3 v1 h-3Z M42 37 h1 v1 h-1Z M44 37 h1 v1 h-1Z M47 37 h2 v1 h-2Z M13 38 h1 v1 h-1Z M18 38 h1 v1 h-1Z M20 38 h1 v1 h-1Z M26 38 h1 v1 h-1Z M28 38 h7 v1 h-7Z M37 38 h1 v1 h-1Z M39 38 h1 v1 h-1Z M41 38 h5 v1 h-5Z M11 39 h1 v1 h-1Z M15 39 h1 v1 h-1Z M17 39 h2 v1 h-2Z M22 39 h3 v1 h-3Z M27 39 h4 v1 h-4Z M32 39 h3 v1 h-3Z M38 39 h3 v1 h-3Z M42 39 h1 v1 h-1Z M44 39 h1 v1 h-1Z M47 39 h1 v1 h-1Z M13 40 h1 v1 h-1Z M16 40 h1 v1 h-1Z M19 40 h2 v1 h-2Z M22 40 h1 v1 h-1Z M29 40 h3 v1 h-3Z M34 40 h1 v1 h-1Z M36 40 h3 v1 h-3Z M46 40 h1 v1 h-1Z M13 41 h1 v1 h-1Z M15 41 h2 v1 h-2Z M20 41 h4 v1 h-4Z M29 41 h2 v1 h-2Z M38 41 h2 v1 h-2Z M45 41 h1 v1 h-1Z M47 41 h1 v1 h-1Z M13 42 h1 v1 h-1Z M16 42 h2 v1 h-2Z M19 42 h1 v1 h-1Z M22 42 h2 v1 h-2Z M30 42 h3 v1 h-3Z M35 42 h4 v1 h-4Z M46 42 h1 v1 h-1Z M48 42 h1 v1 h-1Z M14 43 h1 v1 h-1Z M18 43 h2 v1 h-2Z M33 43 h3 v1 h-3Z M37 43 h1 v1 h-1Z M47 43 h1 v1 h-1Z M13 44 h4 v1 h-4Z M18 44 h4 v1 h-4Z M29 44 h2 v1 h-2Z M32 44 h2 v1 h-2Z M36 44 h1 v1 h-1Z M45 44 h2 v1 h-2Z M48 44 h1 v1 h-1Z M15 45 h7 v1 h-7Z M24 45 h3 v1 h-3Z M28 45 h1 v1 h-1Z M31 45 h2 v1 h-2Z M34 45 h1 v1 h-1Z M37 45 h1 v1 h-1Z M39 45 h4 v1 h-4Z M44 45 h2 v1 h-2Z M48 45 h1 v1 h-1Z M15 46 h2 v1 h-2Z M21 46 h1 v1 h-1Z M23 46 h1 v1 h-1Z M29 46 h1 v1 h-1Z M31 46 h2 v1 h-2Z M35 46 h1 v1 h-1Z M38 46 h1 v1 h-1Z M43 46 h1 v1 h-1Z M47 46 h2 v1 h-2Z M13 47 h1 v1 h-1Z M16 47 h5 v1 h-5Z M22 47 h2 v1 h-2Z M25 47 h6 v1 h-6Z M32 47 h1 v1 h-1Z M36 47 h1 v1 h-1Z M38 47 h1 v1 h-1Z M40 47 h3 v1 h-3Z M45 47 h1 v1 h-1Z M47 47 h2 v1 h-2Z M13 48 h1 v1 h-1Z M15 48 h5 v1 h-5Z M23 48 h1 v1 h-1Z M25 48 h1 v1 h-1Z M27 48 h2 v1 h-2Z M30 48 h1 v1 h-1Z M32 48 h1 v1 h-1Z M34 48 h5 v1 h-5Z M40 48 h1 v1 h-1Z M43 48 h1 v1 h-1Z M48 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-6 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M5 5 h5 v1 h-5Z M43 5 h5 v1 h-5Z M5 6 h1 v1 h-1Z M9 6 h1 v1 h-1Z M43 6 h1 v1 h-1Z M47 6 h1 v1 h-1Z M5 7 h1 v1 h-1Z M9 7 h1 v1 h-1Z M43 7 h1 v1 h-1Z M47 7 h1 v1 h-1Z M5 8 h1 v1 h-1Z M9 8 h1 v1 h-1Z M43 8 h1 v1 h-1Z M47 8 h1 v1 h-1Z M5 9 h5 v1 h-5Z M43 9 h5 v1 h-5Z M5 43 h5 v1 h-5Z M5 44 h1 v1 h-1Z M9 44 h1 v1 h-1Z M5 45 h1 v1 h-1Z M9 45 h1 v1 h-1Z M5 46 h1 v1 h-1Z M9 46 h1 v1 h-1Z M5 47 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-8 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M11 4 h1 v1 h-1Z M41 4 h1 v1 h-1Z M11 5 h1 v1 h-1Z M41 5 h1 v1 h-1Z M11 6 h1 v1 h-1Z M41 6 h1 v1 h-1Z M11 7 h1 v1 h-1Z M41 7 h1 v1 h-1Z M11 8 h1 v1 h-1Z M41 8 h1 v1 h-1Z M11 9 h1 v1 h-1Z M41 9 h1 v1 h-1Z M11 10 h1 v1 h-1Z M41 10 h1 v1 h-1Z M4 11 h8 v1 h-8Z M41 11 h8 v1 h-8Z M4 41 h8 v1 h-8Z M11 42 h1 v1 h-1Z M11 43 h1 v1 h-1Z M11 44 h1 v1 h-1Z M11 45 h1 v1 h-1Z M11 46 h1 v1 h-1Z M11 47 h1 v1 h-1Z M11 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-10 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M25 9 h3 v1 h-3Z M25 10 h1 v1 h-1Z M27 10 h1 v1 h-1Z M25 11 h3 v1 h-3Z M9 25 h3 v1 h-3Z M25 25 h3 v1 h-3Z M41 25 h3 v1 h-3Z M9 26 h1 v1 h-1Z M11 26 h1 v1 h-1Z M25 26 h1 v1 h-1Z M27 26 h1 v1 h-1Z M41 26 h1 v1 h-1Z M43 26 h1 v1 h-1Z M9 27 h3 v1 h-3Z M25 27 h3 v1 h-3Z M41 27 h3 v1 h-3Z M25 41 h3 v1 h-3Z M41 41 h3 v1 h-3Z M25 42 h1 v1 h-1Z M27 42 h1 v1 h-1Z M41 42 h1 v1 h-1Z M43 42 h1 v1 h-1Z M25 43 h3 v1 h-3Z M41 43 h3 v1 h-3Z \" /\u003e\u003cpath class=\"qr-12 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M13 10 h1 v1 h-1Z M15 10 h1 v1 h-1Z M17 10 h1 v1 h-1Z M19 10 h1 v1 h-1Z M21 10 h1 v1 h-1Z M23 10 h1 v1 h-1Z M29 10 h1 v1 h-1Z M31 10 h1 v1 h-1Z M33 10 h1 v1 h-1Z M35 10 h1 v1 h-1Z M37 10 h1 v1 h-1Z M39 10 h1 v1 h-1Z M10 13 h1 v1 h-1Z M10 15 h1 v1 h-1Z M10 17 h1 v1 h-1Z M10 19 h1 v1 h-1Z M10 21 h1 v1 h-1Z M10 23 h1 v1 h-1Z M10 29 h1 v1 h-1Z M10 31 h1 v1 h-1Z M10 33 h1 v1 h-1Z M10 35 h1 v1 h-1Z M10 37 h1 v1 h-1Z M10 39 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-14 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M12 7 h1 v1 h-1Z M12 8 h1 v1 h-1Z M4 12 h2 v1 h-2Z M9 12 h1 v1 h-1Z M11 12 h1 v1 h-1Z M44 12 h2 v1 h-2Z M12 42 h1 v1 h-1Z M12 43 h1 v1 h-1Z M12 47 h1 v1 h-1Z M12 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-16 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M38 4 h2 v1 h-2Z M38 5 h1 v1 h-1Z M40 5 h1 v1 h-1Z M38 6 h1 v1 h-1Z M40 6 h1 v1 h-1Z M38 7 h1 v1 h-1Z M38 9 h3 v1 h-3Z M4 38 h4 v1 h-4Z M9 38 h1 v1 h-1Z M4 39 h1 v1 h-1Z M9 39 h1 v1 h-1Z M5 40 h2 v1 h-2Z M9 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-18 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M0 0 h53 v1 h-53Z M0 1 h53 v1 h-53Z M0 2 h53 v1 h-53Z M0 3 h53 v1 h-53Z M0 4 h4 v1 h-4Z M49 4 h4 v1 h-4Z M0 5 h4 v1 h-4Z M49 5 h4 v1 h-4Z M0 6 h4 v1 h-4Z M49 6 h4 v1 h-4Z M0 7 h4 v1 h-4Z M49 7 h4 v1 h-4Z M0 8 h4 v1 h-4Z M49 8 h4 v1 h-4Z M0 9 h4 v1 h-4Z M49 9 h4 v1 h-4Z M0 10 h4 v1 h-4Z M49 10 h4 v1 h-4Z M0 11 h4 v1 h-4Z M49 11 h4 v1 h-4Z M0 12 h4 v1 h-4Z M49 12 h4 v1 h-4Z M0 13 h4 v1 h-4Z M49 13 h4 v1 h-4Z M0 14 h4 v1 h-4Z M49 14 h4 v1 h-4Z M0 15 h4 v1 h-4Z M49 15 h4 v1 h-4Z M0 16 h4 v1 h-4Z M49 16 h4 v1 h-4Z M0 17 h4 v1 h-4Z M49 17 h4 v1 h-4Z M0 18 h4 v1 h-4Z M49 18 h4 v1 h-4Z M0 19 h4 v1 h-4Z M49 19 h4 v1 h-4Z M0 20 h4 v1 h-4Z M49 20 h4 v1 h-4Z M0 21 h4 v1 h-4Z M49 21 h4 v1 h-4Z M0 22 h4 v1 h-4Z M49 22 h4 v1 h-4Z M0 23 h4 v1 h-4Z M49 23 h4 v1 h-4Z M0 24 h4 v1 h-4Z M49 24 h4 v1 h-4Z M0 25 h4 v1 h-4Z M49 25 h4 v1 h-4Z M0 26 h4 v1 h-4Z M49 26 h4 v1 h-4Z M0 27 h4 v1 h-4Z M49 27 h4 v1 h-4Z M0 28 h4 v1 h-4Z M49 28 h4 v1 h-4Z M0 29 h4 v1 h-4Z M49 29 h4 v1 h-4Z M0 30 h4 v1 h-4Z M49 30 h4 v1 h-4Z M0 31 h4 v1 h-4Z M49 31 h4 v1 h-4Z M0 32 h4 v1 h-4Z M49 32 h4 v1 h-4Z M0 33 h4 v1 h-4Z M49 33 h4 v1 h-4Z M0 34 h4 v1 h-4Z M49 34 h4 v1 h-4Z M0 35 h4 v1 h-4Z M49 35 h4 v1 h-4Z M0 36 h4 v1 h-4Z M49 36 h4 v1 h-4Z M0 37 h4 v1 h-4Z M49 37 h4 v1 h-4Z M0 38 h4 v1 h-4Z M49 38 h4 v1 h-4Z M0 39 h4 v1 h-4Z M49 39 h4 v1 h-4Z M0 40 h4 v1 h-4Z M49 40 h4 v1 h-4Z M0 41 h4 v1 h-4Z M49 41 h4 v1 h-4Z M0 42 h4 v1 h-4Z M49 42 h4 v1 h-4Z M0 43 h4 v1 h-4Z M49 43 h4 v1 h-4Z M0 44 h4 v1 h-4Z M49 44 h4 v1 h-4Z M0 45 h4 v1 h-4Z M49 45 h4 v1 h-4Z M0 46 h4 v1 h-4Z M49 46 h4 v1 h-4Z M0 47 h4 v1 h-4Z M49 47 h4 v1 h-4Z M0 48 h4 v1 h-4Z M49 48 h4 v1 h-4Z M0 49 h53 v1 h-53Z M0 50 h53 v1 h-53Z M0 51 h53 v1 h-53Z M0 52 h53 v1 h-53Z \" /\u003e\u003cpath class=\"qr-512 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 41 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-1024 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M13 4 h3 v1 h-3Z M18 4 h1 v1 h-1Z M20 4 h4 v1 h-4Z M25 4 h3 v1 h-3Z M29 4 h1 v1 h-1Z M32 4 h4 v1 h-4Z M37 4 h1 v1 h-1Z M17 5 h3 v1 h-3Z M22 5 h1 v1 h-1Z M24 5 h1 v1 h-1Z M27 5 h2 v1 h-2Z M30 5 h1 v1 h-1Z M35 5 h2 v1 h-2Z M13 6 h1 v1 h-1Z M17 6 h2 v1 h-2Z M20 6 h1 v1 h-1Z M23 6 h1 v1 h-1Z M27 6 h2 v1 h-2Z M33 6 h3 v1 h-3Z M37 6 h1 v1 h-1Z M16 7 h1 v1 h-1Z M20 7 h1 v1 h-1Z M25 7 h1 v1 h-1Z M29 7 h1 v1 h-1Z M31 7 h1 v1 h-1Z M33 7 h2 v1 h-2Z M37 7 h1 v1 h-1Z M14 8 h5 v1 h-5Z M20 8 h1 v1 h-1Z M23 8 h1 v1 h-1Z M34 8 h2 v1 h-2Z M37 8 h1 v1 h-1Z M13 9 h1 v1 h-1Z M15 9 h2 v1 h-2Z M21 9 h1 v1 h-1Z M23 9 h1 v1 h-1Z M30 9 h3 v1 h-3Z M34 9 h1 v1 h-1Z M13 11 h1 v1 h-1Z M17 11 h3 v1 h-3Z M29 11 h2 v1 h-2Z M32 11 h2 v1 h-2Z M38 11 h1 v1 h-1Z M40 11 h1 v1 h-1Z M13 12 h1 v1 h-1Z M15 12 h2 v1 h-2Z M20 12 h4 v1 h-4Z M29 12 h4 v1 h-4Z M35 12 h2 v1 h-2Z M38 12 h1 v1 h-1Z M40 12 h1 v1 h-1Z M4 13 h1 v1 h-1Z M8 13 h2 v1 h-2Z M12 13 h1 v1 h-1Z M16 13 h4 v1 h-4Z M24 13 h1 v1 h-1Z M26 13 h4 v1 h-4Z M33 13 h1 v1 h-1Z M36 13 h2 v1 h-2Z M39 13 h1 v1 h-1Z M41 13 h4 v1 h-4Z M46 13 h1 v1 h-1Z M6 14 h2 v1 h-2Z M11 14 h2 v1 h-2Z M17 14 h1 v1 h-1Z M20 14 h6 v1 h-6Z M28 14 h5 v1 h-5Z M34 14 h5 v1 h-5Z M44 14 h5 v1 h-5Z M6 15 h1 v1 h-1Z M8 15 h2 v1 h-2Z M11 15 h1 v1 h-1Z M16 15 h5 v1 h-5Z M23 15 h1 v1 h-1Z M26 15 h2 v1 h-2Z M30 15 h3 v1 h-3Z M34 15 h2 v1 h-2Z M39 15 h1 v1 h-1Z M46 15 h1 v1 h-1Z M48 15 h1 v1 h-1Z M4 16 h2 v1 h-2Z M7 16 h1 v1 h-1Z M9 16 h1 v1 h-1Z M11 16 h1 v1 h-1Z M13 16 h3 v1 h-3Z M18 16 h4 v1 h-4Z M27 16 h8 v1 h-8Z M39 16 h2 v1 h-2Z M43 16 h1 v1 h-1Z M45 16 h4 v1 h-4Z M4 17 h1 v1 h-1Z M9 17 h1 v1 h-1Z M11 17 h1 v1 h-1Z M13 17 h4 v1 h-4Z M18 17 h1 v1 h-1Z M21 17 h1 v1 h-1Z M23 17 h2 v1 h-2Z M26 17 h2 v1 h-2Z M29 17 h1 v1 h-1Z M31 17 h1 v1 h-1Z M34 17 h2 v1 h-2Z M40 17 h2 v1 h-2Z M47 17 h1 v1 h-1Z M5 18 h3 v1 h-3Z M11 18 h1 v1 h-1Z M17 18 h2 v1 h-2Z M21 18 h1 v1 h-1Z M27 18 h1 v1 h-1Z M29 18 h2 v1 h-2Z M32 18 h3 v1 h-3Z M37 18 h7 v1 h-7Z M46 18 h1 v1 h-1Z M4 19 h1 v1 h-1Z M6 19 h2 v1 h-2Z M12 19 h1 v1 h-1Z M14 19 h2 v1 h-2Z M20 19 h2 v1 h-2Z M25 19 h3 v1 h-3Z M29 19 h5 v1 h-5Z M36 19 h1 v1 h-1Z M38 19 h1 v1 h-1Z M40 19 h4 v1 h-4Z M45 19 h3 v1 h-3Z M7 20 h3 v1 h-3Z M13 20 h6 v1 h-6Z M22 20 h1 v1 h-1Z M27 20 h3 v1 h-3Z M35 20 h1 v1 h-1Z M37 20 h3 v1 h-3Z M41 20 h1 v1 h-1Z M44 20 h2 v1 h-2Z M6 21 h2 v1 h-2Z M13 21 h1 v1 h-1Z M15 21 h1 v1 h-1Z M17 21 h2 v1 h-2Z M20 21 h3 v1 h-3Z M24 21 h3 v1 h-3Z M30 21 h2 v1 h-2Z M33 21 h1 v1 h-1Z M38 21 h3 v1 h-3Z M43 21 h3 v1 h-3Z M48 21 h1 v1 h-1Z M4 22 h2 v1 h-2Z M8 22 h1 v1 h-1Z M11 22 h1 v1 h-1Z M13 22 h1 v1 h-1Z M18 22 h2 v1 h-2Z M22 22 h3 v1 h-3Z M27 22 h2 v1 h-2Z M30 22 h3 v1 h-3Z M34 22 h2 v1 h-2Z M37 22 h1 v1 h-1Z M40 22 h1 v1 h-1Z M42 22 h1 v1 h-1Z M44 22 h1 v1 h-1Z M5 23 h1 v1 h-1Z M8 23 h1 v1 h-1Z M13 23 h1 v1 h-1Z M15 23 h1 v1 h-1Z M17 23 h3 v1 h-3Z M23 23 h1 v1 h-1Z M28 23 h1 v1 h-1Z M32 23 h1 v1 h-1Z M34 23 h1 v1 h-1Z M36 23 h2 v1 h-2Z M43 23 h5 v1 h-5Z M6 24 h2 v1 h-2Z M15 24 h3 v1 h-3Z M19 24 h1 v1 h-1Z M21 24 h3 v1 h-3Z M29 24 h6 v1 h-6Z M48 24 h1 v1 h-1Z M13 25 h4 v1 h-4Z M19 25 h1 v1 h-1Z M21 25 h1 v1 h-1Z M23 25 h1 v1 h-1Z M29 25 h4 v1 h-4Z M34 25 h4 v1 h-4Z M39 25 h1 v1 h-1Z M45 25 h1 v1 h-1Z M48 25 h1 v1 h-1Z M4 26 h2 v1 h-2Z M13 26 h1 v1 h-1Z M15 26 h5 v1 h-5Z M21 26 h3 v1 h-3Z M30 26 h7 v1 h-7Z M47 26 h1 v1 h-1Z M4 27 h1 v1 h-1Z M6 27 h2 v1 h-2Z M13 27 h1 v1 h-1Z M23 27 h1 v1 h-1Z M29 27 h1 v1 h-1Z M31 27 h2 v1 h-2Z M34 27 h1 v1 h-1Z M38 27 h1 v1 h-1Z M45 27 h1 v1 h-1Z M4 28 h1 v1 h-1Z M6 28 h1 v1 h-1Z M17 28 h4 v1 h-4Z M22 28 h2 v1 h-2Z M32 28 h7 v1 h-7Z M46 28 h1 v1 h-1Z M48 28 h1 v1 h-1Z M4 29 h4 v1 h-4Z M9 29 h1 v1 h-1Z M12 29 h1 v1 h-1Z M14 29 h2 v1 h-2Z M17 29 h1 v1 h-1Z M21 29 h1 v1 h-1Z M23 29 h3 v1 h-3Z M27 29 h1 v1 h-1Z M36 29 h1 v1 h-1Z M38 29 h4 v1 h-4Z M46 29 h1 v1 h-1Z M4 30 h3 v1 h-3Z M11 30 h2 v1 h-2Z M16 30 h2 v1 h-2Z M21 30 h3 v1 h-3Z M26 30 h1 v1 h-1Z M29 30 h1 v1 h-1Z M33 30 h5 v1 h-5Z M39 30 h2 v1 h-2Z M44 30 h5 v1 h-5Z M4 31 h1 v1 h-1Z M7 31 h3 v1 h-3Z M12 31 h1 v1 h-1Z M17 31 h3 v1 h-3Z M21 31 h2 v1 h-2Z M29 31 h1 v1 h-1Z M31 31 h2 v1 h-2Z M35 31 h1 v1 h-1Z M38 31 h1 v1 h-1Z M41 31 h1 v1 h-1Z M44 31 h1 v1 h-1Z M46 31 h1 v1 h-1Z M48 31 h1 v1 h-1Z M4 32 h1 v1 h-1Z M6 32 h2 v1 h-2Z M11 32 h1 v1 h-1Z M19 32 h1 v1 h-1Z M21 32 h1 v1 h-1Z M26 32 h1 v1 h-1Z M28 32 h4 v1 h-4Z M33 32 h1 v1 h-1Z M38 32 h5 v1 h-5Z M44 32 h5 v1 h-5Z M4 33 h4 v1 h-4Z M15 33 h1 v1 h-1Z M18 33 h4 v1 h-4Z M24 33 h1 v1 h-1Z M26 33 h1 v1 h-1Z M29 33 h2 v1 h-2Z M35 33 h1 v1 h-1Z M39 33 h1 v1 h-1Z M42 33 h1 v1 h-1Z M45 33 h1 v1 h-1Z M47 33 h1 v1 h-1Z M6 34 h1 v1 h-1Z M11 34 h1 v1 h-1Z M15 34 h3 v1 h-3Z M20 34 h1 v1 h-1Z M22 34 h1 v1 h-1Z M24 34 h3 v1 h-3Z M28 34 h2 v1 h-2Z M33 34 h2 v1 h-2Z M37 34 h3 v1 h-3Z M41 34 h3 v1 h-3Z M12 35 h2 v1 h-2Z M15 35 h1 v1 h-1Z M17 35 h1 v1 h-1Z M20 35 h2 v1 h-2Z M23 35 h1 v1 h-1Z M26 35 h2 v1 h-2Z M29 35 h1 v1 h-1Z M31 35 h1 v1 h-1Z M37 35 h1 v1 h-1Z M40 35 h1 v1 h-1Z M45 35 h1 v1 h-1Z M47 35 h1 v1 h-1Z M4 36 h2 v1 h-2Z M11 36 h1 v1 h-1Z M13 36 h3 v1 h-3Z M18 36 h1 v1 h-1Z M20 36 h1 v1 h-1Z M25 36 h3 v1 h-3Z M32 36 h1 v1 h-1Z M35 36 h2 v1 h-2Z M38 36 h1 v1 h-1Z M46 36 h1 v1 h-1Z M4 37 h1 v1 h-1Z M6 37 h1 v1 h-1Z M8 37 h1 v1 h-1Z M12 37 h1 v1 h-1Z M14 37 h1 v1 h-1Z M16 37 h3 v1 h-3Z M21 37 h2 v1 h-2Z M25 37 h1 v1 h-1Z M28 37 h1 v1 h-1Z M31 37 h2 v1 h-2Z M34 37 h1 v1 h-1Z M36 37 h1 v1 h-1Z M40 37 h2 v1 h-2Z M43 37 h1 v1 h-1Z M45 37 h2 v1 h-2Z M11 38 h2 v1 h-2Z M14 38 h4 v1 h-4Z M19 38 h1 v1 h-1Z M21 38 h5 v1 h-5Z M27 38 h1 v1 h-1Z M35 38 h2 v1 h-2Z M38 38 h1 v1 h-1Z M40 38 h1 v1 h-1Z M46 38 h3 v1 h-3Z M12 39 h3 v1 h-3Z M16 39 h1 v1 h-1Z M19 39 h3 v1 h-3Z M25 39 h2 v1 h-2Z M31 39 h1 v1 h-1Z M35 39 h3 v1 h-3Z M41 39 h1 v1 h-1Z M43 39 h1 v1 h-1Z M45 39 h2 v1 h-2Z M48 39 h1 v1 h-1Z M11 40 h2 v1 h-2Z M14 40 h2 v1 h-2Z M17 40 h2 v1 h-2Z M21 40 h1 v1 h-1Z M23 40 h1 v1 h-1Z M32 40 h2 v1 h-2Z M35 40 h1 v1 h-1Z M39 40 h1 v1 h-1Z M45 40 h1 v1 h-1Z M47 40 h2 v1 h-2Z M14 41 h1 v1 h-1Z M17 41 h3 v1 h-3Z M31 41 h7 v1 h-7Z M46 41 h1 v1 h-1Z M48 41 h1 v1 h-1Z M14 42 h2 v1 h-2Z M18 42 h1 v1 h-1Z M20 42 h2 v1 h-2Z M29 42 h1 v1 h-1Z M33 42 h2 v1 h-2Z M39 42 h1 v1 h-1Z M45 42 h1 v1 h-1Z M47 42 h1 v1 h-1Z M13 43 h1 v1 h-1Z M15 43 h3 v1 h-3Z M20 43 h4 v1 h-4Z M29 43 h4 v1 h-4Z M36 43 h1 v1 h-1Z M38 43 h2 v1 h-2Z M45 43 h2 v1 h-2Z M48 43 h1 v1 h-1Z M17 44 h1 v1 h-1Z M22 44 h2 v1 h-2Z M31 44 h1 v1 h-1Z M34 44 h2 v1 h-2Z M37 44 h3 v1 h-3Z M47 44 h1 v1 h-1Z M13 45 h2 v1 h-2Z M22 45 h2 v1 h-2Z M27 45 h1 v1 h-1Z M29 45 h2 v1 h-2Z M33 45 h1 v1 h-1Z M35 45 h2 v1 h-2Z M38 45 h1 v1 h-1Z M43 45 h1 v1 h-1Z M46 45 h2 v1 h-2Z M13 46 h2 v1 h-2Z M17 46 h4 v1 h-4Z M22 46 h1 v1 h-1Z M24 46 h5 v1 h-5Z M30 46 h1 v1 h-1Z M33 46 h2 v1 h-2Z M36 46 h2 v1 h-2Z M39 46 h4 v1 h-4Z M44 46 h3 v1 h-3Z M14 47 h2 v1 h-2Z M21 47 h1 v1 h-1Z M24 47 h1 v1 h-1Z M31 47 h1 v1 h-1Z M33 47 h3 v1 h-3Z M37 47 h1 v1 h-1Z M39 47 h1 v1 h-1Z M43 47 h2 v1 h-2Z M46 47 h1 v1 h-1Z M14 48 h1 v1 h-1Z M20 48 h3 v1 h-3Z M24 48 h1 v1 h-1Z M26 48 h1 v1 h-1Z M29 48 h1 v1 h-1Z M31 48 h1 v1 h-1Z M33 48 h1 v1 h-1Z M39 48 h1 v1 h-1Z M41 48 h2 v1 h-2Z M44 48 h4 v1 h-4Z \" /\u003e\u003cpath class=\"qr-1536 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M4 4 h7 v1 h-7Z M42 4 h7 v1 h-7Z M4 5 h1 v1 h-1Z M10 5 h1 v1 h-1Z M42 5 h1 v1 h-1Z M48 5 h1 v1 h-1Z M4 6 h1 v1 h-1Z M10 6 h1 v1 h-1Z M42 6 h1 v1 h-1Z M48 6 h1 v1 h-1Z M4 7 h1 v1 h-1Z M10 7 h1 v1 h-1Z M42 7 h1 v1 h-1Z M48 7 h1 v1 h-1Z M4 8 h1 v1 h-1Z M10 8 h1 v1 h-1Z M42 8 h1 v1 h-1Z M48 8 h1 v1 h-1Z M4 9 h1 v1 h-1Z M10 9 h1 v1 h-1Z M42 9 h1 v1 h-1Z M48 9 h1 v1 h-1Z M4 10 h7 v1 h-7Z M42 10 h7 v1 h-7Z M4 42 h7 v1 h-7Z M4 43 h1 v1 h-1Z M10 43 h1 v1 h-1Z M4 44 h1 v1 h-1Z M10 44 h1 v1 h-1Z M4 45 h1 v1 h-1Z M10 45 h1 v1 h-1Z M4 46 h1 v1 h-1Z M10 46 h1 v1 h-1Z M4 47 h1 v1 h-1Z M10 47 h1 v1 h-1Z M4 48 h7 v1 h-7Z \" /\u003e\u003cpath class=\"qr-2560 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M24 8 h5 v1 h-5Z M24 9 h1 v1 h-1Z M28 9 h1 v1 h-1Z M24 10 h1 v1 h-1Z M26 10 h1 v1 h-1Z M28 10 h1 v1 h-1Z M24 11 h1 v1 h-1Z M28 11 h1 v1 h-1Z M24 12 h5 v1 h-5Z M8 24 h5 v1 h-5Z M24 24 h5 v1 h-5Z M40 24 h5 v1 h-5Z M8 25 h1 v1 h-1Z M12 25 h1 v1 h-1Z M24 25 h1 v1 h-1Z M28 25 h1 v1 h-1Z M40 25 h1 v1 h-1Z M44 25 h1 v1 h-1Z M8 26 h1 v1 h-1Z M10 26 h1 v1 h-1Z M12 26 h1 v1 h-1Z M24 26 h1 v1 h-1Z M26 26 h1 v1 h-1Z M28 26 h1 v1 h-1Z M40 26 h1 v1 h-1Z M42 26 h1 v1 h-1Z M44 26 h1 v1 h-1Z M8 27 h1 v1 h-1Z M12 27 h1 v1 h-1Z M24 27 h1 v1 h-1Z M28 27 h1 v1 h-1Z M40 27 h1 v1 h-1Z M44 27 h1 v1 h-1Z M8 28 h5 v1 h-5Z M24 28 h5 v1 h-5Z M40 28 h5 v1 h-5Z M24 40 h5 v1 h-5Z M40 40 h5 v1 h-5Z M24 41 h1 v1 h-1Z M28 41 h1 v1 h-1Z M40 41 h1 v1 h-1Z M44 41 h1 v1 h-1Z M24 42 h1 v1 h-1Z M26 42 h1 v1 h-1Z M28 42 h1 v1 h-1Z M40 42 h1 v1 h-1Z M42 42 h1 v1 h-1Z M44 42 h1 v1 h-1Z M24 43 h1 v1 h-1Z M28 43 h1 v1 h-1Z M40 43 h1 v1 h-1Z M44 43 h1 v1 h-1Z M24 44 h5 v1 h-5Z M40 44 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-3072 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 10 h1 v1 h-1Z M14 10 h1 v1 h-1Z M16 10 h1 v1 h-1Z M18 10 h1 v1 h-1Z M20 10 h1 v1 h-1Z M22 10 h1 v1 h-1Z M30 10 h1 v1 h-1Z M32 10 h1 v1 h-1Z M34 10 h1 v1 h-1Z M36 10 h1 v1 h-1Z M38 10 h1 v1 h-1Z M40 10 h1 v1 h-1Z M10 12 h1 v1 h-1Z M10 14 h1 v1 h-1Z M10 16 h1 v1 h-1Z M10 18 h1 v1 h-1Z M10 20 h1 v1 h-1Z M10 22 h1 v1 h-1Z M10 30 h1 v1 h-1Z M10 32 h1 v1 h-1Z M10 34 h1 v1 h-1Z M10 36 h1 v1 h-1Z M10 38 h1 v1 h-1Z M10 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-3584 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 4 h1 v1 h-1Z M12 5 h1 v1 h-1Z M12 6 h1 v1 h-1Z M12 9 h1 v1 h-1Z M12 11 h1 v1 h-1Z M6 12 h3 v1 h-3Z M12 12 h1 v1 h-1Z M41 12 h3 v1 h-3Z M46 12 h3 v1 h-3Z M12 44 h1 v1 h-1Z M12 45 h1 v1 h-1Z M12 46 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-4096 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M40 4 h1 v1 h-1Z M39 5 h1 v1 h-1Z M39 6 h1 v1 h-1Z M39 7 h2 v1 h-2Z M38 8 h3 v1 h-3Z M8 38 h1 v1 h-1Z M5 39 h4 v1 h-4Z M4 40 h1 v1 h-1Z M7 40 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-5632 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M6 6 h3 v1 h-3Z M44 6 h3 v1 h-3Z M6 7 h3 v1 h-3Z M44 7 h3 v1 h-3Z M6 8 h3 v1 h-3Z M44 8 h3 v1 h-3Z M6 44 h3 v1 h-3Z M6 45 h3 v1 h-3Z M6 46 h3 v1 h-3Z \" /\u003e\u003c/svg\u003e\n\n    \u003c/a\u003e\n    \u003cfigcaption aria-hidden=\"true\" class=\"hidden\" hidden\u003eEt, un Ko-fi pour Stéphane HUC\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\n\u003ch3 id=\"liberapay\"\u003eLiberapay\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.liberapay.com/HucSte/donate\" rel=\"external\"\u003ehttps://fr.liberapay.com/HucSte/donate\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\n\u003cfigure class=\"pure-img\"\u003e\n    \u003ca href=\"/svg/qrcode/liberapay.svg\" title=\"Un don Liberapay pour Stéphane HUC\"\u003e\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" class=\"qr-svg \" height=\"128\" viewBox=\"0 0 53 53\" width=\"128\"\u003e\n\u003cdefs\u003e\u003cstyle\u003erect{shape-rendering:crispEdges}\u003c/style\u003e\u003c/defs\u003e\n\u003cpath class=\"qr-4 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M14 4 h2 v1 h-2Z M18 4 h1 v1 h-1Z M22 4 h5 v1 h-5Z M28 4 h1 v1 h-1Z M30 4 h2 v1 h-2Z M35 4 h1 v1 h-1Z M13 5 h1 v1 h-1Z M15 5 h2 v1 h-2Z M18 5 h1 v1 h-1Z M20 5 h1 v1 h-1Z M23 5 h1 v1 h-1Z M26 5 h3 v1 h-3Z M30 5 h2 v1 h-2Z M36 5 h1 v1 h-1Z M17 6 h1 v1 h-1Z M26 6 h1 v1 h-1Z M28 6 h2 v1 h-2Z M31 6 h2 v1 h-2Z M35 6 h3 v1 h-3Z M13 7 h3 v1 h-3Z M17 7 h3 v1 h-3Z M21 7 h8 v1 h-8Z M30 7 h1 v1 h-1Z M35 7 h2 v1 h-2Z M13 8 h1 v1 h-1Z M15 8 h2 v1 h-2Z M18 8 h3 v1 h-3Z M22 8 h2 v1 h-2Z M29 8 h2 v1 h-2Z M32 8 h1 v1 h-1Z M34 8 h1 v1 h-1Z M37 8 h1 v1 h-1Z M13 9 h1 v1 h-1Z M16 9 h2 v1 h-2Z M20 9 h1 v1 h-1Z M23 9 h1 v1 h-1Z M29 9 h1 v1 h-1Z M33 9 h1 v1 h-1Z M36 9 h1 v1 h-1Z M13 11 h1 v1 h-1Z M20 11 h4 v1 h-4Z M29 11 h1 v1 h-1Z M33 11 h3 v1 h-3Z M40 11 h1 v1 h-1Z M13 12 h1 v1 h-1Z M15 12 h4 v1 h-4Z M20 12 h1 v1 h-1Z M22 12 h2 v1 h-2Z M29 12 h1 v1 h-1Z M31 12 h5 v1 h-5Z M38 12 h3 v1 h-3Z M4 13 h3 v1 h-3Z M9 13 h1 v1 h-1Z M11 13 h2 v1 h-2Z M14 13 h2 v1 h-2Z M18 13 h2 v1 h-2Z M21 13 h1 v1 h-1Z M23 13 h1 v1 h-1Z M25 13 h1 v1 h-1Z M27 13 h3 v1 h-3Z M31 13 h2 v1 h-2Z M35 13 h1 v1 h-1Z M38 13 h1 v1 h-1Z M40 13 h1 v1 h-1Z M45 13 h1 v1 h-1Z M47 13 h2 v1 h-2Z M5 14 h4 v1 h-4Z M11 14 h1 v1 h-1Z M13 14 h4 v1 h-4Z M19 14 h1 v1 h-1Z M21 14 h2 v1 h-2Z M24 14 h1 v1 h-1Z M26 14 h1 v1 h-1Z M29 14 h1 v1 h-1Z M31 14 h1 v1 h-1Z M36 14 h2 v1 h-2Z M41 14 h1 v1 h-1Z M45 14 h2 v1 h-2Z M48 14 h1 v1 h-1Z M7 15 h1 v1 h-1Z M9 15 h1 v1 h-1Z M12 15 h2 v1 h-2Z M16 15 h4 v1 h-4Z M21 15 h1 v1 h-1Z M23 15 h3 v1 h-3Z M27 15 h2 v1 h-2Z M31 15 h5 v1 h-5Z M37 15 h2 v1 h-2Z M42 15 h1 v1 h-1Z M45 15 h2 v1 h-2Z M7 16 h1 v1 h-1Z M11 16 h3 v1 h-3Z M17 16 h1 v1 h-1Z M19 16 h1 v1 h-1Z M22 16 h3 v1 h-3Z M26 16 h2 v1 h-2Z M31 16 h2 v1 h-2Z M36 16 h7 v1 h-7Z M44 16 h1 v1 h-1Z M4 17 h3 v1 h-3Z M8 17 h1 v1 h-1Z M11 17 h1 v1 h-1Z M13 17 h1 v1 h-1Z M15 17 h2 v1 h-2Z M18 17 h4 v1 h-4Z M24 17 h4 v1 h-4Z M31 17 h2 v1 h-2Z M34 17 h1 v1 h-1Z M37 17 h4 v1 h-4Z M44 17 h1 v1 h-1Z M48 17 h1 v1 h-1Z M4 18 h2 v1 h-2Z M8 18 h2 v1 h-2Z M11 18 h1 v1 h-1Z M16 18 h2 v1 h-2Z M19 18 h3 v1 h-3Z M23 18 h3 v1 h-3Z M27 18 h3 v1 h-3Z M31 18 h1 v1 h-1Z M34 18 h1 v1 h-1Z M36 18 h3 v1 h-3Z M41 18 h1 v1 h-1Z M43 18 h1 v1 h-1Z M45 18 h4 v1 h-4Z M8 19 h2 v1 h-2Z M11 19 h1 v1 h-1Z M13 19 h1 v1 h-1Z M15 19 h1 v1 h-1Z M17 19 h1 v1 h-1Z M19 19 h1 v1 h-1Z M21 19 h1 v1 h-1Z M24 19 h1 v1 h-1Z M32 19 h1 v1 h-1Z M34 19 h2 v1 h-2Z M37 19 h2 v1 h-2Z M40 19 h4 v1 h-4Z M47 19 h2 v1 h-2Z M5 20 h2 v1 h-2Z M9 20 h1 v1 h-1Z M12 20 h2 v1 h-2Z M16 20 h2 v1 h-2Z M20 20 h1 v1 h-1Z M24 20 h2 v1 h-2Z M27 20 h4 v1 h-4Z M37 20 h3 v1 h-3Z M44 20 h2 v1 h-2Z M47 20 h2 v1 h-2Z M4 21 h1 v1 h-1Z M6 21 h2 v1 h-2Z M9 21 h1 v1 h-1Z M13 21 h1 v1 h-1Z M18 21 h1 v1 h-1Z M20 21 h1 v1 h-1Z M23 21 h1 v1 h-1Z M25 21 h1 v1 h-1Z M27 21 h3 v1 h-3Z M31 21 h1 v1 h-1Z M35 21 h1 v1 h-1Z M40 21 h3 v1 h-3Z M44 21 h3 v1 h-3Z M4 22 h1 v1 h-1Z M7 22 h1 v1 h-1Z M9 22 h1 v1 h-1Z M11 22 h8 v1 h-8Z M20 22 h1 v1 h-1Z M22 22 h1 v1 h-1Z M24 22 h2 v1 h-2Z M32 22 h2 v1 h-2Z M44 22 h3 v1 h-3Z M48 22 h1 v1 h-1Z M8 23 h2 v1 h-2Z M11 23 h1 v1 h-1Z M14 23 h2 v1 h-2Z M18 23 h4 v1 h-4Z M23 23 h2 v1 h-2Z M26 23 h1 v1 h-1Z M28 23 h5 v1 h-5Z M34 23 h5 v1 h-5Z M40 23 h1 v1 h-1Z M43 23 h1 v1 h-1Z M45 23 h2 v1 h-2Z M5 24 h2 v1 h-2Z M16 24 h3 v1 h-3Z M20 24 h1 v1 h-1Z M22 24 h2 v1 h-2Z M29 24 h1 v1 h-1Z M31 24 h1 v1 h-1Z M34 24 h1 v1 h-1Z M36 24 h1 v1 h-1Z M39 24 h1 v1 h-1Z M45 24 h1 v1 h-1Z M4 25 h2 v1 h-2Z M7 25 h1 v1 h-1Z M13 25 h7 v1 h-7Z M21 25 h3 v1 h-3Z M29 25 h2 v1 h-2Z M33 25 h1 v1 h-1Z M35 25 h1 v1 h-1Z M38 25 h1 v1 h-1Z M47 25 h1 v1 h-1Z M4 26 h1 v1 h-1Z M13 26 h4 v1 h-4Z M18 26 h1 v1 h-1Z M20 26 h1 v1 h-1Z M23 26 h1 v1 h-1Z M30 26 h2 v1 h-2Z M33 26 h3 v1 h-3Z M38 26 h1 v1 h-1Z M45 26 h2 v1 h-2Z M6 27 h1 v1 h-1Z M13 27 h1 v1 h-1Z M15 27 h1 v1 h-1Z M18 27 h1 v1 h-1Z M21 27 h2 v1 h-2Z M30 27 h1 v1 h-1Z M33 27 h2 v1 h-2Z M36 27 h1 v1 h-1Z M38 27 h2 v1 h-2Z M46 27 h1 v1 h-1Z M4 28 h1 v1 h-1Z M7 28 h1 v1 h-1Z M15 28 h2 v1 h-2Z M20 28 h1 v1 h-1Z M23 28 h1 v1 h-1Z M30 28 h1 v1 h-1Z M32 28 h3 v1 h-3Z M39 28 h1 v1 h-1Z M45 28 h2 v1 h-2Z M48 28 h1 v1 h-1Z M5 29 h4 v1 h-4Z M11 29 h5 v1 h-5Z M19 29 h2 v1 h-2Z M23 29 h1 v1 h-1Z M25 29 h1 v1 h-1Z M28 29 h3 v1 h-3Z M32 29 h2 v1 h-2Z M35 29 h2 v1 h-2Z M39 29 h3 v1 h-3Z M44 29 h1 v1 h-1Z M46 29 h2 v1 h-2Z M9 30 h1 v1 h-1Z M11 30 h1 v1 h-1Z M13 30 h1 v1 h-1Z M15 30 h3 v1 h-3Z M23 30 h2 v1 h-2Z M26 30 h3 v1 h-3Z M30 30 h1 v1 h-1Z M32 30 h1 v1 h-1Z M35 30 h1 v1 h-1Z M37 30 h1 v1 h-1Z M40 30 h5 v1 h-5Z M46 30 h2 v1 h-2Z M5 31 h2 v1 h-2Z M11 31 h1 v1 h-1Z M14 31 h5 v1 h-5Z M20 31 h1 v1 h-1Z M22 31 h1 v1 h-1Z M25 31 h4 v1 h-4Z M33 31 h1 v1 h-1Z M36 31 h2 v1 h-2Z M39 31 h3 v1 h-3Z M44 31 h2 v1 h-2Z M47 31 h1 v1 h-1Z M5 32 h1 v1 h-1Z M7 32 h3 v1 h-3Z M12 32 h2 v1 h-2Z M16 32 h1 v1 h-1Z M22 32 h1 v1 h-1Z M28 32 h1 v1 h-1Z M31 32 h3 v1 h-3Z M35 32 h1 v1 h-1Z M39 32 h2 v1 h-2Z M42 32 h1 v1 h-1Z M45 32 h2 v1 h-2Z M48 32 h1 v1 h-1Z M7 33 h2 v1 h-2Z M13 33 h1 v1 h-1Z M17 33 h2 v1 h-2Z M20 33 h1 v1 h-1Z M22 33 h1 v1 h-1Z M24 33 h1 v1 h-1Z M26 33 h2 v1 h-2Z M34 33 h3 v1 h-3Z M48 33 h1 v1 h-1Z M4 34 h6 v1 h-6Z M11 34 h4 v1 h-4Z M16 34 h4 v1 h-4Z M21 34 h1 v1 h-1Z M23 34 h1 v1 h-1Z M25 34 h3 v1 h-3Z M31 34 h3 v1 h-3Z M35 34 h2 v1 h-2Z M40 34 h1 v1 h-1Z M44 34 h5 v1 h-5Z M5 35 h2 v1 h-2Z M8 35 h1 v1 h-1Z M11 35 h2 v1 h-2Z M16 35 h1 v1 h-1Z M19 35 h1 v1 h-1Z M21 35 h1 v1 h-1Z M23 35 h5 v1 h-5Z M31 35 h2 v1 h-2Z M34 35 h3 v1 h-3Z M40 35 h2 v1 h-2Z M44 35 h2 v1 h-2Z M4 36 h4 v1 h-4Z M9 36 h1 v1 h-1Z M15 36 h4 v1 h-4Z M20 36 h2 v1 h-2Z M24 36 h1 v1 h-1Z M30 36 h2 v1 h-2Z M35 36 h5 v1 h-5Z M42 36 h1 v1 h-1Z M45 36 h4 v1 h-4Z M5 37 h1 v1 h-1Z M9 37 h1 v1 h-1Z M12 37 h2 v1 h-2Z M15 37 h1 v1 h-1Z M17 37 h2 v1 h-2Z M20 37 h1 v1 h-1Z M23 37 h2 v1 h-2Z M26 37 h2 v1 h-2Z M29 37 h2 v1 h-2Z M32 37 h2 v1 h-2Z M35 37 h1 v1 h-1Z M37 37 h3 v1 h-3Z M42 37 h1 v1 h-1Z M44 37 h1 v1 h-1Z M47 37 h2 v1 h-2Z M12 38 h1 v1 h-1Z M17 38 h1 v1 h-1Z M20 38 h1 v1 h-1Z M22 38 h1 v1 h-1Z M24 38 h1 v1 h-1Z M26 38 h4 v1 h-4Z M32 38 h1 v1 h-1Z M36 38 h2 v1 h-2Z M40 38 h2 v1 h-2Z M44 38 h1 v1 h-1Z M46 38 h1 v1 h-1Z M11 39 h1 v1 h-1Z M13 39 h2 v1 h-2Z M17 39 h1 v1 h-1Z M19 39 h4 v1 h-4Z M24 39 h1 v1 h-1Z M28 39 h1 v1 h-1Z M30 39 h3 v1 h-3Z M38 39 h1 v1 h-1Z M40 39 h4 v1 h-4Z M46 39 h2 v1 h-2Z M13 40 h1 v1 h-1Z M15 40 h3 v1 h-3Z M19 40 h3 v1 h-3Z M29 40 h3 v1 h-3Z M36 40 h2 v1 h-2Z M39 40 h1 v1 h-1Z M46 40 h1 v1 h-1Z M15 41 h7 v1 h-7Z M23 41 h1 v1 h-1Z M29 41 h1 v1 h-1Z M32 41 h1 v1 h-1Z M36 41 h1 v1 h-1Z M38 41 h2 v1 h-2Z M45 41 h4 v1 h-4Z M13 42 h1 v1 h-1Z M16 42 h1 v1 h-1Z M20 42 h4 v1 h-4Z M32 42 h3 v1 h-3Z M36 42 h4 v1 h-4Z M46 42 h3 v1 h-3Z M16 43 h2 v1 h-2Z M19 43 h1 v1 h-1Z M23 43 h1 v1 h-1Z M29 43 h2 v1 h-2Z M32 43 h3 v1 h-3Z M37 43 h1 v1 h-1Z M47 43 h2 v1 h-2Z M14 44 h1 v1 h-1Z M17 44 h4 v1 h-4Z M23 44 h1 v1 h-1Z M29 44 h1 v1 h-1Z M31 44 h1 v1 h-1Z M34 44 h1 v1 h-1Z M37 44 h1 v1 h-1Z M45 44 h1 v1 h-1Z M48 44 h1 v1 h-1Z M14 45 h2 v1 h-2Z M17 45 h1 v1 h-1Z M19 45 h1 v1 h-1Z M23 45 h6 v1 h-6Z M30 45 h3 v1 h-3Z M38 45 h2 v1 h-2Z M42 45 h2 v1 h-2Z M45 45 h2 v1 h-2Z M13 46 h1 v1 h-1Z M19 46 h4 v1 h-4Z M25 46 h3 v1 h-3Z M29 46 h1 v1 h-1Z M31 46 h2 v1 h-2Z M36 46 h1 v1 h-1Z M38 46 h1 v1 h-1Z M43 46 h1 v1 h-1Z M46 46 h3 v1 h-3Z M14 47 h1 v1 h-1Z M16 47 h2 v1 h-2Z M21 47 h1 v1 h-1Z M27 47 h7 v1 h-7Z M37 47 h2 v1 h-2Z M40 47 h2 v1 h-2Z M43 47 h1 v1 h-1Z M45 47 h3 v1 h-3Z M13 48 h1 v1 h-1Z M15 48 h1 v1 h-1Z M18 48 h1 v1 h-1Z M20 48 h1 v1 h-1Z M22 48 h3 v1 h-3Z M29 48 h2 v1 h-2Z M32 48 h1 v1 h-1Z M34 48 h1 v1 h-1Z M36 48 h1 v1 h-1Z M39 48 h3 v1 h-3Z M44 48 h1 v1 h-1Z M46 48 h3 v1 h-3Z \" /\u003e\u003cpath class=\"qr-6 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M5 5 h5 v1 h-5Z M43 5 h5 v1 h-5Z M5 6 h1 v1 h-1Z M9 6 h1 v1 h-1Z M43 6 h1 v1 h-1Z M47 6 h1 v1 h-1Z M5 7 h1 v1 h-1Z M9 7 h1 v1 h-1Z M43 7 h1 v1 h-1Z M47 7 h1 v1 h-1Z M5 8 h1 v1 h-1Z M9 8 h1 v1 h-1Z M43 8 h1 v1 h-1Z M47 8 h1 v1 h-1Z M5 9 h5 v1 h-5Z M43 9 h5 v1 h-5Z M5 43 h5 v1 h-5Z M5 44 h1 v1 h-1Z M9 44 h1 v1 h-1Z M5 45 h1 v1 h-1Z M9 45 h1 v1 h-1Z M5 46 h1 v1 h-1Z M9 46 h1 v1 h-1Z M5 47 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-8 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M11 4 h1 v1 h-1Z M41 4 h1 v1 h-1Z M11 5 h1 v1 h-1Z M41 5 h1 v1 h-1Z M11 6 h1 v1 h-1Z M41 6 h1 v1 h-1Z M11 7 h1 v1 h-1Z M41 7 h1 v1 h-1Z M11 8 h1 v1 h-1Z M41 8 h1 v1 h-1Z M11 9 h1 v1 h-1Z M41 9 h1 v1 h-1Z M11 10 h1 v1 h-1Z M41 10 h1 v1 h-1Z M4 11 h8 v1 h-8Z M41 11 h8 v1 h-8Z M4 41 h8 v1 h-8Z M11 42 h1 v1 h-1Z M11 43 h1 v1 h-1Z M11 44 h1 v1 h-1Z M11 45 h1 v1 h-1Z M11 46 h1 v1 h-1Z M11 47 h1 v1 h-1Z M11 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-10 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M25 9 h3 v1 h-3Z M25 10 h1 v1 h-1Z M27 10 h1 v1 h-1Z M25 11 h3 v1 h-3Z M9 25 h3 v1 h-3Z M25 25 h3 v1 h-3Z M41 25 h3 v1 h-3Z M9 26 h1 v1 h-1Z M11 26 h1 v1 h-1Z M25 26 h1 v1 h-1Z M27 26 h1 v1 h-1Z M41 26 h1 v1 h-1Z M43 26 h1 v1 h-1Z M9 27 h3 v1 h-3Z M25 27 h3 v1 h-3Z M41 27 h3 v1 h-3Z M25 41 h3 v1 h-3Z M41 41 h3 v1 h-3Z M25 42 h1 v1 h-1Z M27 42 h1 v1 h-1Z M41 42 h1 v1 h-1Z M43 42 h1 v1 h-1Z M25 43 h3 v1 h-3Z M41 43 h3 v1 h-3Z \" /\u003e\u003cpath class=\"qr-12 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M13 10 h1 v1 h-1Z M15 10 h1 v1 h-1Z M17 10 h1 v1 h-1Z M19 10 h1 v1 h-1Z M21 10 h1 v1 h-1Z M23 10 h1 v1 h-1Z M29 10 h1 v1 h-1Z M31 10 h1 v1 h-1Z M33 10 h1 v1 h-1Z M35 10 h1 v1 h-1Z M37 10 h1 v1 h-1Z M39 10 h1 v1 h-1Z M10 13 h1 v1 h-1Z M10 15 h1 v1 h-1Z M10 17 h1 v1 h-1Z M10 19 h1 v1 h-1Z M10 21 h1 v1 h-1Z M10 23 h1 v1 h-1Z M10 29 h1 v1 h-1Z M10 31 h1 v1 h-1Z M10 33 h1 v1 h-1Z M10 35 h1 v1 h-1Z M10 37 h1 v1 h-1Z M10 39 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-14 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M12 4 h1 v1 h-1Z M12 5 h1 v1 h-1Z M12 6 h1 v1 h-1Z M12 7 h1 v1 h-1Z M12 9 h1 v1 h-1Z M4 12 h2 v1 h-2Z M8 12 h2 v1 h-2Z M43 12 h1 v1 h-1Z M45 12 h4 v1 h-4Z M12 43 h1 v1 h-1Z M12 44 h1 v1 h-1Z M12 47 h1 v1 h-1Z M12 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-16 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M38 4 h2 v1 h-2Z M38 5 h1 v1 h-1Z M40 5 h1 v1 h-1Z M38 6 h1 v1 h-1Z M40 6 h1 v1 h-1Z M38 7 h1 v1 h-1Z M38 9 h3 v1 h-3Z M4 38 h4 v1 h-4Z M9 38 h1 v1 h-1Z M4 39 h1 v1 h-1Z M9 39 h1 v1 h-1Z M5 40 h2 v1 h-2Z M9 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-18 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M0 0 h53 v1 h-53Z M0 1 h53 v1 h-53Z M0 2 h53 v1 h-53Z M0 3 h53 v1 h-53Z M0 4 h4 v1 h-4Z M49 4 h4 v1 h-4Z M0 5 h4 v1 h-4Z M49 5 h4 v1 h-4Z M0 6 h4 v1 h-4Z M49 6 h4 v1 h-4Z M0 7 h4 v1 h-4Z M49 7 h4 v1 h-4Z M0 8 h4 v1 h-4Z M49 8 h4 v1 h-4Z M0 9 h4 v1 h-4Z M49 9 h4 v1 h-4Z M0 10 h4 v1 h-4Z M49 10 h4 v1 h-4Z M0 11 h4 v1 h-4Z M49 11 h4 v1 h-4Z M0 12 h4 v1 h-4Z M49 12 h4 v1 h-4Z M0 13 h4 v1 h-4Z M49 13 h4 v1 h-4Z M0 14 h4 v1 h-4Z M49 14 h4 v1 h-4Z M0 15 h4 v1 h-4Z M49 15 h4 v1 h-4Z M0 16 h4 v1 h-4Z M49 16 h4 v1 h-4Z M0 17 h4 v1 h-4Z M49 17 h4 v1 h-4Z M0 18 h4 v1 h-4Z M49 18 h4 v1 h-4Z M0 19 h4 v1 h-4Z M49 19 h4 v1 h-4Z M0 20 h4 v1 h-4Z M49 20 h4 v1 h-4Z M0 21 h4 v1 h-4Z M49 21 h4 v1 h-4Z M0 22 h4 v1 h-4Z M49 22 h4 v1 h-4Z M0 23 h4 v1 h-4Z M49 23 h4 v1 h-4Z M0 24 h4 v1 h-4Z M49 24 h4 v1 h-4Z M0 25 h4 v1 h-4Z M49 25 h4 v1 h-4Z M0 26 h4 v1 h-4Z M49 26 h4 v1 h-4Z M0 27 h4 v1 h-4Z M49 27 h4 v1 h-4Z M0 28 h4 v1 h-4Z M49 28 h4 v1 h-4Z M0 29 h4 v1 h-4Z M49 29 h4 v1 h-4Z M0 30 h4 v1 h-4Z M49 30 h4 v1 h-4Z M0 31 h4 v1 h-4Z M49 31 h4 v1 h-4Z M0 32 h4 v1 h-4Z M49 32 h4 v1 h-4Z M0 33 h4 v1 h-4Z M49 33 h4 v1 h-4Z M0 34 h4 v1 h-4Z M49 34 h4 v1 h-4Z M0 35 h4 v1 h-4Z M49 35 h4 v1 h-4Z M0 36 h4 v1 h-4Z M49 36 h4 v1 h-4Z M0 37 h4 v1 h-4Z M49 37 h4 v1 h-4Z M0 38 h4 v1 h-4Z M49 38 h4 v1 h-4Z M0 39 h4 v1 h-4Z M49 39 h4 v1 h-4Z M0 40 h4 v1 h-4Z M49 40 h4 v1 h-4Z M0 41 h4 v1 h-4Z M49 41 h4 v1 h-4Z M0 42 h4 v1 h-4Z M49 42 h4 v1 h-4Z M0 43 h4 v1 h-4Z M49 43 h4 v1 h-4Z M0 44 h4 v1 h-4Z M49 44 h4 v1 h-4Z M0 45 h4 v1 h-4Z M49 45 h4 v1 h-4Z M0 46 h4 v1 h-4Z M49 46 h4 v1 h-4Z M0 47 h4 v1 h-4Z M49 47 h4 v1 h-4Z M0 48 h4 v1 h-4Z M49 48 h4 v1 h-4Z M0 49 h53 v1 h-53Z M0 50 h53 v1 h-53Z M0 51 h53 v1 h-53Z M0 52 h53 v1 h-53Z \" /\u003e\u003cpath class=\"qr-512 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 41 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-1024 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M13 4 h1 v1 h-1Z M16 4 h2 v1 h-2Z M19 4 h3 v1 h-3Z M27 4 h1 v1 h-1Z M29 4 h1 v1 h-1Z M32 4 h3 v1 h-3Z M36 4 h2 v1 h-2Z M14 5 h1 v1 h-1Z M17 5 h1 v1 h-1Z M19 5 h1 v1 h-1Z M21 5 h2 v1 h-2Z M24 5 h2 v1 h-2Z M29 5 h1 v1 h-1Z M32 5 h4 v1 h-4Z M37 5 h1 v1 h-1Z M13 6 h4 v1 h-4Z M18 6 h8 v1 h-8Z M27 6 h1 v1 h-1Z M30 6 h1 v1 h-1Z M33 6 h2 v1 h-2Z M16 7 h1 v1 h-1Z M20 7 h1 v1 h-1Z M29 7 h1 v1 h-1Z M31 7 h4 v1 h-4Z M37 7 h1 v1 h-1Z M14 8 h1 v1 h-1Z M17 8 h1 v1 h-1Z M21 8 h1 v1 h-1Z M31 8 h1 v1 h-1Z M33 8 h1 v1 h-1Z M35 8 h2 v1 h-2Z M14 9 h2 v1 h-2Z M18 9 h2 v1 h-2Z M21 9 h2 v1 h-2Z M30 9 h3 v1 h-3Z M34 9 h2 v1 h-2Z M37 9 h1 v1 h-1Z M14 11 h6 v1 h-6Z M30 11 h3 v1 h-3Z M36 11 h4 v1 h-4Z M14 12 h1 v1 h-1Z M19 12 h1 v1 h-1Z M21 12 h1 v1 h-1Z M30 12 h1 v1 h-1Z M36 12 h2 v1 h-2Z M7 13 h2 v1 h-2Z M13 13 h1 v1 h-1Z M16 13 h2 v1 h-2Z M20 13 h1 v1 h-1Z M22 13 h1 v1 h-1Z M24 13 h1 v1 h-1Z M26 13 h1 v1 h-1Z M30 13 h1 v1 h-1Z M33 13 h2 v1 h-2Z M36 13 h2 v1 h-2Z M39 13 h1 v1 h-1Z M41 13 h4 v1 h-4Z M46 13 h1 v1 h-1Z M4 14 h1 v1 h-1Z M9 14 h1 v1 h-1Z M12 14 h1 v1 h-1Z M17 14 h2 v1 h-2Z M20 14 h1 v1 h-1Z M23 14 h1 v1 h-1Z M25 14 h1 v1 h-1Z M27 14 h2 v1 h-2Z M30 14 h1 v1 h-1Z M32 14 h4 v1 h-4Z M38 14 h3 v1 h-3Z M42 14 h3 v1 h-3Z M47 14 h1 v1 h-1Z M4 15 h3 v1 h-3Z M8 15 h1 v1 h-1Z M11 15 h1 v1 h-1Z M14 15 h2 v1 h-2Z M20 15 h1 v1 h-1Z M22 15 h1 v1 h-1Z M26 15 h1 v1 h-1Z M29 15 h2 v1 h-2Z M36 15 h1 v1 h-1Z M39 15 h3 v1 h-3Z M43 15 h2 v1 h-2Z M47 15 h2 v1 h-2Z M4 16 h3 v1 h-3Z M8 16 h2 v1 h-2Z M14 16 h3 v1 h-3Z M18 16 h1 v1 h-1Z M20 16 h2 v1 h-2Z M25 16 h1 v1 h-1Z M28 16 h3 v1 h-3Z M33 16 h3 v1 h-3Z M43 16 h1 v1 h-1Z M45 16 h4 v1 h-4Z M7 17 h1 v1 h-1Z M9 17 h1 v1 h-1Z M12 17 h1 v1 h-1Z M14 17 h1 v1 h-1Z M17 17 h1 v1 h-1Z M22 17 h2 v1 h-2Z M28 17 h3 v1 h-3Z M33 17 h1 v1 h-1Z M35 17 h2 v1 h-2Z M41 17 h3 v1 h-3Z M45 17 h3 v1 h-3Z M6 18 h2 v1 h-2Z M12 18 h4 v1 h-4Z M18 18 h1 v1 h-1Z M22 18 h1 v1 h-1Z M26 18 h1 v1 h-1Z M30 18 h1 v1 h-1Z M32 18 h2 v1 h-2Z M35 18 h1 v1 h-1Z M39 18 h2 v1 h-2Z M42 18 h1 v1 h-1Z M44 18 h1 v1 h-1Z M4 19 h4 v1 h-4Z M12 19 h1 v1 h-1Z M14 19 h1 v1 h-1Z M16 19 h1 v1 h-1Z M18 19 h1 v1 h-1Z M20 19 h1 v1 h-1Z M22 19 h2 v1 h-2Z M25 19 h7 v1 h-7Z M33 19 h1 v1 h-1Z M36 19 h1 v1 h-1Z M39 19 h1 v1 h-1Z M44 19 h3 v1 h-3Z M4 20 h1 v1 h-1Z M7 20 h2 v1 h-2Z M11 20 h1 v1 h-1Z M14 20 h2 v1 h-2Z M18 20 h2 v1 h-2Z M21 20 h3 v1 h-3Z M26 20 h1 v1 h-1Z M31 20 h6 v1 h-6Z M40 20 h4 v1 h-4Z M46 20 h1 v1 h-1Z M5 21 h1 v1 h-1Z M8 21 h1 v1 h-1Z M11 21 h2 v1 h-2Z M14 21 h4 v1 h-4Z M19 21 h1 v1 h-1Z M21 21 h2 v1 h-2Z M24 21 h1 v1 h-1Z M26 21 h1 v1 h-1Z M30 21 h1 v1 h-1Z M32 21 h3 v1 h-3Z M36 21 h4 v1 h-4Z M43 21 h1 v1 h-1Z M47 21 h2 v1 h-2Z M5 22 h2 v1 h-2Z M8 22 h1 v1 h-1Z M19 22 h1 v1 h-1Z M21 22 h1 v1 h-1Z M23 22 h1 v1 h-1Z M26 22 h6 v1 h-6Z M34 22 h10 v1 h-10Z M47 22 h1 v1 h-1Z M4 23 h4 v1 h-4Z M12 23 h2 v1 h-2Z M16 23 h2 v1 h-2Z M22 23 h1 v1 h-1Z M25 23 h1 v1 h-1Z M27 23 h1 v1 h-1Z M33 23 h1 v1 h-1Z M39 23 h1 v1 h-1Z M41 23 h2 v1 h-2Z M44 23 h1 v1 h-1Z M47 23 h2 v1 h-2Z M4 24 h1 v1 h-1Z M7 24 h1 v1 h-1Z M13 24 h3 v1 h-3Z M19 24 h1 v1 h-1Z M21 24 h1 v1 h-1Z M30 24 h1 v1 h-1Z M32 24 h2 v1 h-2Z M35 24 h1 v1 h-1Z M37 24 h2 v1 h-2Z M46 24 h3 v1 h-3Z M6 25 h1 v1 h-1Z M20 25 h1 v1 h-1Z M31 25 h2 v1 h-2Z M34 25 h1 v1 h-1Z M36 25 h2 v1 h-2Z M39 25 h1 v1 h-1Z M45 25 h2 v1 h-2Z M48 25 h1 v1 h-1Z M5 26 h3 v1 h-3Z M17 26 h1 v1 h-1Z M19 26 h1 v1 h-1Z M21 26 h2 v1 h-2Z M29 26 h1 v1 h-1Z M32 26 h1 v1 h-1Z M36 26 h2 v1 h-2Z M39 26 h1 v1 h-1Z M47 26 h2 v1 h-2Z M4 27 h2 v1 h-2Z M7 27 h1 v1 h-1Z M14 27 h1 v1 h-1Z M16 27 h2 v1 h-2Z M19 27 h2 v1 h-2Z M23 27 h1 v1 h-1Z M29 27 h1 v1 h-1Z M31 27 h2 v1 h-2Z M35 27 h1 v1 h-1Z M37 27 h1 v1 h-1Z M45 27 h1 v1 h-1Z M47 27 h2 v1 h-2Z M5 28 h2 v1 h-2Z M13 28 h2 v1 h-2Z M17 28 h3 v1 h-3Z M21 28 h2 v1 h-2Z M29 28 h1 v1 h-1Z M31 28 h1 v1 h-1Z M35 28 h4 v1 h-4Z M47 28 h1 v1 h-1Z M4 29 h1 v1 h-1Z M9 29 h1 v1 h-1Z M16 29 h3 v1 h-3Z M21 29 h2 v1 h-2Z M24 29 h1 v1 h-1Z M26 29 h2 v1 h-2Z M31 29 h1 v1 h-1Z M34 29 h1 v1 h-1Z M37 29 h2 v1 h-2Z M42 29 h2 v1 h-2Z M45 29 h1 v1 h-1Z M48 29 h1 v1 h-1Z M4 30 h5 v1 h-5Z M12 30 h1 v1 h-1Z M14 30 h1 v1 h-1Z M18 30 h5 v1 h-5Z M25 30 h1 v1 h-1Z M29 30 h1 v1 h-1Z M31 30 h1 v1 h-1Z M33 30 h2 v1 h-2Z M36 30 h1 v1 h-1Z M38 30 h2 v1 h-2Z M45 30 h1 v1 h-1Z M48 30 h1 v1 h-1Z M4 31 h1 v1 h-1Z M7 31 h3 v1 h-3Z M12 31 h2 v1 h-2Z M19 31 h1 v1 h-1Z M21 31 h1 v1 h-1Z M23 31 h2 v1 h-2Z M29 31 h4 v1 h-4Z M34 31 h2 v1 h-2Z M38 31 h1 v1 h-1Z M42 31 h2 v1 h-2Z M46 31 h1 v1 h-1Z M48 31 h1 v1 h-1Z M4 32 h1 v1 h-1Z M6 32 h1 v1 h-1Z M11 32 h1 v1 h-1Z M14 32 h2 v1 h-2Z M17 32 h5 v1 h-5Z M23 32 h5 v1 h-5Z M29 32 h2 v1 h-2Z M34 32 h1 v1 h-1Z M36 32 h3 v1 h-3Z M41 32 h1 v1 h-1Z M43 32 h2 v1 h-2Z M47 32 h1 v1 h-1Z M4 33 h3 v1 h-3Z M9 33 h1 v1 h-1Z M11 33 h2 v1 h-2Z M14 33 h3 v1 h-3Z M19 33 h1 v1 h-1Z M21 33 h1 v1 h-1Z M23 33 h1 v1 h-1Z M25 33 h1 v1 h-1Z M28 33 h6 v1 h-6Z M37 33 h11 v1 h-11Z M15 34 h1 v1 h-1Z M20 34 h1 v1 h-1Z M22 34 h1 v1 h-1Z M24 34 h1 v1 h-1Z M28 34 h3 v1 h-3Z M34 34 h1 v1 h-1Z M37 34 h3 v1 h-3Z M41 34 h3 v1 h-3Z M4 35 h1 v1 h-1Z M7 35 h1 v1 h-1Z M9 35 h1 v1 h-1Z M13 35 h3 v1 h-3Z M17 35 h2 v1 h-2Z M20 35 h1 v1 h-1Z M22 35 h1 v1 h-1Z M28 35 h3 v1 h-3Z M33 35 h1 v1 h-1Z M37 35 h3 v1 h-3Z M42 35 h2 v1 h-2Z M46 35 h3 v1 h-3Z M8 36 h1 v1 h-1Z M11 36 h4 v1 h-4Z M19 36 h1 v1 h-1Z M22 36 h2 v1 h-2Z M25 36 h5 v1 h-5Z M32 36 h3 v1 h-3Z M40 36 h2 v1 h-2Z M43 36 h2 v1 h-2Z M4 37 h1 v1 h-1Z M6 37 h3 v1 h-3Z M11 37 h1 v1 h-1Z M14 37 h1 v1 h-1Z M16 37 h1 v1 h-1Z M19 37 h1 v1 h-1Z M21 37 h2 v1 h-2Z M25 37 h1 v1 h-1Z M28 37 h1 v1 h-1Z M31 37 h1 v1 h-1Z M34 37 h1 v1 h-1Z M36 37 h1 v1 h-1Z M40 37 h2 v1 h-2Z M43 37 h1 v1 h-1Z M45 37 h2 v1 h-2Z M11 38 h1 v1 h-1Z M13 38 h4 v1 h-4Z M18 38 h2 v1 h-2Z M21 38 h1 v1 h-1Z M23 38 h1 v1 h-1Z M25 38 h1 v1 h-1Z M30 38 h2 v1 h-2Z M33 38 h3 v1 h-3Z M38 38 h2 v1 h-2Z M42 38 h2 v1 h-2Z M45 38 h1 v1 h-1Z M47 38 h2 v1 h-2Z M12 39 h1 v1 h-1Z M15 39 h2 v1 h-2Z M18 39 h1 v1 h-1Z M23 39 h1 v1 h-1Z M25 39 h3 v1 h-3Z M29 39 h1 v1 h-1Z M33 39 h5 v1 h-5Z M39 39 h1 v1 h-1Z M44 39 h2 v1 h-2Z M48 39 h1 v1 h-1Z M11 40 h2 v1 h-2Z M14 40 h1 v1 h-1Z M18 40 h1 v1 h-1Z M22 40 h2 v1 h-2Z M32 40 h4 v1 h-4Z M38 40 h1 v1 h-1Z M45 40 h1 v1 h-1Z M47 40 h2 v1 h-2Z M13 41 h2 v1 h-2Z M22 41 h1 v1 h-1Z M30 41 h2 v1 h-2Z M33 41 h3 v1 h-3Z M37 41 h1 v1 h-1Z M14 42 h2 v1 h-2Z M17 42 h3 v1 h-3Z M29 42 h3 v1 h-3Z M35 42 h1 v1 h-1Z M45 42 h1 v1 h-1Z M13 43 h3 v1 h-3Z M18 43 h1 v1 h-1Z M20 43 h3 v1 h-3Z M31 43 h1 v1 h-1Z M35 43 h2 v1 h-2Z M38 43 h2 v1 h-2Z M45 43 h2 v1 h-2Z M13 44 h1 v1 h-1Z M15 44 h2 v1 h-2Z M21 44 h2 v1 h-2Z M30 44 h1 v1 h-1Z M32 44 h2 v1 h-2Z M35 44 h2 v1 h-2Z M38 44 h2 v1 h-2Z M46 44 h2 v1 h-2Z M13 45 h1 v1 h-1Z M16 45 h1 v1 h-1Z M18 45 h1 v1 h-1Z M20 45 h3 v1 h-3Z M29 45 h1 v1 h-1Z M33 45 h5 v1 h-5Z M40 45 h2 v1 h-2Z M44 45 h1 v1 h-1Z M47 45 h2 v1 h-2Z M14 46 h5 v1 h-5Z M23 46 h2 v1 h-2Z M28 46 h1 v1 h-1Z M30 46 h1 v1 h-1Z M33 46 h3 v1 h-3Z M37 46 h1 v1 h-1Z M39 46 h4 v1 h-4Z M44 46 h2 v1 h-2Z M13 47 h1 v1 h-1Z M15 47 h1 v1 h-1Z M18 47 h3 v1 h-3Z M22 47 h5 v1 h-5Z M34 47 h3 v1 h-3Z M39 47 h1 v1 h-1Z M42 47 h1 v1 h-1Z M44 47 h1 v1 h-1Z M48 47 h1 v1 h-1Z M14 48 h1 v1 h-1Z M16 48 h2 v1 h-2Z M19 48 h1 v1 h-1Z M21 48 h1 v1 h-1Z M25 48 h4 v1 h-4Z M31 48 h1 v1 h-1Z M33 48 h1 v1 h-1Z M35 48 h1 v1 h-1Z M37 48 h2 v1 h-2Z M42 48 h2 v1 h-2Z M45 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-1536 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M4 4 h7 v1 h-7Z M42 4 h7 v1 h-7Z M4 5 h1 v1 h-1Z M10 5 h1 v1 h-1Z M42 5 h1 v1 h-1Z M48 5 h1 v1 h-1Z M4 6 h1 v1 h-1Z M10 6 h1 v1 h-1Z M42 6 h1 v1 h-1Z M48 6 h1 v1 h-1Z M4 7 h1 v1 h-1Z M10 7 h1 v1 h-1Z M42 7 h1 v1 h-1Z M48 7 h1 v1 h-1Z M4 8 h1 v1 h-1Z M10 8 h1 v1 h-1Z M42 8 h1 v1 h-1Z M48 8 h1 v1 h-1Z M4 9 h1 v1 h-1Z M10 9 h1 v1 h-1Z M42 9 h1 v1 h-1Z M48 9 h1 v1 h-1Z M4 10 h7 v1 h-7Z M42 10 h7 v1 h-7Z M4 42 h7 v1 h-7Z M4 43 h1 v1 h-1Z M10 43 h1 v1 h-1Z M4 44 h1 v1 h-1Z M10 44 h1 v1 h-1Z M4 45 h1 v1 h-1Z M10 45 h1 v1 h-1Z M4 46 h1 v1 h-1Z M10 46 h1 v1 h-1Z M4 47 h1 v1 h-1Z M10 47 h1 v1 h-1Z M4 48 h7 v1 h-7Z \" /\u003e\u003cpath class=\"qr-2560 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M24 8 h5 v1 h-5Z M24 9 h1 v1 h-1Z M28 9 h1 v1 h-1Z M24 10 h1 v1 h-1Z M26 10 h1 v1 h-1Z M28 10 h1 v1 h-1Z M24 11 h1 v1 h-1Z M28 11 h1 v1 h-1Z M24 12 h5 v1 h-5Z M8 24 h5 v1 h-5Z M24 24 h5 v1 h-5Z M40 24 h5 v1 h-5Z M8 25 h1 v1 h-1Z M12 25 h1 v1 h-1Z M24 25 h1 v1 h-1Z M28 25 h1 v1 h-1Z M40 25 h1 v1 h-1Z M44 25 h1 v1 h-1Z M8 26 h1 v1 h-1Z M10 26 h1 v1 h-1Z M12 26 h1 v1 h-1Z M24 26 h1 v1 h-1Z M26 26 h1 v1 h-1Z M28 26 h1 v1 h-1Z M40 26 h1 v1 h-1Z M42 26 h1 v1 h-1Z M44 26 h1 v1 h-1Z M8 27 h1 v1 h-1Z M12 27 h1 v1 h-1Z M24 27 h1 v1 h-1Z M28 27 h1 v1 h-1Z M40 27 h1 v1 h-1Z M44 27 h1 v1 h-1Z M8 28 h5 v1 h-5Z M24 28 h5 v1 h-5Z M40 28 h5 v1 h-5Z M24 40 h5 v1 h-5Z M40 40 h5 v1 h-5Z M24 41 h1 v1 h-1Z M28 41 h1 v1 h-1Z M40 41 h1 v1 h-1Z M44 41 h1 v1 h-1Z M24 42 h1 v1 h-1Z M26 42 h1 v1 h-1Z M28 42 h1 v1 h-1Z M40 42 h1 v1 h-1Z M42 42 h1 v1 h-1Z M44 42 h1 v1 h-1Z M24 43 h1 v1 h-1Z M28 43 h1 v1 h-1Z M40 43 h1 v1 h-1Z M44 43 h1 v1 h-1Z M24 44 h5 v1 h-5Z M40 44 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-3072 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 10 h1 v1 h-1Z M14 10 h1 v1 h-1Z M16 10 h1 v1 h-1Z M18 10 h1 v1 h-1Z M20 10 h1 v1 h-1Z M22 10 h1 v1 h-1Z M30 10 h1 v1 h-1Z M32 10 h1 v1 h-1Z M34 10 h1 v1 h-1Z M36 10 h1 v1 h-1Z M38 10 h1 v1 h-1Z M40 10 h1 v1 h-1Z M10 12 h1 v1 h-1Z M10 14 h1 v1 h-1Z M10 16 h1 v1 h-1Z M10 18 h1 v1 h-1Z M10 20 h1 v1 h-1Z M10 22 h1 v1 h-1Z M10 30 h1 v1 h-1Z M10 32 h1 v1 h-1Z M10 34 h1 v1 h-1Z M10 36 h1 v1 h-1Z M10 38 h1 v1 h-1Z M10 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-3584 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 8 h1 v1 h-1Z M12 11 h1 v1 h-1Z M6 12 h2 v1 h-2Z M11 12 h2 v1 h-2Z M41 12 h2 v1 h-2Z M44 12 h1 v1 h-1Z M12 42 h1 v1 h-1Z M12 45 h1 v1 h-1Z M12 46 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-4096 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M40 4 h1 v1 h-1Z M39 5 h1 v1 h-1Z M39 6 h1 v1 h-1Z M39 7 h2 v1 h-2Z M38 8 h3 v1 h-3Z M8 38 h1 v1 h-1Z M5 39 h4 v1 h-4Z M4 40 h1 v1 h-1Z M7 40 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-5632 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M6 6 h3 v1 h-3Z M44 6 h3 v1 h-3Z M6 7 h3 v1 h-3Z M44 7 h3 v1 h-3Z M6 8 h3 v1 h-3Z M44 8 h3 v1 h-3Z M6 44 h3 v1 h-3Z M6 45 h3 v1 h-3Z M6 46 h3 v1 h-3Z \" /\u003e\u003c/svg\u003e\n\n    \u003c/a\u003e\n    \u003cfigcaption aria-hidden=\"true\" class=\"hidden\" hidden\u003eUn don Liberapay pour Stéphane HUC\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\n\u003ch3 id=\"paypal\"\u003ePaypal\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://paypal.me/hucste\" rel=\"external\"\u003ehttps://paypal.me/hucste\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\n\u003cfigure class=\"pure-img\"\u003e\n    \u003ca href=\"/svg/qrcode/paypal.svg\" title=\"Un don Paypal pour Stéphane HUC\"\u003e\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" class=\"qr-svg \" height=\"128\" viewBox=\"0 0 53 53\" width=\"128\"\u003e\n\u003cdefs\u003e\u003cstyle\u003erect{shape-rendering:crispEdges}\u003c/style\u003e\u003c/defs\u003e\n\u003cpath class=\"qr-4 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M15 4 h1 v1 h-1Z M18 4 h3 v1 h-3Z M24 4 h1 v1 h-1Z M27 4 h7 v1 h-7Z M35 4 h1 v1 h-1Z M16 5 h6 v1 h-6Z M25 5 h2 v1 h-2Z M29 5 h4 v1 h-4Z M34 5 h1 v1 h-1Z M36 5 h1 v1 h-1Z M13 6 h5 v1 h-5Z M19 6 h7 v1 h-7Z M30 6 h2 v1 h-2Z M35 6 h2 v1 h-2Z M13 7 h1 v1 h-1Z M15 7 h1 v1 h-1Z M17 7 h1 v1 h-1Z M20 7 h3 v1 h-3Z M25 7 h4 v1 h-4Z M32 7 h1 v1 h-1Z M35 7 h1 v1 h-1Z M37 7 h1 v1 h-1Z M13 8 h1 v1 h-1Z M15 8 h1 v1 h-1Z M18 8 h2 v1 h-2Z M22 8 h1 v1 h-1Z M29 8 h1 v1 h-1Z M31 8 h2 v1 h-2Z M13 9 h1 v1 h-1Z M15 9 h1 v1 h-1Z M21 9 h2 v1 h-2Z M29 9 h1 v1 h-1Z M31 9 h1 v1 h-1Z M35 9 h2 v1 h-2Z M13 11 h4 v1 h-4Z M19 11 h4 v1 h-4Z M29 11 h2 v1 h-2Z M34 11 h1 v1 h-1Z M39 11 h1 v1 h-1Z M17 12 h1 v1 h-1Z M19 12 h1 v1 h-1Z M29 12 h1 v1 h-1Z M32 12 h4 v1 h-4Z M37 12 h3 v1 h-3Z M5 13 h1 v1 h-1Z M8 13 h1 v1 h-1Z M11 13 h2 v1 h-2Z M15 13 h1 v1 h-1Z M17 13 h2 v1 h-2Z M21 13 h3 v1 h-3Z M34 13 h4 v1 h-4Z M40 13 h1 v1 h-1Z M42 13 h4 v1 h-4Z M47 13 h1 v1 h-1Z M4 14 h3 v1 h-3Z M8 14 h1 v1 h-1Z M12 14 h3 v1 h-3Z M16 14 h1 v1 h-1Z M18 14 h2 v1 h-2Z M21 14 h1 v1 h-1Z M24 14 h1 v1 h-1Z M30 14 h1 v1 h-1Z M36 14 h1 v1 h-1Z M40 14 h2 v1 h-2Z M43 14 h1 v1 h-1Z M45 14 h1 v1 h-1Z M48 14 h1 v1 h-1Z M4 15 h2 v1 h-2Z M8 15 h2 v1 h-2Z M12 15 h1 v1 h-1Z M22 15 h1 v1 h-1Z M24 15 h2 v1 h-2Z M27 15 h3 v1 h-3Z M31 15 h2 v1 h-2Z M36 15 h1 v1 h-1Z M39 15 h4 v1 h-4Z M47 15 h1 v1 h-1Z M5 16 h1 v1 h-1Z M9 16 h1 v1 h-1Z M11 16 h2 v1 h-2Z M14 16 h3 v1 h-3Z M18 16 h5 v1 h-5Z M25 16 h1 v1 h-1Z M27 16 h1 v1 h-1Z M29 16 h2 v1 h-2Z M32 16 h2 v1 h-2Z M37 16 h1 v1 h-1Z M39 16 h1 v1 h-1Z M45 16 h1 v1 h-1Z M47 16 h2 v1 h-2Z M8 17 h1 v1 h-1Z M11 17 h1 v1 h-1Z M13 17 h1 v1 h-1Z M17 17 h1 v1 h-1Z M19 17 h1 v1 h-1Z M22 17 h3 v1 h-3Z M28 17 h2 v1 h-2Z M31 17 h3 v1 h-3Z M35 17 h1 v1 h-1Z M38 17 h2 v1 h-2Z M41 17 h1 v1 h-1Z M44 17 h4 v1 h-4Z M5 18 h1 v1 h-1Z M9 18 h1 v1 h-1Z M12 18 h2 v1 h-2Z M15 18 h3 v1 h-3Z M20 18 h3 v1 h-3Z M24 18 h2 v1 h-2Z M28 18 h2 v1 h-2Z M31 18 h2 v1 h-2Z M36 18 h1 v1 h-1Z M38 18 h1 v1 h-1Z M41 18 h1 v1 h-1Z M45 18 h1 v1 h-1Z M48 18 h1 v1 h-1Z M6 19 h2 v1 h-2Z M9 19 h1 v1 h-1Z M11 19 h1 v1 h-1Z M14 19 h1 v1 h-1Z M16 19 h2 v1 h-2Z M20 19 h2 v1 h-2Z M23 19 h1 v1 h-1Z M25 19 h2 v1 h-2Z M28 19 h1 v1 h-1Z M31 19 h2 v1 h-2Z M34 19 h3 v1 h-3Z M38 19 h2 v1 h-2Z M43 19 h1 v1 h-1Z M4 20 h1 v1 h-1Z M6 20 h2 v1 h-2Z M9 20 h1 v1 h-1Z M11 20 h1 v1 h-1Z M16 20 h1 v1 h-1Z M18 20 h6 v1 h-6Z M25 20 h3 v1 h-3Z M29 20 h4 v1 h-4Z M34 20 h1 v1 h-1Z M39 20 h2 v1 h-2Z M43 20 h1 v1 h-1Z M45 20 h3 v1 h-3Z M4 21 h2 v1 h-2Z M11 21 h1 v1 h-1Z M13 21 h1 v1 h-1Z M20 21 h1 v1 h-1Z M23 21 h1 v1 h-1Z M25 21 h2 v1 h-2Z M28 21 h1 v1 h-1Z M30 21 h2 v1 h-2Z M33 21 h4 v1 h-4Z M38 21 h2 v1 h-2Z M41 21 h7 v1 h-7Z M4 22 h1 v1 h-1Z M6 22 h3 v1 h-3Z M11 22 h1 v1 h-1Z M15 22 h2 v1 h-2Z M18 22 h1 v1 h-1Z M21 22 h1 v1 h-1Z M23 22 h3 v1 h-3Z M30 22 h1 v1 h-1Z M32 22 h1 v1 h-1Z M35 22 h1 v1 h-1Z M42 22 h3 v1 h-3Z M47 22 h1 v1 h-1Z M5 23 h1 v1 h-1Z M7 23 h3 v1 h-3Z M13 23 h2 v1 h-2Z M16 23 h5 v1 h-5Z M23 23 h1 v1 h-1Z M26 23 h1 v1 h-1Z M29 23 h3 v1 h-3Z M33 23 h1 v1 h-1Z M35 23 h6 v1 h-6Z M43 23 h1 v1 h-1Z M45 23 h1 v1 h-1Z M47 23 h1 v1 h-1Z M4 24 h2 v1 h-2Z M7 24 h1 v1 h-1Z M13 24 h1 v1 h-1Z M15 24 h1 v1 h-1Z M17 24 h2 v1 h-2Z M23 24 h1 v1 h-1Z M29 24 h1 v1 h-1Z M32 24 h1 v1 h-1Z M35 24 h3 v1 h-3Z M39 24 h1 v1 h-1Z M45 24 h2 v1 h-2Z M48 24 h1 v1 h-1Z M6 25 h1 v1 h-1Z M13 25 h2 v1 h-2Z M16 25 h2 v1 h-2Z M19 25 h1 v1 h-1Z M21 25 h1 v1 h-1Z M29 25 h1 v1 h-1Z M31 25 h3 v1 h-3Z M37 25 h1 v1 h-1Z M46 25 h3 v1 h-3Z M6 26 h2 v1 h-2Z M13 26 h3 v1 h-3Z M18 26 h1 v1 h-1Z M20 26 h2 v1 h-2Z M31 26 h1 v1 h-1Z M33 26 h1 v1 h-1Z M35 26 h1 v1 h-1Z M37 26 h2 v1 h-2Z M46 26 h1 v1 h-1Z M5 27 h3 v1 h-3Z M16 27 h3 v1 h-3Z M22 27 h1 v1 h-1Z M30 27 h2 v1 h-2Z M33 27 h4 v1 h-4Z M38 27 h1 v1 h-1Z M45 27 h4 v1 h-4Z M6 28 h2 v1 h-2Z M14 28 h1 v1 h-1Z M16 28 h3 v1 h-3Z M20 28 h1 v1 h-1Z M23 28 h1 v1 h-1Z M31 28 h1 v1 h-1Z M34 28 h3 v1 h-3Z M38 28 h1 v1 h-1Z M48 28 h1 v1 h-1Z M5 29 h3 v1 h-3Z M9 29 h1 v1 h-1Z M12 29 h1 v1 h-1Z M14 29 h1 v1 h-1Z M16 29 h2 v1 h-2Z M20 29 h1 v1 h-1Z M22 29 h2 v1 h-2Z M25 29 h2 v1 h-2Z M28 29 h1 v1 h-1Z M31 29 h2 v1 h-2Z M34 29 h1 v1 h-1Z M36 29 h1 v1 h-1Z M41 29 h1 v1 h-1Z M44 29 h2 v1 h-2Z M5 30 h1 v1 h-1Z M7 30 h3 v1 h-3Z M11 30 h1 v1 h-1Z M13 30 h1 v1 h-1Z M15 30 h1 v1 h-1Z M18 30 h2 v1 h-2Z M25 30 h6 v1 h-6Z M32 30 h1 v1 h-1Z M35 30 h1 v1 h-1Z M42 30 h2 v1 h-2Z M47 30 h1 v1 h-1Z M5 31 h1 v1 h-1Z M7 31 h3 v1 h-3Z M11 31 h2 v1 h-2Z M15 31 h2 v1 h-2Z M19 31 h1 v1 h-1Z M24 31 h1 v1 h-1Z M31 31 h2 v1 h-2Z M38 31 h3 v1 h-3Z M44 31 h2 v1 h-2Z M47 31 h2 v1 h-2Z M5 32 h2 v1 h-2Z M8 32 h1 v1 h-1Z M13 32 h2 v1 h-2Z M16 32 h1 v1 h-1Z M19 32 h5 v1 h-5Z M25 32 h1 v1 h-1Z M27 32 h1 v1 h-1Z M30 32 h1 v1 h-1Z M32 32 h4 v1 h-4Z M37 32 h1 v1 h-1Z M39 32 h1 v1 h-1Z M42 32 h2 v1 h-2Z M45 32 h1 v1 h-1Z M48 32 h1 v1 h-1Z M7 33 h1 v1 h-1Z M9 33 h1 v1 h-1Z M11 33 h2 v1 h-2Z M15 33 h2 v1 h-2Z M18 33 h6 v1 h-6Z M26 33 h1 v1 h-1Z M28 33 h1 v1 h-1Z M36 33 h1 v1 h-1Z M39 33 h3 v1 h-3Z M45 33 h2 v1 h-2Z M48 33 h1 v1 h-1Z M4 34 h1 v1 h-1Z M6 34 h4 v1 h-4Z M11 34 h1 v1 h-1Z M13 34 h1 v1 h-1Z M15 34 h1 v1 h-1Z M19 34 h2 v1 h-2Z M29 34 h1 v1 h-1Z M31 34 h1 v1 h-1Z M33 34 h1 v1 h-1Z M37 34 h6 v1 h-6Z M46 34 h1 v1 h-1Z M4 35 h1 v1 h-1Z M8 35 h1 v1 h-1Z M12 35 h3 v1 h-3Z M16 35 h2 v1 h-2Z M20 35 h1 v1 h-1Z M22 35 h1 v1 h-1Z M24 35 h3 v1 h-3Z M28 35 h2 v1 h-2Z M31 35 h4 v1 h-4Z M37 35 h3 v1 h-3Z M44 35 h1 v1 h-1Z M46 35 h2 v1 h-2Z M5 36 h3 v1 h-3Z M9 36 h1 v1 h-1Z M11 36 h2 v1 h-2Z M14 36 h1 v1 h-1Z M16 36 h2 v1 h-2Z M19 36 h1 v1 h-1Z M21 36 h2 v1 h-2Z M24 36 h3 v1 h-3Z M28 36 h1 v1 h-1Z M30 36 h6 v1 h-6Z M37 36 h4 v1 h-4Z M42 36 h2 v1 h-2Z M45 36 h1 v1 h-1Z M48 36 h1 v1 h-1Z M5 37 h2 v1 h-2Z M8 37 h2 v1 h-2Z M11 37 h2 v1 h-2Z M14 37 h2 v1 h-2Z M17 37 h1 v1 h-1Z M20 37 h1 v1 h-1Z M23 37 h1 v1 h-1Z M26 37 h2 v1 h-2Z M29 37 h1 v1 h-1Z M31 37 h3 v1 h-3Z M35 37 h2 v1 h-2Z M39 37 h1 v1 h-1Z M43 37 h1 v1 h-1Z M47 37 h1 v1 h-1Z M12 38 h2 v1 h-2Z M15 38 h1 v1 h-1Z M19 38 h2 v1 h-2Z M22 38 h1 v1 h-1Z M24 38 h1 v1 h-1Z M26 38 h4 v1 h-4Z M31 38 h2 v1 h-2Z M34 38 h1 v1 h-1Z M36 38 h2 v1 h-2Z M41 38 h1 v1 h-1Z M43 38 h2 v1 h-2Z M48 38 h1 v1 h-1Z M11 39 h1 v1 h-1Z M13 39 h2 v1 h-2Z M17 39 h4 v1 h-4Z M22 39 h3 v1 h-3Z M26 39 h1 v1 h-1Z M28 39 h4 v1 h-4Z M34 39 h1 v1 h-1Z M37 39 h1 v1 h-1Z M40 39 h1 v1 h-1Z M42 39 h2 v1 h-2Z M45 39 h1 v1 h-1Z M47 39 h1 v1 h-1Z M12 40 h4 v1 h-4Z M17 40 h3 v1 h-3Z M23 40 h1 v1 h-1Z M30 40 h6 v1 h-6Z M37 40 h1 v1 h-1Z M39 40 h1 v1 h-1Z M45 40 h4 v1 h-4Z M17 41 h6 v1 h-6Z M29 41 h3 v1 h-3Z M35 41 h5 v1 h-5Z M46 41 h1 v1 h-1Z M48 41 h1 v1 h-1Z M13 42 h1 v1 h-1Z M16 42 h1 v1 h-1Z M19 42 h4 v1 h-4Z M29 42 h1 v1 h-1Z M31 42 h1 v1 h-1Z M36 42 h2 v1 h-2Z M45 42 h4 v1 h-4Z M20 43 h3 v1 h-3Z M29 43 h1 v1 h-1Z M33 43 h4 v1 h-4Z M38 43 h1 v1 h-1Z M47 43 h1 v1 h-1Z M13 44 h2 v1 h-2Z M16 44 h1 v1 h-1Z M19 44 h3 v1 h-3Z M29 44 h1 v1 h-1Z M31 44 h2 v1 h-2Z M39 44 h1 v1 h-1Z M46 44 h2 v1 h-2Z M13 45 h2 v1 h-2Z M16 45 h3 v1 h-3Z M21 45 h1 v1 h-1Z M24 45 h1 v1 h-1Z M27 45 h2 v1 h-2Z M31 45 h6 v1 h-6Z M38 45 h1 v1 h-1Z M40 45 h4 v1 h-4Z M48 45 h1 v1 h-1Z M13 46 h2 v1 h-2Z M17 46 h2 v1 h-2Z M20 46 h1 v1 h-1Z M24 46 h2 v1 h-2Z M27 46 h1 v1 h-1Z M29 46 h1 v1 h-1Z M31 46 h3 v1 h-3Z M39 46 h1 v1 h-1Z M41 46 h5 v1 h-5Z M14 47 h2 v1 h-2Z M20 47 h1 v1 h-1Z M22 47 h1 v1 h-1Z M24 47 h1 v1 h-1Z M26 47 h3 v1 h-3Z M31 47 h5 v1 h-5Z M37 47 h2 v1 h-2Z M40 47 h1 v1 h-1Z M43 47 h1 v1 h-1Z M45 47 h1 v1 h-1Z M13 48 h1 v1 h-1Z M15 48 h2 v1 h-2Z M18 48 h3 v1 h-3Z M25 48 h6 v1 h-6Z M32 48 h3 v1 h-3Z M36 48 h2 v1 h-2Z M40 48 h2 v1 h-2Z M43 48 h2 v1 h-2Z M47 48 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-6 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M5 5 h5 v1 h-5Z M43 5 h5 v1 h-5Z M5 6 h1 v1 h-1Z M9 6 h1 v1 h-1Z M43 6 h1 v1 h-1Z M47 6 h1 v1 h-1Z M5 7 h1 v1 h-1Z M9 7 h1 v1 h-1Z M43 7 h1 v1 h-1Z M47 7 h1 v1 h-1Z M5 8 h1 v1 h-1Z M9 8 h1 v1 h-1Z M43 8 h1 v1 h-1Z M47 8 h1 v1 h-1Z M5 9 h5 v1 h-5Z M43 9 h5 v1 h-5Z M5 43 h5 v1 h-5Z M5 44 h1 v1 h-1Z M9 44 h1 v1 h-1Z M5 45 h1 v1 h-1Z M9 45 h1 v1 h-1Z M5 46 h1 v1 h-1Z M9 46 h1 v1 h-1Z M5 47 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-8 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M11 4 h1 v1 h-1Z M41 4 h1 v1 h-1Z M11 5 h1 v1 h-1Z M41 5 h1 v1 h-1Z M11 6 h1 v1 h-1Z M41 6 h1 v1 h-1Z M11 7 h1 v1 h-1Z M41 7 h1 v1 h-1Z M11 8 h1 v1 h-1Z M41 8 h1 v1 h-1Z M11 9 h1 v1 h-1Z M41 9 h1 v1 h-1Z M11 10 h1 v1 h-1Z M41 10 h1 v1 h-1Z M4 11 h8 v1 h-8Z M41 11 h8 v1 h-8Z M4 41 h8 v1 h-8Z M11 42 h1 v1 h-1Z M11 43 h1 v1 h-1Z M11 44 h1 v1 h-1Z M11 45 h1 v1 h-1Z M11 46 h1 v1 h-1Z M11 47 h1 v1 h-1Z M11 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-10 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M25 9 h3 v1 h-3Z M25 10 h1 v1 h-1Z M27 10 h1 v1 h-1Z M25 11 h3 v1 h-3Z M9 25 h3 v1 h-3Z M25 25 h3 v1 h-3Z M41 25 h3 v1 h-3Z M9 26 h1 v1 h-1Z M11 26 h1 v1 h-1Z M25 26 h1 v1 h-1Z M27 26 h1 v1 h-1Z M41 26 h1 v1 h-1Z M43 26 h1 v1 h-1Z M9 27 h3 v1 h-3Z M25 27 h3 v1 h-3Z M41 27 h3 v1 h-3Z M25 41 h3 v1 h-3Z M41 41 h3 v1 h-3Z M25 42 h1 v1 h-1Z M27 42 h1 v1 h-1Z M41 42 h1 v1 h-1Z M43 42 h1 v1 h-1Z M25 43 h3 v1 h-3Z M41 43 h3 v1 h-3Z \" /\u003e\u003cpath class=\"qr-12 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M13 10 h1 v1 h-1Z M15 10 h1 v1 h-1Z M17 10 h1 v1 h-1Z M19 10 h1 v1 h-1Z M21 10 h1 v1 h-1Z M23 10 h1 v1 h-1Z M29 10 h1 v1 h-1Z M31 10 h1 v1 h-1Z M33 10 h1 v1 h-1Z M35 10 h1 v1 h-1Z M37 10 h1 v1 h-1Z M39 10 h1 v1 h-1Z M10 13 h1 v1 h-1Z M10 15 h1 v1 h-1Z M10 17 h1 v1 h-1Z M10 19 h1 v1 h-1Z M10 21 h1 v1 h-1Z M10 23 h1 v1 h-1Z M10 29 h1 v1 h-1Z M10 31 h1 v1 h-1Z M10 33 h1 v1 h-1Z M10 35 h1 v1 h-1Z M10 37 h1 v1 h-1Z M10 39 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-14 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M12 4 h1 v1 h-1Z M12 5 h1 v1 h-1Z M12 8 h1 v1 h-1Z M12 9 h1 v1 h-1Z M12 11 h1 v1 h-1Z M4 12 h3 v1 h-3Z M9 12 h1 v1 h-1Z M12 12 h1 v1 h-1Z M41 12 h4 v1 h-4Z M47 12 h2 v1 h-2Z M12 43 h1 v1 h-1Z M12 46 h1 v1 h-1Z M12 47 h1 v1 h-1Z M12 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-16 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M38 4 h2 v1 h-2Z M38 5 h1 v1 h-1Z M40 5 h1 v1 h-1Z M38 6 h1 v1 h-1Z M40 6 h1 v1 h-1Z M38 7 h1 v1 h-1Z M38 9 h3 v1 h-3Z M4 38 h4 v1 h-4Z M9 38 h1 v1 h-1Z M4 39 h1 v1 h-1Z M9 39 h1 v1 h-1Z M5 40 h2 v1 h-2Z M9 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-18 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M0 0 h53 v1 h-53Z M0 1 h53 v1 h-53Z M0 2 h53 v1 h-53Z M0 3 h53 v1 h-53Z M0 4 h4 v1 h-4Z M49 4 h4 v1 h-4Z M0 5 h4 v1 h-4Z M49 5 h4 v1 h-4Z M0 6 h4 v1 h-4Z M49 6 h4 v1 h-4Z M0 7 h4 v1 h-4Z M49 7 h4 v1 h-4Z M0 8 h4 v1 h-4Z M49 8 h4 v1 h-4Z M0 9 h4 v1 h-4Z M49 9 h4 v1 h-4Z M0 10 h4 v1 h-4Z M49 10 h4 v1 h-4Z M0 11 h4 v1 h-4Z M49 11 h4 v1 h-4Z M0 12 h4 v1 h-4Z M49 12 h4 v1 h-4Z M0 13 h4 v1 h-4Z M49 13 h4 v1 h-4Z M0 14 h4 v1 h-4Z M49 14 h4 v1 h-4Z M0 15 h4 v1 h-4Z M49 15 h4 v1 h-4Z M0 16 h4 v1 h-4Z M49 16 h4 v1 h-4Z M0 17 h4 v1 h-4Z M49 17 h4 v1 h-4Z M0 18 h4 v1 h-4Z M49 18 h4 v1 h-4Z M0 19 h4 v1 h-4Z M49 19 h4 v1 h-4Z M0 20 h4 v1 h-4Z M49 20 h4 v1 h-4Z M0 21 h4 v1 h-4Z M49 21 h4 v1 h-4Z M0 22 h4 v1 h-4Z M49 22 h4 v1 h-4Z M0 23 h4 v1 h-4Z M49 23 h4 v1 h-4Z M0 24 h4 v1 h-4Z M49 24 h4 v1 h-4Z M0 25 h4 v1 h-4Z M49 25 h4 v1 h-4Z M0 26 h4 v1 h-4Z M49 26 h4 v1 h-4Z M0 27 h4 v1 h-4Z M49 27 h4 v1 h-4Z M0 28 h4 v1 h-4Z M49 28 h4 v1 h-4Z M0 29 h4 v1 h-4Z M49 29 h4 v1 h-4Z M0 30 h4 v1 h-4Z M49 30 h4 v1 h-4Z M0 31 h4 v1 h-4Z M49 31 h4 v1 h-4Z M0 32 h4 v1 h-4Z M49 32 h4 v1 h-4Z M0 33 h4 v1 h-4Z M49 33 h4 v1 h-4Z M0 34 h4 v1 h-4Z M49 34 h4 v1 h-4Z M0 35 h4 v1 h-4Z M49 35 h4 v1 h-4Z M0 36 h4 v1 h-4Z M49 36 h4 v1 h-4Z M0 37 h4 v1 h-4Z M49 37 h4 v1 h-4Z M0 38 h4 v1 h-4Z M49 38 h4 v1 h-4Z M0 39 h4 v1 h-4Z M49 39 h4 v1 h-4Z M0 40 h4 v1 h-4Z M49 40 h4 v1 h-4Z M0 41 h4 v1 h-4Z M49 41 h4 v1 h-4Z M0 42 h4 v1 h-4Z M49 42 h4 v1 h-4Z M0 43 h4 v1 h-4Z M49 43 h4 v1 h-4Z M0 44 h4 v1 h-4Z M49 44 h4 v1 h-4Z M0 45 h4 v1 h-4Z M49 45 h4 v1 h-4Z M0 46 h4 v1 h-4Z M49 46 h4 v1 h-4Z M0 47 h4 v1 h-4Z M49 47 h4 v1 h-4Z M0 48 h4 v1 h-4Z M49 48 h4 v1 h-4Z M0 49 h53 v1 h-53Z M0 50 h53 v1 h-53Z M0 51 h53 v1 h-53Z M0 52 h53 v1 h-53Z \" /\u003e\u003cpath class=\"qr-512 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 41 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-1024 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M13 4 h2 v1 h-2Z M16 4 h2 v1 h-2Z M21 4 h3 v1 h-3Z M25 4 h2 v1 h-2Z M34 4 h1 v1 h-1Z M36 4 h2 v1 h-2Z M13 5 h3 v1 h-3Z M22 5 h3 v1 h-3Z M27 5 h2 v1 h-2Z M33 5 h1 v1 h-1Z M35 5 h1 v1 h-1Z M37 5 h1 v1 h-1Z M18 6 h1 v1 h-1Z M26 6 h4 v1 h-4Z M32 6 h3 v1 h-3Z M37 6 h1 v1 h-1Z M14 7 h1 v1 h-1Z M16 7 h1 v1 h-1Z M18 7 h2 v1 h-2Z M23 7 h2 v1 h-2Z M29 7 h3 v1 h-3Z M33 7 h2 v1 h-2Z M36 7 h1 v1 h-1Z M14 8 h1 v1 h-1Z M16 8 h2 v1 h-2Z M20 8 h2 v1 h-2Z M23 8 h1 v1 h-1Z M30 8 h1 v1 h-1Z M33 8 h5 v1 h-5Z M14 9 h1 v1 h-1Z M16 9 h5 v1 h-5Z M23 9 h1 v1 h-1Z M30 9 h1 v1 h-1Z M32 9 h3 v1 h-3Z M37 9 h1 v1 h-1Z M17 11 h2 v1 h-2Z M23 11 h1 v1 h-1Z M31 11 h3 v1 h-3Z M35 11 h4 v1 h-4Z M40 11 h1 v1 h-1Z M13 12 h4 v1 h-4Z M18 12 h1 v1 h-1Z M20 12 h4 v1 h-4Z M30 12 h2 v1 h-2Z M36 12 h1 v1 h-1Z M40 12 h1 v1 h-1Z M4 13 h1 v1 h-1Z M6 13 h2 v1 h-2Z M9 13 h1 v1 h-1Z M13 13 h2 v1 h-2Z M16 13 h1 v1 h-1Z M19 13 h2 v1 h-2Z M24 13 h10 v1 h-10Z M38 13 h2 v1 h-2Z M41 13 h1 v1 h-1Z M46 13 h1 v1 h-1Z M48 13 h1 v1 h-1Z M7 14 h1 v1 h-1Z M9 14 h1 v1 h-1Z M11 14 h1 v1 h-1Z M15 14 h1 v1 h-1Z M17 14 h1 v1 h-1Z M20 14 h1 v1 h-1Z M22 14 h2 v1 h-2Z M25 14 h5 v1 h-5Z M31 14 h5 v1 h-5Z M37 14 h3 v1 h-3Z M42 14 h1 v1 h-1Z M44 14 h1 v1 h-1Z M46 14 h2 v1 h-2Z M6 15 h2 v1 h-2Z M11 15 h1 v1 h-1Z M13 15 h9 v1 h-9Z M23 15 h1 v1 h-1Z M26 15 h1 v1 h-1Z M30 15 h1 v1 h-1Z M33 15 h3 v1 h-3Z M37 15 h2 v1 h-2Z M43 15 h4 v1 h-4Z M48 15 h1 v1 h-1Z M4 16 h1 v1 h-1Z M6 16 h3 v1 h-3Z M13 16 h1 v1 h-1Z M17 16 h1 v1 h-1Z M23 16 h2 v1 h-2Z M26 16 h1 v1 h-1Z M28 16 h1 v1 h-1Z M31 16 h1 v1 h-1Z M34 16 h3 v1 h-3Z M38 16 h1 v1 h-1Z M40 16 h5 v1 h-5Z M46 16 h1 v1 h-1Z M4 17 h4 v1 h-4Z M9 17 h1 v1 h-1Z M12 17 h1 v1 h-1Z M14 17 h3 v1 h-3Z M18 17 h1 v1 h-1Z M20 17 h2 v1 h-2Z M25 17 h3 v1 h-3Z M30 17 h1 v1 h-1Z M34 17 h1 v1 h-1Z M36 17 h2 v1 h-2Z M40 17 h1 v1 h-1Z M42 17 h2 v1 h-2Z M48 17 h1 v1 h-1Z M4 18 h1 v1 h-1Z M6 18 h3 v1 h-3Z M11 18 h1 v1 h-1Z M14 18 h1 v1 h-1Z M18 18 h2 v1 h-2Z M23 18 h1 v1 h-1Z M26 18 h2 v1 h-2Z M30 18 h1 v1 h-1Z M33 18 h3 v1 h-3Z M37 18 h1 v1 h-1Z M39 18 h2 v1 h-2Z M42 18 h3 v1 h-3Z M46 18 h2 v1 h-2Z M4 19 h2 v1 h-2Z M8 19 h1 v1 h-1Z M12 19 h2 v1 h-2Z M15 19 h1 v1 h-1Z M18 19 h2 v1 h-2Z M22 19 h1 v1 h-1Z M24 19 h1 v1 h-1Z M27 19 h1 v1 h-1Z M29 19 h2 v1 h-2Z M33 19 h1 v1 h-1Z M37 19 h1 v1 h-1Z M40 19 h3 v1 h-3Z M44 19 h5 v1 h-5Z M5 20 h1 v1 h-1Z M8 20 h1 v1 h-1Z M12 20 h4 v1 h-4Z M17 20 h1 v1 h-1Z M24 20 h1 v1 h-1Z M28 20 h1 v1 h-1Z M33 20 h1 v1 h-1Z M35 20 h4 v1 h-4Z M41 20 h2 v1 h-2Z M44 20 h1 v1 h-1Z M48 20 h1 v1 h-1Z M6 21 h4 v1 h-4Z M12 21 h1 v1 h-1Z M14 21 h6 v1 h-6Z M21 21 h2 v1 h-2Z M24 21 h1 v1 h-1Z M27 21 h1 v1 h-1Z M29 21 h1 v1 h-1Z M32 21 h1 v1 h-1Z M37 21 h1 v1 h-1Z M40 21 h1 v1 h-1Z M48 21 h1 v1 h-1Z M5 22 h1 v1 h-1Z M9 22 h1 v1 h-1Z M12 22 h3 v1 h-3Z M17 22 h1 v1 h-1Z M19 22 h2 v1 h-2Z M22 22 h1 v1 h-1Z M26 22 h4 v1 h-4Z M31 22 h1 v1 h-1Z M33 22 h2 v1 h-2Z M36 22 h6 v1 h-6Z M45 22 h2 v1 h-2Z M48 22 h1 v1 h-1Z M4 23 h1 v1 h-1Z M6 23 h1 v1 h-1Z M11 23 h2 v1 h-2Z M15 23 h1 v1 h-1Z M21 23 h2 v1 h-2Z M24 23 h2 v1 h-2Z M27 23 h2 v1 h-2Z M32 23 h1 v1 h-1Z M34 23 h1 v1 h-1Z M41 23 h2 v1 h-2Z M44 23 h1 v1 h-1Z M46 23 h1 v1 h-1Z M48 23 h1 v1 h-1Z M6 24 h1 v1 h-1Z M14 24 h1 v1 h-1Z M16 24 h1 v1 h-1Z M19 24 h4 v1 h-4Z M30 24 h2 v1 h-2Z M33 24 h2 v1 h-2Z M38 24 h1 v1 h-1Z M47 24 h1 v1 h-1Z M4 25 h2 v1 h-2Z M7 25 h1 v1 h-1Z M15 25 h1 v1 h-1Z M18 25 h1 v1 h-1Z M20 25 h1 v1 h-1Z M22 25 h2 v1 h-2Z M30 25 h1 v1 h-1Z M34 25 h3 v1 h-3Z M38 25 h2 v1 h-2Z M45 25 h1 v1 h-1Z M4 26 h2 v1 h-2Z M16 26 h2 v1 h-2Z M19 26 h1 v1 h-1Z M22 26 h2 v1 h-2Z M29 26 h2 v1 h-2Z M32 26 h1 v1 h-1Z M34 26 h1 v1 h-1Z M36 26 h1 v1 h-1Z M39 26 h1 v1 h-1Z M45 26 h1 v1 h-1Z M47 26 h2 v1 h-2Z M4 27 h1 v1 h-1Z M13 27 h3 v1 h-3Z M19 27 h3 v1 h-3Z M23 27 h1 v1 h-1Z M29 27 h1 v1 h-1Z M32 27 h1 v1 h-1Z M37 27 h1 v1 h-1Z M39 27 h1 v1 h-1Z M4 28 h2 v1 h-2Z M13 28 h1 v1 h-1Z M15 28 h1 v1 h-1Z M19 28 h1 v1 h-1Z M21 28 h2 v1 h-2Z M29 28 h2 v1 h-2Z M32 28 h2 v1 h-2Z M37 28 h1 v1 h-1Z M39 28 h1 v1 h-1Z M45 28 h3 v1 h-3Z M4 29 h1 v1 h-1Z M8 29 h1 v1 h-1Z M11 29 h1 v1 h-1Z M13 29 h1 v1 h-1Z M15 29 h1 v1 h-1Z M18 29 h2 v1 h-2Z M21 29 h1 v1 h-1Z M24 29 h1 v1 h-1Z M27 29 h1 v1 h-1Z M29 29 h2 v1 h-2Z M33 29 h1 v1 h-1Z M35 29 h1 v1 h-1Z M37 29 h4 v1 h-4Z M42 29 h2 v1 h-2Z M46 29 h3 v1 h-3Z M4 30 h1 v1 h-1Z M6 30 h1 v1 h-1Z M12 30 h1 v1 h-1Z M14 30 h1 v1 h-1Z M16 30 h2 v1 h-2Z M20 30 h5 v1 h-5Z M31 30 h1 v1 h-1Z M33 30 h2 v1 h-2Z M36 30 h6 v1 h-6Z M44 30 h3 v1 h-3Z M48 30 h1 v1 h-1Z M4 31 h1 v1 h-1Z M6 31 h1 v1 h-1Z M13 31 h2 v1 h-2Z M17 31 h2 v1 h-2Z M20 31 h4 v1 h-4Z M25 31 h6 v1 h-6Z M33 31 h5 v1 h-5Z M41 31 h3 v1 h-3Z M46 31 h1 v1 h-1Z M4 32 h1 v1 h-1Z M7 32 h1 v1 h-1Z M9 32 h1 v1 h-1Z M11 32 h2 v1 h-2Z M15 32 h1 v1 h-1Z M17 32 h2 v1 h-2Z M24 32 h1 v1 h-1Z M26 32 h1 v1 h-1Z M28 32 h2 v1 h-2Z M31 32 h1 v1 h-1Z M36 32 h1 v1 h-1Z M38 32 h1 v1 h-1Z M40 32 h2 v1 h-2Z M44 32 h1 v1 h-1Z M46 32 h2 v1 h-2Z M4 33 h3 v1 h-3Z M8 33 h1 v1 h-1Z M13 33 h2 v1 h-2Z M17 33 h1 v1 h-1Z M24 33 h2 v1 h-2Z M27 33 h1 v1 h-1Z M29 33 h7 v1 h-7Z M37 33 h2 v1 h-2Z M42 33 h3 v1 h-3Z M47 33 h1 v1 h-1Z M5 34 h1 v1 h-1Z M12 34 h1 v1 h-1Z M14 34 h1 v1 h-1Z M16 34 h3 v1 h-3Z M21 34 h8 v1 h-8Z M30 34 h1 v1 h-1Z M32 34 h1 v1 h-1Z M34 34 h3 v1 h-3Z M43 34 h3 v1 h-3Z M47 34 h2 v1 h-2Z M5 35 h3 v1 h-3Z M9 35 h1 v1 h-1Z M11 35 h1 v1 h-1Z M15 35 h1 v1 h-1Z M18 35 h2 v1 h-2Z M21 35 h1 v1 h-1Z M23 35 h1 v1 h-1Z M27 35 h1 v1 h-1Z M30 35 h1 v1 h-1Z M35 35 h2 v1 h-2Z M40 35 h4 v1 h-4Z M45 35 h1 v1 h-1Z M48 35 h1 v1 h-1Z M4 36 h1 v1 h-1Z M8 36 h1 v1 h-1Z M13 36 h1 v1 h-1Z M15 36 h1 v1 h-1Z M18 36 h1 v1 h-1Z M20 36 h1 v1 h-1Z M23 36 h1 v1 h-1Z M27 36 h1 v1 h-1Z M29 36 h1 v1 h-1Z M36 36 h1 v1 h-1Z M41 36 h1 v1 h-1Z M44 36 h1 v1 h-1Z M46 36 h2 v1 h-2Z M4 37 h1 v1 h-1Z M7 37 h1 v1 h-1Z M13 37 h1 v1 h-1Z M16 37 h1 v1 h-1Z M18 37 h2 v1 h-2Z M21 37 h2 v1 h-2Z M24 37 h2 v1 h-2Z M28 37 h1 v1 h-1Z M30 37 h1 v1 h-1Z M34 37 h1 v1 h-1Z M37 37 h2 v1 h-2Z M40 37 h3 v1 h-3Z M44 37 h3 v1 h-3Z M48 37 h1 v1 h-1Z M11 38 h1 v1 h-1Z M14 38 h1 v1 h-1Z M16 38 h3 v1 h-3Z M21 38 h1 v1 h-1Z M23 38 h1 v1 h-1Z M25 38 h1 v1 h-1Z M30 38 h1 v1 h-1Z M33 38 h1 v1 h-1Z M35 38 h1 v1 h-1Z M38 38 h3 v1 h-3Z M42 38 h1 v1 h-1Z M45 38 h3 v1 h-3Z M12 39 h1 v1 h-1Z M15 39 h2 v1 h-2Z M21 39 h1 v1 h-1Z M25 39 h1 v1 h-1Z M27 39 h1 v1 h-1Z M32 39 h2 v1 h-2Z M35 39 h2 v1 h-2Z M38 39 h2 v1 h-2Z M41 39 h1 v1 h-1Z M44 39 h1 v1 h-1Z M46 39 h1 v1 h-1Z M48 39 h1 v1 h-1Z M11 40 h1 v1 h-1Z M16 40 h1 v1 h-1Z M20 40 h3 v1 h-3Z M29 40 h1 v1 h-1Z M36 40 h1 v1 h-1Z M38 40 h1 v1 h-1Z M13 41 h4 v1 h-4Z M23 41 h1 v1 h-1Z M32 41 h3 v1 h-3Z M45 41 h1 v1 h-1Z M47 41 h1 v1 h-1Z M14 42 h2 v1 h-2Z M17 42 h2 v1 h-2Z M23 42 h1 v1 h-1Z M30 42 h1 v1 h-1Z M32 42 h4 v1 h-4Z M38 42 h2 v1 h-2Z M13 43 h7 v1 h-7Z M23 43 h1 v1 h-1Z M30 43 h3 v1 h-3Z M37 43 h1 v1 h-1Z M39 43 h1 v1 h-1Z M45 43 h2 v1 h-2Z M48 43 h1 v1 h-1Z M15 44 h1 v1 h-1Z M17 44 h2 v1 h-2Z M22 44 h2 v1 h-2Z M30 44 h1 v1 h-1Z M33 44 h6 v1 h-6Z M45 44 h1 v1 h-1Z M48 44 h1 v1 h-1Z M15 45 h1 v1 h-1Z M19 45 h2 v1 h-2Z M22 45 h2 v1 h-2Z M25 45 h2 v1 h-2Z M29 45 h2 v1 h-2Z M37 45 h1 v1 h-1Z M39 45 h1 v1 h-1Z M44 45 h4 v1 h-4Z M15 46 h2 v1 h-2Z M19 46 h1 v1 h-1Z M21 46 h3 v1 h-3Z M26 46 h1 v1 h-1Z M28 46 h1 v1 h-1Z M30 46 h1 v1 h-1Z M34 46 h5 v1 h-5Z M40 46 h1 v1 h-1Z M46 46 h3 v1 h-3Z M13 47 h1 v1 h-1Z M16 47 h4 v1 h-4Z M21 47 h1 v1 h-1Z M23 47 h1 v1 h-1Z M25 47 h1 v1 h-1Z M29 47 h2 v1 h-2Z M36 47 h1 v1 h-1Z M39 47 h1 v1 h-1Z M41 47 h2 v1 h-2Z M44 47 h1 v1 h-1Z M46 47 h3 v1 h-3Z M14 48 h1 v1 h-1Z M17 48 h1 v1 h-1Z M21 48 h4 v1 h-4Z M31 48 h1 v1 h-1Z M35 48 h1 v1 h-1Z M38 48 h2 v1 h-2Z M42 48 h1 v1 h-1Z M45 48 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-1536 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M4 4 h7 v1 h-7Z M42 4 h7 v1 h-7Z M4 5 h1 v1 h-1Z M10 5 h1 v1 h-1Z M42 5 h1 v1 h-1Z M48 5 h1 v1 h-1Z M4 6 h1 v1 h-1Z M10 6 h1 v1 h-1Z M42 6 h1 v1 h-1Z M48 6 h1 v1 h-1Z M4 7 h1 v1 h-1Z M10 7 h1 v1 h-1Z M42 7 h1 v1 h-1Z M48 7 h1 v1 h-1Z M4 8 h1 v1 h-1Z M10 8 h1 v1 h-1Z M42 8 h1 v1 h-1Z M48 8 h1 v1 h-1Z M4 9 h1 v1 h-1Z M10 9 h1 v1 h-1Z M42 9 h1 v1 h-1Z M48 9 h1 v1 h-1Z M4 10 h7 v1 h-7Z M42 10 h7 v1 h-7Z M4 42 h7 v1 h-7Z M4 43 h1 v1 h-1Z M10 43 h1 v1 h-1Z M4 44 h1 v1 h-1Z M10 44 h1 v1 h-1Z M4 45 h1 v1 h-1Z M10 45 h1 v1 h-1Z M4 46 h1 v1 h-1Z M10 46 h1 v1 h-1Z M4 47 h1 v1 h-1Z M10 47 h1 v1 h-1Z M4 48 h7 v1 h-7Z \" /\u003e\u003cpath class=\"qr-2560 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M24 8 h5 v1 h-5Z M24 9 h1 v1 h-1Z M28 9 h1 v1 h-1Z M24 10 h1 v1 h-1Z M26 10 h1 v1 h-1Z M28 10 h1 v1 h-1Z M24 11 h1 v1 h-1Z M28 11 h1 v1 h-1Z M24 12 h5 v1 h-5Z M8 24 h5 v1 h-5Z M24 24 h5 v1 h-5Z M40 24 h5 v1 h-5Z M8 25 h1 v1 h-1Z M12 25 h1 v1 h-1Z M24 25 h1 v1 h-1Z M28 25 h1 v1 h-1Z M40 25 h1 v1 h-1Z M44 25 h1 v1 h-1Z M8 26 h1 v1 h-1Z M10 26 h1 v1 h-1Z M12 26 h1 v1 h-1Z M24 26 h1 v1 h-1Z M26 26 h1 v1 h-1Z M28 26 h1 v1 h-1Z M40 26 h1 v1 h-1Z M42 26 h1 v1 h-1Z M44 26 h1 v1 h-1Z M8 27 h1 v1 h-1Z M12 27 h1 v1 h-1Z M24 27 h1 v1 h-1Z M28 27 h1 v1 h-1Z M40 27 h1 v1 h-1Z M44 27 h1 v1 h-1Z M8 28 h5 v1 h-5Z M24 28 h5 v1 h-5Z M40 28 h5 v1 h-5Z M24 40 h5 v1 h-5Z M40 40 h5 v1 h-5Z M24 41 h1 v1 h-1Z M28 41 h1 v1 h-1Z M40 41 h1 v1 h-1Z M44 41 h1 v1 h-1Z M24 42 h1 v1 h-1Z M26 42 h1 v1 h-1Z M28 42 h1 v1 h-1Z M40 42 h1 v1 h-1Z M42 42 h1 v1 h-1Z M44 42 h1 v1 h-1Z M24 43 h1 v1 h-1Z M28 43 h1 v1 h-1Z M40 43 h1 v1 h-1Z M44 43 h1 v1 h-1Z M24 44 h5 v1 h-5Z M40 44 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-3072 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 10 h1 v1 h-1Z M14 10 h1 v1 h-1Z M16 10 h1 v1 h-1Z M18 10 h1 v1 h-1Z M20 10 h1 v1 h-1Z M22 10 h1 v1 h-1Z M30 10 h1 v1 h-1Z M32 10 h1 v1 h-1Z M34 10 h1 v1 h-1Z M36 10 h1 v1 h-1Z M38 10 h1 v1 h-1Z M40 10 h1 v1 h-1Z M10 12 h1 v1 h-1Z M10 14 h1 v1 h-1Z M10 16 h1 v1 h-1Z M10 18 h1 v1 h-1Z M10 20 h1 v1 h-1Z M10 22 h1 v1 h-1Z M10 30 h1 v1 h-1Z M10 32 h1 v1 h-1Z M10 34 h1 v1 h-1Z M10 36 h1 v1 h-1Z M10 38 h1 v1 h-1Z M10 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-3584 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 6 h1 v1 h-1Z M12 7 h1 v1 h-1Z M7 12 h2 v1 h-2Z M11 12 h1 v1 h-1Z M45 12 h2 v1 h-2Z M12 42 h1 v1 h-1Z M12 44 h1 v1 h-1Z M12 45 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-4096 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M40 4 h1 v1 h-1Z M39 5 h1 v1 h-1Z M39 6 h1 v1 h-1Z M39 7 h2 v1 h-2Z M38 8 h3 v1 h-3Z M8 38 h1 v1 h-1Z M5 39 h4 v1 h-4Z M4 40 h1 v1 h-1Z M7 40 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-5632 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M6 6 h3 v1 h-3Z M44 6 h3 v1 h-3Z M6 7 h3 v1 h-3Z M44 7 h3 v1 h-3Z M6 8 h3 v1 h-3Z M44 8 h3 v1 h-3Z M6 44 h3 v1 h-3Z M6 45 h3 v1 h-3Z M6 46 h3 v1 h-3Z \" /\u003e\u003c/svg\u003e\n\n    \u003c/a\u003e\n    \u003cfigcaption aria-hidden=\"true\" class=\"hidden\" hidden\u003eUn don Paypal pour Stéphane HUC\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\n\u003ch3 id=\"tipeee\"\u003eTip\u003cem\u003eeee\u003c/em\u003e\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.tipeee.com/hucste\" rel=\"external\"\u003ehttps://fr.tipeee.com/hucste\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\n\u003cfigure class=\"pure-img\"\u003e\n    \u003ca href=\"/svg/qrcode/tipee.svg\" title=\"Un soutien tipeee pour Stéphane HUC\"\u003e\n    \u003csvg xmlns=\"http://www.w3.org/2000/svg\" height=\"128\" viewBox=\"0 0 53 53\" width=\"128\"\u003e\n\u003cdefs\u003e\u003cstyle\u003erect{shape-rendering:crispEdges}\u003c/style\u003e\u003c/defs\u003e\n\u003cpath class=\"qr-4 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M14 4 h1 v1 h-1Z M16 4 h1 v1 h-1Z M18 4 h1 v1 h-1Z M20 4 h1 v1 h-1Z M22 4 h2 v1 h-2Z M25 4 h1 v1 h-1Z M27 4 h4 v1 h-4Z M35 4 h2 v1 h-2Z M17 5 h5 v1 h-5Z M23 5 h1 v1 h-1Z M27 5 h1 v1 h-1Z M32 5 h2 v1 h-2Z M35 5 h1 v1 h-1Z M13 6 h1 v1 h-1Z M15 6 h3 v1 h-3Z M19 6 h1 v1 h-1Z M22 6 h2 v1 h-2Z M25 6 h1 v1 h-1Z M29 6 h1 v1 h-1Z M31 6 h1 v1 h-1Z M35 6 h1 v1 h-1Z M13 7 h1 v1 h-1Z M15 7 h1 v1 h-1Z M17 7 h1 v1 h-1Z M19 7 h1 v1 h-1Z M21 7 h2 v1 h-2Z M26 7 h3 v1 h-3Z M31 7 h1 v1 h-1Z M33 7 h3 v1 h-3Z M37 7 h1 v1 h-1Z M13 8 h3 v1 h-3Z M17 8 h1 v1 h-1Z M23 8 h1 v1 h-1Z M30 8 h2 v1 h-2Z M35 8 h3 v1 h-3Z M14 9 h3 v1 h-3Z M19 9 h1 v1 h-1Z M22 9 h2 v1 h-2Z M29 9 h2 v1 h-2Z M32 9 h1 v1 h-1Z M35 9 h1 v1 h-1Z M13 11 h1 v1 h-1Z M15 11 h2 v1 h-2Z M20 11 h1 v1 h-1Z M23 11 h1 v1 h-1Z M30 11 h1 v1 h-1Z M32 11 h1 v1 h-1Z M34 11 h4 v1 h-4Z M39 11 h1 v1 h-1Z M13 12 h1 v1 h-1Z M16 12 h1 v1 h-1Z M19 12 h1 v1 h-1Z M21 12 h3 v1 h-3Z M31 12 h2 v1 h-2Z M35 12 h1 v1 h-1Z M38 12 h1 v1 h-1Z M4 13 h1 v1 h-1Z M6 13 h2 v1 h-2Z M11 13 h3 v1 h-3Z M15 13 h2 v1 h-2Z M23 13 h1 v1 h-1Z M26 13 h2 v1 h-2Z M30 13 h1 v1 h-1Z M34 13 h3 v1 h-3Z M38 13 h1 v1 h-1Z M40 13 h1 v1 h-1Z M42 13 h4 v1 h-4Z M47 13 h2 v1 h-2Z M4 14 h4 v1 h-4Z M9 14 h1 v1 h-1Z M12 14 h2 v1 h-2Z M15 14 h3 v1 h-3Z M19 14 h3 v1 h-3Z M23 14 h3 v1 h-3Z M28 14 h3 v1 h-3Z M32 14 h1 v1 h-1Z M35 14 h1 v1 h-1Z M37 14 h2 v1 h-2Z M43 14 h1 v1 h-1Z M45 14 h3 v1 h-3Z M5 15 h1 v1 h-1Z M9 15 h1 v1 h-1Z M14 15 h2 v1 h-2Z M17 15 h2 v1 h-2Z M20 15 h2 v1 h-2Z M24 15 h4 v1 h-4Z M30 15 h1 v1 h-1Z M33 15 h1 v1 h-1Z M36 15 h2 v1 h-2Z M40 15 h1 v1 h-1Z M42 15 h1 v1 h-1Z M44 15 h2 v1 h-2Z M47 15 h2 v1 h-2Z M4 16 h2 v1 h-2Z M7 16 h1 v1 h-1Z M13 16 h1 v1 h-1Z M20 16 h1 v1 h-1Z M22 16 h2 v1 h-2Z M25 16 h2 v1 h-2Z M29 16 h1 v1 h-1Z M33 16 h2 v1 h-2Z M36 16 h1 v1 h-1Z M38 16 h2 v1 h-2Z M41 16 h1 v1 h-1Z M44 16 h2 v1 h-2Z M47 16 h1 v1 h-1Z M4 17 h1 v1 h-1Z M9 17 h1 v1 h-1Z M12 17 h3 v1 h-3Z M16 17 h1 v1 h-1Z M18 17 h2 v1 h-2Z M24 17 h2 v1 h-2Z M29 17 h2 v1 h-2Z M32 17 h2 v1 h-2Z M37 17 h3 v1 h-3Z M41 17 h2 v1 h-2Z M47 17 h1 v1 h-1Z M6 18 h1 v1 h-1Z M9 18 h1 v1 h-1Z M12 18 h1 v1 h-1Z M14 18 h1 v1 h-1Z M16 18 h1 v1 h-1Z M18 18 h2 v1 h-2Z M21 18 h2 v1 h-2Z M24 18 h2 v1 h-2Z M27 18 h3 v1 h-3Z M31 18 h3 v1 h-3Z M36 18 h5 v1 h-5Z M42 18 h1 v1 h-1Z M44 18 h2 v1 h-2Z M5 19 h2 v1 h-2Z M11 19 h1 v1 h-1Z M13 19 h1 v1 h-1Z M16 19 h5 v1 h-5Z M23 19 h6 v1 h-6Z M30 19 h1 v1 h-1Z M34 19 h2 v1 h-2Z M38 19 h2 v1 h-2Z M41 19 h2 v1 h-2Z M44 19 h4 v1 h-4Z M5 20 h1 v1 h-1Z M11 20 h1 v1 h-1Z M13 20 h1 v1 h-1Z M15 20 h3 v1 h-3Z M20 20 h1 v1 h-1Z M22 20 h1 v1 h-1Z M24 20 h2 v1 h-2Z M28 20 h4 v1 h-4Z M39 20 h2 v1 h-2Z M43 20 h1 v1 h-1Z M46 20 h2 v1 h-2Z M6 21 h2 v1 h-2Z M11 21 h4 v1 h-4Z M16 21 h1 v1 h-1Z M20 21 h1 v1 h-1Z M22 21 h2 v1 h-2Z M25 21 h1 v1 h-1Z M27 21 h1 v1 h-1Z M29 21 h3 v1 h-3Z M34 21 h1 v1 h-1Z M36 21 h1 v1 h-1Z M38 21 h3 v1 h-3Z M42 21 h2 v1 h-2Z M46 21 h2 v1 h-2Z M5 22 h1 v1 h-1Z M8 22 h2 v1 h-2Z M12 22 h2 v1 h-2Z M15 22 h1 v1 h-1Z M18 22 h1 v1 h-1Z M21 22 h4 v1 h-4Z M27 22 h1 v1 h-1Z M29 22 h1 v1 h-1Z M35 22 h2 v1 h-2Z M40 22 h3 v1 h-3Z M44 22 h2 v1 h-2Z M9 23 h1 v1 h-1Z M16 23 h1 v1 h-1Z M18 23 h2 v1 h-2Z M21 23 h1 v1 h-1Z M23 23 h2 v1 h-2Z M27 23 h2 v1 h-2Z M32 23 h2 v1 h-2Z M37 23 h1 v1 h-1Z M40 23 h2 v1 h-2Z M45 23 h4 v1 h-4Z M7 24 h1 v1 h-1Z M15 24 h1 v1 h-1Z M18 24 h5 v1 h-5Z M30 24 h1 v1 h-1Z M33 24 h3 v1 h-3Z M37 24 h3 v1 h-3Z M45 24 h4 v1 h-4Z M5 25 h1 v1 h-1Z M7 25 h1 v1 h-1Z M17 25 h1 v1 h-1Z M19 25 h2 v1 h-2Z M23 25 h1 v1 h-1Z M29 25 h3 v1 h-3Z M33 25 h1 v1 h-1Z M37 25 h1 v1 h-1Z M39 25 h1 v1 h-1Z M45 25 h2 v1 h-2Z M4 26 h1 v1 h-1Z M7 26 h1 v1 h-1Z M14 26 h1 v1 h-1Z M23 26 h1 v1 h-1Z M30 26 h1 v1 h-1Z M33 26 h1 v1 h-1Z M35 26 h1 v1 h-1Z M37 26 h1 v1 h-1Z M39 26 h1 v1 h-1Z M45 26 h1 v1 h-1Z M6 27 h1 v1 h-1Z M13 27 h1 v1 h-1Z M16 27 h1 v1 h-1Z M20 27 h4 v1 h-4Z M29 27 h1 v1 h-1Z M33 27 h1 v1 h-1Z M35 27 h2 v1 h-2Z M38 27 h1 v1 h-1Z M45 27 h4 v1 h-4Z M4 28 h4 v1 h-4Z M13 28 h5 v1 h-5Z M20 28 h2 v1 h-2Z M30 28 h2 v1 h-2Z M35 28 h1 v1 h-1Z M39 28 h1 v1 h-1Z M45 28 h2 v1 h-2Z M48 28 h1 v1 h-1Z M4 29 h1 v1 h-1Z M6 29 h2 v1 h-2Z M9 29 h1 v1 h-1Z M14 29 h2 v1 h-2Z M17 29 h2 v1 h-2Z M24 29 h6 v1 h-6Z M31 29 h6 v1 h-6Z M38 29 h3 v1 h-3Z M43 29 h3 v1 h-3Z M47 29 h2 v1 h-2Z M7 30 h2 v1 h-2Z M11 30 h1 v1 h-1Z M13 30 h1 v1 h-1Z M15 30 h1 v1 h-1Z M19 30 h2 v1 h-2Z M23 30 h3 v1 h-3Z M27 30 h2 v1 h-2Z M30 30 h3 v1 h-3Z M35 30 h1 v1 h-1Z M40 30 h1 v1 h-1Z M42 30 h1 v1 h-1Z M45 30 h3 v1 h-3Z M4 31 h1 v1 h-1Z M7 31 h1 v1 h-1Z M9 31 h1 v1 h-1Z M13 31 h1 v1 h-1Z M17 31 h1 v1 h-1Z M19 31 h1 v1 h-1Z M23 31 h1 v1 h-1Z M26 31 h1 v1 h-1Z M28 31 h4 v1 h-4Z M33 31 h1 v1 h-1Z M36 31 h2 v1 h-2Z M40 31 h1 v1 h-1Z M42 31 h4 v1 h-4Z M47 31 h2 v1 h-2Z M5 32 h1 v1 h-1Z M8 32 h2 v1 h-2Z M13 32 h1 v1 h-1Z M16 32 h1 v1 h-1Z M18 32 h1 v1 h-1Z M21 32 h1 v1 h-1Z M23 32 h2 v1 h-2Z M26 32 h4 v1 h-4Z M33 32 h2 v1 h-2Z M36 32 h1 v1 h-1Z M38 32 h4 v1 h-4Z M44 32 h2 v1 h-2Z M47 32 h1 v1 h-1Z M4 33 h2 v1 h-2Z M7 33 h1 v1 h-1Z M9 33 h1 v1 h-1Z M13 33 h2 v1 h-2Z M16 33 h2 v1 h-2Z M19 33 h1 v1 h-1Z M21 33 h1 v1 h-1Z M23 33 h2 v1 h-2Z M26 33 h1 v1 h-1Z M28 33 h1 v1 h-1Z M30 33 h2 v1 h-2Z M33 33 h1 v1 h-1Z M37 33 h2 v1 h-2Z M40 33 h5 v1 h-5Z M46 33 h1 v1 h-1Z M48 33 h1 v1 h-1Z M5 34 h5 v1 h-5Z M12 34 h1 v1 h-1Z M19 34 h2 v1 h-2Z M23 34 h1 v1 h-1Z M25 34 h1 v1 h-1Z M28 34 h1 v1 h-1Z M31 34 h1 v1 h-1Z M33 34 h1 v1 h-1Z M36 34 h4 v1 h-4Z M41 34 h1 v1 h-1Z M43 34 h1 v1 h-1Z M48 34 h1 v1 h-1Z M4 35 h1 v1 h-1Z M6 35 h1 v1 h-1Z M8 35 h2 v1 h-2Z M13 35 h2 v1 h-2Z M16 35 h5 v1 h-5Z M23 35 h5 v1 h-5Z M30 35 h1 v1 h-1Z M32 35 h6 v1 h-6Z M41 35 h4 v1 h-4Z M46 35 h1 v1 h-1Z M5 36 h2 v1 h-2Z M8 36 h2 v1 h-2Z M12 36 h1 v1 h-1Z M15 36 h1 v1 h-1Z M20 36 h1 v1 h-1Z M22 36 h3 v1 h-3Z M27 36 h2 v1 h-2Z M32 36 h2 v1 h-2Z M35 36 h1 v1 h-1Z M42 36 h2 v1 h-2Z M48 36 h1 v1 h-1Z M5 37 h2 v1 h-2Z M11 37 h1 v1 h-1Z M13 37 h2 v1 h-2Z M17 37 h4 v1 h-4Z M24 37 h1 v1 h-1Z M26 37 h2 v1 h-2Z M30 37 h1 v1 h-1Z M33 37 h1 v1 h-1Z M35 37 h2 v1 h-2Z M38 37 h2 v1 h-2Z M43 37 h1 v1 h-1Z M45 37 h3 v1 h-3Z M11 38 h9 v1 h-9Z M23 38 h3 v1 h-3Z M27 38 h4 v1 h-4Z M33 38 h3 v1 h-3Z M37 38 h2 v1 h-2Z M40 38 h1 v1 h-1Z M42 38 h4 v1 h-4Z M11 39 h1 v1 h-1Z M13 39 h3 v1 h-3Z M18 39 h5 v1 h-5Z M24 39 h3 v1 h-3Z M30 39 h1 v1 h-1Z M37 39 h1 v1 h-1Z M40 39 h1 v1 h-1Z M42 39 h2 v1 h-2Z M45 39 h3 v1 h-3Z M12 40 h4 v1 h-4Z M18 40 h1 v1 h-1Z M20 40 h3 v1 h-3Z M32 40 h3 v1 h-3Z M37 40 h3 v1 h-3Z M46 40 h2 v1 h-2Z M13 41 h5 v1 h-5Z M32 41 h1 v1 h-1Z M34 41 h2 v1 h-2Z M37 41 h1 v1 h-1Z M39 41 h1 v1 h-1Z M45 41 h2 v1 h-2Z M13 42 h1 v1 h-1Z M15 42 h2 v1 h-2Z M20 42 h2 v1 h-2Z M29 42 h6 v1 h-6Z M36 42 h2 v1 h-2Z M39 42 h1 v1 h-1Z M18 43 h5 v1 h-5Z M30 43 h1 v1 h-1Z M33 43 h1 v1 h-1Z M35 43 h1 v1 h-1Z M38 43 h1 v1 h-1Z M45 43 h2 v1 h-2Z M48 43 h1 v1 h-1Z M13 44 h2 v1 h-2Z M16 44 h1 v1 h-1Z M18 44 h1 v1 h-1Z M20 44 h3 v1 h-3Z M29 44 h2 v1 h-2Z M32 44 h3 v1 h-3Z M39 44 h1 v1 h-1Z M45 44 h2 v1 h-2Z M13 45 h3 v1 h-3Z M17 45 h1 v1 h-1Z M19 45 h2 v1 h-2Z M22 45 h2 v1 h-2Z M26 45 h5 v1 h-5Z M32 45 h1 v1 h-1Z M38 45 h1 v1 h-1Z M42 45 h7 v1 h-7Z M13 46 h2 v1 h-2Z M18 46 h1 v1 h-1Z M20 46 h1 v1 h-1Z M22 46 h1 v1 h-1Z M25 46 h1 v1 h-1Z M27 46 h1 v1 h-1Z M29 46 h2 v1 h-2Z M42 46 h2 v1 h-2Z M47 46 h1 v1 h-1Z M13 47 h1 v1 h-1Z M15 47 h1 v1 h-1Z M18 47 h1 v1 h-1Z M20 47 h1 v1 h-1Z M22 47 h4 v1 h-4Z M29 47 h3 v1 h-3Z M33 47 h2 v1 h-2Z M36 47 h2 v1 h-2Z M42 47 h3 v1 h-3Z M46 47 h1 v1 h-1Z M48 47 h1 v1 h-1Z M13 48 h5 v1 h-5Z M19 48 h2 v1 h-2Z M22 48 h1 v1 h-1Z M25 48 h3 v1 h-3Z M30 48 h5 v1 h-5Z M36 48 h3 v1 h-3Z M40 48 h1 v1 h-1Z M42 48 h2 v1 h-2Z M45 48 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-6 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M5 5 h5 v1 h-5Z M43 5 h5 v1 h-5Z M5 6 h1 v1 h-1Z M9 6 h1 v1 h-1Z M43 6 h1 v1 h-1Z M47 6 h1 v1 h-1Z M5 7 h1 v1 h-1Z M9 7 h1 v1 h-1Z M43 7 h1 v1 h-1Z M47 7 h1 v1 h-1Z M5 8 h1 v1 h-1Z M9 8 h1 v1 h-1Z M43 8 h1 v1 h-1Z M47 8 h1 v1 h-1Z M5 9 h5 v1 h-5Z M43 9 h5 v1 h-5Z M5 43 h5 v1 h-5Z M5 44 h1 v1 h-1Z M9 44 h1 v1 h-1Z M5 45 h1 v1 h-1Z M9 45 h1 v1 h-1Z M5 46 h1 v1 h-1Z M9 46 h1 v1 h-1Z M5 47 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-8 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M11 4 h1 v1 h-1Z M41 4 h1 v1 h-1Z M11 5 h1 v1 h-1Z M41 5 h1 v1 h-1Z M11 6 h1 v1 h-1Z M41 6 h1 v1 h-1Z M11 7 h1 v1 h-1Z M41 7 h1 v1 h-1Z M11 8 h1 v1 h-1Z M41 8 h1 v1 h-1Z M11 9 h1 v1 h-1Z M41 9 h1 v1 h-1Z M11 10 h1 v1 h-1Z M41 10 h1 v1 h-1Z M4 11 h8 v1 h-8Z M41 11 h8 v1 h-8Z M4 41 h8 v1 h-8Z M11 42 h1 v1 h-1Z M11 43 h1 v1 h-1Z M11 44 h1 v1 h-1Z M11 45 h1 v1 h-1Z M11 46 h1 v1 h-1Z M11 47 h1 v1 h-1Z M11 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-10 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M25 9 h3 v1 h-3Z M25 10 h1 v1 h-1Z M27 10 h1 v1 h-1Z M25 11 h3 v1 h-3Z M9 25 h3 v1 h-3Z M25 25 h3 v1 h-3Z M41 25 h3 v1 h-3Z M9 26 h1 v1 h-1Z M11 26 h1 v1 h-1Z M25 26 h1 v1 h-1Z M27 26 h1 v1 h-1Z M41 26 h1 v1 h-1Z M43 26 h1 v1 h-1Z M9 27 h3 v1 h-3Z M25 27 h3 v1 h-3Z M41 27 h3 v1 h-3Z M25 41 h3 v1 h-3Z M41 41 h3 v1 h-3Z M25 42 h1 v1 h-1Z M27 42 h1 v1 h-1Z M41 42 h1 v1 h-1Z M43 42 h1 v1 h-1Z M25 43 h3 v1 h-3Z M41 43 h3 v1 h-3Z \" /\u003e\u003cpath class=\"qr-12 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M13 10 h1 v1 h-1Z M15 10 h1 v1 h-1Z M17 10 h1 v1 h-1Z M19 10 h1 v1 h-1Z M21 10 h1 v1 h-1Z M23 10 h1 v1 h-1Z M29 10 h1 v1 h-1Z M31 10 h1 v1 h-1Z M33 10 h1 v1 h-1Z M35 10 h1 v1 h-1Z M37 10 h1 v1 h-1Z M39 10 h1 v1 h-1Z M10 13 h1 v1 h-1Z M10 15 h1 v1 h-1Z M10 17 h1 v1 h-1Z M10 19 h1 v1 h-1Z M10 21 h1 v1 h-1Z M10 23 h1 v1 h-1Z M10 29 h1 v1 h-1Z M10 31 h1 v1 h-1Z M10 33 h1 v1 h-1Z M10 35 h1 v1 h-1Z M10 37 h1 v1 h-1Z M10 39 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-14 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M12 5 h1 v1 h-1Z M12 6 h1 v1 h-1Z M12 8 h1 v1 h-1Z M12 9 h1 v1 h-1Z M12 11 h1 v1 h-1Z M4 12 h2 v1 h-2Z M7 12 h1 v1 h-1Z M11 12 h1 v1 h-1Z M42 12 h3 v1 h-3Z M46 12 h2 v1 h-2Z M12 42 h1 v1 h-1Z M12 45 h1 v1 h-1Z M12 47 h1 v1 h-1Z M12 48 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-16 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M38 4 h2 v1 h-2Z M38 5 h1 v1 h-1Z M40 5 h1 v1 h-1Z M38 6 h1 v1 h-1Z M40 6 h1 v1 h-1Z M38 7 h1 v1 h-1Z M38 9 h3 v1 h-3Z M4 38 h4 v1 h-4Z M9 38 h1 v1 h-1Z M4 39 h1 v1 h-1Z M9 39 h1 v1 h-1Z M5 40 h2 v1 h-2Z M9 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-18 \" stroke=\"transparent\" fill=\"#fff\" fill-opacity=\"1\" d=\"M0 0 h53 v1 h-53Z M0 1 h53 v1 h-53Z M0 2 h53 v1 h-53Z M0 3 h53 v1 h-53Z M0 4 h4 v1 h-4Z M49 4 h4 v1 h-4Z M0 5 h4 v1 h-4Z M49 5 h4 v1 h-4Z M0 6 h4 v1 h-4Z M49 6 h4 v1 h-4Z M0 7 h4 v1 h-4Z M49 7 h4 v1 h-4Z M0 8 h4 v1 h-4Z M49 8 h4 v1 h-4Z M0 9 h4 v1 h-4Z M49 9 h4 v1 h-4Z M0 10 h4 v1 h-4Z M49 10 h4 v1 h-4Z M0 11 h4 v1 h-4Z M49 11 h4 v1 h-4Z M0 12 h4 v1 h-4Z M49 12 h4 v1 h-4Z M0 13 h4 v1 h-4Z M49 13 h4 v1 h-4Z M0 14 h4 v1 h-4Z M49 14 h4 v1 h-4Z M0 15 h4 v1 h-4Z M49 15 h4 v1 h-4Z M0 16 h4 v1 h-4Z M49 16 h4 v1 h-4Z M0 17 h4 v1 h-4Z M49 17 h4 v1 h-4Z M0 18 h4 v1 h-4Z M49 18 h4 v1 h-4Z M0 19 h4 v1 h-4Z M49 19 h4 v1 h-4Z M0 20 h4 v1 h-4Z M49 20 h4 v1 h-4Z M0 21 h4 v1 h-4Z M49 21 h4 v1 h-4Z M0 22 h4 v1 h-4Z M49 22 h4 v1 h-4Z M0 23 h4 v1 h-4Z M49 23 h4 v1 h-4Z M0 24 h4 v1 h-4Z M49 24 h4 v1 h-4Z M0 25 h4 v1 h-4Z M49 25 h4 v1 h-4Z M0 26 h4 v1 h-4Z M49 26 h4 v1 h-4Z M0 27 h4 v1 h-4Z M49 27 h4 v1 h-4Z M0 28 h4 v1 h-4Z M49 28 h4 v1 h-4Z M0 29 h4 v1 h-4Z M49 29 h4 v1 h-4Z M0 30 h4 v1 h-4Z M49 30 h4 v1 h-4Z M0 31 h4 v1 h-4Z M49 31 h4 v1 h-4Z M0 32 h4 v1 h-4Z M49 32 h4 v1 h-4Z M0 33 h4 v1 h-4Z M49 33 h4 v1 h-4Z M0 34 h4 v1 h-4Z M49 34 h4 v1 h-4Z M0 35 h4 v1 h-4Z M49 35 h4 v1 h-4Z M0 36 h4 v1 h-4Z M49 36 h4 v1 h-4Z M0 37 h4 v1 h-4Z M49 37 h4 v1 h-4Z M0 38 h4 v1 h-4Z M49 38 h4 v1 h-4Z M0 39 h4 v1 h-4Z M49 39 h4 v1 h-4Z M0 40 h4 v1 h-4Z M49 40 h4 v1 h-4Z M0 41 h4 v1 h-4Z M49 41 h4 v1 h-4Z M0 42 h4 v1 h-4Z M49 42 h4 v1 h-4Z M0 43 h4 v1 h-4Z M49 43 h4 v1 h-4Z M0 44 h4 v1 h-4Z M49 44 h4 v1 h-4Z M0 45 h4 v1 h-4Z M49 45 h4 v1 h-4Z M0 46 h4 v1 h-4Z M49 46 h4 v1 h-4Z M0 47 h4 v1 h-4Z M49 47 h4 v1 h-4Z M0 48 h4 v1 h-4Z M49 48 h4 v1 h-4Z M0 49 h53 v1 h-53Z M0 50 h53 v1 h-53Z M0 51 h53 v1 h-53Z M0 52 h53 v1 h-53Z \" /\u003e\u003cpath class=\"qr-512 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 41 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-1024 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M13 4 h1 v1 h-1Z M15 4 h1 v1 h-1Z M17 4 h1 v1 h-1Z M19 4 h1 v1 h-1Z M21 4 h1 v1 h-1Z M24 4 h1 v1 h-1Z M26 4 h1 v1 h-1Z M31 4 h4 v1 h-4Z M37 4 h1 v1 h-1Z M13 5 h4 v1 h-4Z M22 5 h1 v1 h-1Z M24 5 h3 v1 h-3Z M28 5 h4 v1 h-4Z M34 5 h1 v1 h-1Z M36 5 h2 v1 h-2Z M14 6 h1 v1 h-1Z M18 6 h1 v1 h-1Z M20 6 h2 v1 h-2Z M24 6 h1 v1 h-1Z M26 6 h3 v1 h-3Z M30 6 h1 v1 h-1Z M32 6 h3 v1 h-3Z M36 6 h2 v1 h-2Z M14 7 h1 v1 h-1Z M16 7 h1 v1 h-1Z M18 7 h1 v1 h-1Z M20 7 h1 v1 h-1Z M23 7 h3 v1 h-3Z M29 7 h2 v1 h-2Z M32 7 h1 v1 h-1Z M36 7 h1 v1 h-1Z M16 8 h1 v1 h-1Z M18 8 h5 v1 h-5Z M29 8 h1 v1 h-1Z M32 8 h3 v1 h-3Z M13 9 h1 v1 h-1Z M17 9 h2 v1 h-2Z M20 9 h2 v1 h-2Z M31 9 h1 v1 h-1Z M33 9 h2 v1 h-2Z M36 9 h2 v1 h-2Z M14 11 h1 v1 h-1Z M17 11 h3 v1 h-3Z M21 11 h2 v1 h-2Z M29 11 h1 v1 h-1Z M31 11 h1 v1 h-1Z M33 11 h1 v1 h-1Z M38 11 h1 v1 h-1Z M40 11 h1 v1 h-1Z M14 12 h2 v1 h-2Z M17 12 h2 v1 h-2Z M20 12 h1 v1 h-1Z M29 12 h2 v1 h-2Z M33 12 h2 v1 h-2Z M36 12 h2 v1 h-2Z M39 12 h2 v1 h-2Z M5 13 h1 v1 h-1Z M8 13 h2 v1 h-2Z M14 13 h1 v1 h-1Z M17 13 h6 v1 h-6Z M24 13 h2 v1 h-2Z M28 13 h2 v1 h-2Z M31 13 h3 v1 h-3Z M37 13 h1 v1 h-1Z M39 13 h1 v1 h-1Z M41 13 h1 v1 h-1Z M46 13 h1 v1 h-1Z M8 14 h1 v1 h-1Z M11 14 h1 v1 h-1Z M14 14 h1 v1 h-1Z M18 14 h1 v1 h-1Z M22 14 h1 v1 h-1Z M26 14 h2 v1 h-2Z M31 14 h1 v1 h-1Z M33 14 h2 v1 h-2Z M36 14 h1 v1 h-1Z M39 14 h4 v1 h-4Z M44 14 h1 v1 h-1Z M48 14 h1 v1 h-1Z M4 15 h1 v1 h-1Z M6 15 h3 v1 h-3Z M11 15 h3 v1 h-3Z M16 15 h1 v1 h-1Z M19 15 h1 v1 h-1Z M22 15 h2 v1 h-2Z M28 15 h2 v1 h-2Z M31 15 h2 v1 h-2Z M34 15 h2 v1 h-2Z M38 15 h2 v1 h-2Z M41 15 h1 v1 h-1Z M43 15 h1 v1 h-1Z M46 15 h1 v1 h-1Z M6 16 h1 v1 h-1Z M8 16 h2 v1 h-2Z M11 16 h2 v1 h-2Z M14 16 h6 v1 h-6Z M21 16 h1 v1 h-1Z M24 16 h1 v1 h-1Z M27 16 h2 v1 h-2Z M30 16 h3 v1 h-3Z M35 16 h1 v1 h-1Z M37 16 h1 v1 h-1Z M40 16 h1 v1 h-1Z M42 16 h2 v1 h-2Z M46 16 h1 v1 h-1Z M48 16 h1 v1 h-1Z M5 17 h4 v1 h-4Z M11 17 h1 v1 h-1Z M15 17 h1 v1 h-1Z M17 17 h1 v1 h-1Z M20 17 h4 v1 h-4Z M26 17 h3 v1 h-3Z M31 17 h1 v1 h-1Z M34 17 h3 v1 h-3Z M40 17 h1 v1 h-1Z M43 17 h4 v1 h-4Z M48 17 h1 v1 h-1Z M4 18 h2 v1 h-2Z M7 18 h2 v1 h-2Z M11 18 h1 v1 h-1Z M13 18 h1 v1 h-1Z M15 18 h1 v1 h-1Z M17 18 h1 v1 h-1Z M20 18 h1 v1 h-1Z M23 18 h1 v1 h-1Z M26 18 h1 v1 h-1Z M30 18 h1 v1 h-1Z M34 18 h2 v1 h-2Z M41 18 h1 v1 h-1Z M43 18 h1 v1 h-1Z M46 18 h3 v1 h-3Z M4 19 h1 v1 h-1Z M7 19 h3 v1 h-3Z M12 19 h1 v1 h-1Z M14 19 h2 v1 h-2Z M21 19 h2 v1 h-2Z M29 19 h1 v1 h-1Z M31 19 h3 v1 h-3Z M36 19 h2 v1 h-2Z M40 19 h1 v1 h-1Z M43 19 h1 v1 h-1Z M48 19 h1 v1 h-1Z M4 20 h1 v1 h-1Z M6 20 h4 v1 h-4Z M12 20 h1 v1 h-1Z M14 20 h1 v1 h-1Z M18 20 h2 v1 h-2Z M21 20 h1 v1 h-1Z M23 20 h1 v1 h-1Z M26 20 h2 v1 h-2Z M32 20 h7 v1 h-7Z M41 20 h2 v1 h-2Z M44 20 h2 v1 h-2Z M48 20 h1 v1 h-1Z M4 21 h2 v1 h-2Z M8 21 h2 v1 h-2Z M15 21 h1 v1 h-1Z M17 21 h3 v1 h-3Z M21 21 h1 v1 h-1Z M24 21 h1 v1 h-1Z M26 21 h1 v1 h-1Z M28 21 h1 v1 h-1Z M32 21 h2 v1 h-2Z M35 21 h1 v1 h-1Z M37 21 h1 v1 h-1Z M41 21 h1 v1 h-1Z M44 21 h2 v1 h-2Z M48 21 h1 v1 h-1Z M4 22 h1 v1 h-1Z M6 22 h2 v1 h-2Z M11 22 h1 v1 h-1Z M14 22 h1 v1 h-1Z M16 22 h2 v1 h-2Z M19 22 h2 v1 h-2Z M25 22 h2 v1 h-2Z M28 22 h1 v1 h-1Z M30 22 h5 v1 h-5Z M37 22 h3 v1 h-3Z M43 22 h1 v1 h-1Z M46 22 h3 v1 h-3Z M4 23 h5 v1 h-5Z M11 23 h5 v1 h-5Z M17 23 h1 v1 h-1Z M20 23 h1 v1 h-1Z M22 23 h1 v1 h-1Z M25 23 h2 v1 h-2Z M29 23 h3 v1 h-3Z M34 23 h3 v1 h-3Z M38 23 h2 v1 h-2Z M42 23 h3 v1 h-3Z M4 24 h3 v1 h-3Z M13 24 h2 v1 h-2Z M16 24 h2 v1 h-2Z M23 24 h1 v1 h-1Z M29 24 h1 v1 h-1Z M31 24 h2 v1 h-2Z M36 24 h1 v1 h-1Z M4 25 h1 v1 h-1Z M6 25 h1 v1 h-1Z M13 25 h4 v1 h-4Z M18 25 h1 v1 h-1Z M21 25 h2 v1 h-2Z M32 25 h1 v1 h-1Z M34 25 h3 v1 h-3Z M38 25 h1 v1 h-1Z M47 25 h2 v1 h-2Z M5 26 h2 v1 h-2Z M13 26 h1 v1 h-1Z M15 26 h8 v1 h-8Z M29 26 h1 v1 h-1Z M31 26 h2 v1 h-2Z M34 26 h1 v1 h-1Z M36 26 h1 v1 h-1Z M38 26 h1 v1 h-1Z M46 26 h3 v1 h-3Z M4 27 h2 v1 h-2Z M7 27 h1 v1 h-1Z M14 27 h2 v1 h-2Z M17 27 h3 v1 h-3Z M30 27 h3 v1 h-3Z M34 27 h1 v1 h-1Z M37 27 h1 v1 h-1Z M39 27 h1 v1 h-1Z M18 28 h2 v1 h-2Z M22 28 h2 v1 h-2Z M29 28 h1 v1 h-1Z M32 28 h3 v1 h-3Z M36 28 h3 v1 h-3Z M47 28 h1 v1 h-1Z M5 29 h1 v1 h-1Z M8 29 h1 v1 h-1Z M11 29 h3 v1 h-3Z M16 29 h1 v1 h-1Z M19 29 h5 v1 h-5Z M30 29 h1 v1 h-1Z M37 29 h1 v1 h-1Z M41 29 h2 v1 h-2Z M46 29 h1 v1 h-1Z M4 30 h3 v1 h-3Z M9 30 h1 v1 h-1Z M12 30 h1 v1 h-1Z M14 30 h1 v1 h-1Z M16 30 h3 v1 h-3Z M21 30 h2 v1 h-2Z M26 30 h1 v1 h-1Z M29 30 h1 v1 h-1Z M33 30 h2 v1 h-2Z M36 30 h4 v1 h-4Z M41 30 h1 v1 h-1Z M43 30 h2 v1 h-2Z M48 30 h1 v1 h-1Z M5 31 h2 v1 h-2Z M8 31 h1 v1 h-1Z M11 31 h2 v1 h-2Z M14 31 h3 v1 h-3Z M18 31 h1 v1 h-1Z M20 31 h3 v1 h-3Z M24 31 h2 v1 h-2Z M27 31 h1 v1 h-1Z M32 31 h1 v1 h-1Z M34 31 h2 v1 h-2Z M38 31 h2 v1 h-2Z M41 31 h1 v1 h-1Z M46 31 h1 v1 h-1Z M4 32 h1 v1 h-1Z M6 32 h2 v1 h-2Z M11 32 h2 v1 h-2Z M14 32 h2 v1 h-2Z M17 32 h1 v1 h-1Z M19 32 h2 v1 h-2Z M22 32 h1 v1 h-1Z M25 32 h1 v1 h-1Z M30 32 h3 v1 h-3Z M35 32 h1 v1 h-1Z M37 32 h1 v1 h-1Z M42 32 h2 v1 h-2Z M46 32 h1 v1 h-1Z M48 32 h1 v1 h-1Z M6 33 h1 v1 h-1Z M8 33 h1 v1 h-1Z M11 33 h2 v1 h-2Z M15 33 h1 v1 h-1Z M18 33 h1 v1 h-1Z M20 33 h1 v1 h-1Z M22 33 h1 v1 h-1Z M25 33 h1 v1 h-1Z M27 33 h1 v1 h-1Z M29 33 h1 v1 h-1Z M32 33 h1 v1 h-1Z M34 33 h3 v1 h-3Z M39 33 h1 v1 h-1Z M45 33 h1 v1 h-1Z M47 33 h1 v1 h-1Z M4 34 h1 v1 h-1Z M11 34 h1 v1 h-1Z M13 34 h6 v1 h-6Z M21 34 h2 v1 h-2Z M24 34 h1 v1 h-1Z M26 34 h2 v1 h-2Z M29 34 h2 v1 h-2Z M32 34 h1 v1 h-1Z M34 34 h2 v1 h-2Z M40 34 h1 v1 h-1Z M42 34 h1 v1 h-1Z M44 34 h4 v1 h-4Z M5 35 h1 v1 h-1Z M7 35 h1 v1 h-1Z M11 35 h2 v1 h-2Z M15 35 h1 v1 h-1Z M21 35 h2 v1 h-2Z M28 35 h2 v1 h-2Z M31 35 h1 v1 h-1Z M38 35 h3 v1 h-3Z M45 35 h1 v1 h-1Z M47 35 h2 v1 h-2Z M4 36 h1 v1 h-1Z M7 36 h1 v1 h-1Z M11 36 h1 v1 h-1Z M13 36 h2 v1 h-2Z M16 36 h4 v1 h-4Z M21 36 h1 v1 h-1Z M25 36 h2 v1 h-2Z M29 36 h3 v1 h-3Z M34 36 h1 v1 h-1Z M36 36 h6 v1 h-6Z M44 36 h4 v1 h-4Z M4 37 h1 v1 h-1Z M7 37 h3 v1 h-3Z M12 37 h1 v1 h-1Z M15 37 h2 v1 h-2Z M21 37 h3 v1 h-3Z M25 37 h1 v1 h-1Z M28 37 h2 v1 h-2Z M31 37 h2 v1 h-2Z M34 37 h1 v1 h-1Z M37 37 h1 v1 h-1Z M40 37 h3 v1 h-3Z M44 37 h1 v1 h-1Z M48 37 h1 v1 h-1Z M20 38 h3 v1 h-3Z M26 38 h1 v1 h-1Z M31 38 h2 v1 h-2Z M36 38 h1 v1 h-1Z M39 38 h1 v1 h-1Z M41 38 h1 v1 h-1Z M46 38 h3 v1 h-3Z M12 39 h1 v1 h-1Z M16 39 h2 v1 h-2Z M23 39 h1 v1 h-1Z M27 39 h3 v1 h-3Z M31 39 h6 v1 h-6Z M38 39 h2 v1 h-2Z M41 39 h1 v1 h-1Z M44 39 h1 v1 h-1Z M48 39 h1 v1 h-1Z M11 40 h1 v1 h-1Z M16 40 h2 v1 h-2Z M19 40 h1 v1 h-1Z M23 40 h1 v1 h-1Z M29 40 h3 v1 h-3Z M35 40 h2 v1 h-2Z M45 40 h1 v1 h-1Z M48 40 h1 v1 h-1Z M18 41 h6 v1 h-6Z M29 41 h3 v1 h-3Z M33 41 h1 v1 h-1Z M36 41 h1 v1 h-1Z M38 41 h1 v1 h-1Z M47 41 h2 v1 h-2Z M14 42 h1 v1 h-1Z M17 42 h3 v1 h-3Z M22 42 h2 v1 h-2Z M35 42 h1 v1 h-1Z M38 42 h1 v1 h-1Z M45 42 h4 v1 h-4Z M13 43 h5 v1 h-5Z M23 43 h1 v1 h-1Z M29 43 h1 v1 h-1Z M31 43 h2 v1 h-2Z M34 43 h1 v1 h-1Z M36 43 h2 v1 h-2Z M39 43 h1 v1 h-1Z M47 43 h1 v1 h-1Z M15 44 h1 v1 h-1Z M17 44 h1 v1 h-1Z M19 44 h1 v1 h-1Z M23 44 h1 v1 h-1Z M31 44 h1 v1 h-1Z M35 44 h4 v1 h-4Z M47 44 h2 v1 h-2Z M16 45 h1 v1 h-1Z M18 45 h1 v1 h-1Z M21 45 h1 v1 h-1Z M24 45 h2 v1 h-2Z M31 45 h1 v1 h-1Z M33 45 h5 v1 h-5Z M39 45 h3 v1 h-3Z M15 46 h3 v1 h-3Z M19 46 h1 v1 h-1Z M21 46 h1 v1 h-1Z M23 46 h2 v1 h-2Z M26 46 h1 v1 h-1Z M28 46 h1 v1 h-1Z M31 46 h11 v1 h-11Z M44 46 h3 v1 h-3Z M48 46 h1 v1 h-1Z M14 47 h1 v1 h-1Z M16 47 h2 v1 h-2Z M19 47 h1 v1 h-1Z M21 47 h1 v1 h-1Z M26 47 h3 v1 h-3Z M32 47 h1 v1 h-1Z M35 47 h1 v1 h-1Z M38 47 h4 v1 h-4Z M45 47 h1 v1 h-1Z M47 47 h1 v1 h-1Z M18 48 h1 v1 h-1Z M21 48 h1 v1 h-1Z M23 48 h2 v1 h-2Z M28 48 h2 v1 h-2Z M35 48 h1 v1 h-1Z M39 48 h1 v1 h-1Z M41 48 h1 v1 h-1Z M44 48 h1 v1 h-1Z M47 48 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-1536 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M4 4 h7 v1 h-7Z M42 4 h7 v1 h-7Z M4 5 h1 v1 h-1Z M10 5 h1 v1 h-1Z M42 5 h1 v1 h-1Z M48 5 h1 v1 h-1Z M4 6 h1 v1 h-1Z M10 6 h1 v1 h-1Z M42 6 h1 v1 h-1Z M48 6 h1 v1 h-1Z M4 7 h1 v1 h-1Z M10 7 h1 v1 h-1Z M42 7 h1 v1 h-1Z M48 7 h1 v1 h-1Z M4 8 h1 v1 h-1Z M10 8 h1 v1 h-1Z M42 8 h1 v1 h-1Z M48 8 h1 v1 h-1Z M4 9 h1 v1 h-1Z M10 9 h1 v1 h-1Z M42 9 h1 v1 h-1Z M48 9 h1 v1 h-1Z M4 10 h7 v1 h-7Z M42 10 h7 v1 h-7Z M4 42 h7 v1 h-7Z M4 43 h1 v1 h-1Z M10 43 h1 v1 h-1Z M4 44 h1 v1 h-1Z M10 44 h1 v1 h-1Z M4 45 h1 v1 h-1Z M10 45 h1 v1 h-1Z M4 46 h1 v1 h-1Z M10 46 h1 v1 h-1Z M4 47 h1 v1 h-1Z M10 47 h1 v1 h-1Z M4 48 h7 v1 h-7Z \" /\u003e\u003cpath class=\"qr-2560 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M24 8 h5 v1 h-5Z M24 9 h1 v1 h-1Z M28 9 h1 v1 h-1Z M24 10 h1 v1 h-1Z M26 10 h1 v1 h-1Z M28 10 h1 v1 h-1Z M24 11 h1 v1 h-1Z M28 11 h1 v1 h-1Z M24 12 h5 v1 h-5Z M8 24 h5 v1 h-5Z M24 24 h5 v1 h-5Z M40 24 h5 v1 h-5Z M8 25 h1 v1 h-1Z M12 25 h1 v1 h-1Z M24 25 h1 v1 h-1Z M28 25 h1 v1 h-1Z M40 25 h1 v1 h-1Z M44 25 h1 v1 h-1Z M8 26 h1 v1 h-1Z M10 26 h1 v1 h-1Z M12 26 h1 v1 h-1Z M24 26 h1 v1 h-1Z M26 26 h1 v1 h-1Z M28 26 h1 v1 h-1Z M40 26 h1 v1 h-1Z M42 26 h1 v1 h-1Z M44 26 h1 v1 h-1Z M8 27 h1 v1 h-1Z M12 27 h1 v1 h-1Z M24 27 h1 v1 h-1Z M28 27 h1 v1 h-1Z M40 27 h1 v1 h-1Z M44 27 h1 v1 h-1Z M8 28 h5 v1 h-5Z M24 28 h5 v1 h-5Z M40 28 h5 v1 h-5Z M24 40 h5 v1 h-5Z M40 40 h5 v1 h-5Z M24 41 h1 v1 h-1Z M28 41 h1 v1 h-1Z M40 41 h1 v1 h-1Z M44 41 h1 v1 h-1Z M24 42 h1 v1 h-1Z M26 42 h1 v1 h-1Z M28 42 h1 v1 h-1Z M40 42 h1 v1 h-1Z M42 42 h1 v1 h-1Z M44 42 h1 v1 h-1Z M24 43 h1 v1 h-1Z M28 43 h1 v1 h-1Z M40 43 h1 v1 h-1Z M44 43 h1 v1 h-1Z M24 44 h5 v1 h-5Z M40 44 h5 v1 h-5Z \" /\u003e\u003cpath class=\"qr-3072 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 10 h1 v1 h-1Z M14 10 h1 v1 h-1Z M16 10 h1 v1 h-1Z M18 10 h1 v1 h-1Z M20 10 h1 v1 h-1Z M22 10 h1 v1 h-1Z M30 10 h1 v1 h-1Z M32 10 h1 v1 h-1Z M34 10 h1 v1 h-1Z M36 10 h1 v1 h-1Z M38 10 h1 v1 h-1Z M40 10 h1 v1 h-1Z M10 12 h1 v1 h-1Z M10 14 h1 v1 h-1Z M10 16 h1 v1 h-1Z M10 18 h1 v1 h-1Z M10 20 h1 v1 h-1Z M10 22 h1 v1 h-1Z M10 30 h1 v1 h-1Z M10 32 h1 v1 h-1Z M10 34 h1 v1 h-1Z M10 36 h1 v1 h-1Z M10 38 h1 v1 h-1Z M10 40 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-3584 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M12 4 h1 v1 h-1Z M12 7 h1 v1 h-1Z M6 12 h1 v1 h-1Z M8 12 h2 v1 h-2Z M12 12 h1 v1 h-1Z M41 12 h1 v1 h-1Z M45 12 h1 v1 h-1Z M48 12 h1 v1 h-1Z M12 43 h1 v1 h-1Z M12 44 h1 v1 h-1Z M12 46 h1 v1 h-1Z \" /\u003e\u003cpath class=\"qr-4096 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M40 4 h1 v1 h-1Z M39 5 h1 v1 h-1Z M39 6 h1 v1 h-1Z M39 7 h2 v1 h-2Z M38 8 h3 v1 h-3Z M8 38 h1 v1 h-1Z M5 39 h4 v1 h-4Z M4 40 h1 v1 h-1Z M7 40 h2 v1 h-2Z \" /\u003e\u003cpath class=\"qr-5632 \" stroke=\"transparent\" fill=\"#000\" fill-opacity=\"1\" d=\"M6 6 h3 v1 h-3Z M44 6 h3 v1 h-3Z M6 7 h3 v1 h-3Z M44 7 h3 v1 h-3Z M6 8 h3 v1 h-3Z M44 8 h3 v1 h-3Z M6 44 h3 v1 h-3Z M6 45 h3 v1 h-3Z M6 46 h3 v1 h-3Z \" /\u003e\u003c/svg\u003e\n\n    \u003c/a\u003e\n    \u003cfigcaption aria-hidden=\"true\" class=\"hidden\" hidden\u003eUn soutien tipeee pour Stéphane HUC\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\n\u003ch2 id=\"qui\"\u003eQui\u003c/h2\u003e\n\u003ch3 id=\"2020\"\u003e2020\u003c/h3\u003e\n\u003cp\u003e⇒ Au mois d\u0026rsquo;Octobre :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e@scorpus\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2022\"\u003e2022\u003c/h3\u003e\n\u003cp\u003e⇒ Au mois de Novembre :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun certain @Cascador\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"quoi\"\u003eQuoi\u003c/h2\u003e\n\u003ch3 id=\"2020-1\"\u003e2020\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eL\u0026rsquo;équivalent d\u0026rsquo;une \u003cstrong\u003etrappiste rochefort 10\u003c/strong\u003e : 5 €\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"2022-1\"\u003e2022\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e5 dizaines de roros\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Informations à-propos des dons",
            "tags": ["Don"],
            "date_published": "2020-02-21T19:59:41+01:00",
            "date_modified": "2024-02-12T12:45:22+01:00"
        },{
            "id": "urn:uuid:550a5455-57ff-68dc-c071-49957089f060",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openwrt/about/",
            "title": "OpenWRT : Présentation du projet",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenWRT est un système d\u0026rsquo;exploitation GNU/Linux ciblant les périphériques embarqués (typiquement des routeurs sans fils).\nCe n\u0026rsquo;est pas un projet monolitique , bien au contraire, c\u0026rsquo;est plus un framework fournissant les outils logiciels nécessaires afin de fournir un système de fichiers complet, de permettre la création de micrologiciels (en anglais : firmware) selon le matériel et tout autour une distribution complète qui permet à l\u0026rsquo;administrateur/utilisateur de la configurer \u0026ldquo;aux petits oignons\u0026rdquo; permettant différents usages utiles.\nOpenWRT : v19.07.x\nLe shell est le ash du projet Busybox.\nL\u0026rsquo;éditeur par défaut est vi - si vous n\u0026rsquo;aimez pas, il est possible d\u0026rsquo;en installer d\u0026rsquo;autres, tel nano.\nLes fichiers de configuration se trouvent généralement dans /etc/config/ et portent le nom du service à configurer.\nLes services sont fonctionnels à partir du répertoire /etc/init.d/ et portent le nom du service ; ils ont pour options les classiques :\ndisable : désactiver un service - il ne redémarrera pas lors d\u0026rsquo;un (re)démarrage du routeur, enable : activer un service - permet le démarrage du service lors du (re)démarrage du routeur, reload : recharge la configuration du service, restart : redémarre le service, start : démarre le service, stop : arrête le service. Installation Gestionnaire de paquets Le gestionnaire de paquets est opkg est intégré de base dans le système ; hormis la mise-à-jour \u0026#39;one-shot\u0026#39; de plusieurs paquets , il a pour propos les différentes possibilités de gestion des paquets, à savoir installation, configuration, suppression de paquets… pour en savoir plus : $ opkg ?\nSi vous avez installé l\u0026rsquo;interface d\u0026rsquo;administration LuCI, il est possible de gérer les paquets par le biais du menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Software\u0026rsquo;.\nInstall: LuCI LuCI est l\u0026rsquo;interface web d\u0026rsquo;administration. Par défaut, elle n\u0026rsquo;est fonctionnelle que sur le protocole HTTP (HyperText Transfer Protocol) .\nInstallez le paquet avec le gestionnaire de paquets.\n# opkg install luci\nL\u0026rsquo;installation de LuCI installe plusieurs paquets, dont un serveur web minimaliste nommé uhttpd, le thème basé sur Bootstrap, et les dépendances nécessaires pour la gestion de l\u0026rsquo;administration (gestion des différents protocoles réseaux, du parefeu, etc.).\nPour installer la version supportant HTTPS (HyperText Transfer Protocol Secure) - ce qui est préférable -, ce sera :\n# opkg install luci-ssl\nAttentionATTENTION : vous devez impérativement avoir une ROM Flash ≥ 8 Mo ! Install: Langue FR Il est possible d\u0026rsquo;installer la langue française au besoin.\nRetrouvez les différents paquets linguistiques :\nen mode console : # opkg list | grep -E \u0026quot;luci-i18n-(.*)-fr\u0026quot; à-travers l\u0026rsquo;interface d\u0026rsquo;administration : menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Software\u0026rsquo; puis dans le champ \u0026lsquo;Filter\u0026rsquo;, écrivez \u0026ldquo;luci-i18n-\u0026rdquo;. N\u0026rsquo;installez pas tous les paquets disponibles, mais seuls ceux qui vous sont vraiment nécessaires, tels - peut-être - :\nluci-i18n-base-fr pour l\u0026rsquo;interface de base de LuCI. luci-i18n-firewall-fr pour la partie parefeu Configuration root La première ET la plus importante des premières modifications à faire est de changer le mot de passe de l\u0026rsquo;admin.\nen mode console, grâce à la commande passwd par l\u0026rsquo;interface d\u0026rsquo;administration LuCI - si elle est installée - : menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Administration\u0026rsquo;, onglet \u0026lsquo;Router Password\u0026rsquo; - onglet par défaut. OpenWRT :: Administration Système : Mot de Pass Root AttentionIl est fortement recommandé d\u0026rsquo;éviter la connexion SSH pour root, prenez le temps de configurer un nouvel utilisateur\net de lui donner les droits pour assumer correctement l\u0026rsquo;administration.\nRéseaux La configuration des ports se fait, soit depuis : le fichier /etc/config/network, l\u0026rsquo;interface d\u0026rsquo;administration LuCI, menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;Interfaces\u0026rsquo;. Par défaut sont configurées les interfaces :\nLAN en mode bridge, WAN et WAN6 De plus, il est configuré deux VLAN (Virtual Local Area Network) , à partir du menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;Switch\u0026rsquo;, pour séparer logiciellement le LAN (Local Area Network) du WAN (World Area Network) .\nLe service est accessible via : /etc/init.d/network. AstuceIl peut être intéressant de basculer LAN sur le port 0 et WAN sur le port 4 . Parefeu La configuration du parefeu se fait, soit depuis : le fichier /etc/config/firewall, l\u0026rsquo;interface d\u0026rsquo;administration LuCI, menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;Firewall\u0026rsquo;. Il est possible d\u0026rsquo;écrire directement des règles iptables à partir de l\u0026rsquo;onglet \u0026lsquo;Custom Rules\u0026rsquo;. Son fichier se trouve être /etc/firewall.user. C\u0026rsquo;est seulement dans celui-ci où peut s\u0026rsquo;écrire directement des règles iptables ou ip6tables.\nLe service est accessible via : /etc/init.d/firewall. dhcpd Le serveur DHCP (Dynamic Host Control Protocol) est dnsmasq, un serveur léger qui fait aussi office de résolveur DNS (Domain Name Service) Relais (en anglais : DNS Forwarder) et fait partie du système de base. La pile IPv6 est assurée par le serveur odhcpd.\nLa configuration du serveur dnsmasq peut se faire, soit par: le fichier /etc/config/dhcp l\u0026rsquo;interface d\u0026rsquo;administration LuCI, menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;DHCP and DNS\u0026rsquo;. Les services dnsmasq et odhcpd sont accessibles à partir du même répertoire d\u0026rsquo;initialisation /etc/init.d. Les fichiers d\u0026rsquo;enregistrement des baux DHCP sont, pour : dnsmasq : /tmp/dhcp.leases odhcpd : /tmp/hosts/odhcpd On ne peut fixer/enregistrer des baux DHCP au-travers de LuCI que pour IPv4.\nConfig: LuCI Le fichier de configuration de LuCI est : /etc/config/luci - évitez d'y toucher, à moins de savoir réellement ce que vous faîtes ! AstuceIl est recommandable de modifier l\u0026rsquo;accès à l\u0026rsquo;interface web, certainement par le biais d\u0026rsquo;un tunnel SSH … SSH C\u0026rsquo;est le serveur dropbear - un serveur SSH, seulement v2, léger - qui fait office, par défaut dans le système de base. Il gère très bien les clés à courbes elliptiques, tel ed25519.\nAstuceLa première chose à faire du côté de votre client est d\u0026rsquo;ajouter dans votre configuration sécurisée , le support de :\nCiphers aes256-ctr HostKeyAlgorithms ssh-rsa MACs hmac-sha2-256 Retrouvez les différents codes d\u0026rsquo;erreurs liés à la fin de cet article sur SSH .\nPar le biais de l\u0026rsquo;interface web d\u0026rsquo;administration LuCI, choisissez le menu \u0026lsquo;System \u0026gt; Administration\u0026rsquo;, puis l\u0026rsquo;onglet \u0026ldquo;SSH Access\u0026rdquo;. OpenWRT :: Administration Système : Accès SSH Puis paramétrez ainsi :\nInterface : choisissez lan Port : si vous laissez le port par défaut, pas besoin de le spécifier, sinon modifiez-le. Par mesure de sécurité : laissez non cochées, les trois autres options que sont \u0026lsquo;Password Authentication\u0026rsquo;, \u0026lsquo;Allow root logins with password\u0026rsquo; et \u0026lsquo;Gateway Ports\u0026rsquo;. Ainsi nous ne permettrons pas à l\u0026rsquo;identifiant root de se connecter, et à nul compte de pouvoir se connecter par mot-de-passe. Cela signifie qu\u0026rsquo;il faut ajouter une clé d\u0026rsquo;authentification SSH.\nAstuceLe seul moment où \u0026lsquo;Password Authentication\u0026rsquo; et \u0026lsquo;Allow root logins with password\u0026rsquo; seront autorisées, donc cochées, et le temps de définir un\nnouvel utilisateur … Si ce n\u0026rsquo;est pas déjà fait, c\u0026rsquo;est le moment de le faire !\nIl est aussi possible de créer un nouvel utilisateur SSH, en choisissant pour interface : \u0026lsquo;unspecified\u0026rsquo;, qui permettrait de créer ledit utilisateur…\nAstuceAppréciez cette méthode pour sécuriser LuCI. uhttpd Bien que léger, voire minimaliste uhttpd est LE serveur web, par défaut non installé sur le firmware initram, qui fait fonctionner l\u0026rsquo;interface web LuCI.\nLa configuration du serveur se fait via : /etc/config/uhttpd Le service est accessible via /etc/init.d/uhttpd AttentionPar défaut, le serveur uhttpd écoute sur toutes les interfaces, partout !\nPensez à minima, par principe de sécurité, à changer les lignes list listen_http pour cibler seulement l\u0026rsquo;adresse IP de votre LAN, tel que : list listen_http 192.168.1.1:80 - (bien sûr, si votre adresse IP est celle-là, sinon changez-la selon vos paramétrages) - idem, pour le port HTTPS, voire pour l\u0026rsquo;IPv6, si vous gérez !\nToujours par principe de sécurité, il est recommandé de le démarrer qu\u0026rsquo;en cas de besoin de configuration et de l\u0026rsquo;arrêter une fois terminée. C\u0026rsquo;est pourquoi, vous pouvez faire allégrement :\n# /etc/init.d/uhttpd disable ainsi il ne redémarrera pas lors de (re)démarrage du routeur. # /etc/init.d/uhttpd start et stop pour réciproquement le démarrer et l\u0026rsquo;arrêter au besoin. Avantage : Cela permet de libérer les ressources de puissance machine.\nCela sous-entend bien-sûr une connexion SSH active !\nRestauration La restauration d\u0026rsquo;une configuration précédente peut se faire par :\nl\u0026rsquo;interface d\u0026rsquo;administration, menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Backup / Flash Firmware\u0026rsquo; puis dans la section Restore soit vous cliquez sur le bouton : [ Perform reset ] qui aura pour propos de remettre à la configuration initiale du firmware - nécessite que celui-ci soit de type \u0026ldquo;squashfs\u0026rdquo; [ Upload archive… ] pour restaurer une configuration précédemment archivée. OpenWRT :: Administration Système : Restauration Sauvegarde La sauvegarde de toutes configurations du routeur peut se faire par :\nl\u0026rsquo;interface d\u0026rsquo;administration, menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Backup / Flash Firmware\u0026rsquo; puis dans la section Backup cliquez sur le bouton [ Generate archive ]. OpenWRT :: Administration Système : Sauvegarde Upgrade La mise à jour du firmware peut se faire :\nen mode console - ce qui semble préférable - par le biais de la commande sysupgrade après avoir téléchargé le firmware adéquat. par l\u0026rsquo;interface d\u0026rsquo;administration, menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Backup / Flash Firmware\u0026rsquo; puis dans la section Flash new firmware image cliquez sur le bouton [ Flash image ]. OpenWRT :: Administration Système : Mise à jour Firmware AttentionIl faut être conscient que lors de la mise à jour du firmware, toute configuration personnalisée hors système sera purgée.\nMieux vaut suivre ce processus de sauvegarde correcte :\nOpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)\nDocumentation Le wiki du projet OpenWRT : https://openwrt.org/ ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenWRT\u003c/strong\u003e est un système d\u0026rsquo;exploitation GNU/Linux ciblant les périphériques\nembarqués \u003cem\u003e(typiquement des routeurs sans fils)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eCe n\u0026rsquo;est pas un projet monolitique , bien au contraire, c\u0026rsquo;est plus un framework\nfournissant les outils logiciels nécessaires afin de fournir un système de fichiers\ncomplet, de permettre la création de micrologiciels \u003cem\u003e(en anglais : firmware)\u003c/em\u003e\nselon le matériel et tout autour une distribution complète qui permet à\nl\u0026rsquo;administrateur/utilisateur de la configurer \u0026ldquo;aux petits oignons\u0026rdquo; permettant\ndifférents usages utiles.\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOpenWRT : \u003cstrong\u003ev19.07.x\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe shell est le \u003cstrong\u003eash\u003c/strong\u003e du projet \u003cstrong\u003e\u003ca href=\"https://www.busybox.net/BusyBox.html\" rel=\"external\"\u003eBusybox\u003c/a\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;éditeur par défaut est \u003ccode\u003evi\u003c/code\u003e - \u003cem\u003esi vous n\u0026rsquo;aimez pas, il est possible d\u0026rsquo;en\n\u003ca href=\"/fr/sys/openwrt/about/#gestionnaire-de-paquets\"\u003einstaller\u003c/a\u003e d\u0026rsquo;autres, tel \u003ccode\u003enano\u003c/code\u003e.\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes fichiers de configuration se trouvent généralement dans \u003ccode\u003e/etc/config/\u003c/code\u003e et\nportent le nom du service à configurer.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes services sont fonctionnels à partir du répertoire \u003ccode\u003e/etc/init.d/\u003c/code\u003e et portent\nle nom du service ; ils ont pour options les classiques :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edisable\u003c/code\u003e : désactiver un service - il ne redémarrera pas lors d\u0026rsquo;un\n(re)démarrage du routeur,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eenable\u003c/code\u003e : activer un service - permet le démarrage du service lors du\n(re)démarrage du routeur,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ereload\u003c/code\u003e : recharge la configuration du service,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erestart\u003c/code\u003e : redémarre le service,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estart\u003c/code\u003e : démarre le service,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estop\u003c/code\u003e : arrête le service.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003ch3 id=\"gestionnaire-de-paquets\"\u003eGestionnaire de paquets\u003c/h3\u003e\n\u003cp\u003eLe gestionnaire de paquets est \u003ccode\u003eopkg\u003c/code\u003e est intégré de base dans le système ;\nhormis la \n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/opkg-upgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : opkg upgrade (astuce)'\"\u003emise-à-jour \u0026#39;one-shot\u0026#39; de plusieurs paquets\u003c/a\u003e\n,\nil a pour propos les différentes possibilités de gestion des paquets, à savoir\ninstallation, configuration, suppression de paquets… \u003cbr\u003e\npour en savoir plus : \u003ccode\u003e$ opkg ?\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi vous avez \u003ca href=\"/fr/sys/openwrt/about/#install-luci\"\u003einstallé l\u0026rsquo;interface d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e\u003c/a\u003e,\nil est possible de gérer les paquets par le biais du menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Software\u0026rsquo;.\u003c/p\u003e\n\u003ch3 id=\"install-luci\"\u003eInstall: LuCI\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eLuCI\u003c/strong\u003e est l\u0026rsquo;interface web d\u0026rsquo;administration. Par défaut, elle n\u0026rsquo;est fonctionnelle\nque sur le protocole \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eHTTP \u003cem\u003e(HyperText Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003eInstallez le paquet avec le gestionnaire de paquets.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# opkg install luci\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;installation de \u003cstrong\u003eLuCI\u003c/strong\u003e installe plusieurs paquets, dont un serveur web\nminimaliste nommé \u003cstrong\u003e\u003ca href=\"/fr/sys/openwrt/about/#uhttpd\"\u003euhttpd\u003c/a\u003e\u003c/strong\u003e, le thème basé sur \u003cstrong\u003e\u003ca href=\"https://getbootstrap.com/\" rel=\"external\"\u003eBootstrap\u003c/a\u003e\u003c/strong\u003e,\net les dépendances nécessaires pour la gestion de l\u0026rsquo;administration (gestion des\ndifférents protocoles réseaux, du parefeu, etc.).\u003c/p\u003e\n\u003cp\u003ePour installer la version supportant \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eHTTPS \u003cem\u003e(HyperText Transfer Protocol Secure)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n -\n\u003cem\u003ece qui est préférable\u003c/em\u003e -, ce sera :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# opkg install luci-ssl\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION : vous devez impérativement avoir une ROM Flash ≥ 8 Mo !\u003c/div\u003e\n\n\u003ch4 id=\"install-langue-fr\"\u003eInstall: Langue FR\u003c/h4\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;installer la langue française au besoin.\u003c/p\u003e\n\u003cp\u003eRetrouvez les différents paquets linguistiques :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003een mode console : \u003ccode\u003e# opkg list | grep -E \u0026quot;luci-i18n-(.*)-fr\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eà-travers l\u0026rsquo;interface d\u0026rsquo;administration : menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Software\u0026rsquo; puis dans\nle champ \u0026lsquo;Filter\u0026rsquo;, écrivez \u0026ldquo;luci-i18n-\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eN\u0026rsquo;installez pas tous les paquets disponibles, mais seuls ceux qui vous sont vraiment\nnécessaires, tels \u003cem\u003e- peut-être -\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eluci-i18n-base-fr\u003c/code\u003e pour l\u0026rsquo;interface de base de LuCI.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eluci-i18n-firewall-fr\u003c/code\u003e pour la partie parefeu\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"root\"\u003eroot\u003c/h3\u003e\n\u003cp\u003eLa première ET la plus importante des premières modifications à faire est de changer\nle mot de passe de l\u0026rsquo;admin.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003een mode console, grâce à la commande \u003ccode\u003epasswd\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epar l\u0026rsquo;interface d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e - \u003cem\u003esi elle est installée\u003c/em\u003e - :\nmenu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Administration\u0026rsquo;, onglet \u0026lsquo;Router Password\u0026rsquo; - \u003cem\u003eonglet par défaut\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"row justify-content-center align-items-center\"\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openwrt/System-Administration-SSH-Router-Password-min.png\" title=\"OpenWRT :: Administration Système : Mot de Pass Root\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openwrt/System-Administration-SSH-Router-Password-min_hu_ecae989021bc8ca.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"OpenWRT :: Administration Système : Mot de Pass Root\" height=\"76\" loading=\"lazy\" src=\"/images/openwrt/System-Administration-SSH-Router-Password-min_hu_287fa69ea70bd52d.png\" type=\"image/png\" width=\"256\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eOpenWRT :: Administration Système : Mot de Pass Root\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl est fortement recommandé d\u0026rsquo;éviter la connexion \u003ca href=\"/fr/sys/openwrt/about/#ssh\"\u003eSSH\u003c/a\u003e pour root, prenez\nle temps de\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/sudo/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : sudo'\"\u003econfigurer un nouvel utilisateur\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eet de lui donner les droits pour assumer correctement l\u0026rsquo;administration.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"réseaux\"\u003eRéseaux\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLa configuration des ports se fait, soit depuis :\n\u003cul\u003e\n\u003cli\u003ele fichier \u003ccode\u003e/etc/config/network\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;interface d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e, menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;Interfaces\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePar défaut sont configurées les interfaces :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eLAN\u003c/strong\u003e en mode bridge,\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWAN\u003c/strong\u003e et \u003cstrong\u003eWAN6\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDe plus, il est configuré deux \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eVLAN \u003cem\u003e(Virtual Local Area Network)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n, à partir du menu \u0026lsquo;Network\u0026rsquo; \u0026gt;\n\u0026lsquo;Switch\u0026rsquo;, pour séparer logiciellement le \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eLAN \u003cem\u003e(Local Area Network)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eWAN \u003cem\u003e(World Area Network)\u003c/em\u003e\u003c/span\u003e\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLe service est accessible via : \u003ccode\u003e/etc/init.d/network\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eIl peut être intéressant de\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/switch-lan-wan/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT: Switch LAN WAN (astuce)'\"\u003ebasculer LAN sur le port 0 et WAN sur le port 4\u003c/a\u003e\n.\u003c/div\u003e\n\n\u003ch3 id=\"parefeu\"\u003eParefeu\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLa configuration du parefeu se fait, soit depuis :\n\u003cul\u003e\n\u003cli\u003ele fichier \u003ccode\u003e/etc/config/firewall\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;interface d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e, menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;Firewall\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;écrire directement des règles \u003cstrong\u003eiptables\u003c/strong\u003e à partir de l\u0026rsquo;onglet\n\u0026lsquo;Custom Rules\u0026rsquo;. \u003cbr\u003e\nSon fichier se trouve être  \u003ccode\u003e/etc/firewall.user\u003c/code\u003e. C\u0026rsquo;est seulement dans celui-ci\noù peut s\u0026rsquo;écrire directement des règles \u003cstrong\u003eiptables\u003c/strong\u003e ou \u003cstrong\u003eip6tables\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLe service est accessible via : \u003ccode\u003e/etc/init.d/firewall\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dhcpd\"\u003edhcpd\u003c/h3\u003e\n\u003cp\u003eLe serveur \n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDHCP \u003cem\u003e(Dynamic Host Control Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est \u003cstrong\u003ednsmasq\u003c/strong\u003e, un serveur léger qui fait aussi\noffice de résolveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eDNS \u003cem\u003e(Domain Name Service)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Relais \u003cem\u003e(en anglais : DNS Forwarder)\u003c/em\u003e et\nfait partie du système de base. La pile IPv6 est assurée par le serveur \u003cstrong\u003eodhcpd\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa configuration du serveur \u003cstrong\u003ednsmasq\u003c/strong\u003e peut se faire, soit par:\n\u003cul\u003e\n\u003cli\u003ele fichier \u003ccode\u003e/etc/config/dhcp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;interface d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e, menu \u0026lsquo;Network\u0026rsquo; \u0026gt; \u0026lsquo;DHCP and DNS\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLes services \u003ccode\u003ednsmasq\u003c/code\u003e et \u003ccode\u003eodhcpd\u003c/code\u003e sont accessibles à partir du même répertoire\nd\u0026rsquo;initialisation \u003ccode\u003e/etc/init.d\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eLes fichiers d\u0026rsquo;enregistrement des baux DHCP sont, pour :\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ednsmasq\u003c/strong\u003e : \u003ccode\u003e/tmp/dhcp.leases\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eodhcpd\u003c/strong\u003e : \u003ccode\u003e/tmp/hosts/odhcpd\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eOn ne peut fixer/enregistrer des baux DHCP au-travers de LuCI que pour IPv4.\u003c/p\u003e\n\u003ch3 id=\"config-luci\"\u003eConfig: LuCI\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration de \u003cstrong\u003eLuCI\u003c/strong\u003e est : \u003ccode\u003e/etc/config/luci\u003c/code\u003e -\n\u003cspan class=\"red\"\u003eévitez d'y toucher, à moins de savoir réellement ce que vous\nfaîtes !\u003c/span\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eIl est recommandable de modifier l\u0026rsquo;accès à l\u0026rsquo;interface web, certainement\npar le biais d\u0026rsquo;un tunnel\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/ssh/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eSSH\u003c/a\u003e\n…\u003c/div\u003e\n\n\u003ch3 id=\"ssh\"\u003eSSH\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est le serveur \u003cstrong\u003edropbear\u003c/strong\u003e - un serveur SSH, seulement v2, léger - qui fait\noffice, par défaut dans le système de base.\nIl gère très bien les clés à courbes elliptiques, tel ed25519.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eLa première chose à faire du côté de votre client est d\u0026rsquo;ajouter dans\nvotre \u003ca class=\"inside\" href=\"/fr/sec/ssh/configuration-securisee/#message-authentication-codes\" title=\"Lien interne vers l\u0026#39;article : 'SSH : Configuration Sécurisée'\"\u003econfiguration sécurisée\u003c/a\u003e\n,\nle support de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eCiphers aes256-ctr\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHostKeyAlgorithms ssh-rsa\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMACs hmac-sha2-256\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRetrouvez les \u003ca class=\"inside\" href=\"/fr/sys/openwrt/ssh-tunnel/#d%c3%a9pannage\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Tunnel SSH pour LuCI'\"\u003edifférents codes d\u0026rsquo;erreurs liés à la fin de cet article sur SSH\u003c/a\u003e\n.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003ePar le biais de l\u0026rsquo;interface web d\u0026rsquo;administration \u003cstrong\u003eLuCI\u003c/strong\u003e, choisissez le menu\n\u0026lsquo;System \u0026gt; Administration\u0026rsquo;, puis l\u0026rsquo;onglet \u0026ldquo;SSH Access\u0026rdquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"row justify-content-center align-items-center\"\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openwrt/System-Administration-SSH-Access-min.png\" title=\"OpenWRT :: Administration Système : Accès SSH\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openwrt/System-Administration-SSH-Access-min_hu_ce0ba6881e70fd84.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"OpenWRT :: Administration Système : Accès SSH\" height=\"166\" loading=\"lazy\" src=\"/images/openwrt/System-Administration-SSH-Access-min_hu_bdf0307b55062d5c.png\" type=\"image/png\" width=\"256\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eOpenWRT :: Administration Système : Accès SSH\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\u003cp\u003ePuis paramétrez ainsi :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eInterface : choisissez lan\u003c/li\u003e\n\u003cli\u003ePort : si vous laissez le port par défaut, pas besoin de le spécifier, sinon\nmodifiez-le.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePar mesure de sécurité : laissez non cochées, les trois autres options que sont\n\u0026lsquo;Password Authentication\u0026rsquo;, \u0026lsquo;Allow root logins with password\u0026rsquo; et \u0026lsquo;Gateway Ports\u0026rsquo;.\nAinsi nous ne permettrons pas à l\u0026rsquo;identifiant \u003cstrong\u003eroot\u003c/strong\u003e de se connecter, et à\nnul compte de pouvoir se connecter par mot-de-passe.\nCela signifie qu\u0026rsquo;il faut ajouter une clé d\u0026rsquo;authentification SSH.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eLe seul moment où \u0026lsquo;Password Authentication\u0026rsquo; et \u0026lsquo;Allow root logins with password\u0026rsquo;\nseront autorisées, donc cochées, et le temps de définir un\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openwrt/sudo/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : sudo'\"\u003enouvel utilisateur\u003c/a\u003e\n… \u003cbr\u003e\n\u003cstrong\u003eSi ce n\u0026rsquo;est pas déjà fait, c\u0026rsquo;est le moment de le faire !\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl est aussi possible de créer un nouvel utilisateur SSH, en choisissant pour\ninterface : \u0026lsquo;unspecified\u0026rsquo;,\nqui permettrait de créer ledit utilisateur…\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eAppréciez cette\n\u003ca class=\"inside\" href=\"/fr/sys/openwrt/ssh-tunnel/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Tunnel SSH pour LuCI'\"\u003eméthode\u003c/a\u003e\npour sécuriser\nLuCI.\u003c/div\u003e\n\n\u003ch3 id=\"uhttpd\"\u003euhttpd\u003c/h3\u003e\n\u003cp\u003eBien que léger, voire minimaliste \u003cstrong\u003euhttpd\u003c/strong\u003e est LE serveur web, \u003cem\u003epar défaut non\ninstallé sur le firmware initram\u003c/em\u003e, qui fait fonctionner l\u0026rsquo;interface web\n\u003cstrong\u003e\u003ca href=\"/fr/sys/openwrt/about/#install-luci\"\u003eLuCI\u003c/a\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa configuration du serveur se fait via : \u003ccode\u003e/etc/config/uhttpd\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLe service est accessible via \u003ccode\u003e/etc/init.d/uhttpd\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003ePar défaut, le serveur \u003cstrong\u003euhttpd\u003c/strong\u003e écoute sur toutes les interfaces, partout !\u003c/p\u003e\n\u003cp\u003ePensez à minima, par principe de sécurité, à changer les lignes \u003ccode\u003elist listen_http\u003c/code\u003e\npour cibler seulement l\u0026rsquo;adresse IP de votre LAN, tel que : \u003cbr\u003e\n\u003ccode\u003elist listen_http 192.168.1.1:80\u003c/code\u003e - \u003cem\u003e(bien sûr, si votre adresse IP est celle-là,\nsinon changez-la selon vos paramétrages)\u003c/em\u003e - \u003cbr\u003e\nidem, pour le port HTTPS, voire pour l\u0026rsquo;IPv6, si vous gérez !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eToujours par principe de sécurité, il est recommandé de le démarrer qu\u0026rsquo;en cas\nde besoin de configuration et de l\u0026rsquo;arrêter une fois terminée. C\u0026rsquo;est pourquoi,\nvous pouvez faire allégrement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e# /etc/init.d/uhttpd disable\u003c/code\u003e ainsi il ne redémarrera pas lors de\n(re)démarrage du routeur.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e# /etc/init.d/uhttpd start\u003c/code\u003e et \u003ccode\u003estop\u003c/code\u003e pour réciproquement le démarrer et\nl\u0026rsquo;arrêter au besoin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAvantage : Cela permet de libérer les ressources de puissance machine.\u003c/p\u003e\n\u003cp\u003eCela sous-entend bien-sûr une connexion \u003ca href=\"/fr/sys/openwrt/about/#ssh\"\u003eSSH\u003c/a\u003e active !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"restauration\"\u003eRestauration\u003c/h3\u003e\n\u003cp\u003eLa restauration d\u0026rsquo;une configuration précédente peut se faire par :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;interface d\u0026rsquo;administration, menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Backup / Flash Firmware\u0026rsquo; puis\ndans la section \u003cstrong\u003eRestore\u003c/strong\u003e soit vous cliquez sur le bouton :\n\u003cul\u003e\n\u003cli\u003e[ Perform reset ] qui aura pour propos de remettre à la configuration\ninitiale du firmware - \u003cstrong\u003enécessite que celui-ci soit de type \u0026ldquo;squashfs\u0026rdquo;\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e[ Upload archive… ] pour restaurer une configuration précédemment archivée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"row justify-content-center align-items-center\"\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openwrt/System-Administration-Flash-Restore-min.png\" title=\"OpenWRT :: Administration Système : Restauration\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openwrt/System-Administration-Flash-Restore-min_hu_15b21f2bdfc6ac81.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"OpenWRT :: Administration Système : Restauration\" height=\"52\" loading=\"lazy\" src=\"/images/openwrt/System-Administration-Flash-Restore-min_hu_489f65747e61dba6.png\" type=\"image/png\" width=\"256\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eOpenWRT :: Administration Système : Restauration\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\u003ch3 id=\"sauvegarde\"\u003eSauvegarde\u003c/h3\u003e\n\u003cp\u003eLa sauvegarde de toutes configurations du routeur peut se faire par :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;interface d\u0026rsquo;administration, menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Backup / Flash Firmware\u0026rsquo; puis\ndans la section \u003cstrong\u003eBackup\u003c/strong\u003e cliquez sur le bouton [ Generate archive ].\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"row justify-content-center align-items-center\"\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openwrt/System-Administration-Flash-Backup-min.png\" title=\"OpenWRT :: Administration Système : Sauvegarde\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openwrt/System-Administration-Flash-Backup-min_hu_5f355f13b8336c8d.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"OpenWRT :: Administration Système : Sauvegarde\" height=\"45\" loading=\"lazy\" src=\"/images/openwrt/System-Administration-Flash-Backup-min_hu_70f8400468b45383.png\" type=\"image/png\" width=\"256\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eOpenWRT :: Administration Système : Sauvegarde\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\u003ch3 id=\"upgrade\"\u003eUpgrade\u003c/h3\u003e\n\u003cp\u003eLa mise à jour du firmware peut se faire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003een mode console - \u003cstrong\u003ece qui semble préférable\u003c/strong\u003e - par le biais de la commande\n\u003ccode\u003esysupgrade\u003c/code\u003e après avoir téléchargé le firmware adéquat.\u003c/li\u003e\n\u003cli\u003epar l\u0026rsquo;interface d\u0026rsquo;administration, menu \u0026lsquo;System\u0026rsquo; \u0026gt; \u0026lsquo;Backup / Flash Firmware\u0026rsquo; puis\ndans la section \u003cstrong\u003eFlash new firmware image\u003c/strong\u003e cliquez sur le bouton [ Flash image ].\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"row justify-content-center align-items-center\"\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/openwrt/System-Administration-Flash-Firmware-min.png\" title=\"OpenWRT :: Administration Système : Mise à jour Firmware\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openwrt/System-Administration-Flash-Firmware-min_hu_93624c47bb312f28.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"OpenWRT :: Administration Système : Mise à jour Firmware\" height=\"49\" loading=\"lazy\" src=\"/images/openwrt/System-Administration-Flash-Firmware-min_hu_44d5261862970bef.png\" type=\"image/png\" width=\"256\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eOpenWRT :: Administration Système : Mise à jour Firmware\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl faut être conscient que lors de la mise à jour du firmware, toute\nconfiguration personnalisée hors système sera purgée.\u003c/p\u003e\n\u003cp\u003eMieux vaut suivre ce processus de sauvegarde correcte :\u003c/p\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openwrt/sysupgrade/\" title=\"Lien interne vers l\u0026#39;article : 'OpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)'\"\u003eOpenWRT : Gérer correctement le processus de mise à niveau (sysupgrade)\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe wiki du projet OpenWRT : \u003ca href=\"https://openwrt.org/\" rel=\"external\"\u003ehttps://openwrt.org/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n",
            "summary": "Présentation du projet OpenWRT",
            "tags": ["OpenWRT"],
            "date_published": "2020-02-20T21:37:23+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:91eecf8d-610b-dd02-5f48-f36c567cf09c",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-fr-lang/",
            "title": "Configurer la langue Française / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Avoir les applications en français À configurer dans votre fichier ~/.profile, normalement, seule LC_MESSAGES est nécessaire :\nexport LC_MESSAGES=\u0026quot;fr\u0026quot;\nOn peut au besoin configurer également les autres variables d\u0026rsquo;environnement LC_*, tel que:\nexport LC_CTYPE=\u0026#34;fr_FR.UTF-8\u0026#34; export LC_MESSAGES=\u0026#34;fr\u0026#34; export LC_NUMERIC=C Il est possible de l\u0026rsquo;écrire légèrement différemment :\nLC_CTYPE=\u0026#34;fr_FR.UTF-8\u0026#34; LC_MESSAGES=\u0026#34;fr\u0026#34; LC_ALL=\u0026#34;fr_FR.UTF-8\u0026#34; export LC_CTYPE LC_MESSAGES LC_ALL Dictionnaires Il est possible d\u0026rsquo;ajouter aussi les dictionnaires aspell-fr et ispell-xyz-french (xyz est le numéro de la version en cours…) :\nPuis mettre le français par défaut avec :\n# /usr/local/bin/ispell-config Il est possible d\u0026rsquo;y ajouter aussi les dictionnaires aspell et ispell !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"avoir-les-applications-en-français\"\u003eAvoir les applications en français\u003c/h2\u003e\n\u003cp\u003eÀ configurer dans votre fichier \u003ccode\u003e~/.profile\u003c/code\u003e, normalement, seule\n\u003ccode\u003eLC_MESSAGES\u003c/code\u003e est nécessaire :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eexport LC_MESSAGES=\u0026quot;fr\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eOn peut au besoin  configurer également les autres variables\nd\u0026rsquo;environnement \u003ccode\u003eLC_*\u003c/code\u003e, tel que:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport LC_CTYPE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr_FR.UTF-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport LC_MESSAGES\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport LC_NUMERIC\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eC\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est possible de l\u0026rsquo;écrire légèrement différemment :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLC_CTYPE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr_FR.UTF-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLC_MESSAGES\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eLC_ALL\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;fr_FR.UTF-8\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eexport LC_CTYPE LC_MESSAGES LC_ALL\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"dictionnaires\"\u003eDictionnaires\u003c/h2\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#ajouter\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eajouter\u003c/a\u003e\n\naussi les dictionnaires \u003cstrong\u003easpell-fr\u003c/strong\u003e et \u003cstrong\u003eispell-\u003cem\u003exyz\u003c/em\u003e-french\u003c/strong\u003e\n\u003cem\u003e(\u003ccode\u003exyz\u003c/code\u003e est le numéro de la version en cours…)\u003c/em\u003e :\u003c/p\u003e\n\u003cp\u003ePuis mettre le français par défaut avec :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /usr/local/bin/ispell-config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;y \u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#ajouter\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eajouter\u003c/a\u003e\n\naussi les dictionnaires \u003ccode\u003easpell\u003c/code\u003e et \u003ccode\u003eispell\u003c/code\u003e !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour la gestion de la langue française sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Lang"],
            "date_published": "2020-01-19T22:16:40+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:863cc740-7b37-b91d-6ba8-39e308fa0ea4",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-limits/",
            "title": "Gestion des Limit(e)s Systèmes / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Augmenter les limites autorisées Dans le fichier /etc/login.conf , on peut allouer plus de mémoire :\nNotez que la classe default est attribuée à chaque utilisateur qui n\u0026rsquo;a pas de classe particulière dans /etc/master.passwd. L\u0026rsquo;utilisateur principal se trouve généralement dans la classe staff.\ndefault:\\ :path=/usr/bin /bin /usr/sbin /sbin /usr/X11R6/bin /usr/local/bin /usr/local/sbin:\\ :umask=022:\\ :datasize-max=infinity:\\ :datasize-cur=4G:\\ :maxproc-max=512:\\ :maxproc-cur=256:\\ :openfiles-cur=512:\\ :stacksize-cur=4M:\\ :localcipher=blowfish,a:\\ :tc=auth-defaults:\\ :tc=auth-ftp-defaults: Ensuite, si votre fichier login.conf est conséquent, vous gagnerez en performance en créant une base de donnée. Pour créer et mettre à jour la base de donnée :\n# cap_mkdb /etc/login.conf Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"augmenter-les-limites-autorisées\"\u003eAugmenter les limites autorisées\u003c/h2\u003e\n\u003cp\u003eDans le fichier \u003ccode\u003e/etc/login.conf\u003c/code\u003e , on peut allouer plus de mémoire :\u003c/p\u003e\n\u003cp\u003eNotez que la classe \u003ccode\u003edefault\u003c/code\u003e est attribuée à chaque utilisateur qui n\u0026rsquo;a\npas de classe particulière dans \u003ccode\u003e/etc/master.passwd\u003c/code\u003e.\nL\u0026rsquo;utilisateur principal se trouve généralement dans la classe \u003ccode\u003estaff\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edefault:\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003e:path\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/usr/bin /bin /usr/sbin /sbin /usr/X11R6/bin /usr/local/bin /usr/local/sbin:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :umask=022:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :datasize-max=infinity:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :datasize-cur=4G:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :maxproc-max=512:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :maxproc-cur=256:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :openfiles-cur=512:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :stacksize-cur=4M:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :localcipher=blowfish,a:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :tc=auth-defaults:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e        :tc=auth-ftp-defaults:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, si votre fichier \u003ccode\u003elogin.conf\u003c/code\u003e est conséquent, vous gagnerez en\nperformance en créant une base de donnée. Pour créer et mettre à jour la\nbase de donnée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cap_mkdb /etc/login.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces de gestion des limites systèmes sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Limits"],
            "date_published": "2020-01-19T22:11:05+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:c535df24-2d3f-e46f-2f6c-e20334ade54a",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-group/",
            "title": "Gestion des Group(e)s Systèmes sur OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Ajouter un utilisateur au groupe wheel # usermod -G wheel nom_user Autoriser les utilisateurs du groupe wheel à utiliser doas AttentionATTENTION : Ce qui suit n\u0026rsquo;est qu\u0026rsquo;un exemple, parmi tant d\u0026rsquo;autres…\nPour de plus amples informations, lisez absolument la page de manuel de doas.conf(5) !\nDans le fichier /etc/doas.conf :\npermit setenv { ENV PS1 } :wheel\nPuis logout, login !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"ajouter-un-utilisateur-au-groupe-wheel\"\u003eAjouter un utilisateur au groupe wheel\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# usermod -G wheel nom_user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"autoriser-les-utilisateurs-du-groupe-wheel-à-utiliser-doas\"\u003eAutoriser les utilisateurs du groupe wheel à utiliser doas\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Ce qui suit n\u0026rsquo;est qu\u0026rsquo;un exemple, parmi tant d\u0026rsquo;autres…\u003c/p\u003e\n\u003cp\u003ePour de plus amples informations, lisez absolument la page de manuel de\n\u003ca href=\"http://man.openbsd.org/doas.conf.5\" rel=\"external\"\u003e\u003ccode\u003edoas.conf\u003c/code\u003e(5)\u003c/a\u003e !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eDans le fichier \u003ccode\u003e/etc/doas.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epermit setenv { ENV PS1 } :wheel\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePuis logout, login !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces de gestion des groupes systèmes sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Group"],
            "date_published": "2020-01-19T22:06:28+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:eb446da1-790a-ebd0-1123-af1fe72c6467",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/kit-survie/",
            "title": "Kit de survie sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Kit de survie sous OpenBSD Vous débutez sur OpenBSD ?\nassurez-vous d\u0026rsquo;avoir lu la page \u0026ldquo;Que faire après l\u0026#39;installation d’OpenBSD ?\u0026rdquo; ! Vous avez oublié une commande bien utile après avoir vécu 15 jours chez belle-maman ?\nCette page recense quelques astuces relatives à la gestion d\u0026rsquo;OpenBSD\nGestion des paquets ⇒ En premier, lisez ces explications ;)\n⇒ Le miroir utilisé pour chercher les paquets est indiqué dans le fichier /etc/installurl .\nVous trouverez une liste de miroirs officiels.\nGestion des services Les services sont gérés avec rcctl !\nMettre à jour ⇒ Pour mettre à jour le système, il faut utiliser l\u0026rsquo;outil syspatch ⇒ Pour mettre à jour les paquets, utilisez l\u0026rsquo;outil pkg_add avec l\u0026rsquo;option -u.\nsudo? sudo ? inconnu !\nIci, c\u0026rsquo;est doas(1).\nCharge système ? Veuillez lire notre page d\u0026rsquo;information à-propos de l\u0026rsquo;outil systat .\nAjouter une imprimante Le plus simple est :\nd\u0026rsquo;installer le serveur CUPS puis d\u0026rsquo;ouvrir un navigateur à l\u0026rsquo;adresse http://localhost:631 et aller dans la partie administration en tant qu\u0026rsquo;administrateur système. Autres Astuces Là, c\u0026rsquo;est le must… oui, oui… nous vous avons concocté plusieurs astuces, toutes recensées sur la page \u0026ldquo;Trucs et astuces pour OpenBSD\u0026rdquo;.\nAlors, profitez-en, régalez-vous - c\u0026rsquo;est fait pour cela :p\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"kit-de-survie-sous-openbsd\"\u003eKit de survie sous OpenBSD\u003c/h2\u003e\n\u003cp\u003eVous débutez sur OpenBSD ?\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eassurez-vous d\u0026rsquo;avoir lu la page \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/after-install/\" title=\"Lien interne vers l\u0026#39;article : 'Que faire après l\u0026#39;installation d’OpenBSD ?'\"\u003eQue faire après l\u0026#39;installation d’OpenBSD ?\u003c/a\u003e\u0026rdquo; !\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eVous avez oublié une commande bien utile après avoir vécu 15 jours chez\nbelle-maman ?\u003c/p\u003e\n\u003cp\u003eCette page recense quelques astuces relatives à la gestion d\u0026rsquo;OpenBSD\u003c/p\u003e\n\u003ch2 id=\"gestion-des-paquets\"\u003eGestion des paquets\u003c/h2\u003e\n\u003cp\u003e⇒ En premier, \u003cstrong\u003elisez ces \u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#explications\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eexplications\u003c/a\u003e\n\u003c/strong\u003e\n;)\u003c/p\u003e\n\u003cp\u003e⇒ Le miroir utilisé pour chercher les paquets est indiqué dans le fichier\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/installurl/\" title=\"Lien interne vers l\u0026#39;article : 'installurl : localisation du serveur miroir OpenBSD'\"\u003e/etc/installurl\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eVous trouverez une \u003ca href=\"https://www.openbsd.org/ftp.htm\" rel=\"external\"\u003eliste de miroirs\u003c/a\u003e\nofficiels.\u003c/p\u003e\n\u003ch2 id=\"gestion-des-services\"\u003eGestion des services\u003c/h2\u003e\n\u003cp\u003eLes services sont gérés avec \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003ercctl\u003c/a\u003e\n !\u003c/p\u003e\n\u003ch2 id=\"mettre-à-jour\"\u003eMettre à jour\u003c/h2\u003e\n\u003cp\u003e⇒ Pour mettre à jour le système, il faut utiliser l\u0026rsquo;outil\n\u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/syspatch/\" title=\"Lien interne vers l\u0026#39;article : 'Syspatch : gérer les correctifs binaires du système de base sous OpenBSD'\"\u003esyspatch\u003c/a\u003e\n\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Pour \u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003emettre à jour\u003c/a\u003e\n\u003c/code\u003e\nles paquets, utilisez l\u0026rsquo;outil \u003ccode\u003epkg_add\u003c/code\u003e avec l\u0026rsquo;option \u003ccode\u003e-u\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"sudo\"\u003esudo?\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003esudo\u003c/code\u003e ? inconnu !\u003c/p\u003e\n\u003cp\u003eIci, c\u0026rsquo;est \u003ca href=\"https://man.openbsd.org/doas\" rel=\"external\"\u003e\u003ccode\u003edoas\u003c/code\u003e(1)\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"charge-système-\"\u003eCharge système ?\u003c/h2\u003e\n\u003cp\u003eVeuillez lire notre page d\u0026rsquo;information à-propos de l\u0026rsquo;outil\n\u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/systat/\" title=\"Lien interne vers l\u0026#39;article : 'Systat : Voir la charge de la machine'\"\u003esystat\u003c/a\u003e\n\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"ajouter-une-imprimante\"\u003eAjouter une imprimante\u003c/h2\u003e\n\u003cp\u003eLe plus simple est :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ed\u0026rsquo;installer le serveur \u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003eCUPS\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003epuis d\u0026rsquo;ouvrir un navigateur à l\u0026rsquo;adresse\n\u003ccode\u003ehttp://localhost:631\u003c/code\u003e et aller dans la partie administration en tant\nqu\u0026rsquo;administrateur système.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"autres-astuces\"\u003eAutres Astuces\u003c/h2\u003e\n\u003cp\u003eLà, c\u0026rsquo;est le must… oui, oui… nous vous avons concocté plusieurs astuces,\ntoutes recensées sur la page \u0026ldquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tips/\" title=\"Lien interne vers l\u0026#39;article : 'Trucs et astuces pour OpenBSD'\"\u003eTrucs et astuces pour OpenBSD\u003c/a\u003e\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eAlors, profitez-en, régalez-vous - c\u0026rsquo;est fait pour cela  :p\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Que faire pour survivre sur OpenBSD quand on découvre… OpenBSD",
            "tags": ["OpenBSD", "Astuce", "kit", "survie"],
            "date_published": "2020-01-19T21:58:22+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:417540a8-2b87-4a5b-85d4-6402ab259af0",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-cpu/",
            "title": "Informations CPU / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Détecter le nombre de processeurs ⇒ La commande ci-dessous détecte le nombre de CPU :\n$ sysctl hw.ncpu\n⇒ La commande suivante détecte le nombre de coeurs / CPU :\n$ sysctl hw.ncpufound\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"détecter-le-nombre-de-processeurs\"\u003eDétecter le nombre de processeurs\u003c/h2\u003e\n\u003cp\u003e⇒ La commande ci-dessous détecte le nombre de CPU :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ sysctl hw.ncpu\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ La commande suivante détecte le nombre de coeurs / CPU :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ sysctl hw.ncpufound\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour obtenir les informations CPU sur OpenBSD",
            "tags": ["OpenBSD", "Astuce", "CPU"],
            "date_published": "2020-01-19T21:57:54+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:1e7c92fe-dad4-b1ff-fa79-047c80f2e8ae",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-boot/",
            "title": "Gestion du boot / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Réduire le temps de démarrage Par défaut, le démarreur attend 5 secondes avant de commencer le lancement d\u0026rsquo;OpenBSD. Pour réduire ce temps, mettez une ligne comme celle-ci dans le fichier /etc/boot.conf :\nset timeout 1 Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"réduire-le-temps-de-démarrage\"\u003eRéduire le temps de démarrage\u003c/h2\u003e\n\u003cp\u003ePar défaut, le démarreur attend 5 secondes avant de commencer le\nlancement d\u0026rsquo;OpenBSD. Pour réduire ce temps, mettez une ligne comme\ncelle-ci dans le fichier \u003ccode\u003e/etc/boot.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset timeout 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Différentes astuces sur la gestion du boot sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "boot"],
            "date_published": "2020-01-19T21:54:39+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:132f2d05-4373-1869-e8cb-55715413ad0b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-audio/",
            "title": "Gestion du Son / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Enregistrement Audio Par défaut, depuis OpenBSD 6.4, pour des raisons de confidentialité, l\u0026rsquo;enregistrement audio est désactivé !\nPour le réactiver : # sysctl kern.audio.record=1\nN\u0026rsquo;oubliez pas de modifier le fichier /etc/sysctl.conf en conséquence, si vous désirez qu\u0026rsquo;il soit actif dès le démarrage :\n# echo kern.audio.record=1 \u0026gt;\u0026gt; /etc/sysctl.conf\nPour chaque périphérique mixer, record.enable peut être paramétré sur :\noff (toujours éteint), on (toujours actif), ou sysctl (par défaut : suit l\u0026rsquo;état du paramètre kern.audio.record de sysctl). Gérer le volume sonore Il peut être utile d\u0026rsquo;ajouter votre utilisateur au groupe operator :\n# usermod -G operator votre-id\nsndioctl À partir d\u0026rsquo;OpenBSD 6.7, c\u0026rsquo;est l\u0026rsquo;outil sndioctl(1) qui est utilisé. Par défaut, il n\u0026rsquo;y a aucune option de configuration à paramétrer. Normalement, il se manipule sans soucis avec les droits utilisateurs, sans autre nécessité de gestion de droits particuliers.\nL\u0026rsquo;outil sndioctl(1) est le contrôleur pour manipuler le dispositif audio ; par exemple :\nPour augmenter le son d\u0026rsquo;environ 10% : $ sndioctl output.level=+0.1 Pour mettre en mode muet : $ sndioctl output.mute=1 Pour enlever le mode muet : $ sndioctl output.mute=! AstuceVous désirez avoir l\u0026rsquo;affichage sous forme de pourcentage ?\n⇒ Utilisez : $ sndioctl output.level | awk -F = '{printf \u0026quot;%d\\n\u0026quot;,$2*100}'\nCompréhension affinée Les applications audio qui utilisent la bibliothèque sndio(7) n\u0026rsquo;ont plus accès directement aux matériels audio (au-travers de /dev/audio*).\nOpenBSD exécute le serveur de son sndiod(8) qui découvrira automatiquement quels sont vos dispositifs audio et requerra les applications audio qui en ont besoin.\nIl existe des exceptions :\nlorsqu\u0026rsquo;un autre serveur de son est fonctionnel dues à une configuration spécifique du serveur de son sndiod(8) Deux utilisateurs peuvent essayer d\u0026rsquo;obtenir un accès en même temps au même dispositif audio en partageant le cookie d\u0026rsquo;authentification. (cf : la section AUTHENTICATION du manpage sndio(7))\nVérifier le fonctionnement de sndiod(8) Il est possible de vérifier que le serveur de son sndiod(8) est fonctionnel en exécutant : $ pgrep -lf sndiod\ncf : source\nmixerctl Avant OpenBSD 6.7, c’est la commande mixerctl qui était utile. Vous pouvez lancer la commande seule pour voir toutes les sorties existantes.\nPour monter le son : mixerctl outputs.master=+10 Pour baisser le son : mixerctl outputs.master=-10 Pour mettre en mode muet ou l\u0026rsquo;enlever : mixerctl outputs.mute=toggle Paramètres système Comme le rappelle la FAQ Multimédia d\u0026rsquo;OpenBSD, l\u0026rsquo;outil mixerctl sert toujours à configurer les paramètres liés au matériel audio ! (à utiliser toujours avec des droits administrateurs)\nPour savoir ce que gère l\u0026rsquo;outil de votre matériel : # mixerctl -av\nQuelque soit la modification faite ou à faire, il faut ensuite l\u0026rsquo;écrire dans le fichier /etc/mixerctl.conf qui n\u0026rsquo;existe pas par défaut :\n# cp /etc/examples/mixerctl.conf /etc/mixerctl.conf\nSi les modifications ne sont pas écrites dans ce fichier, tout sera réinitialisé par défaut au redémarrage suivant.\nContrôle des niveaux et mode muet Lire la FAQ Contrôles des niveaux.\nÉconomie d\u0026rsquo;énergie L\u0026rsquo;Amplificateur EAPD est un bouton logiciel utile dans le contexte des modes d\u0026rsquo;énergie, tels que la veille ou l\u0026rsquo;hibernation. C\u0026rsquo;est une spécification de la norme Intel HDA - HD Audio.\nLire la FAQ Amplificateur EAPD si vous utilisez un ordinateur portable.\nPour information, votre matériel peut très certainement le gérer et déjà paramétré pour les différentes sorties correspondantes. Vérifiez : # mixerctl -av | grep eapd\nGestion de la source d\u0026rsquo;enregistrement Lire la FAQ Amplificateur EAPD\nGestion d\u0026rsquo;un périphérique Audio USB Lire la FAQ Utiliser une interface USB Audio\nUtiliser du matériel audio à distance Lire la FAQ Utiliser à distance le matériel audio\nGestion d\u0026rsquo;une sortie SPDIF Pour gérer le son sur une sortie SPDIF, donc en mode digital, il est nécessaire de modifier le mode de sortie :\noutputs.mode=digital\nEnsuite, il faut modifier le serveur de son sndiod(8) pour qu\u0026rsquo;il gère les canaux correspondants. Par défaut, sndiod ne gère que les canaux 0:1, ce qui permet quand même un son stéréo.\nEn premier, vérifions la sortie SPDIF : # mixerctl outputs.SPDIF_source\nCe qui pour l\u0026rsquo;exemple :\n$ doas mixerctl outputs.SPDIF_source outputs.SPDIF_source=dig-dac-2:3 Comme le montre cet exemple, la sortie SPDIF se fait sur les canaux 2:3 (2 et 3), non géré par défaut par le serveur sndiod.\nIl faut donc modifier le démarrage du serveur sndiod, en ajoutant les drapeaux suivants 0:3 pour :\n# rcctl set sndiod flags -c0:3 # rcctl restart sndiod Attention, certains périphériques matérielles (càd comme des cartes-mères) peuvent gérer plus de canaux que les 4 premiers en question. C\u0026rsquo;est à chacun de s\u0026rsquo;assurer des canaux à utiliser et à modifier en conséquence la gestion des canaux par le serveur de son.\nDésactiver le bip sonore Parfois, un bip peut être émis si par exemple une commande n’arrive pas à être complétée avec Tab. Pour le désactiver, ajoutez cette ligne au fichier /etc/wsconsctl.conf :\nkeyboard.bell.volume=0 Avant OpenBSD v6.7, il pouvait être utile d\u0026rsquo;utiliser la commande suivante :\n# mixerctl inputs.mix_beep = 0\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"enregistrement-audio\"\u003eEnregistrement Audio\u003c/h2\u003e\n\u003cp\u003ePar défaut, depuis OpenBSD 6.4, pour des raisons de confidentialité,\nl\u0026rsquo;enregistrement audio est désactivé !\u003c/p\u003e\n\u003cp\u003ePour le réactiver : \u003ccode\u003e# sysctl kern.audio.record=1\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de modifier le fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e en conséquence,\nsi vous désirez qu\u0026rsquo;il soit actif dès le démarrage :\u003cbr\u003e\n\u003ccode\u003e# echo kern.audio.record=1 \u0026gt;\u0026gt; /etc/sysctl.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour chaque périphérique mixer, \u003ccode\u003erecord.enable\u003c/code\u003e peut être paramétré sur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eoff\u003c/code\u003e (\u003cem\u003etoujours éteint\u003c/em\u003e),\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eon\u003c/code\u003e (\u003cem\u003etoujours actif\u003c/em\u003e),\u003c/li\u003e\n\u003cli\u003eou \u003ccode\u003esysctl\u003c/code\u003e (\u003cem\u003epar défaut : suit l\u0026rsquo;état du paramètre \u003ccode\u003ekern.audio.record\u003c/code\u003e de \u003ccode\u003esysctl\u003c/code\u003e\u003c/em\u003e).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"gérer-le-volume-sonore\"\u003eGérer le volume sonore\u003c/h2\u003e\n\u003cp\u003eIl peut être utile d\u0026rsquo;ajouter votre utilisateur au groupe \u003ccode\u003eoperator\u003c/code\u003e :\u003cbr\u003e\n\u003ccode\u003e# usermod -G operator votre-id\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"sndioctl\"\u003esndioctl\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eÀ partir d\u0026rsquo;OpenBSD 6.7, c\u0026rsquo;est l\u0026rsquo;outil \u003ca href=\"https://man.openbsd.org/sndioctl\" rel=\"external\"\u003esndioctl(1)\u003c/a\u003e\u003c/strong\u003e\nqui est utilisé. Par défaut, il n\u0026rsquo;y a aucune option de configuration à\nparamétrer. \u003cem\u003eNormalement, il se manipule sans soucis avec les droits\nutilisateurs, sans autre nécessité de gestion de droits particuliers\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;outil \u003ccode\u003esndioctl(1)\u003c/code\u003e est le contrôleur pour manipuler le dispositif\naudio ; par exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour augmenter le son d\u0026rsquo;environ 10% : \u003ccode\u003e$ sndioctl output.level=+0.1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour mettre en mode muet : \u003ccode\u003e$ sndioctl output.mute=1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour enlever le mode muet : \u003ccode\u003e$ sndioctl output.mute=!\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eVous désirez avoir l\u0026rsquo;affichage sous forme de pourcentage ?\u003c/p\u003e\n\u003cp\u003e⇒ Utilisez : \u003cbr\u003e\n\u003ccode\u003e$ sndioctl output.level | awk -F = '{printf \u0026quot;%d\\n\u0026quot;,$2*100}'\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"compréhension-affinée\"\u003eCompréhension affinée\u003c/h4\u003e\n\u003cp\u003eLes applications audio qui utilisent la bibliothèque \u003ca href=\"https://man.openbsd.org/sndio.7\" rel=\"external\"\u003esndio(7)\u003c/a\u003e\nn\u0026rsquo;ont plus accès directement aux matériels audio \u003cem\u003e(au-travers de \u003ccode\u003e/dev/audio*\u003c/code\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eOpenBSD exécute le serveur de son \u003ca href=\"https://man.openbsd.org/sndiod.8\" rel=\"external\"\u003esndiod(8)\u003c/a\u003e\nqui découvrira automatiquement quels sont vos dispositifs audio et\nrequerra les applications audio qui en ont besoin.\u003c/p\u003e\n\u003cp\u003eIl existe des exceptions :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003elorsqu\u0026rsquo;un autre serveur de son est fonctionnel\u003c/li\u003e\n\u003cli\u003edues à une configuration spécifique du serveur de son \u003ccode\u003esndiod(8)\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eDeux utilisateurs peuvent essayer d\u0026rsquo;obtenir un accès en même temps au\nmême dispositif audio en partageant le cookie d\u0026rsquo;authentification.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e(cf : la section \u003cstrong\u003e\u003ca href=\"https://man.openbsd.org/sndio.7#AUTHENTICATION\" rel=\"external\"\u003eAUTHENTICATION\u003c/a\u003e\u003c/strong\u003e\ndu manpage \u003ccode\u003esndio(7)\u003c/code\u003e)\u003c/em\u003e\u003c/p\u003e\n\u003ch4 id=\"vérifier-le-fonctionnement-de-sndiod8\"\u003eVérifier le fonctionnement de sndiod(8)\u003c/h4\u003e\n\u003cp\u003eIl est possible de vérifier que le serveur de son \u003ccode\u003esndiod(8)\u003c/code\u003e est\nfonctionnel en exécutant : \u003cbr\u003e\n\u003ccode\u003e$ pgrep -lf sndiod\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ecf : \u003ca href=\"http://daemonforums.org/showthread.php?t=11402#post68959\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"mixerctl\"\u003emixerctl\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eAvant OpenBSD 6.7, c’est la commande \u003ccode\u003emixerctl\u003c/code\u003e\u003c/strong\u003e qui était utile. Vous pouvez lancer la commande seule pour voir toutes les sorties existantes.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour monter le son : \u003ccode\u003emixerctl outputs.master=+10\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour baisser le son : \u003ccode\u003emixerctl outputs.master=-10\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour mettre en mode muet ou l\u0026rsquo;enlever : \u003ccode\u003emixerctl outputs.mute=toggle\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"paramètres-système\"\u003eParamètres système\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eComme le rappelle la \u003ca href=\"https://www.openbsd.org/faq/faq13.html\" rel=\"external\"\u003eFAQ Multimédia d\u0026rsquo;OpenBSD\u003c/a\u003e,\nl\u0026rsquo;outil \u003ccode\u003emixerctl\u003c/code\u003e sert toujours à configurer les paramètres\u003c/strong\u003e liés au\nmatériel audio ! \u003cbr\u003e\n\u003cem\u003e(à utiliser toujours avec des droits administrateurs)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePour savoir ce que gère l\u0026rsquo;outil de votre matériel : \u003cbr\u003e\n\u003ccode\u003e# mixerctl -av\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eQuelque soit la modification faite ou à faire, il faut ensuite l\u0026rsquo;écrire\ndans le fichier \u003ccode\u003e/etc/mixerctl.conf\u003c/code\u003e qui n\u0026rsquo;existe pas par défaut :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# cp /etc/examples/mixerctl.conf /etc/mixerctl.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi les modifications ne sont pas écrites dans ce fichier, tout sera\nréinitialisé par défaut au redémarrage suivant.\u003c/p\u003e\n\u003ch3 id=\"contrôle-des-niveaux-et-mode-muet\"\u003eContrôle des niveaux et mode muet\u003c/h3\u003e\n\u003cp\u003eLire la FAQ \u003ca href=\"https://www.openbsd.org/faq/faq13.html#audiolevel\" rel=\"external\"\u003eContrôles des niveaux\u003c/a\u003e.\u003c/p\u003e\n\u003ch3 id=\"économie-dénergie\"\u003eÉconomie d\u0026rsquo;énergie\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;\u003cstrong\u003eAmplificateur EAPD\u003c/strong\u003e est un bouton logiciel utile dans le contexte\ndes modes d\u0026rsquo;énergie, tels que la veille ou l\u0026rsquo;hibernation. C\u0026rsquo;est une\nspécification de la norme Intel HDA - HD Audio.\u003c/p\u003e\n\u003cp\u003eLire la FAQ \u003ca href=\"https://www.openbsd.org/faq/faq13.html#confaudio\" rel=\"external\"\u003eAmplificateur EAPD\u003c/a\u003e\nsi vous utilisez un ordinateur portable.\u003c/p\u003e\n\u003cp\u003ePour information, votre matériel peut très certainement le gérer et déjà\nparamétré pour les différentes sorties correspondantes. Vérifiez : \u003cbr\u003e\n\u003ccode\u003e# mixerctl -av | grep eapd\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-de-la-source-denregistrement\"\u003eGestion de la source d\u0026rsquo;enregistrement\u003c/h3\u003e\n\u003cp\u003eLire la FAQ \u003ca href=\"https://www.openbsd.org/faq/faq13.html#confaudio\" rel=\"external\"\u003eAmplificateur EAPD\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-dun-périphérique-audio-usb\"\u003eGestion d\u0026rsquo;un périphérique Audio USB\u003c/h3\u003e\n\u003cp\u003eLire la FAQ \u003ca href=\"https://www.openbsd.org/faq/faq13.html#usbaudio\" rel=\"external\"\u003eUtiliser une interface USB Audio\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"utiliser-du-matériel-audio-à-distance\"\u003eUtiliser du matériel audio à distance\u003c/h3\u003e\n\u003cp\u003eLire la FAQ \u003ca href=\"https://www.openbsd.org/faq/faq13.html#audionet\" rel=\"external\"\u003eUtiliser à distance le matériel audio\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-dune-sortie-spdif\"\u003eGestion d\u0026rsquo;une sortie SPDIF\u003c/h3\u003e\n\u003cp\u003ePour gérer le son sur une sortie SPDIF, donc en mode digital, il est\nnécessaire de modifier le mode de sortie :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eoutputs.mode=digital\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite, il faut modifier le serveur de son sndiod(8) pour qu\u0026rsquo;il gère\nles canaux correspondants. Par défaut, sndiod ne gère que les canaux\n\u003ccode\u003e0:1\u003c/code\u003e, ce qui permet quand même un son stéréo.\u003c/p\u003e\n\u003cp\u003eEn premier, vérifions la sortie SPDIF : \u003cbr\u003e\n\u003ccode\u003e# mixerctl outputs.SPDIF_source\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCe qui pour l\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas mixerctl outputs.SPDIF_source\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoutputs.SPDIF_source\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003edig-dac-2:3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eComme le montre cet exemple, la sortie SPDIF se fait sur les canaux\n\u003ccode\u003e2:3\u003c/code\u003e \u003cem\u003e(2 et 3)\u003c/em\u003e, non géré par défaut par le serveur sndiod.\u003c/p\u003e\n\u003cp\u003eIl faut donc modifier le démarrage du serveur sndiod, en ajoutant les\ndrapeaux suivants \u003ccode\u003e0:3\u003c/code\u003e pour :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set sndiod flags -c0:3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl restart sndiod\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAttention, certains périphériques matérielles (càd comme des cartes-mères)\npeuvent gérer plus de canaux que les 4 premiers en question. C\u0026rsquo;est à\nchacun de s\u0026rsquo;assurer des canaux à utiliser et à modifier en conséquence\nla gestion des canaux par le serveur de son.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"désactiver-le-bip-sonore\"\u003eDésactiver le bip sonore\u003c/h3\u003e\n\u003cp\u003eParfois, un bip peut être émis si par exemple une commande n’arrive pas\nà être complétée avec Tab. Pour le désactiver, ajoutez cette ligne au\nfichier \u003ccode\u003e/etc/wsconsctl.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekeyboard.bell.volume\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAvant OpenBSD v6.7, il pouvait être utile d\u0026rsquo;utiliser la commande suivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# mixerctl inputs.mix_beep = 0\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer de l'audio sous OpenBSD : trucs et astuces, et divers paramétrages",
            "tags": ["OpenBSD", "Astuce", "audio"],
            "date_published": "2020-01-19T21:24:36+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:3ce28999-77f6-7ace-9da4-dc00ef0aeb7e",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-pdksh/",
            "title": "KSH : Korn shell",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description ksh est le shell par défaut sous OpenBSD - exactement pdksh : Public Domain Korn Shell, qui est l\u0026rsquo;équivalent du ksh88.\nInfoIl ressemble beaucoup à Bash par bien des aspects et vous devriez vous y retrouver si vous venez de GNU/Linux. Configuration Le fichier de configuration principal : /etc/ksh.kshrc Votre fichier de configuration personnel : ~/.kshrc Les autres fichiers de configuration liés à l\u0026rsquo;usage de ksh sont (cf : le manpage ksh) :\nle fichier profil de la session utilisateur : ~/.profile celui relatif au système : /etc/profile la base de données shell : /etc/shells et, enfin, le fichier de profil shell privilégié : /etc/suid_profile ATTENTION, aux conséquences relatives aux modifications de ce fichier sensible. Préférez modifier votre fichier de configuration personnel, en ajoutant les déclarations principales, tel que :\n. /etc/ksh.kshrc Ajout du fichier .profile Sourcez votre fichier personnel ~/.profile dans lequel vous déclarez toutes vos variables d\u0026rsquo;environnement, vos alias, de manière généraliste.\nPréférez l\u0026rsquo;usage de la variable HOME plutôt que du tilde ~, tel que :\n. $HOME/.profile Activer l’historique Ajoutez ceci :\nHISTFILE=~/.hist HISTSIZE=3000 Si vous ne voulez pas garder de doublons si une même commande est lancée plusieurs fois de suite :\nHISTCONTROL=ignoredumps PS1 : un prompt en couleur ⇒ PS1 user : PS1=\u0026quot;\\e[0;36m\\u@\\h: \\e[0;32m\\w \\e[0;36m\\$ \\e[m\u0026quot;\n⇒ PS1 root : PS1=\u0026quot;\\e[0;31m\\u@\\h | \\e[0;32m\\w | \\e[0;31m\\# \\e[m\u0026quot;\nAstucePetite astuce : si vous mettez \u0026lsquo;#\u0026rsquo;, à chaque commande utilisée, le prompt affichera un compteur… En fonction du code de sortie de la commande Il peut être intéressant d\u0026rsquo;avoir un prompt couleur, d\u0026rsquo;une part pour se repérer dans son terminal, d\u0026rsquo;autre part, ça devient intéressant visuellement si ce dernier change de couleur en fonction du code de retour de la commande qui vient d\u0026rsquo;être lancée.\nPour cela, voici un bout de config à ajouter :\nescape=$(print \u0026#39;\\033\u0026#39;) ctrla=$(print \u0026#39;\\001\u0026#39;) PS1=$(print \u0026#39;\\001\\015\u0026#39;) PS1=$PS1$ctrla$escape\u0026#39;[$(($? ? 31 : 32))m\u0026#39;$ctrla PS1=$PS1\u0026#39;[\\u@\\h \\w]\u0026#39; PS1=$PS1$ctrla$escape\u0026#39;[0m\u0026#39;$ctrla\u0026#39; \u0026#39; Exemples Un .kshrc minimal . /etc/ksh.kshrc . $HOME/.profile HISTCONTROL=ignoredumps HISTFILE=~/.hist HISTSIZE=3000 # Préférez paramétrer les variables PS1, LC_* dans .profile export PS1=\u0026#34;\\u@\\h:\\w\\$ \u0026#34; export LC_CTYPE=fr_FR.UTF-8 export LC_MESSAGES=fr export TOP=\u0026#39;-s 1\u0026#39; export PAGER=less Informations Systèmes Gestion de dates ⇒ Obtenir une date au format timestamp :\n:$ date +%s\n⇒ Transformer un timestamp en date :\n:$ date -r $timestamp +\u0026quot;%x %X\u0026quot;\n⇒ Obtenir la date de maintenant :\n:$ date +\u0026quot;%x %X\u0026quot;\n⇒ Obtenir la date du jour :\n:$ date +'%Y-%m-%d_%H-%M-%S'\n⇒ Obtenir la date d\u0026rsquo;hier :\n:$ date -r $(($(date -j $(date +%Y%m%d1200) +%s) - 86400)) +%F\nInformations de fichiers Dates de fichier ⇒ date de création : :$ stat -f \u0026quot;%c\u0026quot; nom-fichier\n⇒ date de modification : :$ stat -f \u0026quot;%m\u0026quot; nom-fichier\n⇒ date du dernier accès : :$ stat -f \u0026quot;%c\u0026quot; nom-fichier\nAttentionVous obtiendrez des dates au format timestamp. Pour les transformer en date, humainement compréhensible, voire ci-dessus… Taille d\u0026rsquo;un fichier Obtenir la taille d\u0026rsquo;un fichier :\n:$ stat -f \u0026quot;%z\u0026quot; nom-fichier\nType d\u0026rsquo;un fichier Obtenir le type du fichier :\n:$ stat -f \u0026quot;%T\u0026quot; nom-fichier\nUtilisateur et groupe d\u0026rsquo;un fichier ⇒ Obtenir l\u0026rsquo;utilisateur ayant les droits sur le fichier :\n:$ stat -f \u0026quot;%u\u0026quot; nom-fichier\n⇒ et le groupe :\n:$ stat -f \u0026quot;%g\u0026quot; nom-fichier\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eksh\u003c/strong\u003e est le shell par défaut sous OpenBSD - exactement\n\u003cstrong\u003epdksh : Public Domain Korn Shell\u003c/strong\u003e, qui est l\u0026rsquo;équivalent du \u003cstrong\u003eksh88\u003c/strong\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eIl ressemble beaucoup à Bash par bien des aspects et vous devriez vous y\nretrouver si vous venez de GNU/Linux.\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration principal : \u003ccode\u003e/etc/ksh.kshrc\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eVotre fichier de configuration personnel : \u003ccode\u003e~/.kshrc\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes autres fichiers de configuration liés à l\u0026rsquo;usage de ksh sont \u003cem\u003e(cf : le\n\u003ca href=\"https://man.openbsd.org/ksh\" rel=\"external\"\u003emanpage ksh\u003c/a\u003e)\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier profil de la session utilisateur : \u003ccode\u003e~/.profile\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ecelui relatif au système : \u003ccode\u003e/etc/profile\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ela base de données shell : \u003ccode\u003e/etc/shells\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet, enfin, le fichier de profil shell privilégié : \u003ccode\u003e/etc/suid_profile\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eATTENTION, aux conséquences relatives aux modifications de ce\nfichier sensible\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePréférez modifier votre fichier de configuration personnel, en ajoutant\nles déclarations principales, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e. /etc/ksh.kshrc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"ajout-du-fichier-profile\"\u003eAjout du fichier \u003ccode\u003e.profile\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eSourcez votre fichier personnel \u003ccode\u003e~/.profile\u003c/code\u003e dans lequel vous déclarez\ntoutes vos variables d\u0026rsquo;environnement, vos alias, de manière généraliste.\u003c/p\u003e\n\u003cp\u003ePréférez l\u0026rsquo;usage de la variable \u003ccode\u003eHOME\u003c/code\u003e plutôt que du\n\u003ca href=\"https://man.openbsd.org/ksh#Tilde_expansion\" rel=\"external\"\u003etilde\u003c/a\u003e \u003ccode\u003e~\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e. $HOME/.profile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"activer-lhistorique\"\u003eActiver l’historique\u003c/h3\u003e\n\u003cp\u003eAjoutez ceci :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHISTFILE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e~/.hist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHISTSIZE\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e3000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi vous ne voulez pas garder de doublons si une même commande est lancée\nplusieurs fois de suite :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eHISTCONTROL\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eignoredumps\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"ps1--un-prompt-en-couleur\"\u003ePS1 : un prompt en couleur\u003c/h3\u003e\n\u003cp\u003e⇒ PS1 user : \u003ccode\u003ePS1=\u0026quot;\\e[0;36m\\u@\\h: \\e[0;32m\\w \\e[0;36m\\$ \\e[m\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ PS1 root : \u003ccode\u003ePS1=\u0026quot;\\e[0;31m\\u@\\h | \\e[0;32m\\w | \\e[0;31m\\# \\e[m\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003ePetite astuce : si vous mettez \u0026lsquo;#\u0026rsquo;, à chaque commande utilisée, le\nprompt affichera un compteur…\u003c/div\u003e\n\n\u003ch4 id=\"en-fonction-du-code-de-sortie-de-la-commande\"\u003eEn fonction du code de sortie de la commande\u003c/h4\u003e\n\u003cp\u003eIl peut être intéressant d\u0026rsquo;avoir un prompt couleur, d\u0026rsquo;une part pour se\nrepérer dans son terminal, d\u0026rsquo;autre part, ça devient intéressant\nvisuellement si ce dernier change de couleur en fonction du code de\nretour de la commande qui vient d\u0026rsquo;être lancée.\u003c/p\u003e\n\u003cp\u003ePour cela, voici un bout de config à ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eescape\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$(print \u0026#39;\\033\u0026#39;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ectrla\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$(print \u0026#39;\\001\u0026#39;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePS1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$(print \u0026#39;\\001\\015\u0026#39;)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePS1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$PS1$ctrla$escape\u0026#39;[$(($? ? 31 : 32))m\u0026#39;$ctrla\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePS1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$PS1\u0026#39;[\\u@\\h \\w]\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePS1\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$PS1$ctrla$escape\u0026#39;[0m\u0026#39;$ctrla\u0026#39; \u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003ch3 id=\"un-kshrc-minimal\"\u003eUn .kshrc minimal\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e. /etc/ksh.kshrc\n. $HOME/.profile\n\nHISTCONTROL=ignoredumps\nHISTFILE=~/.hist\nHISTSIZE=3000\n\n# Préférez paramétrer les variables PS1, LC_* dans .profile\nexport PS1=\u0026#34;\\u@\\h:\\w\\$ \u0026#34;\nexport LC_CTYPE=fr_FR.UTF-8\nexport LC_MESSAGES=fr\n\nexport TOP=\u0026#39;-s 1\u0026#39;\nexport PAGER=less\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"informations-systèmes\"\u003eInformations Systèmes\u003c/h2\u003e\n\u003ch3 id=\"gestion-de-dates\"\u003eGestion de dates\u003c/h3\u003e\n\u003cp\u003e⇒ Obtenir une date au format timestamp :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ date +%s\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Transformer un timestamp en date :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ date -r $timestamp +\u0026quot;%x %X\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Obtenir la date de maintenant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ date +\u0026quot;%x %X\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Obtenir la date du jour :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ date +'%Y-%m-%d_%H-%M-%S'\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Obtenir la date d\u0026rsquo;hier :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ date -r $(($(date -j $(date +%Y%m%d1200) +%s) - 86400)) +%F\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"informations-de-fichiers\"\u003eInformations de fichiers\u003c/h3\u003e\n\u003ch4 id=\"dates-de-fichier\"\u003eDates de fichier\u003c/h4\u003e\n\u003cp\u003e⇒ date de création : \u003ccode\u003e:$ stat -f \u0026quot;%c\u0026quot; nom-fichier\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ date de modification : \u003ccode\u003e:$ stat -f \u0026quot;%m\u0026quot; nom-fichier\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ date du dernier accès : \u003ccode\u003e:$ stat -f \u0026quot;%c\u0026quot; nom-fichier\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVous obtiendrez des dates au format timestamp. Pour les transformer en\ndate, humainement compréhensible, voire \u003ca href=\"/fr/sys/openbsd/tip-pdksh/#gestion-de-dates\"\u003eci-dessus\u003c/a\u003e…\u003c/div\u003e\n\n\u003ch4 id=\"taille-dun-fichier\"\u003eTaille d\u0026rsquo;un fichier\u003c/h4\u003e\n\u003cp\u003eObtenir la taille d\u0026rsquo;un fichier :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ stat -f \u0026quot;%z\u0026quot; nom-fichier\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"type-dun-fichier\"\u003eType d\u0026rsquo;un fichier\u003c/h4\u003e\n\u003cp\u003eObtenir le type du fichier :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ stat -f \u0026quot;%T\u0026quot; nom-fichier\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"utilisateur-et-groupe-dun-fichier\"\u003eUtilisateur et groupe d\u0026rsquo;un fichier\u003c/h4\u003e\n\u003cp\u003e⇒ Obtenir l\u0026rsquo;utilisateur ayant les droits sur le fichier :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ stat -f \u0026quot;%u\u0026quot; nom-fichier\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ et le groupe :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ stat -f \u0026quot;%g\u0026quot; nom-fichier\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Découvrir le shell par défaut sous OpenBSD : pdksh, et quelques astuces à ce propos…",
            "tags": ["OpenBSD", "Astuce", "ksh"],
            "date_published": "2020-01-19T20:53:20+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:87f90d21-4cb5-fa95-b14a-f51e374b8d7d",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/audacious/",
            "title": "Audacious / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Audacious est un lecteur multimédia qui utilise actuellement une interface utilisateur basée sur les thémes de Winamp 2.x Il est dérivé de BMP et XMMS.\nArchitectures gérées : aarch64, alpha, amd64, arm, hppa, i386, mips64, mips64el, powerpc, sparc64 Mainteneur : l\u0026rsquo;équipe OpenBSD Openports : https://openports.pl/path/audio/audacious Site officiel : http://audacious-media-player.org/ Installation Installez les paquets audacious audacious-plugins !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAudacious\u003c/strong\u003e est un lecteur multimédia qui utilise actuellement une\ninterface utilisateur basée sur les thémes de Winamp 2.x Il est dérivé\nde BMP et XMMS.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eArchitectures gérées : aarch64, alpha, amd64, arm, hppa, i386, mips64, mips64el, powerpc, sparc64\u003c/li\u003e\n\u003cli\u003eMainteneur : l\u0026rsquo;équipe OpenBSD\u003c/li\u003e\n\u003cli\u003eOpenports : \u003ca href=\"https://openports.pl/path/audio/audacious\" rel=\"external\"\u003ehttps://openports.pl/path/audio/audacious\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSite officiel : \u003ca href=\"http://audacious-media-player.org/\" rel=\"external\"\u003ehttp://audacious-media-player.org/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n les\npaquets \u003ccode\u003eaudacious audacious-plugins\u003c/code\u003e\u003c/strong\u003e !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le logiciel audio nommé 'Audacious' sous OpenBSD",
            "tags": ["OpenBSD", "audacious"],
            "date_published": "2020-01-19T20:50:12+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:9c9f605b-619c-ffc0-b56e-8520a92aa45d",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/lftp/",
            "title": "lftp : client ftp, sftp CLI / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description lftp est un outil en ligne de commande, qui permet de transférer des fichiers. Il supporte les protocoles Bittorent, FISH, FTP, FTPS, HTTP, HTTPS, SFTP et a un support partiel pour WebDAV. IPv(4|6).\nSes fonctionnalités sont :\nla reconnexion automatique et la possibilité de ré-essai après erreurs ou timeout préservation de l\u0026rsquo;heure de modification mirroring, reverse mirroring, re-get, re-put mise en file d\u0026rsquo;attente par job, multiplier les transferts en tâche de fond gestion de \u0026ldquo;bookmarks\u0026rdquo; et d\u0026rsquo;alias Installation installez le paquet lftp.\nUtilisation En tant que client CLI, il peut autant s\u0026rsquo;utiliser dans une ligne de commande que dans un script sh.\nOptions Les options :\n-c : suivi d\u0026rsquo;un ensemble de commandes et quitte -d : le mode de déboguage -e : suivi d\u0026rsquo;un ensemble de commandes et ne quitte pas -f : suivi d\u0026rsquo;un nom de fichier, permet d\u0026rsquo;exécuter les commandes dans ce fichier et quitte. Cette option DOIT s\u0026rsquo;utiliser toute seule, sans aucun autre argument (sauf --norc). --norc : ne pas exécuter les fichiers rc depuis votre répertoire $HOME. -p : spécifie le numéro de port sur lequel se connecter --rcfile : suivi d\u0026rsquo;un nom de fichier, permet d\u0026rsquo;exécuter un ensemble de commandes dans ce fichier et d\u0026rsquo;être exécuté plusieurs fois. -u : permet de spécifier le couple d\u0026rsquo;identification utilisateur + mot de passe. Il est recommandé d\u0026rsquo;utiliser le fichier ~/.netrc dans lequel préciser le mot de passe, plutôt que dans la ligne de commande, ou par le biais de la variable d\u0026rsquo;environnement LFTP_PASSWORD qui sera ensuite appelée par l\u0026rsquo;option --env-password. De manière alternative, il est possible d\u0026rsquo;utiliser une connexion SSH par authentification par clé autorisée. Variables d\u0026rsquo;environnement Si les variables d\u0026rsquo;environnement suivantes sont précisées avant l\u0026rsquo;appel système, lftp est/sera capable de les utiliser :\nEDITOR : l\u0026rsquo;éditeur de texte qui sera appelé lors de l\u0026rsquo;usage de la commande edit. HOME : le répertoire personnel local LFTP_HOME : utilisée pour localiser le répertoire des fichiers de configurations locaux spécifiques à l\u0026rsquo;utilisateur. Par défaut, sans spécification, il sera utilisé ~/.lftp. LFTP_MODULE_PATH : initialise la variable module:path LFTP_PASSWORD : utilisée par l\u0026rsquo;argument open lors de l\u0026rsquo;usage de l\u0026rsquo;option --env-password. LS_COLORS : permet de paramétrer la variable color:dir-colors qui ajoutera des couleurs. PAGER : le nom du pager à utiliser lors de l\u0026rsquo;usage des commandes more et zmore. SHELL : utilisée par la commande ! pour déterminer quel shell utiliser XDG_CONFIG_HOME, XDG_DATA_HOME, XDG_CACHE_HOME : utilisée pour localiser les répertoires spécifiques utilisateur si ~/.lftp ou la variable d\u0026rsquo;environnement LFTP_HOME ne sont pas précisés. Par défaut, il sera recherché respectivement ~/.cache, ~/.config, ~/.local/share. Il sera ajouté le préfixe /lftp pour restituer le chemin absolu du répertoire en question. ftp_proxy : initialise la variable pour le mandataire FTP http_proxy, https_proxy : initialise les variables pour les mandataires HTTP(S) no_proxy : initialise la variable net:no_proxy. Les commandes ll existe énormément de commandes utilisables avec lftp ; veuillez lire le manpage ; seules certaines seront précisées ici sur cette page :\n! Cette commande spéciale ! exécute un shell suivi d\u0026rsquo;une autre commande\nalias Pour définir un nom d\u0026rsquo;alias ; c\u0026rsquo;est le même principe que les alias de shell\nat Exécutera une commande au moment donné. Voir le manpage at(1).\nedit Permettra l\u0026rsquo;édition d\u0026rsquo;un fichier distant par le biais de l\u0026rsquo;éditeur texte spécifié. Dans les faits, lftp récupérera le fichier vers un répertoire temporaire local, exécutera l\u0026rsquo;éditeur de texte local et téléversera sur le serveur le fichier.\nLes options :\n-k : pour garder le fichier temporaire -o : pour spécifier le répertoire temporaire mirror Faire une copie en miroir d\u0026rsquo;un répertoire source spécifié vers un répertoire cible. (c\u0026rsquo;est l\u0026rsquo;équivalent de l\u0026rsquo;outil rsync).\nPar défaut, la source est distante et la cible est le répertoire local. Il faut utiliser l\u0026rsquo;option -R pour inverser la source et la cible ; ainsi le répertoire source sera le répertoire local et la cible sera le répertoire distant.\nSi le répertoire cible est omis, la base du nom du répertoire source sera utilisée. Si les deux sont omis, les répertoires courants local et distant seront utilisés.\nSi le répertoire cible termine avec un / (hormis le répertoire racine) alors la base du nom du répertoire source sera ajouté.\nLes options :\n-a : l\u0026rsquo;équivalent des options --allow-suid et --no-umask. -c, --continue : continue un job si possible -e, --delete : supprime les fichiers qui ne sont pas présent sur la source --delete-excluded : supprimera les fichiesr exclus sur la cible --delete-first : supprimera en premier les vieux fichiers avant de transférer les nouveaux --depth-first : descendra dans les sous répertoires avant de transférer les fichiers --scan-all-first : analysera tous les répertoires récursivement avant de transférer les fichiers -F, --directory= : fera une copie miroir du seul répertoire spécifié, ou selon un glob précis, tel /path/dir*. -f, --file= : fera une copie miroir du seul fichier spécifié, ou selon un glob précis, tel que /path/*.txt. -I GP, --include-glob=GP : inclue les fichiers correspondants au glob pattern. À-propos de GP, voir la note ci-dessous. -i RX, --include=RX : inclue les fichiers correspondants à l\u0026rsquo;expression régulière. À-propos de RX, voir la note ci-dessous. -L, --dereference : télécharge les liens symboliques comme étant des fichiers --no-overwrite : supprime d\u0026rsquo;abord les fichiers et les recréer ensuite --overwrite : ré-écrit les fichiers sans les supprimer en premier -O, --target-directory= : cible le chemin ou l\u0026rsquo;URL -N, --never-than= : téléchargera seulement les fichiers les plus récents selon une date spécifiée --older-than= : téléchargera seulement les fichiers anciens selon une date spécifiée --size-range= : téléchargera seulement les fichiers ayant telle taille -n, --only-newer : téléchargera seulement les fichiers les plus récents - dans ce cas, l\u0026rsquo;option -c ne fonctionnera pas. --upload-older : téléchargera sur la cible même les fichiers plus vieux que les actuels. --transfer-all : transférera tous les fichiers, même ceux qui ressemblent à ceux existant sur la cible. -P, --parallel : téléchargera N fichiers en même temps --loop : répétera le miroir jusqu\u0026rsquo;à ce que plus aucun changement ne soit trouvé --on-change= : exécutera la commande spécifiée lors d\u0026rsquo;un changement --use-pget : utilisera l\u0026rsquo;outil pget pour transférer chaque fichier -p, --no-perms : ne paramétrera pas les permissions de fichiers --no-umask : n\u0026rsquo;appliquera pas le mode umask -R, --reverse : inverse le miroir -r, --no-recursion : ne parcourra pas les sous répertoires --recursion= : parcourra les sous répertoires selon un mode choisi --no-symlinks : ne créera pas les liens symboliques -s, --allow-suid : paramétrera les bits suid et sgid selon la source --allow-chown : paramétrera les droits utilisateur et groupe sur les fichiers --ascii : utilisera le mode de transfert ascii - ce qui implique l\u0026rsquo;option --ignore-size. --ignore-size : ignore la taille --ignore-time : ignore l\u0026rsquo;heure de téléchargement --only-existing : téléchargera seulement les fichiers déjà existant sur la cible --only-missing : téléchargera seulement les fichiers non existant sur la cible. -v, --verbose : restitue les informations de manière verbeuse ; il est possible de spécifier un niveau, tel que =level. --log= : écrit le retour des commandes lftp exécutées dans le fichier journal spécifié --max-errors= : arrête l\u0026rsquo;exécution après N erreurs. --Move : identique à l\u0026rsquo;option --Remove-source-dirs. --Remove-source-dirs : supprime les répertoires et les fichiers sources après le transfert - à utiliser avec précaution ! --Remove-source-files : supprime les fichiers sources après le transfert - à utiliser avec précaution ! --script= : lis les commandes lftp depuis un fichier, sans les exécuter. Autres noms de l\u0026rsquo;option : --just-print, ou --dry-run. --skip-noaccess : ne pas essayer de transférer les fichiers qui n\u0026rsquo;ont pas d\u0026rsquo;accès en lecture. --use-cache : utilise une liste de répertoire mis en cache -X GP, --exclude-glob=GP : exclue les fichiers selon le pattern glob. À-propos de GP, voir la note ci-dessous. --exclude-glob-from=, --exclude-rx-from=, --include-glob-from=, --include-rx-from= : inclura ou exclura les fichiers selon le fichier renfermant l\u0026rsquo;expression régulière ou le glob pattern fourni - un par ligne. -x RX, --exclude=RX : exclue les fichiers selon l\u0026rsquo;expression régulière. À-propos de RX, voir la note ci-dessous. Notes :\nGP est un glob pattern à fournir, tel *.zip RX est une expression régulière à fournir sachez qu\u0026rsquo;il existe énormément de notes relatives à certaines options, pour plus d\u0026rsquo;informations, veuillez lire le manpage. Exemples SFTP Se connecter en ligne de commande :\n$ lftp -p $port sftp://$user@$address\n-p $port : est le numéro de port de connexion vers le serveur. Par défaut, pour SSH, c\u0026rsquo;est le 22, mais cela dépend de votre configuration serveur. $user : l\u0026rsquo;identifiant de connexion $adress : l\u0026rsquo;adresse ip ou le nom d\u0026rsquo;hôte FQDN du serveur sur lequel se connecter. Dans un script shell :\n/usr/local/bin/lftp -p $port sftp://$user@$host\nUne des fonctionnalités intéressantes est le fait de pouvoir faire du \u0026ldquo;mirroring\u0026rdquo; - de la copie en miroir d\u0026rsquo;un ensemble de fichiers, répertoires vers un autre endroit ; l\u0026rsquo;équivalent de rsync -\nMirroring par SFTP $ lftp -e \u0026quot;mirror -e -R /repertoire_local/ /repertoire_distant/ ; quit\u0026quot; -p $port sftp://$user@$host\nDocumentation le manpage : man ltfp le site web : https://lftp.tech/ Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003elftp\u003c/strong\u003e  est un outil en ligne de commande, qui permet de transférer\ndes fichiers. Il supporte les protocoles Bittorent, FISH, FTP, FTPS,\nHTTP, HTTPS, SFTP  et a un support partiel pour WebDAV. IPv(4|6).\u003c/p\u003e\n\u003cp\u003eSes fonctionnalités sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela reconnexion automatique et la possibilité de ré-essai après erreurs\nou timeout\u003c/li\u003e\n\u003cli\u003epréservation de l\u0026rsquo;heure de modification\u003c/li\u003e\n\u003cli\u003emirroring, reverse mirroring, re-get, re-put\u003c/li\u003e\n\u003cli\u003emise en file d\u0026rsquo;attente par job, multiplier les transferts en tâche de\nfond\u003c/li\u003e\n\u003cli\u003egestion de \u0026ldquo;bookmarks\u0026rdquo; et d\u0026rsquo;alias\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003elftp\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eEn tant que client CLI, il peut autant s\u0026rsquo;utiliser dans une ligne de\ncommande que dans un script sh.\u003c/p\u003e\n\u003ch3 id=\"options\"\u003eOptions\u003c/h3\u003e\n\u003cp\u003eLes options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-c\u003c/code\u003e : suivi d\u0026rsquo;un ensemble de commandes et quitte\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-d\u003c/code\u003e : le mode de déboguage\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-e\u003c/code\u003e : suivi d\u0026rsquo;un ensemble de commandes et ne quitte pas\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-f\u003c/code\u003e : suivi d\u0026rsquo;un nom de fichier, permet d\u0026rsquo;exécuter les commandes dans\nce fichier et quitte. Cette option \u003cstrong\u003eDOIT\u003c/strong\u003e s\u0026rsquo;utiliser toute seule,\nsans aucun autre argument (sauf \u003ccode\u003e--norc\u003c/code\u003e).\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--norc\u003c/code\u003e : ne pas exécuter les fichiers rc depuis votre répertoire $HOME.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e : spécifie le numéro de port sur lequel se connecter\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--rcfile\u003c/code\u003e : suivi d\u0026rsquo;un nom de fichier, permet d\u0026rsquo;exécuter un ensemble\nde commandes dans ce fichier et d\u0026rsquo;être exécuté plusieurs fois.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-u\u003c/code\u003e : permet de spécifier le couple d\u0026rsquo;identification utilisateur +\nmot de passe. Il est recommandé d\u0026rsquo;utiliser le fichier \u003ccode\u003e~/.netrc\u003c/code\u003e dans\nlequel préciser le mot de passe, plutôt que dans la ligne de commande,\nou par le biais de la variable d\u0026rsquo;environnement \u003ccode\u003eLFTP_PASSWORD\u003c/code\u003e qui\nsera ensuite appelée par l\u0026rsquo;option \u003ccode\u003e--env-password\u003c/code\u003e. De manière\nalternative, il est possible d\u0026rsquo;utiliser une connexion SSH par\nauthentification par clé autorisée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"variables-denvironnement\"\u003eVariables d\u0026rsquo;environnement\u003c/h3\u003e\n\u003cp\u003eSi les variables d\u0026rsquo;environnement suivantes sont précisées avant l\u0026rsquo;appel\nsystème, \u003cstrong\u003elftp\u003c/strong\u003e est/sera capable de les utiliser :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eEDITOR\u003c/code\u003e : l\u0026rsquo;éditeur de texte qui sera appelé lors de l\u0026rsquo;usage de la\ncommande \u003ccode\u003eedit\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eHOME\u003c/code\u003e : le répertoire personnel local\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLFTP_HOME\u003c/code\u003e : utilisée pour localiser le répertoire des fichiers de\nconfigurations locaux spécifiques à l\u0026rsquo;utilisateur.\n\u003cul\u003e\n\u003cli\u003ePar défaut, sans spécification, il sera utilisé \u003ccode\u003e~/.lftp\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLFTP_MODULE_PATH\u003c/code\u003e : initialise la variable \u003ccode\u003emodule:path\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLFTP_PASSWORD\u003c/code\u003e : utilisée par l\u0026rsquo;argument \u003ccode\u003eopen\u003c/code\u003e lors de l\u0026rsquo;usage de\nl\u0026rsquo;option \u003ccode\u003e--env-password\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eLS_COLORS\u003c/code\u003e : permet de paramétrer la variable \u003ccode\u003ecolor:dir-colors\u003c/code\u003e qui\najoutera des couleurs.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ePAGER\u003c/code\u003e : le nom du pager à utiliser lors de l\u0026rsquo;usage des commandes\n\u003ccode\u003emore\u003c/code\u003e et \u003ccode\u003ezmore\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSHELL\u003c/code\u003e : utilisée par la commande \u003ccode\u003e!\u003c/code\u003e pour déterminer quel shell utiliser\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eXDG_CONFIG_HOME\u003c/code\u003e, \u003ccode\u003eXDG_DATA_HOME\u003c/code\u003e, \u003ccode\u003eXDG_CACHE_HOME\u003c/code\u003e : utilisée pour\nlocaliser les répertoires spécifiques utilisateur si \u003ccode\u003e~/.lftp\u003c/code\u003e ou la\nvariable d\u0026rsquo;environnement \u003ccode\u003eLFTP_HOME\u003c/code\u003e ne sont pas précisés.\n\u003cul\u003e\n\u003cli\u003ePar défaut, il sera recherché respectivement \u003ccode\u003e~/.cache\u003c/code\u003e, \u003ccode\u003e~/.config\u003c/code\u003e,\n\u003ccode\u003e~/.local/share\u003c/code\u003e. Il sera ajouté le préfixe \u003ccode\u003e/lftp\u003c/code\u003e pour restituer\nle chemin absolu du répertoire en question.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eftp_proxy\u003c/code\u003e : initialise la variable pour le mandataire FTP\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehttp_proxy\u003c/code\u003e, \u003ccode\u003ehttps_proxy\u003c/code\u003e : initialise les variables pour les\nmandataires HTTP(S)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eno_proxy\u003c/code\u003e : initialise la variable \u003ccode\u003enet:no_proxy\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"les-commandes\"\u003eLes commandes\u003c/h3\u003e\n\u003cp\u003ell existe énormément de commandes utilisables avec \u003cstrong\u003elftp\u003c/strong\u003e ; veuillez\nlire le manpage ; seules certaines seront précisées ici sur cette page :\u003c/p\u003e\n\u003ch4 id=\"heading\"\u003e!\u003c/h4\u003e\n\u003cp\u003eCette commande spéciale \u003ccode\u003e!\u003c/code\u003e exécute un shell suivi d\u0026rsquo;une autre commande\u003c/p\u003e\n\u003ch4 id=\"alias\"\u003ealias\u003c/h4\u003e\n\u003cp\u003ePour définir un nom d\u0026rsquo;alias ; c\u0026rsquo;est le même principe que les alias de shell\u003c/p\u003e\n\u003ch4 id=\"at\"\u003eat\u003c/h4\u003e\n\u003cp\u003eExécutera une commande au moment donné. Voir le manpage\n\u003ca href=\"https://man.openbsd.org/at\" rel=\"external\"\u003eat(1)\u003c/a\u003e.\u003c/p\u003e\n\u003ch4 id=\"edit\"\u003eedit\u003c/h4\u003e\n\u003cp\u003ePermettra l\u0026rsquo;édition d\u0026rsquo;un fichier distant par le biais de l\u0026rsquo;éditeur texte\nspécifié. Dans les faits, \u003cstrong\u003elftp\u003c/strong\u003e récupérera le fichier vers un répertoire\ntemporaire local, exécutera l\u0026rsquo;éditeur de texte local et téléversera sur\nle serveur le fichier.\u003c/p\u003e\n\u003cp\u003eLes options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-k\u003c/code\u003e : pour garder le fichier temporaire\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-o\u003c/code\u003e : pour spécifier le répertoire temporaire\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"mirror\"\u003emirror\u003c/h4\u003e\n\u003cp\u003eFaire une copie en miroir d\u0026rsquo;un répertoire source spécifié vers un\nrépertoire cible. \u003cem\u003e(c\u0026rsquo;est l\u0026rsquo;équivalent de l\u0026rsquo;outil \u003ccode\u003ersync\u003c/code\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003ePar défaut, la source est distante et la cible est le répertoire local.\nIl faut utiliser l\u0026rsquo;option \u003ccode\u003e-R\u003c/code\u003e pour inverser la source et la cible ;\nainsi le répertoire source sera le répertoire local et la cible sera le\nrépertoire distant.\u003c/p\u003e\n\u003cp\u003eSi le répertoire cible est omis, la base du nom du répertoire source sera utilisée. \u003cbr\u003e\nSi les deux sont omis, les répertoires courants local et distant seront utilisés.\u003c/p\u003e\n\u003cp\u003eSi le répertoire cible termine avec un \u003ccode\u003e/\u003c/code\u003e \u003cem\u003e(hormis le répertoire racine)\u003c/em\u003e\nalors la base du nom du répertoire source sera ajouté.\u003c/p\u003e\n\u003cp\u003eLes options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-a\u003c/code\u003e : l\u0026rsquo;équivalent des options \u003ccode\u003e--allow-suid\u003c/code\u003e et \u003ccode\u003e--no-umask\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-c\u003c/code\u003e, \u003ccode\u003e--continue\u003c/code\u003e : continue un job si possible\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-e\u003c/code\u003e, \u003ccode\u003e--delete\u003c/code\u003e : supprime les fichiers qui ne sont pas présent sur\nla source\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--delete-excluded\u003c/code\u003e : supprimera les fichiesr exclus sur la cible\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--delete-first\u003c/code\u003e : supprimera en premier les vieux fichiers avant de\ntransférer les nouveaux\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--depth-first\u003c/code\u003e : descendra dans les sous répertoires avant de\ntransférer les fichiers\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--scan-all-first\u003c/code\u003e : analysera tous les répertoires récursivement\navant de transférer les fichiers\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-F\u003c/code\u003e, \u003ccode\u003e--directory=\u003c/code\u003e : fera une copie miroir du seul répertoire\nspécifié, ou selon un glob précis, tel \u003ccode\u003e/path/dir*\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-f\u003c/code\u003e, \u003ccode\u003e--file=\u003c/code\u003e : fera une copie miroir du seul fichier spécifié, ou\nselon un glob précis, tel que \u003ccode\u003e/path/*.txt\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-I GP\u003c/code\u003e, \u003ccode\u003e--include-glob=GP\u003c/code\u003e : inclue les fichiers correspondants au\nglob pattern. À-propos de \u003ccode\u003eGP\u003c/code\u003e, voir la note ci-dessous.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-i RX\u003c/code\u003e, \u003ccode\u003e--include=RX\u003c/code\u003e : inclue les fichiers correspondants à\nl\u0026rsquo;expression régulière. À-propos de \u003ccode\u003eRX\u003c/code\u003e, voir la note ci-dessous.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-L\u003c/code\u003e, \u003ccode\u003e--dereference\u003c/code\u003e : télécharge les liens symboliques comme étant\ndes fichiers\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--no-overwrite\u003c/code\u003e : supprime d\u0026rsquo;abord les fichiers et les recréer ensuite\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--overwrite\u003c/code\u003e : ré-écrit les fichiers sans les supprimer en premier\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-O\u003c/code\u003e, \u003ccode\u003e--target-directory=\u003c/code\u003e : cible le chemin ou l\u0026rsquo;URL\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-N\u003c/code\u003e, \u003ccode\u003e--never-than=\u003c/code\u003e : téléchargera seulement les fichiers les plus\nrécents selon une date spécifiée\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--older-than=\u003c/code\u003e : téléchargera seulement les fichiers  anciens selon\nune date spécifiée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--size-range=\u003c/code\u003e : téléchargera seulement les fichiers ayant telle taille\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-n\u003c/code\u003e, \u003ccode\u003e--only-newer\u003c/code\u003e : téléchargera seulement les fichiers les plus\nrécents - dans ce cas, l\u0026rsquo;option \u003ccode\u003e-c\u003c/code\u003e ne fonctionnera pas.\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--upload-older\u003c/code\u003e : téléchargera sur la cible même les fichiers plus\nvieux que les actuels.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--transfer-all\u003c/code\u003e : transférera tous les fichiers, même ceux qui\nressemblent à ceux existant sur la cible.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-P\u003c/code\u003e, \u003ccode\u003e--parallel\u003c/code\u003e : téléchargera N fichiers en même temps\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--loop\u003c/code\u003e : répétera le miroir jusqu\u0026rsquo;à ce que plus aucun changement\nne soit trouvé\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--on-change=\u003c/code\u003e : exécutera la commande spécifiée lors d\u0026rsquo;un changement\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--use-pget\u003c/code\u003e : utilisera l\u0026rsquo;outil \u003ccode\u003epget\u003c/code\u003e pour transférer chaque fichier\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e, \u003ccode\u003e--no-perms\u003c/code\u003e : ne paramétrera pas les permissions de fichiers\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--no-umask\u003c/code\u003e : n\u0026rsquo;appliquera pas le mode umask\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-R\u003c/code\u003e, \u003ccode\u003e--reverse\u003c/code\u003e : inverse le miroir\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-r\u003c/code\u003e, \u003ccode\u003e--no-recursion\u003c/code\u003e : ne parcourra pas les sous répertoires\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--recursion=\u003c/code\u003e : parcourra les sous répertoires selon un mode choisi\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--no-symlinks\u003c/code\u003e : ne créera pas les liens symboliques\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-s\u003c/code\u003e, \u003ccode\u003e--allow-suid\u003c/code\u003e : paramétrera les bits \u003ccode\u003esuid\u003c/code\u003e et \u003ccode\u003esgid\u003c/code\u003e selon\nla source\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--allow-chown\u003c/code\u003e : paramétrera les droits utilisateur et groupe sur\nles fichiers\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--ascii\u003c/code\u003e : utilisera le mode de transfert \u003ccode\u003eascii\u003c/code\u003e - ce qui implique\nl\u0026rsquo;option \u003ccode\u003e--ignore-size\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--ignore-size\u003c/code\u003e : ignore la taille\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--ignore-time\u003c/code\u003e : ignore l\u0026rsquo;heure de téléchargement\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--only-existing\u003c/code\u003e : téléchargera seulement les fichiers déjà existant\nsur la cible\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--only-missing\u003c/code\u003e : téléchargera seulement les fichiers non existant\nsur la cible.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-v\u003c/code\u003e, \u003ccode\u003e--verbose\u003c/code\u003e : restitue les informations de manière verbeuse ; il\nest possible de spécifier un niveau, tel que \u003ccode\u003e=level\u003c/code\u003e.\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--log=\u003c/code\u003e : écrit le retour des commandes \u003cstrong\u003elftp\u003c/strong\u003e exécutées dans le\nfichier journal spécifié\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--max-errors=\u003c/code\u003e : arrête l\u0026rsquo;exécution après N erreurs.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--Move\u003c/code\u003e : identique à l\u0026rsquo;option \u003ccode\u003e--Remove-source-dirs\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--Remove-source-dirs\u003c/code\u003e : supprime les répertoires et les fichiers\nsources après le transfert - à utiliser avec précaution !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--Remove-source-files\u003c/code\u003e : supprime les fichiers sources après le\ntransfert - à utiliser avec précaution !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--script=\u003c/code\u003e : lis les commandes \u003cstrong\u003elftp\u003c/strong\u003e depuis un fichier, sans les\nexécuter. Autres noms de l\u0026rsquo;option : \u003ccode\u003e--just-print\u003c/code\u003e, ou \u003ccode\u003e--dry-run\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--skip-noaccess\u003c/code\u003e : ne pas essayer de transférer les fichiers qui\nn\u0026rsquo;ont pas d\u0026rsquo;accès en lecture.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--use-cache\u003c/code\u003e : utilise une liste de répertoire mis en cache\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-X GP\u003c/code\u003e, \u003ccode\u003e--exclude-glob=GP\u003c/code\u003e : exclue les fichiers selon le pattern\nglob. À-propos de \u003ccode\u003eGP\u003c/code\u003e, voir la note ci-dessous.\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--exclude-glob-from=\u003c/code\u003e, \u003ccode\u003e--exclude-rx-from=\u003c/code\u003e, \u003ccode\u003e--include-glob-from=\u003c/code\u003e,\n\u003ccode\u003e--include-rx-from=\u003c/code\u003e : inclura ou exclura les fichiers selon le\nfichier renfermant l\u0026rsquo;expression régulière ou le glob pattern\nfourni - un par ligne.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-x RX\u003c/code\u003e, \u003ccode\u003e--exclude=RX\u003c/code\u003e : exclue les fichiers selon l\u0026rsquo;expression\nrégulière. À-propos de \u003ccode\u003eRX\u003c/code\u003e, voir la note ci-dessous.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNotes  :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eGP\u003c/code\u003e est un glob pattern à fournir, tel \u003ccode\u003e*.zip\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eRX\u003c/code\u003e est une expression régulière à fournir\u003c/li\u003e\n\u003cli\u003esachez qu\u0026rsquo;il existe énormément de notes relatives à certaines options,\npour plus d\u0026rsquo;informations, veuillez lire le manpage.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003ch3 id=\"sftp\"\u003eSFTP\u003c/h3\u003e\n\u003cp\u003eSe connecter en ligne de commande :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ lftp -p $port sftp://$user@$address\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-p $port\u003c/code\u003e : est le numéro de port de connexion vers le serveur.\n\u003cul\u003e\n\u003cli\u003ePar défaut, pour \u003cstrong\u003eSSH\u003c/strong\u003e, c\u0026rsquo;est le \u003ccode\u003e22\u003c/code\u003e, mais cela dépend de votre\nconfiguration serveur.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$user\u003c/code\u003e : l\u0026rsquo;identifiant de connexion\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e$adress\u003c/code\u003e : l\u0026rsquo;adresse ip ou le nom d\u0026rsquo;hôte FQDN du serveur sur lequel\nse connecter.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans un script shell :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e/usr/local/bin/lftp -p $port sftp://$user@$host\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUne des fonctionnalités intéressantes est le fait de pouvoir faire du\n\u0026ldquo;mirroring\u0026rdquo; - \u003cem\u003ede la copie en miroir d\u0026rsquo;un ensemble de fichiers,\nrépertoires vers un autre endroit ; l\u0026rsquo;équivalent de rsync\u003c/em\u003e -\u003c/p\u003e\n\u003ch4 id=\"mirroring-par-sftp\"\u003eMirroring par SFTP\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003e$ lftp -e \u0026quot;mirror -e -R /repertoire_local/ /repertoire_distant/ ; quit\u0026quot; -p $port sftp://$user@$host\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele manpage : \u003ccode\u003eman ltfp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ele site web : \u003ca href=\"https://lftp.tech/\" rel=\"external\"\u003ehttps://lftp.tech/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le client (s)ftp, en mode console/terminal, nommé lftp, sous OpenBSD",
            "tags": ["OpenBSD", "lftp"],
            "date_published": "2020-01-19T17:56:42+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:abd38680-ffd8-a1bb-1b95-33bb37a8b624",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/gajim/",
            "title": "Gajim",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Gajim est un client Jabber, messagerie de communication presque instantanée, écrit en Python-GTK.\nSite officiel : https://gajim.org Site développement des plugins : https://dev.gajim.org/gajim/gajim-plugins Disponible : à partir d\u0026rsquo;OpenBSD 6.2\nInstallation installez le paquet gajim.\nPlugins Pour installer un ou plusieurs plugins, il y a :\nla manière officielle au-travers du gestionnaire de plugins, menu Édition \u0026gt; Plugins l\u0026rsquo;autre manière étant de les télécharger à partir du site github de développement des plugins, et de les installer dans votre répertoire personnel local ~/.local/share/gajim/plugins/ vous pouvez le faire en clonant le dépôt git : git clone https://dev.gajim.org/gajim/gajim-plugins.git Configuration Ci-dessous sera abordé les quelques plugins pour communiquer de manière sécurisée avec un interlocuteur.\nAttentionCes méthodes sont dites expérimentales ! OMEMO Le protocole de chiffrement OMEMO est basé sur les protocoles de chiffrement X3DH (génération de clés cryptographiques asymétriques, basées soit sur XEd25519, ou XEd448 ; le protocole XEdDSA est simplement une variante du protocole EdDSA) + \u0026ldquo;Double Rachet\u0026rdquo; (protocole d\u0026rsquo;échange et de maintenance des clés et autres informations secrètes).\nOMEMO chiffre les messages en employant AES256+GCM !\nLes informations concernant le plugin OMEMO pour Gajim sont disponibles depuis le wiki du git : https://dev.gajim.org/gajim/gajim-plugins/wikis/OmemoGajimPlugin\nAttentionPour pouvoir utiliser OMEMO, il est nécessaire d\u0026rsquo;avoir une version de Gajim ≥ 0.16.6 ; ce qui est le cas depuis OpenBSD 6.0 ! À noter qu\u0026rsquo;à partir d\u0026rsquo;OpenBSD 6.9, il est possible (et préférable) d\u0026rsquo;installer les paquets pour les ajouter :\npy3-cryptography py3-axolotl py3-qrcode py3-Pillow py3-future\nAutrement, pour Python 2.x, une fois le plugin téléchargé et installé dans votre répertoire personnel, en tant qu\u0026rsquo;administrateur :\nVérifiez que le paquet py-cryptography soit installé normalement, il l\u0026rsquo;est en tant que dépendance de gajim ! il est nécessaire en plus d\u0026rsquo;installer par le bais de pip certains modules supplémentaires, autrement les fonctionnalités liés à OMEMO ne pourraient être utilisées. # python -m pip install python-axolotl qrcode pillow future Ceci étant fait, ouvrez votre client Gajim, allez dans le menu Édition \u0026gt; Plugins. Activez le plugin dans l\u0026rsquo;onglet \u0026ldquo;Installé\u0026rdquo;… puis cliquer sur le bouton [ Configurer ] qui vous permettra de générer une empreinte, pour la transmettre à un tiers, et aussi de gérer celles de vos contacts !\nOTR AttentionLes informations concernant le plugin OTR - Off-the-Record - pour Gajim sont disponibles depuis le wiki du git : https://dev.gajim.org/gajim/gajim-plugins/wikis/OffTheRecordPlugin\nL\u0026rsquo;auteur du plugin avertit qu\u0026rsquo;à cause de bogues dans le plugin qui restranscrit en text clair, il est préférable d\u0026rsquo;utiliser soit OMEMO, soit PGP !\nDe plus, le plugin ne fonctionnera pas si la version de Gajim est \u0026gt;= 1.0, car il n\u0026rsquo;a pas été migré vers Python 3.x, et n\u0026rsquo;est pas planifié.\nOpenBSD ≤ 6.4 Ceci étant fait, ouvrez votre client Gajim, allez dans le menu Édition \u0026gt; Plugins. Activez le plugin dans l\u0026rsquo;onglet \u0026ldquo;Installé\u0026rdquo;… puis cliquer sur le bouton [ Configurer ] qui vous permettra de générer une empreinte, pour la transmettre à un tiers, et aussi de gérer celles de vos contacts !\nPGP Les informations concernant le plugin PGP - pour Gajim sont disponibles depuis le wiki du git : https://dev.gajim.org/gajim/gajim-plugins/wikis/pgpplugin\nUne fois le plugin téléchargé et installé dans votre répertoire personnel, en tant qu\u0026rsquo;administrateur :\nVérifiez que le paquet py-gnupg soit installé normalement, il est installé en tant que dépendance de gajim ! Documentation ANSSI - Chiffrement de messagerie quasi instantanée : à quel protocole se vouer ? : fichier pdf LinuxFR : ChatSecure 4.0 ronronne et adopte OMEMO Historique J\u0026rsquo;ai écrit historiquement de manière collaborative cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://gajim.org\" rel=\"external\"\u003eGajim\u003c/a\u003e\u003c/strong\u003e est un client Jabber, messagerie de\ncommunication presque instantanée, écrit en Python-GTK.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite officiel : \u003ca href=\"https://gajim.org\" rel=\"external\"\u003ehttps://gajim.org\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSite développement des plugins : \u003ca href=\"https://dev.gajim.org/gajim/gajim-plugins\" rel=\"external\"\u003ehttps://dev.gajim.org/gajim/gajim-plugins\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDisponible : à partir d\u0026rsquo;OpenBSD 6.2\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003egajim\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"plugins\"\u003ePlugins\u003c/h3\u003e\n\u003cp\u003ePour installer un ou plusieurs plugins, il y a :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela manière officielle au-travers du gestionnaire de plugins, menu\n\u003cstrong\u003eÉ\u003cu\u003ed\u003c/u\u003eition \u0026gt; P\u003cu\u003el\u003c/u\u003eugins\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;autre manière étant de les télécharger à partir du site github de\ndéveloppement des plugins, et de les installer dans votre répertoire\npersonnel local \u003cbr\u003e\n\u003ccode\u003e~/.local/share/gajim/plugins/\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003evous pouvez le faire en clonant le dépôt git : \u003cbr\u003e\n\u003ccode\u003egit clone https://dev.gajim.org/gajim/gajim-plugins.git\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eCi-dessous sera abordé les quelques plugins pour communiquer de manière\nsécurisée avec un interlocuteur.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCes méthodes sont dites expérimentales !\u003c/div\u003e\n\n\u003ch3 id=\"omemo\"\u003eOMEMO\u003c/h3\u003e\n\u003cp\u003eLe protocole de chiffrement \u003cstrong\u003e\u003ca href=\"https://conversations.im/omemo/\" rel=\"external\"\u003eOMEMO\u003c/a\u003e\u003c/strong\u003e\nest basé sur les protocoles de chiffrement X3DH \u003cem\u003e(génération de clés\ncryptographiques asymétriques, basées soit sur XEd25519, ou XEd448 ; le\nprotocole XEdDSA est simplement une variante du protocole EdDSA)\u003c/em\u003e +\n\u0026ldquo;Double Rachet\u0026rdquo; \u003cem\u003e(protocole d\u0026rsquo;échange et de maintenance des clés et\nautres informations secrètes)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eOMEMO chiffre les messages en employant AES256+GCM !\u003c/p\u003e\n\u003cp\u003eLes informations concernant le plugin OMEMO pour Gajim sont disponibles\ndepuis le wiki du git : \u003cbr\u003e\n\u003ca href=\"https://dev.gajim.org/gajim/gajim-plugins/wikis/OmemoGajimPlugin\" rel=\"external\"\u003ehttps://dev.gajim.org/gajim/gajim-plugins/wikis/OmemoGajimPlugin\u003c/a\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003ePour pouvoir utiliser OMEMO, il est nécessaire d\u0026rsquo;avoir une version de\nGajim ≥ 0.16.6 ; ce qui est le cas depuis OpenBSD 6.0 !\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eÀ noter qu\u0026rsquo;à partir d\u0026rsquo;OpenBSD 6.9, il est possible (et préférable)\nd\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n les\npaquets pour les ajouter :\u003cbr\u003e\n\u003ccode\u003epy3-cryptography py3-axolotl py3-qrcode py3-Pillow py3-future\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAutrement, pour Python 2.x, une fois le plugin téléchargé et installé\ndans votre répertoire personnel, en tant qu\u0026rsquo;administrateur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVérifiez que le paquet \u003ccode\u003epy-cryptography\u003c/code\u003e soit \u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallé\u003c/a\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003enormalement, il l\u0026rsquo;est en tant que dépendance de gajim !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eil est nécessaire en plus d\u0026rsquo;installer par le bais de \u003ccode\u003epip\u003c/code\u003e certains\nmodules supplémentaires, autrement les fonctionnalités liés à OMEMO\nne pourraient être utilisées. \u003cbr\u003e\n\u003ccode\u003e# python -m pip install python-axolotl qrcode pillow future\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eCeci étant fait, ouvrez votre client Gajim, allez dans le menu\n\u003cstrong\u003eÉdition \u0026gt; Plugins\u003c/strong\u003e. Activez le plugin dans l\u0026rsquo;onglet \u0026ldquo;Installé\u0026rdquo;… puis\ncliquer sur le bouton [ Configurer ] qui vous permettra de générer une\nempreinte, pour la transmettre à un tiers, et aussi de gérer celles de\nvos contacts !\u003c/p\u003e\n\u003ch3 id=\"otr\"\u003eOTR\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eLes informations concernant le plugin \u003cstrong\u003e\u003ca href=\"https://otr.cypherpunks.ca/\" rel=\"external\"\u003eOTR\u003c/a\u003e -\nOff-the-Record\u003c/strong\u003e - pour Gajim sont disponibles depuis le wiki du git : \u003cbr\u003e\n\u003ca href=\"https://dev.gajim.org/gajim/gajim-plugins/wikis/OffTheRecordPlugin\" rel=\"external\"\u003ehttps://dev.gajim.org/gajim/gajim-plugins/wikis/OffTheRecordPlugin\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;auteur du plugin avertit qu\u0026rsquo;à cause de bogues dans le plugin qui\nrestranscrit en text clair, il est préférable d\u0026rsquo;utiliser soit OMEMO, soit\nPGP !\u003c/p\u003e\n\u003cp\u003eDe plus, le plugin ne fonctionnera pas si la version de Gajim est \u0026gt;= 1.0,\ncar il n\u0026rsquo;a pas été migré vers Python 3.x, et n\u0026rsquo;est pas planifié.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"openbsd--64\"\u003eOpenBSD ≤ 6.4\u003c/h4\u003e\n\u003cp\u003eCeci étant fait, ouvrez votre client Gajim, allez dans le menu\n\u003cstrong\u003eÉdition \u0026gt; Plugins\u003c/strong\u003e. Activez le plugin dans l\u0026rsquo;onglet \u0026ldquo;Installé\u0026rdquo;… puis\ncliquer sur le bouton [ Configurer ] qui vous permettra de générer une\nempreinte, pour la transmettre à un tiers, et aussi de gérer celles de\nvos contacts !\u003c/p\u003e\n\u003ch3 id=\"pgp\"\u003ePGP\u003c/h3\u003e\n\u003cp\u003eLes informations concernant le plugin \u003cstrong\u003ePGP\u003c/strong\u003e - pour Gajim sont\ndisponibles depuis le wiki du git : \u003cbr\u003e\n\u003ca href=\"https://dev.gajim.org/gajim/gajim-plugins/wikis/pgpplugin\" rel=\"external\"\u003ehttps://dev.gajim.org/gajim/gajim-plugins/wikis/pgpplugin\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eUne fois le plugin téléchargé et installé dans votre répertoire personnel,\nen tant qu\u0026rsquo;administrateur :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVérifiez que le paquet \u003ccode\u003epy-gnupg\u003c/code\u003e soit \u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallé\u003c/a\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003enormalement, il est installé en tant que dépendance de gajim !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eANSSI - \u003cstrong\u003eChiffrement de messagerie quasi instantanée : à quel protocole se vouer ?\u003c/strong\u003e :\nfichier \u003ca href=\"https://www.ssi.gouv.fr/uploads/2017/10/chiffrement_messagerie_instantanee_fmaury_anssi.pdf\" rel=\"external\"\u003epdf\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLinuxFR : \u003ca href=\"https://linuxfr.org/news/chatsecure-4-0-ronronne-et-adopte-omemo\" rel=\"external\"\u003eChatSecure 4.0 ronronne et adopte OMEMO\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement de manière collaborative cette documentation\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le client Jabber, nommé Gajim, sous OpenBSD",
            "tags": ["OpenBSD", "Gajim"],
            "date_published": "2020-01-19T17:36:16+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:d4b60d1e-5663-8806-3791-60a57a1044f8",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/filezilla/",
            "title": "FileZilla",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description FileZilla est un client FTP puissant. Il est conçu pour être facile à utiliser et prenant en charge autant de fonctionnalités que possible, tout en s\u0026rsquo;efforçant d\u0026rsquo;être rapide et fiable.\nLes fonctionnalités principales de FileZilla sont :\nla capacité à reprendre des téléchargements ou téléversements (si le serveur le supporte). des commandes personnalisées. un gestionnaire de site par répertoires. Système Keep Alive Détection des Timeout Gestion des pare-feux Prise en charge des SOCKS4 et 5 et du proxy HTTP1.1 Connexions sécurisées par SSL Prise en charge de SFTP Queues de téléchargement et téléversement Glisser et Déposer Prise en charge multi-langues Installation installez le paquet filezilla.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.filezilla-project.org/\" rel=\"external\"\u003eFileZilla\u003c/a\u003e\u003c/strong\u003e est un client FTP puissant.\nIl est conçu pour être facile à utiliser et prenant en charge autant de\nfonctionnalités que possible, tout en s\u0026rsquo;efforçant d\u0026rsquo;être rapide et fiable.\u003c/p\u003e\n\u003cp\u003eLes fonctionnalités principales de FileZilla sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela capacité à reprendre des téléchargements ou téléversements (si le\nserveur le supporte).\u003c/li\u003e\n\u003cli\u003edes commandes personnalisées.\u003c/li\u003e\n\u003cli\u003eun gestionnaire de site par répertoires.\u003c/li\u003e\n\u003cli\u003eSystème Keep Alive\u003c/li\u003e\n\u003cli\u003eDétection des Timeout\u003c/li\u003e\n\u003cli\u003eGestion des pare-feux\u003c/li\u003e\n\u003cli\u003ePrise en charge des SOCKS4 et 5 et du proxy HTTP1.1\u003c/li\u003e\n\u003cli\u003eConnexions sécurisées par SSL\u003c/li\u003e\n\u003cli\u003ePrise en charge de SFTP\u003c/li\u003e\n\u003cli\u003eQueues de téléchargement et téléversement\u003c/li\u003e\n\u003cli\u003eGlisser et Déposer\u003c/li\u003e\n\u003cli\u003ePrise en charge multi-langues\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003efilezilla\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le puissant client FTP, nommé FileZilla, sous OpenBSD",
            "tags": ["OpenBSD", "FileZilla"],
            "date_published": "2020-01-19T17:32:14+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:74510daf-8d96-28df-8fbe-bd1d7ca5957f",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/avahi/",
            "title": "Avahi (Découverte de services multicast DNS)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Avahi est une implémentation libre, conforme au standard des protocoles Multicast DNS (mDNS) et DNS-SD gérés par Zeroconf.\nC\u0026rsquo;est un système qui facilite la découverte de services sur un réseau local. Cela signifie que vous pouvez connecter votre portable ou ordinateur sur un réseau et qu\u0026rsquo;il soit capable instantanément de voir les autres personnes avec qui vous pouvez discuter, trouver les imprimantes, ou les fichiers partagés. L\u0026rsquo;esprit de cette technologie est toujours trouvé dans l\u0026rsquo;Apple MacOS X (sous la marque Rendezvous, Bonjour et parfois Zeroconf) et est très pratique.\nInstallation installez le paquet avahi.\nConfiguration Il faut :\nActiver les services multicast avahi_daemon\nsi messagebus n\u0026rsquo;est pas activé, pensez à le faire ! que le sous-système wide D-BUS soit impérativement démarré en premier : messagebus avahi_daemon\npuis démarrez les services services relatifs : avahi_daemon\nRègles PF AttentionLes règles PF énoncées ci-dessous sont à adapter à votre besoin ! Voici les règles pare-feu si besoin :\npour le trafic mDNS : pass proto udp from any to 224.0.0.251 port mdns allow-opts pass inet6 proto udp from any to ff02::fb port mdns allow-opts pour le trafic SSDP : pour IPv6 : ff02::c est l\u0026rsquo;adresse multicast de lien local ff05::c est l\u0026rsquo;adresse multicast de site local ff08::c est l\u0026rsquo;adresse multicast d\u0026rsquo;organisation local il existe aussi ff0e::c pour l\u0026rsquo;adresse multicast global - //que nous n\u0026rsquo;utiliserons pas dans le contexte local// ! pass proto udp from any to 239.255.255.250 port ssdp allow-opts pass inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port ssdp allow-opts Documentation Après l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/avahi !\nVous pouvez lire des exemples dans /usr/local/share/examples/avahi/.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.avahi.org/\" rel=\"external\"\u003eAvahi\u003c/a\u003e\u003c/strong\u003e est une implémentation libre, conforme\nau standard des protocoles Multicast DNS (mDNS) et DNS-SD gérés par\nZeroconf.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est un système qui facilite la découverte de services sur un réseau\nlocal. Cela signifie que vous pouvez connecter votre portable ou\nordinateur sur un réseau et qu\u0026rsquo;il soit capable instantanément de voir\nles autres personnes avec qui vous pouvez discuter, trouver les\nimprimantes, ou les fichiers partagés. L\u0026rsquo;esprit de cette technologie est\ntoujours trouvé dans l\u0026rsquo;Apple MacOS X (sous la marque Rendezvous, Bonjour\net parfois Zeroconf) et est très pratique.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003eavahi\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eIl faut :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eActiver les services\u003c/a\u003e\n\n\u003ccode\u003emulticast avahi_daemon\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003esi \u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/consolekit/\" title=\"Lien interne vers l\u0026#39;article : 'Consolekit2 (bus de messages) / OpenBSD'\"\u003emessagebus\u003c/a\u003e\n\u003c/code\u003e\nn\u0026rsquo;est pas activé, pensez à le faire !\u003c/span\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eque le sous-système wide D-BUS soit\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#ordonner\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eimpérativement démarré en premier\u003c/a\u003e\n :\n\u003ccode\u003emessagebus avahi_daemon\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003epuis \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003edémarrez les services\u003c/a\u003e\n\nservices relatifs : \u003ccode\u003eavahi_daemon\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"règles-pf\"\u003eRègles PF\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eLes règles PF énoncées ci-dessous sont à adapter à votre besoin !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003eVoici les règles pare-feu si besoin :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour le trafic mDNS :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to 224.0.0.251 port mdns allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass inet6 proto udp from any to ff02::fb port mdns allow-opts \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003epour le trafic SSDP :\n\u003cul\u003e\n\u003cli\u003epour IPv6 :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eff02::c\u003c/code\u003e est l\u0026rsquo;adresse multicast de lien local\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eff05::c\u003c/code\u003e est l\u0026rsquo;adresse multicast de site local\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eff08::c\u003c/code\u003e est l\u0026rsquo;adresse multicast d\u0026rsquo;organisation local\u003c/li\u003e\n\u003cli\u003eil existe aussi \u003ccode\u003eff0e::c\u003c/code\u003e pour l\u0026rsquo;adresse multicast global - //que nous n\u0026rsquo;utiliserons pas dans le contexte local// !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to 239.255.255.250 port ssdp allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port ssdp allow-opts \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eAprès l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier pkg-readme :\n\u003ccode\u003e/usr/local/share/doc/pkg-readmes/avahi\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eVous pouvez lire des exemples dans \u003ccode\u003e/usr/local/share/examples/avahi/\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utilisons Avahi pour découvrir quels services réseaux sont disponibles sur le réseau local, sous OpenBSD",
            "tags": ["OpenBSD", "Avahi", "Zeroconf"],
            "date_published": "2020-01-19T17:08:50+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:c2655384-f98e-bf1a-ca83-5ef7e73a7118",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/encfs/",
            "title": "EncFS : créer et monter un Système de Fichiers virtuel Chiffré / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description EncFS fournit un système de fichiers basés sur FUSE et OpenSSL.\nEncFS travaille sur la base des fichiers, non pas avec des blocs périphériques. Un système de fichiers EncFS peut grandir à n\u0026rsquo;importe quelle taille sans être reformaté et peut être sauvegardés sur la base de fichiers par fichiers.\nEncFS NE chiffre pas ou ne cache pas les informations suivantes :\nle nombre de fichiers que vous avez chiffrés. Les permissions sur les fichiers (lecture, écriture, exécutable) La taille de chaque fichier La longueur approximative de chaque nom de fichier (jusqu\u0026rsquo;à 16 octets avec AES ou 8 octets avec Blowfish). Installation Installez le paquet encfs.\nAttentionIl est important de modifier les permissions de lecture/écriture, avec les droits administrateur, du périphérique /dev/fuse0 :\n# chmod 0660 /dev/fuse0\nDepuis OpenBSD 6.0, la variable système kern.usermount - sysctl(3) - n\u0026rsquo;est plus gérée… d\u0026rsquo;où la nécessité d\u0026rsquo;utiliser doas(1) !\nUtilisation Il y a trois modes de créations d\u0026rsquo;un système de fichiers virtuel chiffré encfs :\nnormal paranoïaque expert Pour créer :\n$ doas encfs /repertoire_chiffre /repertoire_cible Création du nouveau volume encrypté. Veuillez choisir l\u0026#39;une des options suivantes : entrez \u0026#34;x\u0026#34; pour le mode de configuration expert, entrez \u0026#34;p\u0026#34; pour le mode paranoïaque préconfiguré, toute autre entrée ou une ligne vide sélectionnera le mode normal. ?\u0026gt; Choisissez d\u0026rsquo;appuyer sur la touche :\nEntrée pour utiliser le mode normal\np pour choisir le mode paranoïaque pré-configuré\nqui est déjà correctement configuré pour un mode paranoïaque sécurisé. x est le choix du mode expert\nlà, il vous faudra cibler toutes les différentes options ; à utiliser avec grande précaution… lire la page de manuel à ce propos ! Ensuite, l\u0026rsquo;invite de commande vous demande de taper un mot-de-passe, puis de le confirmer !\n⇒ Pour monter le système de fichier virtuel chiffré encfs, c\u0026rsquo;est exactement la même commande que la création :\n$ doas encfs /repertoire_chiffre /repertoire_cible ⇒ Pour démonter le système de fichier virtuel chiffré encfs :\n$ doas umount /repertoire_cible Dépannage Il peut arriver que, suite au montage d\u0026rsquo;un système de fichier virtuel encfs, les permissions d\u0026rsquo;appartenance des fichiers et autres répertoires sont paramétrées sur les droits administratifs de l\u0026rsquo;utilisateur root.\nModifiez les, à nouveau, par vos droits utilisateurs : $ chown -R $USER:$USER /repertoire_cible\nDocumentation Il peut vous être utile de lire localement sur votre station de travail OpenBSD, la page de manuel correspondante man encfs.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.arg0.net/encfs\" rel=\"external\"\u003eEncFS\u003c/a\u003e\u003c/strong\u003e fournit un système de fichiers\nbasés sur FUSE et OpenSSL.\u003c/p\u003e\n\u003cp\u003eEncFS travaille sur la base des fichiers, non pas avec des blocs\npériphériques. Un système de fichiers EncFS peut grandir à n\u0026rsquo;importe\nquelle taille sans être reformaté et peut être sauvegardés sur la base\nde fichiers par fichiers.\u003c/p\u003e\n\u003cp\u003eEncFS NE chiffre pas ou ne cache pas les informations suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele nombre de fichiers que vous avez chiffrés.\u003c/li\u003e\n\u003cli\u003eLes permissions sur les fichiers (lecture, écriture, exécutable)\u003c/li\u003e\n\u003cli\u003eLa taille de chaque fichier\u003c/li\u003e\n\u003cli\u003eLa longueur approximative de chaque nom de fichier (jusqu\u0026rsquo;à 16 octets\navec AES ou 8 octets avec Blowfish).\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003eencfs\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl est important de modifier les permissions de lecture/écriture, avec\nles droits administrateur, du périphérique \u003cstrong\u003e/dev/fuse0\u003c/strong\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# chmod 0660 /dev/fuse0\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDepuis OpenBSD 6.0, la variable système \u003ccode\u003ekern.usermount\u003c/code\u003e -\n\u003cem\u003e\u003ca href=\"http://man.openbsd.org/OpenBSD-5.9/man3/sysctl.3\" rel=\"external\"\u003esysctl(3)\u003c/a\u003e\u003c/em\u003e - n\u0026rsquo;est\nplus gérée… d\u0026rsquo;où la nécessité d\u0026rsquo;utiliser \u003ca href=\"https://man.openbsd.org/doas\" rel=\"external\"\u003e\u003ccode\u003edoas\u003c/code\u003e(1)\u003c/a\u003e !\u003c/p\u003e\n\u003c/div\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eIl y a trois modes de créations d\u0026rsquo;un système de fichiers virtuel chiffré\nencfs :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003enormal\u003c/li\u003e\n\u003cli\u003eparanoïaque\u003c/li\u003e\n\u003cli\u003eexpert\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003ePour \u003cstrong\u003ecréer\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas encfs /repertoire_chiffre /repertoire_cible \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCréation du nouveau volume encrypté.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eVeuillez choisir l\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003eune des options suivantes :\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e entrez \u003cspan style=\"color:#48b685\"\u003e\u0026#34;x\u0026#34;\u003c/span\u003e pour le mode de configuration expert,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e entrez \u003cspan style=\"color:#48b685\"\u003e\u0026#34;p\u0026#34;\u003c/span\u003e pour le mode paranoïaque préconfiguré,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e toute autre entrée ou une ligne vide sélectionnera le mode normal.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e?\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eChoisissez d\u0026rsquo;appuyer sur la touche :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ckbd\u003eEntrée\u003c/kbd\u003e pour utiliser le \u003cstrong\u003emode normal\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ckbd\u003ep\u003c/kbd\u003e pour choisir le \u003cstrong\u003emode paranoïaque pré-configuré\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003equi est déjà correctement configuré pour un mode paranoïaque sécurisé\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ckbd\u003ex\u003c/kbd\u003e est le choix du \u003cstrong\u003emode expert\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003elà, il vous faudra cibler toutes les différentes options ;\nà utiliser avec grande précaution\u003c/em\u003e…\u003c/li\u003e\n\u003cli\u003elire la page de manuel à ce propos !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEnsuite, l\u0026rsquo;invite de commande vous demande de taper un mot-de-passe,\npuis de le confirmer !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Pour \u003cstrong\u003emonter\u003c/strong\u003e le système de fichier virtuel chiffré encfs, c\u0026rsquo;est\nexactement la même commande que la création :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas encfs /repertoire_chiffre /repertoire_cible\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003e⇒ Pour \u003cstrong\u003edémonter\u003c/strong\u003e le système de fichier virtuel chiffré encfs :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas umount /repertoire_cible\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003eIl peut arriver que, suite au montage d\u0026rsquo;un système de fichier virtuel\nencfs, les permissions d\u0026rsquo;appartenance des fichiers et autres répertoires\nsont paramétrées sur les droits administratifs de l\u0026rsquo;utilisateur root.\u003c/p\u003e\n\u003cp\u003eModifiez les, à nouveau, par vos droits utilisateurs : \u003cbr\u003e\n\u003ccode\u003e$ chown -R $USER:$USER /repertoire_cible\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eIl peut vous être utile de lire localement sur votre station de travail\nOpenBSD, la page de manuel correspondante \u003ccode\u003eman encfs\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer un système de fichiers virtuel, sous OpenBSD, grâce à l'outil 'EncFS'.",
            "tags": ["OpenBSD", "encfs", "fuse", "OpenSSL"],
            "date_published": "2020-01-19T17:07:59+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:36d75f18-5f23-64f3-b84c-f3e5f868ca39",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/readymedia/",
            "title": "ReadyMedia (anciennement MiniDLNA)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description ReadyMedia (anciennement nommé : MiniDLNA ) est un simple logiciel serveur multimédia, écrit en C, qui aime être pleinement compatible avec les clients DLNA ou UPnP-AV (télévisions, tablettes, etc…).\nInstallation installez le paquet minidlna.\nConfiguration Fichier de configuration : /etc/minidlna.conf Avahi L\u0026rsquo;option enable_tivo=yes nécessite qu\u0026rsquo;Avahi soit installé et configuré !\nLimites systèmes Pour améliorer la gestion des mécanismes de notification du noyau kqueue(2) en temps réel, il est intéressant d\u0026rsquo;augmenter la variable kern.maxfiles gérée par sysctl(8), soit en l\u0026rsquo;ajoutant au fichier de configuration /etc/sysctl.conf(5), soit en modifiant les classes de login(1) en augmentant les limites d\u0026rsquo;ouvertures de fichiers cur et max du fichier /etc/login.conf(5).\nCe qui peut donner, par exemple :\npour le fichier /etc/sysctl.conf : kern.maxfiles=16384 pour le fichier /etc/login.conf : minidlna:\\ :openfiles=16384:\\ :tc=daemon: \u0026lt;/file\u0026gt; Une fois fait, redémarrez votre machine !\nRègles PF Voici un exemple de règles PF, à modifier selon vos besoins :\npass in quick on egress proto tcp from egress:network to egress port 8200 flags S/SA modulate state pass in quick on egress proto udp from egress:network to egress port 8200 allow-opts keep state Il vous sera aussi nécessaire d\u0026rsquo;ajouter celles relatives à Avahi , si besoin…\nDépannage Too many open files Depuis OpenBSD 6.5, le fonctionnement de minidlna a changé. Ceci est expliqué dans la section \u0026ldquo;Limites systèmes\u0026rdquo;. Malgré le paramétrage indiqué dans ladite section, il peut être nécessaire de paramétrer l\u0026rsquo;option inotify sur no dans le fichier de configuration de minidlna :\n# set this to no to disable kqueue monitoring to automatically discover new files # note: the default is yes inotify=no Puis, redémarrez le service de minidlna.\nDocumentation Veuillez lire le fichier : /usr/local/share/doc/pkg-readmes/minidlna Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://sourceforge.net/projects/minidlna/\" rel=\"external\"\u003eReadyMedia\u003c/a\u003e\u003c/strong\u003e\n\u003cem\u003e(anciennement nommé : \u003ca class=\"inside\" href=\"/fr/sys/openbsd/minidlna/\" title=\"Lien interne vers l\u0026#39;article : 'MiniDLNA (OpenBSD)'\"\u003eMiniDLNA\u003c/a\u003e\n)\u003c/em\u003e\nest un simple logiciel serveur multimédia, écrit en C, qui aime être\npleinement compatible avec les clients DLNA ou UPnP-AV (télévisions,\ntablettes, etc…).\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003eminidlna\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/etc/minidlna.conf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"avahi\"\u003eAvahi\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;option \u003ccode\u003eenable_tivo=yes\u003c/code\u003e nécessite qu\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003eAvahi\u003c/a\u003e\n\nsoit installé et configuré !\u003c/p\u003e\n\u003ch3 id=\"limites-systèmes\"\u003eLimites systèmes\u003c/h3\u003e\n\u003cp\u003ePour améliorer la gestion des mécanismes de notification du noyau\n\u003ca href=\"http://man.openbsd.org/kqueue.2\" rel=\"external\"\u003ekqueue(2)\u003c/a\u003e en temps réel, il est\nintéressant d\u0026rsquo;augmenter la variable \u003ccode\u003ekern.maxfiles\u003c/code\u003e gérée par\n\u003ca href=\"https://man.openbsd.org/sysctl.8\" rel=\"external\"\u003esysctl(8)\u003c/a\u003e, soit en l\u0026rsquo;ajoutant au\nfichier de configuration \u003ccode\u003e/etc/\u003c/code\u003e\u003ca href=\"https://man.openbsd.org/sysctl.conf.5\" rel=\"external\"\u003e\u003ccode\u003esysctl.conf(5)\u003c/code\u003e\u003c/a\u003e,\nsoit en modifiant les classes de \u003ca href=\"https://man.openbsd.org/login.1\" rel=\"external\"\u003elogin(1)\u003c/a\u003e\nen augmentant les limites d\u0026rsquo;ouvertures de fichiers \u003ccode\u003ecur\u003c/code\u003e et \u003ccode\u003emax\u003c/code\u003e du\nfichier \u003ccode\u003e/etc/\u003c/code\u003e\u003ca href=\"https://man.openbsd.org/login.conf.5\" rel=\"external\"\u003e\u003ccode\u003elogin.conf(5)\u003c/code\u003e\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eCe qui peut donner, par exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour le fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e : \u003ccode\u003ekern.maxfiles=16384\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour le fichier \u003ccode\u003e/etc/login.conf\u003c/code\u003e : \u003cbr\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eminidlna:\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e:openfiles\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e16384:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    :tc=daemon: \u0026lt;/file\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUne fois fait, \u003cstrong\u003eredémarrez votre machine\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"règles-pf\"\u003eRègles PF\u003c/h3\u003e\n\u003cp\u003eVoici un exemple de règles PF, à modifier selon vos besoins :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress proto tcp from egress:network to egress port 8200 flags S/SA modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress proto udp from egress:network to egress port 8200 allow-opts keep state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl vous sera aussi nécessaire d\u0026rsquo;ajouter celles relatives à\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003eAvahi\u003c/a\u003e\n, si besoin…\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"too-many-open-files\"\u003eToo many open files\u003c/h3\u003e\n\u003cp\u003eDepuis OpenBSD 6.5, le fonctionnement de minidlna a changé. Ceci est\nexpliqué dans la section \u0026ldquo;\u003ca href=\"/fr/sys/openbsd/readymedia/#limites-systèmes\"\u003eLimites systèmes\u003c/a\u003e\u0026rdquo;.\nMalgré le paramétrage indiqué dans ladite section, il peut être nécessaire\nde paramétrer l\u0026rsquo;option \u003ccode\u003einotify\u003c/code\u003e sur \u003ccode\u003eno\u003c/code\u003e dans le fichier de configuration\nde minidlna :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# set this to no to disable kqueue monitoring to automatically discover new files\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# note: the default is yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einotify\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eno\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#red%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eredémarrez le service\u003c/a\u003e\n de minidlna.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eVeuillez lire le fichier : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/minidlna\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le serveur de contenu multimédia, nommé ReadyMedia, sous OpenBSD",
            "tags": ["OpenBSD", "ReadyMedia", "minidlna"],
            "date_published": "2020-01-19T16:53:16+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:a5afb183-39fb-725e-069d-006fac012658",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tutoriel-openbsd-cvs/",
            "title": "[Mini-Tuto] Utiliser CVS sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Le projet OpenBSD diffuse ses sources, quelqu\u0026rsquo;elles soient, par le biais de serveurs Anonymes CVS - qui est un système de gestion des différentes versions d\u0026rsquo;un code (tel que peut l\u0026rsquo;être git, ou bazaar…)\nAyant une machine informatique sous OpenBSD, nous n\u0026rsquo;avons besoin de ne rien installer, puisque cvs est installé par défaut.\nLe projet OpenBSD a 4 dépôts différents, avec lesquels nous pouvons interagir :\nsrc - code source pour le système de base ports - l\u0026rsquo;arborescence des ports www - web pages xenocara - xenocara Ces dépôts, du fait de ne pas faire partie de l\u0026rsquo;équipe des développeurs, nous sont accessibles seulement en lecture seule !\nRécupération des sources Admettons que nous avons repéré une erreur sur une des pages du site web d\u0026rsquo;OpenBSD, nous \u0026ldquo;interagirons\u0026rdquo; donc avec le dépôt www.\nCommençons par créer un répertoire où nous téléchargerons les sources désirées :\n$ mkdir ~/src \u0026amp;\u0026amp; cd ~/src\nAstuceBien sûr, le dossier peut avoir tout autre nom que vous désirez lui donner… par convention, nous utiliserons \u0026ldquo;~/src\u0026rdquo; pour le reste de ce mini-tutoriel ! Puis, demandons à cvs de récupérer les sources désirées - nous choisissons pour l\u0026rsquo;exemple le serveur anonyme CVS de nos collaborateurs français que sont A.Jacoutot et L.Breuil :\n$ cvs -qd anoncvs@anoncvs.fr.openbsd.org:/cvs get -P www\nInfoPatientez, cela mettra un certain temps pour récupérer l\u0026rsquo;ensemble des fichiers sources mis à disposition, selon votre bande passante ! Modification Éditez le fichier où vous pensez avoir trouvé une erreur pour le corriger, avec votre éditeur texte préféré. Puis, créer un fichier diff : $ cd ~/src/www $ cvs diff -u \u0026gt; /tmp/patch.txt Cela étant fait, transmettez le contenu du fichier patch.txt, intégré dans le corps du mail - en copie - de préférence à la liste de diffusion tech@openbsd.org !\nAttentionAttention, pour les trois autres dépôts que sont \u0026ldquo;src\u0026rdquo;, \u0026ldquo;ports\u0026rdquo; et \u0026ldquo;xenocara\u0026rdquo;, l\u0026rsquo;utilisation de CVS est légèrement différente ; tout est assez bien expliqué… dans la page \u0026ldquo;CVS Anonyme\u0026rdquo; ! Mettre à jour votre arborescence des sources Pour mettre à jour l\u0026rsquo;arborescence que vous avez déjà récupérée, c\u0026rsquo;est vraiment très simple :\n$ cd ~/src/www $ cvs -q up -Pd Gestion d\u0026rsquo;erreurs No CVSROOT specified Vous avez l\u0026rsquo;erreur suivante, quand vous utilisez cvs :\ncvs update: No CVSROOT specified! Please use the `-d\u0026#39; option cvs [update aborted]: or set the CVSROOT environment variable. Vous n\u0026rsquo;êtes pas dans le bon répertoire à mettre à jour - déplacez-vous dans le répertoire cible à mettre à jour.\nAdmettons, pour reprendre l\u0026rsquo;exemple de gestion du site www, mettez-vous dans ~/src/www !!!\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe projet OpenBSD diffuse ses sources, quelqu\u0026rsquo;elles soient, par le biais\nde \u003ca href=\"https://www.openbsd.org/cvsync.html\" rel=\"external\"\u003eserveurs Anonymes CVS\u003c/a\u003e - qui\nest un système de gestion des différentes versions d\u0026rsquo;un code\n\u003cem\u003e(tel que peut l\u0026rsquo;être git, ou bazaar…)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAyant une machine informatique sous OpenBSD, nous n\u0026rsquo;avons besoin de ne\nrien installer, puisque \u003ccode\u003ecvs\u003c/code\u003e est installé par défaut.\u003c/p\u003e\n\u003cp\u003eLe projet OpenBSD a 4 dépôts différents, avec lesquels nous pouvons interagir :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003esrc\u003c/strong\u003e - code source pour le système de base\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eports\u003c/strong\u003e - l\u0026rsquo;arborescence des ports\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ewww\u003c/strong\u003e - web pages\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003exenocara\u003c/strong\u003e - xenocara\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eCes dépôts, du fait de ne pas faire partie de l\u0026rsquo;équipe des développeurs,\nnous sont accessibles seulement en lecture seule !\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"récupération-des-sources\"\u003eRécupération des sources\u003c/h2\u003e\n\u003cp\u003eAdmettons que nous avons repéré une erreur sur une des pages du site web\nd\u0026rsquo;OpenBSD, nous \u0026ldquo;interagirons\u0026rdquo; donc avec le dépôt \u003cstrong\u003ewww\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eCommençons par créer un répertoire où nous téléchargerons les sources\ndésirées :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ mkdir ~/src \u0026amp;\u0026amp; cd ~/src\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eBien sûr, le dossier peut avoir tout autre nom que vous désirez lui\ndonner… par convention, nous utiliserons \u0026ldquo;~/src\u0026rdquo; pour le reste de ce\nmini-tutoriel !\u003c/div\u003e\n\n\u003cp\u003ePuis, demandons à cvs de récupérer les sources désirées - nous\nchoisissons pour l\u0026rsquo;exemple le \u003ca href=\"https://www.openbsd.org/anoncvs.html\" rel=\"external\"\u003eserveur anonyme CVS\u003c/a\u003e\nde nos collaborateurs français que sont A.Jacoutot et L.Breuil :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ cvs -qd anoncvs@anoncvs.fr.openbsd.org:/cvs get -P www\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003ePatientez, cela mettra un certain temps pour récupérer l\u0026rsquo;ensemble des\nfichiers sources mis à disposition, selon votre bande passante !\u003c/div\u003e\n\n\u003ch2 id=\"modification\"\u003eModification\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eÉditez le fichier où vous pensez avoir trouvé une erreur pour le\ncorriger, avec votre éditeur texte préféré.\u003c/li\u003e\n\u003cli\u003ePuis, créer un fichier diff :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd ~/src/www\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cvs diff -u \u0026gt; /tmp/patch.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCela étant fait, transmettez le contenu du fichier \u003ccode\u003epatch.txt\u003c/code\u003e, intégré\ndans le corps du mail - en copie - de préférence à la liste de diffusion\n\u003ca href=\"mailto:tech@openbsd.org\" rel=\"external\"\u003etech@openbsd.org\u003c/a\u003e !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eAttention, pour les trois autres dépôts que sont \u0026ldquo;src\u0026rdquo;, \u0026ldquo;ports\u0026rdquo; et\n\u0026ldquo;xenocara\u0026rdquo;, l\u0026rsquo;utilisation de CVS est légèrement différente ; tout est\nassez bien expliqué… dans la page \u0026ldquo;\u003ca href=\"https://www.openbsd.org/cvsync.html\" rel=\"external\"\u003eCVS Anonyme\u003c/a\u003e\u0026rdquo; !\u003c/div\u003e\n\n\u003ch2 id=\"mettre-à-jour-votre-arborescence-des-sources\"\u003eMettre à jour votre arborescence des sources\u003c/h2\u003e\n\u003cp\u003ePour mettre à jour l\u0026rsquo;arborescence que vous avez déjà récupérée, c\u0026rsquo;est\nvraiment très simple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd ~/src/www\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cvs -q up -Pd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"gestion-derreurs\"\u003eGestion d\u0026rsquo;erreurs\u003c/h2\u003e\n\u003ch3 id=\"no-cvsroot-specified\"\u003eNo CVSROOT specified\u003c/h3\u003e\n\u003cp\u003eVous avez l\u0026rsquo;erreur suivante, quand vous utilisez cvs :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecvs update: No CVSROOT specified!  Please use the \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e-d\u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003e option\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecvs \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eupdate aborted\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: or set the CVSROOT environment variable.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eVous n\u0026rsquo;êtes pas dans le bon répertoire à mettre à jour\u003c/strong\u003e - déplacez-vous\ndans le répertoire cible à mettre à jour.\u003c/p\u003e\n\u003cp\u003eAdmettons, pour reprendre l\u0026rsquo;exemple de gestion du site www, mettez-vous\ndans \u003ccode\u003e~/src/www\u003c/code\u003e !!!\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comprendre le fonctionnement de CVS par le biais de ce mini-tutoriel pour collaborer avec l'équipe d'OpenBSD",
            "tags": ["OpenBSD", "cvs"],
            "date_published": "2020-01-19T16:44:06+02:00",
            "date_modified": "2023-05-10T16:56:33+02:00"
        },{
            "id": "urn:uuid:fc0cb040-9449-1769-0049-ad6bec01aff5",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/mediatomb/",
            "title": "Mediatomb",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description MediaTomb est LE serveur Multimedia UPnP OpenSource.\nSite : http://mediatomb.cc/\nAttentionN\u0026rsquo;est plus disponible ni en tant que paquet, ni en tant que port depuis OpenBSD 6.4 !\nVeuillez migrer sur un autre service multimédia supporté, tel que ReadyMedia !\nv6.3 : mediatomb-0.12.1p18 v6.2 : mediatomb-0.12.1p16 v6.1 : mediatomb-0.12.1p14 Installation Était installable depuis le système de package : mediatomb\nConfiguration Fichier de configuration : /etc/mediatomb/config.xml Après toute modification, pensez à relancer le serveur !\nGestion des accès Il est impératif d\u0026rsquo;empêcher toute connexion non désirée à l\u0026rsquo;interface web d\u0026rsquo;administration !\nOuvrir le fichier de configuration, pour modifier les lignes suivantes :\n\u0026lt;accounts enabled=\u0026#34;no\u0026#34; session-timeout=\u0026#34;30\u0026#34;\u0026gt; \u0026lt;account user=\u0026#34;mediatomb\u0026#34; password=\u0026#34;mediatomb\u0026#34;/\u0026gt; \u0026lt;/accounts\u0026gt; On change la valeur de l\u0026rsquo;attribut enabled par yes puis celles des attributs user et password, par celles que vous désirez utiliser.\nAttentionNe laissez pas les valeurs par défaut concernant les attributs user et password ! Encodage UTF-8 L\u0026rsquo;encodage UTF-8 n\u0026rsquo;est pas géré nativement.\nOuvrir le fichier de configuration, après la balise ouvrante import :\n\u0026lt;import hidden-files=\u0026#34;no\u0026#34;\u0026gt; Puis, ajoutez les lignes suivantes :\n\u0026lt;filesystem-charset\u0026gt;UTF-8\u0026lt;/filesystem-charset\u0026gt; \u0026lt;metadata-charset\u0026gt;UTF-8\u0026lt;/metadata-charset\u0026gt; \u0026lt;playlist-charset\u0026gt;UTF-8\u0026lt;/playlist-charset\u0026gt; Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eMediaTomb est LE serveur Multimedia UPnP OpenSource.\u003c/p\u003e\n\u003cp\u003eSite : \u003ca href=\"http://mediatomb.cc/\" rel=\"external\"\u003ehttp://mediatomb.cc/\u003c/a\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cspan em\u003eN\u0026rsquo;est plus disponible ni en tant que paquet, ni en tant que\nport depuis OpenBSD 6.4 !\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eVeuillez migrer sur un autre service multimédia supporté, tel que\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/readymedia/\" title=\"Lien interne vers l\u0026#39;article : 'ReadyMedia (anciennement MiniDLNA)'\"\u003eReadyMedia\u003c/a\u003e\n!\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cul\u003e\n\u003cli\u003ev6.3 : mediatomb-0.12.1p18\u003c/li\u003e\n\u003cli\u003ev6.2 : mediatomb-0.12.1p16\u003c/li\u003e\n\u003cli\u003ev6.1 : mediatomb-0.12.1p14\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eÉtait installable depuis le système de package : \u003ccode\u003emediatomb\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eFichier de configuration : \u003ccode\u003e/etc/mediatomb/config.xml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAprès toute modification, pensez à relancer le serveur !\u003c/p\u003e\n\u003ch3 id=\"gestion-des-accès\"\u003eGestion des accès\u003c/h3\u003e\n\u003cp\u003eIl est impératif d\u0026rsquo;empêcher toute connexion non désirée à l\u0026rsquo;interface\nweb d\u0026rsquo;administration !\u003c/p\u003e\n\u003cp\u003eOuvrir le fichier de configuration, pour modifier les lignes suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;accounts\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eenabled=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;no\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esession-timeout=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;30\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;account\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003euser=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mediatomb\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003epassword=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;mediatomb\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/accounts\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn change la valeur de l\u0026rsquo;attribut \u003ccode\u003eenabled\u003c/code\u003e par \u003ccode\u003eyes\u003c/code\u003e puis celles des\nattributs \u003ccode\u003euser\u003c/code\u003e et \u003ccode\u003epassword\u003c/code\u003e, par celles que vous désirez utiliser.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNe laissez pas les valeurs par défaut concernant les attributs \u003ccode\u003euser\u003c/code\u003e et\n\u003ccode\u003epassword\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"encodage-utf-8\"\u003eEncodage UTF-8\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;encodage UTF-8 n\u0026rsquo;est pas géré nativement.\u003c/p\u003e\n\u003cp\u003eOuvrir le fichier de configuration, après la balise ouvrante \u003ccode\u003eimport\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;import\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehidden-files=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;no\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, ajoutez les lignes suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;filesystem-charset\u0026gt;\u003c/span\u003eUTF-8\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/filesystem-charset\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;metadata-charset\u0026gt;\u003c/span\u003eUTF-8\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/metadata-charset\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;playlist-charset\u0026gt;\u003c/span\u003eUTF-8\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/playlist-charset\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "mediatomb : un serveur multimédia sous OpenBSD",
            "tags": ["OpenBSD", "mediatomb"],
            "date_published": "2020-01-19T16:34:04+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:ae7e05e7-d6e9-a127-aa0a-8826c1642898",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/syspatch/",
            "title": "Syspatch : gérer les correctifs binaires du système de base sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Documentation man 8 syspatch man 8 syspatch Synopsis syspatch [-c | -l | -R | -r]\nDescription Syspatch est un outil pour récupérer, vérifier et installer, voire revenir à une précédente version, des correctifs de binaire d\u0026rsquo;OpenBSD.\nLorsqu\u0026rsquo;il est exécuté sans aucune option, syspatch appliquera tous les correctifs non installés, créant une archive pour revenir en arrière, contenant les fichiers qui vont être remplacés, puis extrait et installe tous les fichiers contenus dans l\u0026rsquo;archive pour syspatch. Les correctifs sont cumulatifs et en tant que tel, il n\u0026rsquo;est pas possible de les installer un par un.\nLes options sont les suivantes :\n-c : liste les correctifs disponibles ; convient pour cron(8). -l : liste les correctifs appliqués -R : enlever tous les correctifs -r : enlever les correctifs récemment installés Fichiers /etc/installurl : URL du miroir d\u0026rsquo;OpenBSD pour récupérer les correctifs. /var/syspatch/* : répertoires contenant les archives de reversion et originales, signées avec diff(1) et les correctifs installés. Voir aussi signify(1), installurl(5), release(8) Histoire syspatch est apparu la première fois dans OpenBSD 6.1\nAuteurs syspatch a été écrit par Antoine Jacoutot ajacoutot@openbsd.org.\nMise en garde syspatch est conçu pour travailler seulement sur les versions d\u0026rsquo;un OpenBSD officiel.\nTraduction du manpage syspatch(8) !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/syspatch/#man-8-syspatch\"\u003eman 8 syspatch\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-8-syspatch\"\u003eman 8 syspatch\u003c/h3\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esyspatch\u003c/strong\u003e [\u003cstrong\u003e-c\u003c/strong\u003e | \u003cstrong\u003e-l\u003c/strong\u003e | \u003cstrong\u003e-R\u003c/strong\u003e | \u003cstrong\u003e-r\u003c/strong\u003e]\u003c/p\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003eSyspatch\u003c/strong\u003e est un outil pour récupérer, vérifier et installer, voire\nrevenir à une précédente version, des correctifs de binaire d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003cp\u003eLorsqu\u0026rsquo;il est exécuté sans aucune option, syspatch appliquera tous les\ncorrectifs non installés, créant une archive pour revenir en arrière,\ncontenant les fichiers qui vont être remplacés, puis extrait et installe\ntous les fichiers contenus dans l\u0026rsquo;archive pour syspatch. Les correctifs\nsont cumulatifs et en tant que tel, il n\u0026rsquo;est pas possible de les installer\nun par un.\u003c/p\u003e\n\u003cp\u003eLes options sont les suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e-c\u003c/code\u003e\u003c/strong\u003e : liste les correctifs disponibles ; convient pour \u003ca href=\"https://man.openbsd.org/cron.8\" rel=\"external\"\u003ecron(8)\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e-l\u003c/code\u003e\u003c/strong\u003e : liste les correctifs appliqués\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e-R\u003c/code\u003e\u003c/strong\u003e : enlever tous les correctifs\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e-r\u003c/code\u003e\u003c/strong\u003e : enlever les correctifs récemment installés\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"fichiers\"\u003eFichiers\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/installurl\u003c/code\u003e : URL du miroir d\u0026rsquo;OpenBSD pour récupérer les correctifs.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/var/syspatch/*\u003c/code\u003e : répertoires contenant les archives de reversion\net originales, signées avec \u003ca href=\"https://man.openbsd.org/diff\" rel=\"external\"\u003ediff(1)\u003c/a\u003e\net les correctifs installés.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/signify\" rel=\"external\"\u003esignify(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/installurl.5\" rel=\"external\"\u003einstallurl(5)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/release.8\" rel=\"external\"\u003erelease(8)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"histoire\"\u003eHistoire\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esyspatch\u003c/strong\u003e est apparu la première fois dans OpenBSD 6.1\u003c/p\u003e\n\u003ch4 id=\"auteurs\"\u003eAuteurs\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esyspatch\u003c/strong\u003e a été écrit par Antoine Jacoutot \u003ca href=\"mailto:ajacoutot@openbsd.org\" rel=\"external\"\u003eajacoutot@openbsd.org\u003c/a\u003e.\u003c/p\u003e\n\u003ch4 id=\"mise-en-garde\"\u003eMise en garde\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esyspatch\u003c/strong\u003e est conçu pour travailler seulement sur les versions d\u0026rsquo;un\nOpenBSD officiel.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eTraduction du manpage \u003ca href=\"https://man.openbsd.org/syspatch\" rel=\"external\"\u003esyspatch(8)\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer correctement les correctifs sous OpenBSD, grâce à l'outil 'syspatch'.",
            "tags": ["OpenBSD", "syspatch"],
            "date_published": "2020-01-19T16:30:57+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:469bab96-974b-4976-55e0-b39a00e0835e",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/rcctl/",
            "title": "rcctl : configurer et contrôler les services sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Utilisation Pour rappel, voici les usages les plus courants :\nActiver rcctl enable service Désactiver rcctl disable service Démarrer rcctl start service Redémarrer rcctl restart service Recharger rcctl reload service Arrêter rcctl stop service Paramétrer Pour configurer un service avec certains drapeaux au démarrage de celui-ci :\nrcctl set service flags nom_drapeau valeur_drapeau… Il peut y avoir sans soucis plusieurs drapeaux et leurs valeurs se suivant, sans soucis.\nPour connaître les noms des drapeaux d\u0026rsquo;un service, il est impératif de lire le manpage correspondant.\nOrdonner Certains services doivent démarrés avant d\u0026rsquo;autres, il faut donc les spécifier les uns devant les autres :\nrcctl order service1 service2 service… Documentation man 8 rcctl man 8 rcctl Synopsis rcctl get|getdef|set service | daemon [variable [arguments]] rcctl [-df] action daemon … rcctl disable|enable|order [daemon …] rcctl ls lsarg Description L\u0026rsquo;utilitaire rcctl peut activer ou désactiver un service du système de base ou un démon d\u0026rsquo;un paquet dans rc.conf.local(8) ou afficher sa configuration et son statut. Pour un démon, il peut aussi changer les arguments de ligne de commande, l\u0026rsquo;utilisateur avec lequel l\u0026rsquo;exécuter, le délai \u0026ldquo;timeout\u0026rdquo; d\u0026rsquo;action de rc.d(8) ou appeler son script de contrôle du démon rc.d(8).\nLes commandes suivantes sont disponibles (variable peut être de type class, flags, status, timeout ou user) :\n[-df] action daemon … : exécute les scripts du démon rc.d(8) avec l\u0026rsquo;argument action, passant par dessus les options spécifiées, s\u0026rsquo;il y en a. disable service … | daemon … : alias de set service|daemon status off. enable service … | daemon … : alias de set service|daemon status on. get service | daemon [variable] : affiche la valeur du service ou démon. Si variable est vide, affiche toutes les variables et valeurs du service ou du démon dans un format compatible avec rc.conf(8). Lorsque daemon est paramétré sur \u0026ldquo;al\u0026rdquo;, variable ne doit pas être configurée et rcctl affichera toutes les variables des services et démons. getdef service | daemon [variable] : tout comme get mais retourne les valeurs par défaut. ls lsarg : affiche une liste de services et démons correspondant à lsarg, qui peut être un des suivants : all : tous les services et démons failed : les démons activés mais arrêtés off : les services et démons désactivés on : les services et démons activés started : les démons fonctionnant stopped : les démons stoppés order [daemon …] : place les démons du paquet spécifiés au commencement de pkg_scripts. Ils doivent être toujours activés. Si aucun démon n\u0026rsquo;est spécifié, affiche l\u0026rsquo;ordre actuel. La commande order est seulement nécessaire après l\u0026rsquo;activation d\u0026rsquo;un démon qui a besoin d\u0026rsquo;être exécuté avant un ou plusieurs démons déjà actifs. Spécifiez le nouveau démon précédé de tout ceux qui doivent être exécutés avant lui, mais pas de ceux qui en dépendent. set service | daemon variable [arguments] : Pour un démon, configure la variable du démon avec les arguments spécifiés. Si variable est déjà paramétrée, la variable du démon est reconfigurée par les arguments fournis en option ou sa valeur par défaut. Le status variable doit être fourni avec un argument on ou off. Il est utilisé pour activer ou désactiver un service ou démon dans rc.conf.local(8). Quand un démon désactivé d\u0026rsquo;un paquet est activé, il est ajouté à la fin de pkg_scripts. Quand un démon d\u0026rsquo;un paquet est désactivé, il est supprimé de pkg_scripts et ses variables sont supprimées, s\u0026rsquo;il y en a. Statut de sortie rcctl action retourne un statut de sortie du script du démon rc.d(8). rcctl get daemon | service [status] termine avec 0 si le démon ou service est activé et avec 1 s\u0026rsquo;il ne l\u0026rsquo;est pas. rcctl getdef daemon | service [status] termine avec 0 si le démon ou service est activé par défaut et 1 s\u0026rsquo;il ne l\u0026rsquo;est pas. rcctl ls failed termine avec 1 si un démon activé ne fonctionne pas. Autrement, l\u0026rsquo;utilitaire rcctl termine avec 0 en cas de succès, et supérieur à 0 si une erreur arrive (2 indique un démon ou service non existant).\nExemples Active et paramètre les drapeaux d\u0026rsquo;apmd(8) :\n# rcctl set apmd status on # rcctl set apmd flags -A # rcctl get apmd apmd_class=daemon apmd_flags=-A apmd_rtable=0 apmd_timeout=30 apmd_user=root # echo $? 0 La manière recommandée pour exécuter une seconde copie d\u0026rsquo;un démon en particulier pour un but différent est de créer un lien symbolique vers son script de contrôle rc.d(8) :\n# ln -s /etc/rc.d/snmpd /etc/rc.d/snmpd6 # rcctl set snmpd6 status on # rcctl set snmpd6 flags -D addr=2001:db8::1234 # rcctl start snmpd6 Voir aussi rc.conf.local(8), rc.d(8) Histoire rcctl est apparu la première fois dans OpenBSD 5.7.\nAuteurs rcctl a été écrit par Antoine Jacoutot ajacoutot@openbsd.org.\nTraduction du manpage rcctl(8) !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003ePour rappel, voici les usages les plus courants :\u003c/p\u003e\n\u003ch3 id=\"activer\"\u003eActiver\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl enable service\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"désactiver\"\u003eDésactiver\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl disable service\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"démarrer\"\u003eDémarrer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl start service\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"redémarrer\"\u003eRedémarrer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl restart service\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"recharger\"\u003eRecharger\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl reload service\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"arrêter\"\u003eArrêter\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl stop service\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"paramétrer\"\u003eParamétrer\u003c/h3\u003e\n\u003cp\u003ePour configurer un service avec certains drapeaux au démarrage de celui-ci :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl set service flags nom_drapeau valeur_drapeau…\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl peut y avoir sans soucis plusieurs drapeaux et leurs valeurs se suivant,\nsans soucis.\u003c/p\u003e\n\u003cp\u003ePour connaître les noms des drapeaux d\u0026rsquo;un service, il est impératif de\nlire le manpage correspondant.\u003c/p\u003e\n\u003ch3 id=\"ordonner\"\u003eOrdonner\u003c/h3\u003e\n\u003cp\u003eCertains services doivent démarrés avant d\u0026rsquo;autres, il faut donc les spécifier\nles uns devant les autres :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ercctl order service1 service2 service…\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/rcctl/#man-8-rcctl\"\u003eman 8 rcctl\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-8-rcctl\"\u003eman 8 rcctl\u003c/h3\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003ercctl\u003c/strong\u003e     \u003cstrong\u003eget\u003c/strong\u003e|\u003cstrong\u003egetdef\u003c/strong\u003e|\u003cstrong\u003eset\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e | \u003cstrong\u003edaemon\u003c/strong\u003e [\u003cstrong\u003evariable\u003c/strong\u003e [\u003cstrong\u003earguments\u003c/strong\u003e]]\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ercctl\u003c/strong\u003e     [\u003cstrong\u003e-df\u003c/strong\u003e] \u003cstrong\u003eaction daemon\u003c/strong\u003e \u003cstrong\u003e…\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ercctl\u003c/strong\u003e     \u003cstrong\u003edisable\u003c/strong\u003e|\u003cstrong\u003eenable\u003c/strong\u003e|\u003cstrong\u003eorder\u003c/strong\u003e [\u003cstrong\u003edaemon\u003c/strong\u003e \u003cstrong\u003e…\u003c/strong\u003e]\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ercctl\u003c/strong\u003e     \u003cstrong\u003els\u003c/strong\u003e \u003cstrong\u003elsarg\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;utilitaire \u003cstrong\u003ercctl\u003c/strong\u003e peut activer ou désactiver un \u003cstrong\u003eservice\u003c/strong\u003e du système\nde base ou un \u003cstrong\u003edémon\u003c/strong\u003e d\u0026rsquo;un paquet dans \u003ca href=\"http://man.openbsd.org/rc.conf.local.8\" rel=\"external\"\u003erc.conf.local(8)\u003c/a\u003e\nou afficher sa configuration et son statut. Pour un \u003cstrong\u003edémon\u003c/strong\u003e, il peut\naussi changer les arguments de ligne de commande, l\u0026rsquo;utilisateur avec\nlequel l\u0026rsquo;exécuter, le délai \u0026ldquo;timeout\u0026rdquo; d\u0026rsquo;action de \u003ca href=\"http://man.openbsd.org/rc.d.8\" rel=\"external\"\u003erc.d(8)\u003c/a\u003e\nou appeler son script de contrôle du démon \u003ca href=\"http://man.openbsd.org/rc.d.8\" rel=\"external\"\u003erc.d(8)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLes commandes suivantes sont disponibles\n\u003cem\u003e(\u003cstrong\u003evariable\u003c/strong\u003e peut être de type \u003cstrong\u003eclass\u003c/strong\u003e, \u003cstrong\u003eflags\u003c/strong\u003e, \u003cstrong\u003estatus\u003c/strong\u003e, \u003cstrong\u003etimeout\u003c/strong\u003e ou \u003cstrong\u003euser\u003c/strong\u003e)\u003c/em\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e[\u003cstrong\u003e-df\u003c/strong\u003e] action daemon \u003cstrong\u003e…\u003c/strong\u003e : exécute les scripts du \u003cstrong\u003edémon\u003c/strong\u003e\n\u003ca href=\"http://man.openbsd.org/rc.d.8\" rel=\"external\"\u003erc.d(8)\u003c/a\u003e avec l\u0026rsquo;argument \u003cstrong\u003eaction\u003c/strong\u003e,\npassant par dessus les options spécifiées, s\u0026rsquo;il y en a.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003edisable\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e \u003cstrong\u003e…\u003c/strong\u003e | \u003cstrong\u003edaemon\u003c/strong\u003e \u003cstrong\u003e…\u003c/strong\u003e : alias de \u003cstrong\u003eset\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e|\u003cstrong\u003edaemon\u003c/strong\u003e \u003cstrong\u003estatus off\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eenable\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e \u003cstrong\u003e…\u003c/strong\u003e | \u003cstrong\u003edaemon\u003c/strong\u003e \u003cstrong\u003e…\u003c/strong\u003e : alias de \u003cstrong\u003eset\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e|\u003cstrong\u003edaemon\u003c/strong\u003e \u003cstrong\u003estatus on\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eget\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e | \u003cstrong\u003edaemon\u003c/strong\u003e [\u003cstrong\u003evariable\u003c/strong\u003e] : affiche la valeur\ndu \u003cstrong\u003eservice\u003c/strong\u003e ou \u003cstrong\u003edémon\u003c/strong\u003e. Si \u003cstrong\u003evariable\u003c/strong\u003e est vide, affiche toutes\nles variables et valeurs du \u003cstrong\u003eservice\u003c/strong\u003e ou du \u003cstrong\u003edémon\u003c/strong\u003e dans un format\ncompatible avec \u003ca href=\"http://man.openbsd.org/rc.conf.8\" rel=\"external\"\u003erc.conf(8)\u003c/a\u003e. \u003cbr\u003e\nLorsque \u003cstrong\u003edaemon\u003c/strong\u003e est paramétré sur \u0026ldquo;al\u0026rdquo;, \u003cstrong\u003evariable\u003c/strong\u003e ne doit pas\nêtre configurée et \u003cstrong\u003ercctl\u003c/strong\u003e affichera toutes les variables des\nservices et démons.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003egetdef\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e | \u003cstrong\u003edaemon\u003c/strong\u003e [\u003cstrong\u003evariable\u003c/strong\u003e] : tout comme get\nmais retourne les valeurs par défaut.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003els\u003c/strong\u003e \u003cstrong\u003elsarg\u003c/strong\u003e : affiche une liste de services et démons correspondant\nà \u003cstrong\u003elsarg\u003c/strong\u003e, qui peut être un des suivants :\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eall\u003c/strong\u003e : tous les services et démons\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003efailed\u003c/strong\u003e : les démons activés mais arrêtés\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eoff\u003c/strong\u003e : les services et démons désactivés\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eon\u003c/strong\u003e : les services et démons activés\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003estarted\u003c/strong\u003e : les démons fonctionnant\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003estopped\u003c/strong\u003e : les démons stoppés\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eorder\u003c/strong\u003e [\u003cstrong\u003edaemon\u003c/strong\u003e \u003cstrong\u003e…\u003c/strong\u003e] : place les démons du paquet spécifiés\nau commencement de \u003cstrong\u003epkg_scripts\u003c/strong\u003e. Ils doivent être toujours activés. \u003cbr\u003e\nSi aucun démon n\u0026rsquo;est spécifié, affiche l\u0026rsquo;ordre actuel. \u003cbr\u003e\nLa commande \u003cstrong\u003eorder\u003c/strong\u003e est seulement nécessaire après l\u0026rsquo;activation\nd\u0026rsquo;un démon qui a besoin d\u0026rsquo;être exécuté avant un ou plusieurs démons\ndéjà actifs. Spécifiez le nouveau démon précédé de tout ceux qui doivent\nêtre exécutés avant lui, mais pas de ceux qui en dépendent.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eset\u003c/strong\u003e \u003cstrong\u003eservice\u003c/strong\u003e | \u003cstrong\u003edaemon variable\u003c/strong\u003e [\u003cstrong\u003earguments\u003c/strong\u003e] : Pour un\ndémon, configure la variable du démon avec les arguments spécifiés.\nSi \u003cstrong\u003evariable\u003c/strong\u003e est déjà paramétrée, la variable du démon est reconfigurée\npar les arguments fournis en option ou sa valeur par défaut. \u003cbr\u003e\nLe \u003cstrong\u003estatus\u003c/strong\u003e \u003cstrong\u003evariable\u003c/strong\u003e doit être fourni avec un argument \u003cstrong\u003eon\u003c/strong\u003e\nou \u003cstrong\u003eoff\u003c/strong\u003e. Il est utilisé pour activer ou désactiver un \u003cstrong\u003eservice\u003c/strong\u003e\nou \u003cstrong\u003edémon\u003c/strong\u003e dans \u003ca href=\"http://man.openbsd.org/rc.conf.local.8\" rel=\"external\"\u003erc.conf.local(8)\u003c/a\u003e.\nQuand un démon désactivé d\u0026rsquo;un paquet est activé, il est ajouté à la\nfin de \u003cstrong\u003epkg_scripts\u003c/strong\u003e. Quand un démon d\u0026rsquo;un paquet est désactivé, il\nest supprimé de \u003cstrong\u003epkg_scripts\u003c/strong\u003e et ses variables sont supprimées,\ns\u0026rsquo;il y en a.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"statut-de-sortie\"\u003eStatut de sortie\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003ercctl\u003c/strong\u003e \u003cstrong\u003eaction\u003c/strong\u003e retourne un statut de sortie du script du démon\n\u003ca href=\"http://man.openbsd.org/rc.d.8\" rel=\"external\"\u003erc.d(8)\u003c/a\u003e. \u003cbr\u003e\n\u003cstrong\u003ercctl get\u003c/strong\u003e \u003cstrong\u003edaemon\u003c/strong\u003e | \u003cstrong\u003eservice\u003c/strong\u003e [\u003cstrong\u003estatus\u003c/strong\u003e] termine avec 0 si le\ndémon ou service est activé et avec 1 s\u0026rsquo;il ne l\u0026rsquo;est pas.  \u003cbr\u003e\n\u003cstrong\u003ercctl getdef\u003c/strong\u003e \u003cstrong\u003edaemon\u003c/strong\u003e | \u003cstrong\u003eservice\u003c/strong\u003e [\u003cstrong\u003estatus\u003c/strong\u003e] termine avec 0 si\nle démon ou service est activé par défaut et 1 s\u0026rsquo;il ne l\u0026rsquo;est pas. \u003cbr\u003e\n\u003cstrong\u003ercctl ls failed\u003c/strong\u003e termine avec 1 si un démon activé ne fonctionne pas.\nAutrement, l\u0026rsquo;utilitaire \u003cstrong\u003ercctl\u003c/strong\u003e termine avec 0 en cas de succès, et\nsupérieur à 0 si une erreur arrive (2 indique un démon ou service non existant).\u003c/p\u003e\n\u003ch4 id=\"exemples\"\u003eExemples\u003c/h4\u003e\n\u003cp\u003eActive et paramètre les drapeaux d\u0026rsquo;\u003ca href=\"http://man.openbsd.org/apmd.8\" rel=\"external\"\u003eapmd(8)\u003c/a\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set apmd status on\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set apmd flags -A\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl get apmd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eapmd_class\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003edaemon\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eapmd_flags\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e-A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eapmd_rtable\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eapmd_timeout\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eapmd_user\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eroot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# echo $?\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa manière recommandée pour exécuter une seconde copie d\u0026rsquo;un démon en particulier\npour un but différent est de créer un lien symbolique vers son script de\ncontrôle \u003ca href=\"http://man.openbsd.org/rc.d.8\" rel=\"external\"\u003erc.d(8)\u003c/a\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ln -s /etc/rc.d/snmpd /etc/rc.d/snmpd6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set snmpd6 status on\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl set snmpd6 flags -D addr=2001:db8::1234\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rcctl start snmpd6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://man.openbsd.org/rc.conf.local.8\" rel=\"external\"\u003erc.conf.local(8)\u003c/a\u003e, \u003ca href=\"http://man.openbsd.org/rc.d.8\" rel=\"external\"\u003erc.d(8)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"histoire\"\u003eHistoire\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003ercctl\u003c/strong\u003e est apparu la première fois dans OpenBSD 5.7.\u003c/p\u003e\n\u003ch4 id=\"auteurs\"\u003eAuteurs\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003ercctl\u003c/strong\u003e a été écrit par Antoine Jacoutot \u003ca href=\"mailto:ajacoutot@openbsd.org\" rel=\"external\"\u003eajacoutot@openbsd.org\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eTraduction du manpage \u003ca href=\"http://man.openbsd.org/man8/rcctl.8\" rel=\"external\"\u003ercctl(8)\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Contrôler les services sous OpenBSD grâce à l'outil de gestion 'rcctl'.",
            "tags": ["OpenBSD", "rcctl"],
            "date_published": "2020-01-19T16:30:51+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:db5fb422-5778-0575-917e-74640e3bd904",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/ntpd/",
            "title": "NTPD : Serveur de temps",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenNTPD est intégré nativement dans OpenBSD.\nServeurs NTP Les adresses de serveurs NTP sont visibles depuis la page pour trouver un serveur.\nLes serveurs de pool NTP sont par zones mondiales comportant plusieurs pays.\nLa zone Europe se gère à partir des serveurs [[http://www.pool.ntp.org/zone/europe|europe.pool.ntp.org]]. La zone relative à la France est : [[http://www.pool.ntp.org/zone/fr|fr.pool.ntp.org]] Configuration Le fichier de configuration est /etc/ntpd.conf.\nIl est apparu dans OpenBSD 3.6.\nDes différentes options :\nlisten on address [rtable table-id] : spécifie l\u0026rsquo;adresse ip locale ou le nom d\u0026rsquo;hôte que doit écouter le service ntpd(8). Si l\u0026rsquo;option est spécifiée plusieurs fois, le service écoutera chacune des adresses données. Si le symbole * est donné, ntpd écoutera toutes les adresses locales où est spécifiée la table de routage. Le mot-clé rtable indique quelle table de routage écouter. Par défault, ntpd écoute la table de routage en cours. query from address : spécifie l\u0026rsquo;adresse IP locale que le démon ntpd(8) doit utiliser pour les requêtes sortantes vers des serveurs spécifiés ultérieurement. sensor device : spécifie un périphérique d\u0026rsquo;écoute de temps que ntpd(8) doit écouter. S\u0026rsquo;ils sont spécifiés plusieurs fois, ntpd utilisera chaque capteur donné en référence qui existe vraiment ; ceux qui sont inexistants sont ignorés. Si le symbole * est donné, ntpd essaiera d\u0026rsquo;écouter tous les capteurs qu\u0026rsquo;il trouvera. Par défaut, ntpd n\u0026rsquo;utilise aucun capteur. server address [weight weight-value] : spécifie l\u0026rsquo;adresse IP ou le nom d\u0026rsquo;hôte d\u0026rsquo;un serveur NTP à synchroniser. ntpd essaiera de se synchroniser sur tous les serveurs spécifiés, si cette option est utilisée plusieurs fois. Si un nom d\u0026rsquo;hôte fonctionne sur la double couche réseau IPv4|6, ntpd utilisera la première adresse réseau. Si ntpd n\u0026rsquo;a pas de réponse d\u0026rsquo;une adresse, il utilisera la suivante jusqu\u0026rsquo;à ce qu\u0026rsquo;une réponde. Il est recommandé de configurer plusieurs serveurs, de préférence des serveurs à faible latence, afin d\u0026rsquo;obtenir une meilleure précision. servers address [weight weight-value] : identique à l\u0026rsquo;option server, à la différence que si les serveurs ont plusieurs adresses IP, ntpd essaiera de se synchroniser sur toutes ces adresses. constraint from url : spécifie une URL, l\u0026rsquo;adresse IP ou le nom d\u0026rsquo;hôte d\u0026rsquo;un serveur HTTPS pour fournir une contrainte. Si la contrainte donnée est utilisée plus d\u0026rsquo;une fois, ntpd(8) calculera une contrainte médiane à partir de tous les serveurs spécifiés. constraints from url : identique à l\u0026rsquo;option constraint from, à la différence que si le nom d\u0026rsquo;hôte est résolu sur plusieurs adresses IP, ntpd(8) calculera une contrainte médiane à partir de toutes ces adresses. InfoÀ-propos des options de contraintes :\nntpd(8) peut être configuré pour interroger la \u0026lsquo;Date\u0026rsquo; des serveurs HTTPS de confiance via TLS. Cette information de temps n\u0026rsquo;est pas utilisée pour la précision mais agit comme une contrainte authentifiée, réduisant ainsi l\u0026rsquo;impact des attaques NTP non authentifiées de l\u0026rsquo;homme au milieu. Les paquets NTP reçus dont les informations temporelles se situent en dehors d\u0026rsquo;une plage proche de la contrainte seront rejetés et ces serveurs NTP seront marqués comme invalides.\nDans ce mail, Theo de Raadt explique pourquoi il n\u0026rsquo;est pas désirable de personnaliser les paramètres de contraintes autrement que ceux que l\u0026rsquo;équipe fixe. Où l\u0026rsquo;on apprend aussi que le domaine www.openbsd.org ne doit pas être invoqué, non plus…\nExemple Voici un exemple du fichier /etc/examples/ntpd.conf:\n# $OpenBSD: ntpd.conf,v 1.5 2019/11/11 16:44:37 deraadt Exp $ # sample ntpd configuration file, see ntpd.conf(5) # Addresses to listen on (ntpd does not listen by default) #listen on * # sync to a single server #server ntp.example.org # use a random selection of NTP Pool Time Servers # see http://support.ntp.org/bin/view/Servers/NTPPoolServers servers pool.ntp.org # time server with excellent global adjacency server time.cloudflare.com # use a specific local timedelta sensor (radio clock, etc) sensor nmea0 trusted # use all detected timedelta sensors #sensor * # get the time constraint from a well-known HTTPS site constraint from \u0026#34;9.9.9.9\u0026#34;\t# quad9 v4 without DNS constraint from \u0026#34;2620:fe::fe\u0026#34;\t# quad9 v6 without DNS constraints from \u0026#34;www.google.com\u0026#34;\t# intentionally not 8.8.8.8 Service NTPD Le démon ntpd synchronise l\u0026rsquo;horloge locale sur un ou plusieurs serveurs NTP distants ou capteurs timedelta locaux. ntpd peut également agir comme un serveur NTP lui-même, redistribuant l\u0026rsquo;heure locale. Il implémente la version 4 de Simple Network Time Protocol, telle que décrite dans la RFC 5905, et la version 3 de Network Time Protocol, telle que décrite dans la RFC 1305. Le temps peut également être récupéré depuis les serveurs HTTPS pour réduire l\u0026rsquo;impact des attaques NTP dites \u0026ldquo;man-in-the-middle\u0026rdquo; (l\u0026rsquo;homme au milieu) non authentifiées.\nLe service ntpd est apparu la première fois dans OpenBSD 3.6.\nLes options possibles au service sont :\n-d : ne pas mettre en service. ntpd fonctionnera alors en arrière plan, et journalisera vers la sortie stderr. -f *fichier* : utilisera le fichier de configuration spécifié au lieu du fichier de configuration par défaut. -n : test la validité du fichier de configuration. À n\u0026rsquo;utiliser que pour cela. -S : annule les effets de l\u0026rsquo;option -s. -s : essaye toujours de régler l\u0026rsquo;heure au démarrage de la machine. Par défaut, ntpd essaye de régler l\u0026rsquo;heure au démarrage, uniquement si les contraintes sont configurées et satisfaites. ntpd restera au premier plan jusqu\u0026rsquo;à 15 secondes en attendant la réponse d\u0026rsquo;un des serveurs NTP configurés. Le Contrôleur ntpctl Le contrôleur ntpctl est un programme qui affiche les informations liées au service ntpd(8).\nLes options possibles sont :\n-s all | peers | Sensors | status : all : affiche toutes les informations possibles peers : affiche les informations relatives à chaque pair Sensors : affiche les informations relatives à chaque capteur. status : indique l\u0026rsquo;état des pairs et des capteurs, et si l\u0026rsquo;horloge du système est synchronisée. Le contrôleur est apparu la première fois dans OpenBSD 5.5.\nDocumentation ⇒ les différents manpage :\nle service ntpd(8). le contrôleur ntpdctl(8). le fichier de configuration ntpd.conf. un exemple local : /etc/examples/ntpd.conf RFC 1305 : https://tools.ietf.org/html/rfc1305 ; explications par Stéphane Bortzmeyer : https://www.bortzmeyer.org/1305.html RFC 5905 : https://tools.ietf.org/html/rfc5905 ; explications par Stéphane Bortzmeyer : https://www.bortzmeyer.org/5905.html Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003ca href=\"http://www.openntpd.org/\" rel=\"external\"\u003eOpenNTPD\u003c/a\u003e est intégré nativement dans OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"serveurs-ntp\"\u003eServeurs NTP\u003c/h2\u003e\n\u003cp\u003eLes adresses de serveurs NTP sont visibles depuis la\n\u003ca href=\"http://support.ntp.org/bin/view/Servers/WebHome#Finding_A_Time_Server\" rel=\"external\"\u003epage pour trouver un serveur\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLes \u003ca href=\"http://support.ntp.org/bin/view/Servers/NTPPoolServers\" rel=\"external\"\u003eserveurs de pool NTP\u003c/a\u003e\nsont par zones mondiales comportant plusieurs pays.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa zone Europe se gère à partir des serveurs [[http://www.pool.ntp.org/zone/europe|europe.pool.ntp.org]].\u003c/li\u003e\n\u003cli\u003eLa zone relative à la France est : [[http://www.pool.ntp.org/zone/fr|fr.pool.ntp.org]]\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration est \u003ccode\u003e/etc/ntpd.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl est apparu dans OpenBSD 3.6.\u003c/p\u003e\n\u003cp\u003eDes différentes options :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003elisten on\u003c/strong\u003e \u003cem\u003eaddress\u003c/em\u003e [\u003cstrong\u003ertable\u003c/strong\u003e \u003cem\u003etable-id\u003c/em\u003e] : spécifie l\u0026rsquo;adresse\nip locale ou le nom d\u0026rsquo;hôte que doit écouter le service ntpd(8). Si\nl\u0026rsquo;option est spécifiée plusieurs fois, le service écoutera chacune\ndes adresses données. Si le symbole \u003ccode\u003e*\u003c/code\u003e est donné, ntpd écoutera toutes\nles adresses locales où est spécifiée la table de routage. \u003cbr\u003e\nLe mot-clé \u003ccode\u003ertable\u003c/code\u003e indique quelle table de routage écouter. \u003cbr\u003e\nPar défault, ntpd écoute la table de routage en cours.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003equery from\u003c/strong\u003e \u003cem\u003eaddress\u003c/em\u003e : spécifie l\u0026rsquo;adresse IP locale que le démon\nntpd(8) doit utiliser pour les requêtes sortantes vers des serveurs\nspécifiés ultérieurement.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003esensor\u003c/strong\u003e \u003cem\u003edevice\u003c/em\u003e : spécifie un périphérique d\u0026rsquo;écoute de temps que\nntpd(8) doit écouter. S\u0026rsquo;ils sont spécifiés plusieurs fois, ntpd utilisera\nchaque capteur donné en référence qui existe vraiment ; ceux qui sont\ninexistants sont ignorés. \u003cbr\u003e\nSi le symbole \u003ccode\u003e*\u003c/code\u003e est donné, ntpd essaiera d\u0026rsquo;écouter tous les capteurs\nqu\u0026rsquo;il trouvera. \u003cbr\u003e\nPar défaut, ntpd n\u0026rsquo;utilise aucun capteur.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eserver\u003c/strong\u003e \u003cem\u003eaddress\u003c/em\u003e [\u003cstrong\u003eweight\u003c/strong\u003e \u003cem\u003eweight-value\u003c/em\u003e] : spécifie l\u0026rsquo;adresse\nIP ou le nom d\u0026rsquo;hôte d\u0026rsquo;un serveur NTP à synchroniser. ntpd essaiera de\nse synchroniser sur tous les serveurs spécifiés, si cette option est\nutilisée plusieurs fois. Si un nom d\u0026rsquo;hôte fonctionne sur la double\ncouche réseau IPv4|6, ntpd utilisera la première adresse réseau. \u003cbr\u003e\nSi ntpd n\u0026rsquo;a pas de réponse d\u0026rsquo;une adresse, il utilisera la suivante\njusqu\u0026rsquo;à ce qu\u0026rsquo;une réponde. \u003cbr\u003e\nIl est recommandé de configurer plusieurs serveurs, de préférence des\nserveurs à faible latence, afin d\u0026rsquo;obtenir une meilleure précision.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eservers\u003c/strong\u003e \u003cem\u003eaddress\u003c/em\u003e [\u003cstrong\u003eweight\u003c/strong\u003e \u003cem\u003eweight-value\u003c/em\u003e] : identique à\nl\u0026rsquo;option \u003ccode\u003eserver\u003c/code\u003e, à la différence que si les serveurs ont plusieurs\nadresses IP, ntpd essaiera de se synchroniser sur toutes ces adresses.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003econstraint from\u003c/strong\u003e \u003cem\u003eurl\u003c/em\u003e : spécifie une URL, l\u0026rsquo;adresse IP ou le nom\nd\u0026rsquo;hôte d\u0026rsquo;un serveur HTTPS pour fournir une contrainte. \u003cbr\u003e\nSi la contrainte donnée est utilisée plus d\u0026rsquo;une fois, ntpd(8) calculera\nune contrainte médiane à partir de tous les serveurs spécifiés.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003econstraints from\u003c/strong\u003e \u003cem\u003eurl\u003c/em\u003e : identique à l\u0026rsquo;option \u003ccode\u003econstraint from\u003c/code\u003e,\nà la différence que si le nom d\u0026rsquo;hôte est résolu sur plusieurs adresses\nIP, ntpd(8) calculera une contrainte médiane à partir de toutes ces\nadresses.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eÀ-propos des options de contraintes\u003c/strong\u003e :\u003cbr\u003e\nntpd(8) peut être configuré pour interroger la \u0026lsquo;Date\u0026rsquo; des serveurs HTTPS\nde confiance via TLS. Cette information de temps n\u0026rsquo;est pas utilisée pour\nla précision mais agit comme une contrainte authentifiée, réduisant ainsi\nl\u0026rsquo;impact des attaques NTP non authentifiées de l\u0026rsquo;homme au milieu.\nLes paquets NTP reçus dont les informations temporelles se situent en\ndehors d\u0026rsquo;une plage proche de la contrainte seront rejetés et ces serveurs\nNTP seront marqués comme invalides.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eDans ce \u003ca href=\"https://marc.info/?l=openbsd-misc\u0026amp;m=158888999317454\u0026amp;w=2\" rel=\"external\"\u003email\u003c/a\u003e,\nTheo de Raadt explique pourquoi il n\u0026rsquo;est pas désirable de personnaliser\nles paramètres de contraintes autrement que ceux que l\u0026rsquo;équipe fixe. \u003cbr\u003e\nOù l\u0026rsquo;on apprend aussi que le domaine \u003cstrong\u003e\u003ca href=\"https://www.openbsd.org\" rel=\"external\"\u003ewww.openbsd.org\u003c/a\u003e\u003c/strong\u003e ne doit pas être\ninvoqué, non plus…\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"exemple\"\u003eExemple\u003c/h3\u003e\n\u003cp\u003eVoici un exemple du fichier \u003ccode\u003e/etc/examples/ntpd.conf\u003c/code\u003e:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# $OpenBSD: ntpd.conf,v 1.5 2019/11/11 16:44:37 deraadt Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sample ntpd configuration file, see ntpd.conf(5)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Addresses to listen on (ntpd does not listen by default)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#listen on *\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sync to a single server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#server ntp.example.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# use a random selection of NTP Pool Time Servers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# see http://support.ntp.org/bin/view/Servers/NTPPoolServers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eservers pool.ntp.org\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# time server with excellent global adjacency\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver time.cloudflare.com\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# use a specific local timedelta sensor (radio clock, etc)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003esensor nmea0 trusted\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# use all detected timedelta sensors\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#sensor *\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# get the time constraint from a well-known HTTPS site\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econstraint from \u0026#34;9.9.9.9\u0026#34;\t\t# quad9 v4 without DNS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econstraint from \u0026#34;2620:fe::fe\u0026#34;\t\t# quad9 v6 without DNS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econstraints from \u0026#34;www.google.com\u0026#34;\t# intentionally not 8.8.8.8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"service-ntpd\"\u003eService NTPD\u003c/h2\u003e\n\u003cp\u003eLe démon \u003ccode\u003entpd\u003c/code\u003e synchronise l\u0026rsquo;horloge locale sur un ou plusieurs serveurs\nNTP distants ou capteurs timedelta locaux. ntpd peut également agir comme\nun serveur NTP lui-même, redistribuant l\u0026rsquo;heure locale. Il implémente la\nversion 4 de Simple Network Time Protocol, telle que décrite dans la RFC\n5905, et la version 3 de Network Time Protocol, telle que décrite dans\nla RFC 1305. Le temps peut également être récupéré depuis les serveurs\nHTTPS pour réduire l\u0026rsquo;impact des attaques NTP dites \u0026ldquo;man-in-the-middle\u0026rdquo;\n(\u003cem\u003el\u0026rsquo;homme au milieu\u003c/em\u003e) non authentifiées.\u003c/p\u003e\n\u003cp\u003eLe service \u003ccode\u003entpd\u003c/code\u003e est apparu la première fois dans OpenBSD 3.6.\u003c/p\u003e\n\u003cp\u003eLes options possibles au service sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-d\u003c/code\u003e : ne pas mettre en service. ntpd fonctionnera alors en arrière plan,\net journalisera vers la sortie \u003ccode\u003estderr\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-f *fichier*\u003c/code\u003e : utilisera le fichier de configuration spécifié au lieu\ndu fichier de configuration par défaut.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-n\u003c/code\u003e : test la validité du fichier de configuration. À n\u0026rsquo;utiliser que\npour cela.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-S\u003c/code\u003e : annule les effets de l\u0026rsquo;option \u003ccode\u003e-s\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-s\u003c/code\u003e : essaye toujours de régler l\u0026rsquo;heure au démarrage de la machine.\nPar défaut, ntpd essaye de régler l\u0026rsquo;heure au démarrage, uniquement\nsi les contraintes sont configurées et satisfaites. ntpd restera au\npremier plan jusqu\u0026rsquo;à 15 secondes en attendant la réponse d\u0026rsquo;un des\nserveurs NTP configurés.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"le-contrôleur-ntpctl\"\u003eLe Contrôleur ntpctl\u003c/h2\u003e\n\u003cp\u003eLe contrôleur \u003ccode\u003entpctl\u003c/code\u003e est un programme qui affiche les informations liées\nau service ntpd(8).\u003c/p\u003e\n\u003cp\u003eLes options possibles sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-s all | peers | Sensors | status\u003c/code\u003e :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eall\u003c/code\u003e : affiche toutes les informations possibles\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epeers\u003c/code\u003e : affiche les informations relatives à chaque pair\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSensors\u003c/code\u003e : affiche les informations relatives à chaque capteur.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatus\u003c/code\u003e : indique l\u0026rsquo;état des pairs et des capteurs, et si l\u0026rsquo;horloge du système est synchronisée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe contrôleur est apparu la première fois dans OpenBSD 5.5.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003e⇒ les différents manpage :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele service \u003ca href=\"http://man.openbsd.org/ntpd.8\" rel=\"external\"\u003entpd(8)\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003ele contrôleur \u003ca href=\"http://man.openbsd.org/ntpctl.8\" rel=\"external\"\u003entpdctl(8)\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003ele fichier de configuration \u003ca href=\"http://man.openbsd.org/ntpd.conf.5\" rel=\"external\"\u003entpd.conf\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003eun exemple local : \u003ccode\u003e/etc/examples/ntpd.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRFC 1305 : \u003ca href=\"https://tools.ietf.org/html/rfc1305\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc1305\u003c/a\u003e ;\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eexplications par Stéphane Bortzmeyer\u003c/em\u003e : \u003ca href=\"https://www.bortzmeyer.org/1305.html\" rel=\"external\"\u003ehttps://www.bortzmeyer.org/1305.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eRFC 5905 : \u003ca href=\"https://tools.ietf.org/html/rfc5905\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc5905\u003c/a\u003e ;\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eexplications par Stéphane Bortzmeyer\u003c/em\u003e : \u003ca href=\"https://www.bortzmeyer.org/5905.html\" rel=\"external\"\u003ehttps://www.bortzmeyer.org/5905.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Apprendre à gérer un serveur de temps sous OpenBSD",
            "tags": ["OpenBSD", "ntp", "OpenNTPD"],
            "date_published": "2020-01-19T16:30:48+02:00",
            "date_modified": "2023-04-30T17:05:08+02:00"
        },{
            "id": "urn:uuid:a60df368-d3cd-1939-eb90-db2442d3ea3b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/pkg/",
            "title": "OpenBSD : Gestion des paquets (outils pkg_*)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD fournit des outils bien pratiques pour gérer l\u0026rsquo;installation, la mise à jour, la suppression des paquets officiels :\nInstaller pkg_add(1) : ajouter et mettre-à-jour un logiciel ; utiliser l\u0026rsquo;option -u pour mettre à jour. Supprimer pkg_delete(1) : enlever un logiciel Information pkg_info(1) : obtenir les informations relatives au logiciel désiré Etat pkg_check(8) : vérifier l\u0026rsquo;installation d\u0026rsquo;un logiciel Explications Chercher un paquet : pkg_info -Q nom_du_paquet Installer un paquet : pkg_add nom_du_paquet Supprimer un paquet : pkg_delete nom_du_paquet Supprimer les dépendances inutiles : pkg_delete -a Réparer un système cassé et vérifier son état : pkg_check Vous trouverez plus d\u0026rsquo;informations sur la page \u0026ldquo;Package Management\u0026rdquo; (en) de la FAQ Officielle d\u0026rsquo;OpenBSD…\nAstuces Derrière un proxy Il faut définir la variable d\u0026rsquo;environnement http_proxy.\nDans votre fichier ~/.profile, insérez la ligne suivante :\nexport http_proxy=http://utilisateur_du_proxy:mot_de_passe@ip_du_proxy:port\nDépannage Retrouvez ci-dessous les erreurs courantes :\npartial-* Lors d\u0026rsquo;une installation de paquet interrompue pour une raison ou une autre, pkg_ retient le paquet avec le nom partial-nom_du_paquet.\nIl vaut mieux les supprimer.\npkg_check Au secours, plus rien ne fonctionne comme je veux !!!\nUn petit coup de pkg_check et hop, votre OpenBSD revit !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOpenBSD fournit des outils bien pratiques pour gérer l\u0026rsquo;installation, la\nmise à jour, la suppression des paquets officiels :\u003c/p\u003e\n\u003ch3 id=\"installer\"\u003eInstaller\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/pkg_add\" rel=\"external\"\u003epkg_add(1)\u003c/a\u003e : ajouter et mettre-à-jour\nun logiciel ; utiliser l\u0026rsquo;option \u003ccode\u003e-u\u003c/code\u003e pour mettre à jour.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"supprimer\"\u003eSupprimer\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/pkg_delete.1\" rel=\"external\"\u003epkg_delete(1)\u003c/a\u003e : enlever un\nlogiciel\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"information\"\u003eInformation\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/pkg_info.1\" rel=\"external\"\u003epkg_info(1)\u003c/a\u003e : obtenir les\ninformations relatives au logiciel désiré\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"etat\"\u003eEtat\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/pkg_check.8\" rel=\"external\"\u003epkg_check(8)\u003c/a\u003e : vérifier\nl\u0026rsquo;installation d\u0026rsquo;un logiciel\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"explications\"\u003eExplications\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eChercher un paquet : \u003ccode\u003epkg_info -Q nom_du_paquet\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eInstaller un paquet : \u003ccode\u003epkg_add nom_du_paquet\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSupprimer un paquet : \u003ccode\u003epkg_delete nom_du_paquet\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eSupprimer les dépendances inutiles : \u003ccode\u003epkg_delete -a\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eRéparer un système cassé et vérifier son état : \u003ccode\u003epkg_check\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous trouverez plus d\u0026rsquo;informations sur la page\n\u0026ldquo;\u003ca href=\"https://www.openbsd.org/faq/faq15.html\" rel=\"external\"\u003ePackage Management\u003c/a\u003e\u0026rdquo; \u003cem\u003e(en)\u003c/em\u003e\nde la FAQ Officielle d\u0026rsquo;OpenBSD…\u003c/p\u003e\n\u003ch2 id=\"astuces\"\u003eAstuces\u003c/h2\u003e\n\u003ch3 id=\"derrière-un-proxy\"\u003eDerrière un proxy\u003c/h3\u003e\n\u003cp\u003eIl faut définir la variable d\u0026rsquo;environnement \u003ccode\u003ehttp_proxy\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDans votre fichier \u003ccode\u003e~/.profile\u003c/code\u003e, insérez la ligne suivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eexport http_proxy=http://utilisateur_du_proxy:mot_de_passe@ip_du_proxy:port\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous les erreurs courantes :\u003c/p\u003e\n\u003ch3 id=\"partial-\"\u003epartial-*\u003c/h3\u003e\n\u003cp\u003eLors d\u0026rsquo;une installation de paquet interrompue pour une raison ou une autre,\npkg_ retient le paquet avec le nom \u003ccode\u003epartial-nom_du_paquet\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl vaut mieux les supprimer.\u003c/p\u003e\n\u003ch3 id=\"pkg_check\"\u003epkg_check\u003c/h3\u003e\n\u003cblockquote\u003e\n\u003cp\u003eAu secours, plus rien ne fonctionne comme je veux !!!\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eUn petit coup de \u003ccode\u003epkg_check\u003c/code\u003e et hop, votre OpenBSD revit !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Des outils pour la gestion des paquets sous OpenBSD : pkg_*",
            "tags": ["OpenBSD", "pkg"],
            "date_published": "2020-01-19T16:30:43+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:01cf8269-53a8-48ca-9933-ff7d29f11392",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/sysupgrade/",
            "title": "Sysupgrade : mettre à niveau le système de base vers une nouvelle version ou un nouvel instantané, sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Documentation man 8 sysupgrade man 8 sysupgrade Synopsis sysupgrade [-fkn] [-r | -s] [installurl]\nDescription sysupgrade est un utilitaire pour mettre à niveau OpenBSD vers la nouvelle version (release) ou un nouvel instantané (snapshot) si disponible.\nsysupgrade télécharge les fichiers nécessaires vers _/home/sysupgrade, les vérifie avec signify(1), et copie bsd.rd vers /bsd.upgrade.\nsysupgrade redémarre par défaut le système. Le chargeur de démarrage choisira automatiquement /bsd.upgrade, déclenchant une mise à niveau en une seule fois utilisant les fichiers déposés dans _/home/sysupgrade.\nLes options sont les suivantes :\n-f : force une mise à niveau déjà appliquée. Par défaut, elle met à niveau seulement le dernier instantané s\u0026rsquo;il est disponible. Cette option n\u0026rsquo;a pas d\u0026rsquo;effet sur une nouvelle version. -k : Garde les fichiers dans _/home/sysupgrade. Par défaut, ils seront supprimés après la mise à niveau. -n : Récupère et vérifie les fichiers et crée le fichier /bsd.upgrade mais ne redémarre pas. -r : Mise à niveau vers la nouvelle version. Si le système fonctionne actuellement sur une release, elle est active par défaut. -s : Mise à niveau vers un instantané. Si le système fonctionne actuellement sur un instantané, elle est active par défaut. Fichiers /auto_upgrade.conf : fichier de réponse pour le noyau ramdisk. /bsd.upgrade : le noyau qui déclenche la mise à niveau sans surveillance. /etc/installurl : URL du miroir d\u0026rsquo;OpenBSD pour récupérer la mise à niveau. _/home/sysupgrade : répertoire où la mise à niveau est téléchargée Voir aussi signify(1), installurl(5), autoinstall(8), release(8) Histoire sysupgrade est apparu la première fois dans OpenBSD 6.6\nTraduction du manpage sysupgrade(8) !\nInformations supplémentaires À-partir d\u0026rsquo;OpenBSD 6.7, sysupgrade invoque l\u0026rsquo;outil fw_update(1). (cf : 6.7) :\nAdded an opportunistic run of fw_update(1) to sysupgrade(8) before rebooting to run the upgrade. Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/sysupgrade/#man-8-sysupgrade\"\u003eman 8 sysupgrade\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-8-sysupgrade\"\u003eman 8 sysupgrade\u003c/h3\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esysupgrade\u003c/strong\u003e [\u003cstrong\u003e-fkn\u003c/strong\u003e] [\u003cstrong\u003e-r\u003c/strong\u003e | \u003cstrong\u003e-s\u003c/strong\u003e] [\u003cstrong\u003einstallurl\u003c/strong\u003e]\u003c/p\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esysupgrade\u003c/strong\u003e est un utilitaire pour mettre à niveau OpenBSD vers la\nnouvelle version \u003cem\u003e(release)\u003c/em\u003e ou un nouvel instantané \u003cem\u003e(snapshot)\u003c/em\u003e si disponible.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esysupgrade\u003c/strong\u003e télécharge les fichiers nécessaires vers _\u003cem\u003e/home/\u003cem\u003esysupgrade\u003c/em\u003e\u003c/em\u003e,\nles vérifie avec \u003ca href=\"http://man.openbsd.org/signify\" rel=\"external\"\u003esignify(1)\u003c/a\u003e, et copie\nbsd.rd vers \u003cstrong\u003e/bsd.upgrade\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003esysupgrade\u003c/strong\u003e redémarre par défaut le système. Le chargeur de démarrage\nchoisira automatiquement \u003cstrong\u003e/bsd.upgrade\u003c/strong\u003e, déclenchant une mise à niveau\nen une seule fois utilisant les fichiers déposés dans _\u003cem\u003e/home/\u003cem\u003esysupgrade\u003c/em\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eLes options sont les suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e-f\u003c/strong\u003e : force une mise à niveau déjà appliquée. Par défaut, elle met\nà niveau seulement le dernier instantané s\u0026rsquo;il est disponible. Cette\noption n\u0026rsquo;a pas d\u0026rsquo;effet sur une nouvelle version.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e-k\u003c/strong\u003e : Garde les fichiers dans _\u003cem\u003e/home/\u003cem\u003esysupgrade\u003c/em\u003e\u003c/em\u003e. Par défaut,\nils seront supprimés après la mise à niveau.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e-n\u003c/strong\u003e : Récupère et vérifie les fichiers et crée le fichier \u003cstrong\u003e/bsd.upgrade\u003c/strong\u003e\nmais ne redémarre pas.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e-r\u003c/strong\u003e : Mise à niveau vers la nouvelle version. Si le système fonctionne\nactuellement sur une release, elle est active par défaut.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e-s\u003c/strong\u003e : Mise à niveau vers un instantané. Si le système fonctionne\nactuellement sur un instantané, elle est active par défaut.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"fichiers\"\u003eFichiers\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e/auto_upgrade.conf\u003c/strong\u003e : fichier de réponse pour le noyau ramdisk.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e/bsd.upgrade\u003c/strong\u003e : le noyau qui déclenche la mise à niveau sans surveillance.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e/etc/installurl\u003c/strong\u003e : URL du miroir d\u0026rsquo;OpenBSD pour récupérer la mise à niveau.\u003c/li\u003e\n\u003cli\u003e_\u003cem\u003e/home/\u003cem\u003esysupgrade\u003c/em\u003e\u003c/em\u003e : répertoire où la mise à niveau est téléchargée\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/signify\" rel=\"external\"\u003esignify(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/installurl.5\" rel=\"external\"\u003einstallurl(5)\u003c/a\u003e, \u003ca href=\"http://man.openbsd.org/autoinstall.8\" rel=\"external\"\u003eautoinstall(8)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/release.8\" rel=\"external\"\u003erelease(8)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"histoire\"\u003eHistoire\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esysupgrade\u003c/strong\u003e est apparu la première fois dans OpenBSD 6.6\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eTraduction du manpage \u003ca href=\"http://man.openbsd.org/sysupgrade\" rel=\"external\"\u003esysupgrade(8)\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"informations-supplémentaires\"\u003eInformations supplémentaires\u003c/h3\u003e\n\u003cp\u003eÀ-partir d\u0026rsquo;OpenBSD 6.7, \u003ccode\u003esysupgrade\u003c/code\u003e invoque l\u0026rsquo;outil\n\u003ca href=\"https://man.openbsd.org/fw_update\" rel=\"external\"\u003efw_update(1)\u003c/a\u003e. \u003cem\u003e(cf : \u003ca href=\"https://www.openbsd.org/67.html\" rel=\"external\"\u003e6.7\u003c/a\u003e)\u003c/em\u003e :\u003c/p\u003e\n\u003cblockquote\u003eAdded an opportunistic run of fw_update(1) to sysupgrade(8) before rebooting to run the upgrade. \u003c/blockquote\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Upgrader de version sous OpenBSD, grâce à l'outil 'sysupgrade'.",
            "tags": ["OpenBSD", "sysupgrade"],
            "date_published": "2020-01-19T16:30:29+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:b769a3ee-b5b2-b8a9-71ed-914362bb15b8",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/installurl/",
            "title": "installurl : localisation du serveur miroir OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Documentation man 5 installurl man 5 installurl Description Le fichier /etc/installurl contient une simple ligne spécifiant un serveur miroir d\u0026rsquo;OpenBSD, tel que :\nhttps://ftp.openbsd.org/pub/OpenBSD\nIl est créé par le script d\u0026rsquo;installation durant les phases d\u0026rsquo;installation et de mises à niveau par le biais d\u0026rsquo;HTTP.\nLes lignes vides et les lignes commençant par le symbole \u0026lsquo;#\u0026rsquo; dans le fichier sont ignorées.\nFichiers /etc/installurl Voir aussi pkg_add(1), syspatch(8), sysupgrade(8) Traduction du manpage installurl(5) !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/installurl/#man-5-installurl\"\u003eman 5 installurl\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-5-installurl\"\u003eman 5 installurl\u003c/h3\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/installurl\u003c/code\u003e contient une simple ligne spécifiant un serveur\nmiroir d\u0026rsquo;OpenBSD, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ehttps://ftp.openbsd.org/pub/OpenBSD\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl est créé par le script d\u0026rsquo;installation durant les phases d\u0026rsquo;installation\net de mises à niveau par le biais d\u0026rsquo;HTTP.\u003c/p\u003e\n\u003cp\u003eLes lignes vides et les lignes commençant par le symbole \u0026lsquo;#\u0026rsquo; dans le fichier\nsont ignorées.\u003c/p\u003e\n\u003ch4 id=\"fichiers\"\u003eFichiers\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/installurl\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://man.openbsd.org/pkg_add.1\" rel=\"external\"\u003epkg_add(1)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/syspatch.8\" rel=\"external\"\u003esyspatch(8)\u003c/a\u003e, \u003ca href=\"https://man.openbsd.org/sysupgrade.8\" rel=\"external\"\u003esysupgrade(8)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eTraduction du manpage \u003ca href=\"https://man.openbsd.org/installurl.5\" rel=\"external\"\u003einstallurl(5)\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Installurl - un procédé très simple pour localiser un miroir OpenBSD",
            "tags": ["OpenBSD", "installurl"],
            "date_published": "2020-01-19T16:30:27+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:962925db-df18-51eb-e07a-66a141475584",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tutoriel-pandoc/",
            "title": "Installer et utiliser Pandoc / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Pandoc n\u0026rsquo;est pas empaqueté sous OpenBSD. On peut quand même l\u0026rsquo;installer, mais il faut passer par le biais de l\u0026rsquo;outil cabal !\nPré-requis Modifiez le fichier /etc/login.conf pour avoir la ligne suivante :\n:datasize-cur=infinity:\\ Dans la section \u0026ldquo;default\u0026rdquo; si vous voulez le permettre pour tous les utilisateurs, sinon pour seulement la section \u0026ldquo;staff\u0026rdquo;.\nInstallation En plus, d\u0026rsquo;installer l\u0026rsquo;outil cabal-install, il semble nécessaire d\u0026rsquo;installer aussi le paquet ghc.\nDeuxièmement, il importe de faire les modifications systèmes nécessaires pour l\u0026rsquo;usage correct de cabal.\nEnsuite, utilisez cabal de manière à installer pandoc.\n$ cabal new-update $ cabal new-install pandoc Dépannage does not exist (No such file or directory) Si une erreur de ce type apparaît:\nghc-pkg: /home/hvr/.cabal/store/ghc-8.6.6/package.db: getDirectoryContents:openDirStream: does not exist (No such file or directory) Créez les dossiers manquants avant l\u0026rsquo;installation de pandoc:\nmkdir -p $HOME/.cabal/store/ghc-8.6.4/ ghc-pkg init $HOME/.cabal/store/ghc-8.6.4/package.db Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePandoc n\u0026rsquo;est pas empaqueté sous OpenBSD. On peut quand même l\u0026rsquo;installer,\nmais il faut passer par le biais de l\u0026rsquo;outil\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/cabal/\" title=\"Lien interne vers l\u0026#39;article : 'Installer l\u0026#39;outil Cabal sous OpenBSD'\"\u003ecabal\u003c/a\u003e\n !\u003c/p\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\u003cp\u003eModifiez le fichier \u003ccode\u003e/etc/login.conf\u003c/code\u003e pour avoir la ligne suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e:datasize-cur\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003einfinity:\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans la section \u0026ldquo;default\u0026rdquo; si vous voulez le permettre pour tous les\nutilisateurs, sinon pour seulement la section \u0026ldquo;staff\u0026rdquo;.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eEn plus, d\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n\nl\u0026rsquo;outil \u003ccode\u003ecabal-install\u003c/code\u003e, il semble nécessaire d\u0026rsquo;installer aussi le\npaquet \u003ccode\u003eghc\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDeuxièmement, il importe de faire les\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/cabal/#modifications-syst%c3%a8me\" title=\"Lien interne vers l\u0026#39;article : 'Installer l\u0026#39;outil Cabal sous OpenBSD'\"\u003emodifications systèmes\u003c/a\u003e\n\nnécessaires pour l\u0026rsquo;usage correct de \u003ccode\u003ecabal\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEnsuite, utilisez \u003ccode\u003ecabal\u003c/code\u003e de manière à installer \u003ccode\u003epandoc\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cabal new-update\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cabal new-install pandoc\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"does-not-exist-no-such-file-or-directory\"\u003edoes not exist (No such file or directory)\u003c/h3\u003e\n\u003cp\u003eSi une erreur de ce type apparaît:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eghc-pkg: /home/hvr/.cabal/store/ghc-8.6.6/package.db: getDirectoryContents:openDirStream: does not exist \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eNo such file or directory\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eCréez les dossiers manquants avant l\u0026rsquo;installation\u003c/strong\u003e de pandoc:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir -p \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/.cabal/store/ghc-8.6.4/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eghc-pkg init \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/.cabal/store/ghc-8.6.4/package.db\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Mini-tutoriel pour utiliser pandoc sous OpenBSD",
            "tags": ["OpenBSD", "cabal", "pandoc"],
            "date_published": "2020-01-19T15:08:49+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:af3bc57f-33ba-c75a-05ec-1723b149d321",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/hotplugd/",
            "title": "hotplug-diskmount : utiliser un périphérique USB facilement / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description hotplug-diskmount est un plugin pour le hotplugd(8) d\u0026rsquo;OpenBSD qui monte automatiquement les périphériques à chaud. Il fonctionne avec tout type de disque (des périphériques de stockage de masse USB, des lecteurs de cartes, et CD/DVD) et il est prévu pour être utilisé dans des environnements d\u0026rsquo;utilisateur uniques tels que des ordinateurs de bureau ou des portables.\nLa page du projet : http://www.bsdua.org/hotplug-diskmount.html Le dépôt des sources : https://bitbucket.org/alex_vatchenko/hotplug-diskmount Informations hotplug-diskmount semble se baser sur la détection des informations qui sont retournées par disklabel, aussi !\nhotplug-diskmount gère les partitions de type :\nFat, FAT32 (msdos) (lecture/écriture), NTFS (lecture/écriture) - L\u0026rsquo;écriture est possible grâce à Fuse - veillez à l\u0026rsquo;avoir installer auparavant ! - support ajouté avec la version 1.0.2 AttentionATTENTION, il semble exister un bogue de détection ; en effet, si la table de partition de votre périphérique USB est de type \u0026ldquo;(ms)dos\u0026rdquo;, le périphérique sera détecté et monté correctement ; si la table de partition est de type \u0026ldquo;GPT\u0026rdquo;, cela ne sera pas le cas. Pour l\u0026rsquo;instant, avec la version 1.0.2, veillez à ce que votre table de partition soit \u0026ldquo;(ms)dos\u0026rdquo; ! iso 9660 - non testé ext2/3 (lecture/écriture) - monte effectivement : thunar plante ; fonctionne sans soucis avec \u0026lsquo;mc\u0026rsquo; en mode console\u0026rsquo;. ext4 (lecture) - cherche à le monter, mais se vautre. Il semble nécessaire de faire le point de montage à la main, avec les droits administrateur. OpenBSD ≥ 6.1 Depuis la version 6.1, OpenBSD utilise la version 1.0.2 du projet !\nOpenBSD ≤ 6.0 Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Veuillez à mettre-à-niveau !\nOpenBSD 6.0 utilise la version 0.9 - elle est clairement dépassée, et peut ne pas fonctionner sur certains périphériques ; la raison est que depuis février 2015, date de sortie de la v0.9, la structure du fonctionnement de l\u0026rsquo;outil \u0026lsquo;disklabel(8)\u0026rsquo; a été modifiée. Dans ce contexte, il serait plus intéressant d\u0026rsquo;utiliser la version de l\u0026rsquo;arbre des ports, à ce jour la v1.0.\nNéanmoins, il vaut mieux utiliser la version 1.0.2, car celle-ci ajoute le support ntfs grâce à l\u0026rsquo;ajout de la gestion du projet fuse(4).\nInstallation Pré-requis Installez le paquet fuse.\nOpenBSD ≥ 6.1 Il suffit d\u0026rsquo;[[system:base:pkg|installer]] le paquet hotplug-diskmount.\nOpenBSD ≤ 6.0 Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Veuillez à mettre-à-jour !\nInitialisation Il est IMPORTANT d\u0026rsquo;initialiser le projet pour créer son répertoire de montage par défaut - normalement /vol :\n# /usr/local/libexec/hotplug-diskmount init\nAstuceIl est intéressant à noter que l\u0026rsquo;on peut spécifier un répertoire cible en utilisant l\u0026rsquo;option -d, tel que :\n# /usr/local/libexec/hotplug-diskmount -d /mnt/$USER init\nIl est ensuite nécessaire d\u0026rsquo; activer le service hotplugd…\nConfiguration Il faut créer/modifier le fichier /etc/hotplug/attach :\n# nano /etc/hotplug/attach\n#!/bin/sh DEVCLASS=${1} DEVNAME=${2} LOGIN=\u0026#34;votre_id_user\u0026#34; case \u0026#34;${DEVCLASS}\u0026#34; in 2) /usr/local/libexec/hotplug-diskmount attach -u \u0026#34;${LOGIN}\u0026#34; -m 0700 \u0026#34;${DEVNAME}\u0026#34; ;; esac puis veillez à ce qu\u0026rsquo;il soit exécutable :\n# chmod +x /etc/hotplug/attach\nInfoNote : Modifier la valeur de la variable LOGIN, en ligne 5, avec votre identifiant de session utilisateur. De même, il est spécifié le mode \u0026lsquo;0700\u0026rsquo; afin que nul autre n\u0026rsquo;ait accès au contenu ! AttentionATTENTION : Toute modification dans ce fichier nécessitera le redémarrage du démon hotplugd !\nAutrement, celles-ci ne seront pas prises en compte.\nDémarrage Démarrez le service hotplugd afin que les modifications soient gérées !\nVérification Après avoir inséré votre périphérique USB, ou CD-Rom…\nEn mode console :\n$ mount (…) /dev/sd1i on /vol/DataTraveler 3. type msdos (local, nodev, nosuid, uid=1000, gid=0, mask=0700) $ ls -al /vol/ total 44 drwxr-xr-x 4 root wheel 512 Sep 15 22:50 . drwxr-xr-x 15 root wheel 512 Sep 12 23:04 .. drwx------ 2 root wheel 512 Sep 15 22:50 .db drwx------ 1 votre_id_user wheel 16384 Jan 1 1980 DataTraveler 3. En mode graphique, utilisez donc votre navigateur de fichiers, dirigez-vous vers le volume /vol - ou le répertoire cible que vous auriez précisé - où vous trouverez un répertoire créé automatiquement selon le label correspondant à votre périphérique.\nDocumentation Le fichier /usr/local/share/doc/pkg-readmes/hotplug-diskmount Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.bsdua.org/hotplug-diskmount.html\" rel=\"external\"\u003ehotplug-diskmount\u003c/a\u003e\u003c/strong\u003e est\nun plugin pour le \u003ca href=\"http://man.openbsd.org/hotplugd.8\" rel=\"external\"\u003e\u003ccode\u003ehotplugd(8)\u003c/code\u003e\u003c/a\u003e\nd\u0026rsquo;OpenBSD qui monte automatiquement les périphériques à chaud.\nIl fonctionne avec tout type de disque \u003cem\u003e(des périphériques de stockage de\nmasse USB, des lecteurs de cartes, et CD/DVD)\u003c/em\u003e et il est prévu pour être\nutilisé dans des environnements d\u0026rsquo;utilisateur uniques tels que des\nordinateurs de bureau ou des portables.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLa page du projet : \u003ca href=\"http://www.bsdua.org/hotplug-diskmount.html\" rel=\"external\"\u003ehttp://www.bsdua.org/hotplug-diskmount.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLe dépôt des sources : \u003ca href=\"https://bitbucket.org/alex_vatchenko/hotplug-diskmount\" rel=\"external\"\u003ehttps://bitbucket.org/alex_vatchenko/hotplug-diskmount\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"informations\"\u003eInformations\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ehotplug-diskmount\u003c/strong\u003e semble se baser sur la détection des informations\nqui sont retournées par disklabel, aussi !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ehotplug-diskmount\u003c/strong\u003e gère les partitions de type :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eFat, FAT32\u003c/strong\u003e (msdos) (lecture/écriture),\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eNTFS\u003c/strong\u003e (lecture/écriture) - L\u0026rsquo;écriture est possible grâce à Fuse -\n\u003cem\u003eveillez à l\u0026rsquo;avoir installer auparavant !\u003c/em\u003e - support ajouté avec la\nversion 1.0.2\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e, il semble exister un bogue de détection ; en effet, si la\ntable de partition de votre périphérique USB est de type \u0026ldquo;(ms)dos\u0026rdquo;, le\npériphérique sera détecté et monté correctement ; si la table de partition\nest de type \u0026ldquo;GPT\u0026rdquo;, cela ne sera pas le cas. Pour l\u0026rsquo;instant, avec la\nversion 1.0.2, veillez à ce que votre table de partition soit \u0026ldquo;(ms)dos\u0026rdquo; !\u003c/div\u003e\n\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eiso 9660\u003c/strong\u003e - non testé\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eext2/3\u003c/strong\u003e (lecture/écriture) - monte effectivement :\n\u003cul\u003e\n\u003cli\u003ethunar plante ;\u003c/li\u003e\n\u003cli\u003efonctionne sans soucis avec \u0026lsquo;mc\u0026rsquo; en mode console\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eext4\u003c/strong\u003e (lecture) - cherche à le monter, mais se vautre. Il semble\n\u003cem\u003enécessaire de faire le point de montage à la main\u003c/em\u003e, avec les droits\nadministrateur.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"openbsd--61\"\u003eOpenBSD ≥ 6.1\u003c/h4\u003e\n\u003cp\u003eDepuis la version 6.1, OpenBSD utilise la version 1.0.2 du projet !\u003c/p\u003e\n\u003ch4 id=\"openbsd--60\"\u003eOpenBSD ≤ 6.0\u003c/h4\u003e\n\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eVeuillez à mettre-à-niveau\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003eOpenBSD 6.0 utilise la version 0.9 - \u003cem\u003eelle est clairement dépassée, et\npeut ne pas fonctionner sur certains périphériques ; la raison est que\ndepuis février 2015, date de sortie de la v0.9, la structure du\nfonctionnement de l\u0026rsquo;outil\n\u0026lsquo;\u003ca href=\"http://man.openbsd.org/OpenBSD-current/man8/disklabel.8\" rel=\"external\"\u003edisklabel(8)\u003c/a\u003e\u0026rsquo;\na été modifiée. Dans ce contexte, il serait plus intéressant d\u0026rsquo;utiliser\nla version de l\u0026rsquo;arbre des ports, à ce jour la v1.0.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eNéanmoins, il vaut mieux utiliser la version 1.0.2, car celle-ci ajoute\nle support ntfs grâce à l\u0026rsquo;ajout de la gestion du projet\n\u003ca href=\"http://man.openbsd.org/OpenBSD-current/man4/fuse.4\" rel=\"external\"\u003efuse(4)\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003ch3 id=\"pré-requis\"\u003ePré-requis\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003efuse\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"openbsd--61-1\"\u003eOpenBSD ≥ 6.1\u003c/h3\u003e\n\u003cp\u003eIl suffit d\u0026rsquo;\u003cstrong\u003e[[system:base:pkg|installer]] le paquet \u003ccode\u003ehotplug-diskmount\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"openbsd--60-1\"\u003eOpenBSD ≤ 6.0\u003c/h3\u003e\n\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003eVeuillez à mettre-à-jour\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"initialisation\"\u003eInitialisation\u003c/h3\u003e\n\u003cp\u003eIl est IMPORTANT d\u0026rsquo;initialiser le projet pour créer son répertoire de\nmontage par défaut - normalement \u003ccode\u003e/vol\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# /usr/local/libexec/hotplug-diskmount init\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eIl est intéressant à noter que l\u0026rsquo;on peut spécifier un répertoire cible\nen utilisant l\u0026rsquo;option \u003ccode\u003e-d\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# /usr/local/libexec/hotplug-diskmount -d /mnt/$USER init\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl est ensuite nécessaire d\u0026rsquo;\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eactiver le service\u003c/a\u003e\n\n\u003ccode\u003ehotplugd\u003c/code\u003e…\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eIl faut créer/modifier le fichier \u003ccode\u003e/etc/hotplug/attach\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# nano /etc/hotplug/attach\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eDEVCLASS\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e1\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eDEVNAME\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e2\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eLOGIN\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;votre_id_user\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003ecase\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eDEVCLASS\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e in\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        /usr/local/libexec/hotplug-diskmount attach -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eLOGIN\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -m \u003cspan style=\"color:#f99b15\"\u003e0700\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eDEVNAME\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ;;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eesac\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003epuis veillez à ce qu\u0026rsquo;il soit exécutable :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# chmod +x /etc/hotplug/attach\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cstrong\u003eNote\u003c/strong\u003e : Modifier la valeur de la variable LOGIN, en ligne 5, avec\nvotre identifiant de session utilisateur. De même, il est spécifié le\nmode \u0026lsquo;0700\u0026rsquo; afin que nul autre n\u0026rsquo;ait accès au contenu !\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Toute modification dans ce fichier nécessitera le\nredémarrage du démon hotplugd !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eAutrement, celles-ci ne seront pas prises en compte.\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"démarrage\"\u003eDémarrage\u003c/h2\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eDémarrez le service\u003c/a\u003e\n\n\u003ccode\u003ehotplugd\u003c/code\u003e afin que les modifications soient gérées  !\u003c/p\u003e\n\u003ch2 id=\"vérification\"\u003eVérification\u003c/h2\u003e\n\u003cp\u003eAprès avoir inséré votre périphérique USB, ou CD-Rom…\u003c/p\u003e\n\u003cp\u003eEn mode console :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ mount \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/dev/sd1i on /vol/DataTraveler 3. type msdos \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003elocal, nodev, nosuid, \u003cspan style=\"color:#ef6155\"\u003euid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e1000, \u003cspan style=\"color:#ef6155\"\u003egid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0, \u003cspan style=\"color:#ef6155\"\u003emask\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e0700\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ls -al /vol/                                                                                                                             \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etotal \u003cspan style=\"color:#f99b15\"\u003e44\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x   \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e root  wheel    \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Sep \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e 22:50 .\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e root  wheel    \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Sep \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 23:04 ..\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwx------   \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e root  wheel    \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Sep \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e 22:50 .db\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwx------   \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e votre_id_user   wheel  \u003cspan style=\"color:#f99b15\"\u003e16384\u003c/span\u003e Jan  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e1980\u003c/span\u003e DataTraveler 3.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEn mode graphique, utilisez donc votre navigateur de fichiers,\ndirigez-vous vers le volume \u003ccode\u003e/vol\u003c/code\u003e - \u003cem\u003eou le répertoire cible que vous\nauriez précisé\u003c/em\u003e - où vous trouverez un répertoire créé automatiquement\nselon le label correspondant à votre périphérique.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier \u003ccode\u003e/usr/local/share/doc/pkg-readmes/hotplug-diskmount\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser un périphérique USB sous OpenBSD grâce au projet 'hotplugd'.",
            "tags": ["OpenBSD", "hotplugd", "fuse"],
            "date_published": "2020-01-19T15:03:34+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:c7487cfc-dbb2-f367-9ef9-24ee9076135a",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/consolekit/",
            "title": "Consolekit2 (bus de messages) / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description ConsoleKit2 est un framework permettant de définir et de suivre les utilisateurs, les sessions de connexion et les seats. Il permet à de multiples utilisateurs d\u0026rsquo;être connectés en même temps et de partager le matériel pour leur session graphique. ConsoleKit2 gardera une trace de ces ressources et, quelle que soit la session active, utilisera le matériel à ce moment-là.\nDéfinition d\u0026rsquo;un seat Un seat est une collection de sessions et de paramètres matériels (habituellement au moins un clavier et une souris). Une seule session peut être active à la fois par seat.\nDéfinition d\u0026rsquo;une session Une session est une collection de tous les processus qui proviennent d\u0026rsquo;un seul ancêtre commun et qui conservent la connaissance d\u0026rsquo;un secret. En tant que détail d\u0026rsquo;implémentation, ce secret peut être enregistré dans un processus d\u0026rsquo;environnement par le gestionnaire de session sous le nom de XDG_SESSION_COOKIE.\nInstallation Installez les paquets consolekit2 polkit.\nInfoCertains packages l\u0026rsquo;installent automatiquement en tant que dépendance requise… Configuration Pour activer consolekit dans une session graphique, il est nécessaire de préfixer le binaire ck-launch-session dans le script de session, tel que :\n/usr/local/bin/ck-launch-session /usr/local/bin/openbox-session AttentionLe gestionnaire de session gdm s\u0026rsquo;occupe automatiquement de cette fonction\ndans ce cas, il est important de ne rien modifier ! Démarrage de service nécessaire Il est nécessaire que le service system-wide D-Bus fonctionne en premier.\nActiver le service messagebus Ordonner le service en tout premier puis Démarrer le service Log history Il peut être utile, du fait que le journal history puisse devenir gros, de prévoir de faire une rotation de celui-ci.\nOuvrez, avec vos droits administrateurs, le fichier /etc/newsyslog.conf et ajouter, par exemple, la ligne suivante :\n/var/log/ConsoleKit/history root:wheel 640 7 * * Z\nPuis, relancez newsyslog…\nDocumentation Après l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier /usr/local/share/doc/pkg-readmes/consolekit2 !\nVous pouvez aussi lire les exemples :\ndans /usr/local/share/examples/consolekit/ et dans /usr/local/share/examples/polkit/ Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://github.com/ConsoleKit2/ConsoleKit2\" rel=\"external\"\u003eConsoleKit2\u003c/a\u003e\u003c/strong\u003e est un\nframework permettant de définir et de suivre les utilisateurs, les\nsessions de connexion et les seats. Il permet à de multiples utilisateurs\nd\u0026rsquo;être connectés en même temps et de partager le matériel pour leur\nsession graphique. ConsoleKit2 gardera une trace de ces ressources et,\nquelle que soit la session active, utilisera le matériel à ce moment-là.\u003c/p\u003e\n\u003ch3 id=\"définition-dun-seat\"\u003eDéfinition d\u0026rsquo;un seat\u003c/h3\u003e\n\u003cp\u003eUn seat est une collection de sessions et de paramètres matériels\n(habituellement au moins un clavier et une souris). Une seule session\npeut être active à la fois par seat.\u003c/p\u003e\n\u003ch3 id=\"définition-dune-session\"\u003eDéfinition d\u0026rsquo;une session\u003c/h3\u003e\n\u003cp\u003eUne session est une collection de tous les processus qui proviennent\nd\u0026rsquo;un seul ancêtre commun et qui conservent la connaissance d\u0026rsquo;un secret.\nEn tant que détail d\u0026rsquo;implémentation, ce secret peut être enregistré dans\nun processus d\u0026rsquo;environnement par le gestionnaire de session sous le nom\nde \u003ccode\u003eXDG_SESSION_COOKIE\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n les\npaquets \u003ccode\u003econsolekit2 polkit\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCertains packages l\u0026rsquo;installent automatiquement en tant que dépendance\nrequise…\u003c/div\u003e\n\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePour activer \u003ccode\u003econsolekit\u003c/code\u003e dans une session graphique, il est nécessaire\nde préfixer le binaire \u003ccode\u003eck-launch-session\u003c/code\u003e dans le script de session,\ntel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/usr/local/bin/ck-launch-session /usr/local/bin/openbox-session\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eLe gestionnaire de session \u003ccode\u003egdm\u003c/code\u003e s\u0026rsquo;occupe automatiquement de cette\nfonction\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003edans ce cas, il est important de ne rien modifier !\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003ch3 id=\"démarrage-de-service-nécessaire\"\u003eDémarrage de service nécessaire\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire que le service \u003ccode\u003esystem-wide D-Bus\u003c/code\u003e fonctionne en premier.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eActiver le service\u003c/a\u003e\n \u003ccode\u003emessagebus\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#ordonner\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eOrdonner le service\u003c/a\u003e\n\nen tout premier\u003c/li\u003e\n\u003cli\u003epuis \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eDémarrer le service\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"log-history\"\u003eLog \u003ccode\u003ehistory\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eIl peut être utile, du fait que le journal \u003ccode\u003ehistory\u003c/code\u003e puisse devenir gros,\nde prévoir de faire une rotation de celui-ci.\u003c/p\u003e\n\u003cp\u003eOuvrez, avec vos droits administrateurs, le fichier \u003ccode\u003e/etc/newsyslog.conf\u003c/code\u003e\net ajouter, par exemple, la ligne suivante :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e/var/log/ConsoleKit/history     root:wheel      640     7       *       *       Z\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis, relancez \u003ccode\u003enewsyslog\u003c/code\u003e…\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eAprès l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier\n\u003ccode\u003e/usr/local/share/doc/pkg-readmes/consolekit2\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eVous pouvez aussi lire les exemples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edans \u003ccode\u003e/usr/local/share/examples/consolekit/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet dans \u003ccode\u003e/usr/local/share/examples/polkit/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Consolekit2 est un utilitaire sous OpenBSD pour suivre les sessions",
            "tags": ["OpenBSD", "consolekit"],
            "date_published": "2020-01-19T14:52:56+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:6c7711d5-b3be-87f1-bc46-1ac2c3ea27a3",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tutoriel-mount-usb/",
            "title": "Monter un disque / une clé USB en tant qu’utilisateur sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Sous OpenBSD, il existe différents moyens de monter un disque dur USB, ou une clé USB…\nMéthode automatique OpenBSD ≥ 6.0 À partir d\u0026rsquo;OpenBSD 6.0 et supérieures, il semble préférable de se diriger vers l\u0026rsquo;usage du démon hotplugd et du binaire \u0026lsquo;hotplug-diskmount\u0026rsquo;.\nOpenBSD \u0026lt; 6.0 Il faut modifier l’option kern.usermount.\n# sysctl kern.usermount=1\nAttentionATTENTION : cette option n\u0026rsquo;est plus disponible à partir d\u0026rsquo;OpenBSD 6.0 Par sécurité, ce paramétrage retrouve sa valeur par défaut au redémarrage.\nMalgré tout, si vous souhaitez qu\u0026rsquo;il soit pris en compte de façon permanente, ajoutez ceci au fichier /etc/sysctl.conf :\nkern.usermount=1 Méthode \u0026ldquo;manuelle\u0026rdquo; Cette méthode est à recommander que si et seulement si les méthodes automatiques ci-dessus ne fonctionnent pas, ou si vous préférez vous en passer !\nce qui signifie que vous comprenez correctement les étapes décrites ci-dessous ! Identification de la clé Tout d’abord, repérez le nom de votre clé USB avec la commande dmesg juste après l\u0026rsquo;avoir insérée :\numass1 at uhub2 port 2 configuration 1 interface 0 \u0026#34;SanDisk Cruzer Edge\u0026#34; rev 2.00/1.27 addr 3 umass1: using SCSI over Bulk-Only scsibus5 at umass1: 2 targets, initiator 0 sd2 at scsibus5 targ 1 lun 0: \u0026lt;SanDisk, Cruzer Edge, 1.27\u0026gt; SCSI4 0/direct removable serial.0781556b42119B2141E2 sd2: 15267MB, 512 bytes/sector, 31266816 sectors Ici, la clé est donc sd2 !\nEnsuite, avec la commande disklabel, vous pouvez repérer les partitions contenues sur la clé :\n$ disklabel sd2 # /dev/rsd2c: type: SCSI disk: SCSI disk label: Cruzer Edge duid: 0000000000000000 flags: bytes/sector: 512 sectors/track: 63 tracks/cylinder: 255 sectors/cylinder: 16065 cylinders: 1946 total sectors: 31266816 boundstart: 0 boundend: 31266816 drivedata: 0 16 partitions: # size offset fstype [fsize bsize cpg] c: 31266816 0 unused i: 31264768 2048 MSDOS Montage de la clé Enfin, il suffit de monter la clé dans un dossier qui vous appartient. Ici, la partition intéressante est la i. Par exemple pour la monter dans le dossier ~/usb qui se trouve dans votre répertoire :\n# mount /dev/sd2i ~/usb Permission de lecture et d\u0026rsquo;écriture Il reste un problème à régler. Si vous jetez un oeil aux droits d\u0026rsquo;accès de votre clé :\n$ ls -la /dev/sd2i brw-r----- 1 root operator 4, 24 Apr 30 2016 10:29 /dev/sd2i Vous remarquez que seul root et les membres du groupe operator ont les droits requis.\nAjout de votre utilisateur au groupe operator :\n# usermod -G operator toto $ groupinfo operator name operator passwd * gid 5 members root toto Donner au groupe operator les droits adéquats sur votre device, ici /dev/sd2 :\n# chmod g=rw /dev/sd2* AttentionATTENTION : Ces permissions sont à rétablir à chaque fois que vous mettrez à jour votre système de base !!! Démontage de la clé Pour démonter un périphérique cela se réalise avec la commande umount(8).\nOn peut soit démonter à partir du périphérique :\n# umount /dev/sd2i Soit à partir de son point de montage :\n# umount ~/usb Si jamais on obtient une erreur concernant l\u0026rsquo;utilisation du point de montage (occupé), il faut vérifier que les divers terminaux / logiciels n\u0026rsquo;utilisent plus le répertoire en question.\nLa commande fstat(1) peut aider pour voir rapidement quel logiciel y est attaché :\n# umount ~/usb umount: ~/usb: Device busy # fstat -f ~/usb/ USER CMD PID FD MOUNT INUM MODE R/W SZ|DV toto pcmanfm 21084 114 ~/usb 4 drwxr-xr-x r 32768 Dans l\u0026rsquo;exemple ci-dessus on peut voir que pcmanfm occupe le point de montage ~/usb, ayant pour PID 21084.\nOn peut alors soit changer de répertoire à partir de pcmanfm, soit le fermer, voire le tuer avec la commande kill(1).\nC\u0026rsquo;est ce dernier cas qu\u0026rsquo;on va utiliser dans l\u0026rsquo;exemple suivant. On va tuer le processus de pcmanfm, vérifier à nouveau avec fstat pour savoir si le point de montage est bien libre, puis démonter le périphérique avec umount :\n# kill 21084 # fstat -f ~/usb/ USER CMD PID FD MOUNT INUM MODE R/W SZ|DV # umount –/usb Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD, il existe différents moyens de monter un disque dur USB, ou\nune clé USB…\u003c/p\u003e\n\u003ch2 id=\"méthode-automatique\"\u003eMéthode automatique\u003c/h2\u003e\n\u003ch3 id=\"openbsd--60\"\u003eOpenBSD ≥ 6.0\u003c/h3\u003e\n\u003cp\u003eÀ partir d\u0026rsquo;OpenBSD 6.0 et supérieures, il semble préférable de se\ndiriger vers l\u0026rsquo;usage du démon \u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/hotplugd/\" title=\"Lien interne vers l\u0026#39;article : 'hotplug-diskmount : utiliser un périphérique USB facilement / OpenBSD'\"\u003ehotplugd\u003c/a\u003e\n\u003c/code\u003e\net du binaire \u0026lsquo;hotplug-diskmount\u0026rsquo;.\u003c/p\u003e\n\u003ch3 id=\"openbsd--60-1\"\u003eOpenBSD \u0026lt; 6.0\u003c/h3\u003e\n\u003cp\u003eIl faut modifier l’option \u003ccode\u003ekern.usermount\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# sysctl kern.usermount=1\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION : cette option n\u0026rsquo;est plus disponible à partir d\u0026rsquo;OpenBSD 6.0\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003ePar sécurité, ce paramétrage retrouve sa valeur par défaut au redémarrage.\u003c/p\u003e\n\u003cp\u003eMalgré tout, si vous souhaitez qu\u0026rsquo;il soit pris en compte de façon\npermanente, ajoutez ceci au fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ekern.usermount\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"méthode-manuelle\"\u003eMéthode \u0026ldquo;manuelle\u0026rdquo;\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eCette méthode est à recommander que si et seulement si les méthodes\nautomatiques ci-dessus ne fonctionnent pas, ou si vous préférez vous en\npasser !\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003ece qui signifie que vous comprenez correctement les étapes décrites\nci-dessous !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"identification-de-la-clé\"\u003eIdentification de la clé\u003c/h3\u003e\n\u003cp\u003eTout d’abord, repérez le nom de votre clé USB avec la commande \u003ccode\u003edmesg\u003c/code\u003e\njuste après l\u0026rsquo;avoir insérée :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumass1 at uhub2 port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;SanDisk Cruzer Edge\u0026#34;\u003c/span\u003e rev 2.00/1.27 addr \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumass1: using SCSI over Bulk-Only scsibus5 at umass1: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e targets, initiator \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd2 at scsibus5 targ \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e lun 0: \u0026lt;SanDisk, Cruzer Edge, 1.27\u0026gt; SCSI4 0/direct removable serial.0781556b42119B2141E2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd2: 15267MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e31266816\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIci, la clé est donc \u003ccode\u003esd2\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eEnsuite, avec la commande disklabel, vous pouvez repérer les partitions\ncontenues sur la clé :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ disklabel sd2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /dev/rsd2c:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etype: SCSI\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edisk: SCSI disk\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elabel: Cruzer Edge\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eduid: \u003cspan style=\"color:#f99b15\"\u003e0000000000000000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eflags:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebytes/sector: \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esectors/track: \u003cspan style=\"color:#f99b15\"\u003e63\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etracks/cylinder: \u003cspan style=\"color:#f99b15\"\u003e255\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esectors/cylinder: \u003cspan style=\"color:#f99b15\"\u003e16065\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecylinders: \u003cspan style=\"color:#f99b15\"\u003e1946\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etotal sectors: \u003cspan style=\"color:#f99b15\"\u003e31266816\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eboundstart: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eboundend: \u003cspan style=\"color:#f99b15\"\u003e31266816\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrivedata: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e partitions:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#                size           offset  fstype [fsize bsize  cpg]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  c:         \u003cspan style=\"color:#f99b15\"\u003e31266816\u003c/span\u003e                \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e  unused\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  i:         \u003cspan style=\"color:#f99b15\"\u003e31264768\u003c/span\u003e             \u003cspan style=\"color:#f99b15\"\u003e2048\u003c/span\u003e   MSDOS\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"montage-de-la-clé\"\u003eMontage de la clé\u003c/h3\u003e\n\u003cp\u003eEnfin, il suffit de monter la clé dans un dossier qui vous appartient.\nIci, la partition intéressante est la \u003ccode\u003ei\u003c/code\u003e. Par exemple pour la monter\ndans le dossier \u003ccode\u003e~/usb\u003c/code\u003e qui se trouve dans votre répertoire :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# mount /dev/sd2i ~/usb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"permission-de-lecture-et-décriture\"\u003ePermission de lecture et d\u0026rsquo;écriture\u003c/h3\u003e\n\u003cp\u003eIl reste un problème à régler. Si vous jetez un oeil aux droits d\u0026rsquo;accès\nde votre clé :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ls -la /dev/sd2i\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebrw-r-----  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  operator    4,   \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e Apr \u003cspan style=\"color:#f99b15\"\u003e30\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2016\u003c/span\u003e 10:29    /dev/sd2i\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVous remarquez que seul root et les membres du groupe \u003ccode\u003eoperator\u003c/code\u003e ont\nles droits requis.\u003c/p\u003e\n\u003cp\u003eAjout de votre utilisateur au groupe \u003ccode\u003eoperator\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# usermod -G operator toto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ groupinfo operator\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ename    operator\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epasswd  *\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egid     \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emembers root toto\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDonner au groupe \u003ccode\u003eoperator\u003c/code\u003e les droits adéquats sur votre device, ici\n\u003ccode\u003e/dev/sd2\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chmod g=rw /dev/sd2*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION : Ces permissions sont à rétablir à chaque fois que vous\nmettrez à jour votre système de base !!!\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch3 id=\"démontage-de-la-clé\"\u003eDémontage de la clé\u003c/h3\u003e\n\u003cp\u003ePour démonter un périphérique cela se réalise avec la commande\n\u003ca href=\"http://man.openbsd.org/man8/umount.8\" rel=\"external\"\u003e\u003ccode\u003eumount\u003c/code\u003e(8)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eOn peut soit démonter à partir du périphérique :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# umount /dev/sd2i\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSoit à partir de son point de montage :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# umount ~/usb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi jamais on obtient une erreur concernant l\u0026rsquo;utilisation du point de\nmontage (occupé), il faut vérifier que les divers terminaux / logiciels\nn\u0026rsquo;utilisent plus le répertoire en question.\u003c/p\u003e\n\u003cp\u003eLa commande \u003ca href=\"http://man.openbsd.org/man1/fstat.1\" rel=\"external\"\u003e\u003ccode\u003efstat\u003c/code\u003e(1)\u003c/a\u003e peut aider\npour voir rapidement quel logiciel y est attaché :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# umount ~/usb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumount: ~/usb: Device busy\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# fstat -f ~/usb/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER     CMD          PID   FD MOUNT        INUM  MODE         R/W    SZ|DV\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etoto     pcmanfm    \u003cspan style=\"color:#f99b15\"\u003e21084\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e114\u003c/span\u003e ~/usb           \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e  drwxr-xr-x     r    \u003cspan style=\"color:#f99b15\"\u003e32768\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans l\u0026rsquo;exemple ci-dessus on peut voir que pcmanfm occupe le point de\nmontage \u003ccode\u003e~/usb\u003c/code\u003e, ayant pour PID 21084.\u003c/p\u003e\n\u003cp\u003eOn peut alors soit changer de répertoire à partir de pcmanfm, soit le\nfermer, voire le tuer avec la commande \u003ca href=\"http://man.openbsd.org/man1/kill.1\" rel=\"external\"\u003e\u003ccode\u003ekill\u003c/code\u003e(1)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est ce dernier cas qu\u0026rsquo;on va utiliser dans l\u0026rsquo;exemple suivant.\nOn va tuer le processus de pcmanfm, vérifier à nouveau avec fstat pour\nsavoir si le point de montage est bien libre, puis démonter le\npériphérique avec \u003ccode\u003eumount\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# kill 21084\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# fstat -f ~/usb/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUSER     CMD          PID   FD MOUNT        INUM  MODE         R/W    SZ|DV\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# umount –/usb\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Mini-tutoriel pour monter un périphérique de mémoire de masse USB sous OpenBSD",
            "tags": ["OpenBSD", "USB"],
            "date_published": "2020-01-19T14:50:35+02:00",
            "date_modified": "2025-10-06T11:59:02+02:00"
        },{
            "id": "urn:uuid:65fc0f53-bbf9-e6e1-9096-11dfaef93a04",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/anacron/",
            "title": "anacron : utiliser comme simple utilisateur / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Anacron est un ordonnanceur de commandes périodiques. Il exécute des commandes à intervalles spécifiées par jours. À la différence de cron, il n\u0026rsquo;a pas besoin que le système fonctionne en continue. Il peut toutefois être utilisé pour contrôler l\u0026rsquo;exécution de travaux quotidiens, hebdomadaires et mensuels (ou toute autre période de n jours), sur des systèmes qui ne fonctionnent pas 24 heures par jour. Quand il est installé et configuré proprement, Anacron s\u0026rsquo;assurera que les commandes soient exécutées aux intervalles spécifiées aussi précisément que le permet la disponibilité de la machine.\nCe que ne fait pas Anacron : Anacron n’essaie pas de faire un cron redondant. Il ne peut être utilisé pour programmer des commandes à des intervalles plus petites que la journée. Il ne garantit pas que les commandes seront exécutées à heure ou jour spécifique. Ce n\u0026rsquo;est pas un démon à plein temps. Il est exécuté depuis des scripts de démarrage, des travaux cron, ou explicitement.\nInstallation Installez le paquet anacron.\nCe dernier est souvent utilisé en tant qu\u0026rsquo;administrateur. On rajoute dans ce cas les tâches à effectuer dans le fichier /etc/anacrontab puis on le lance à chaque démarrage avec une nouvelle entrée dans /etc/rc.local :\n/usr/local/sbin/anacron -ds Ce n\u0026rsquo;est pas très intéressant sur une machine de bureau où l\u0026rsquo;on peut vouloir lancer des commandes spécifiques aux utilisateurs (pour utiliser les clés ssh par exemple).\nConfiguration On crée le fichier ~/.anacron/anacrontab :\n$ mkdir -p ~/.anacron/ $ vi ~/.anacron/anacrontab On écrit dans ce fichier sur chaque ligne les tâches à lancer régulièrement :\n# period delay job-identifier command # sauvegarde des cours # \u0026lt;Tous les n jours\u0026gt; \u0026lt;séparé de 10 minutes avec les autres tâches\u0026gt; \u0026lt;nom de la tâche\u0026gt; \u0026lt;commande à lancer\u0026gt; 1 10 educ /home/xavier/geek/bin/sauvegarde/synccours # sauvegarde des documents 7 10 backup /home/xavier/geek/bin/sauvegarde/backup_home #sauvegarde du serveur web 7 10 webbackup /home/xavier/geek/bin/sauvegarde/savewww Notez qu\u0026rsquo;inscrire 1 en premier revient à écrire @daily pour lancer la commande chaque jour, et 7 à @weekly pour la lancer de façon hebdomadaire.\nAttentionATTENTION : Les commandes doivent être précisées avec leur chemins complets. Afin d\u0026rsquo;avoir les droits de lancer anacron en tant qu\u0026rsquo;utilisateur et écrire dans la file d\u0026rsquo;attente, on peut s\u0026rsquo;ajouter dans le groupe wheel. Il existe peut-être une meilleure solution, comme définir un emplacement de file d\u0026rsquo;attente différent que celui par défaut, mais je ne l\u0026rsquo;ai pas encore trouvé.\n# usermod -G wheel jdoe On donne les droits pour le groupe wheel d\u0026rsquo;écrire dans la liste d\u0026rsquo;attente :\n# chmod g+xrw /var/spool/anacron Enfin, pour lancer anacron à chaque démarrage, on peut mettre dans le fichier ~.profile ceci :\n/usr/local/sbin/anacron -s -t ~/.anacron/anacrontab Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eAnacron\u003c/strong\u003e est un ordonnanceur de commandes périodiques. Il exécute des\ncommandes à intervalles spécifiées par jours. À la différence de cron,\nil n\u0026rsquo;a pas besoin que le système fonctionne en continue. Il peut\ntoutefois être utilisé pour contrôler l\u0026rsquo;exécution de travaux quotidiens,\nhebdomadaires et mensuels (ou toute autre période de n jours), sur des\nsystèmes qui ne fonctionnent pas 24 heures par jour. Quand il est installé\net configuré proprement, Anacron s\u0026rsquo;assurera que les commandes soient\nexécutées aux intervalles spécifiées aussi précisément que le permet la\ndisponibilité de la machine.\u003c/p\u003e\n\u003cp\u003eCe que ne fait pas Anacron : Anacron n’essaie pas de faire un cron\nredondant. Il ne peut être utilisé pour programmer des commandes à des\nintervalles plus petites que la journée. Il ne garantit pas que les\ncommandes seront exécutées à heure ou jour spécifique. Ce n\u0026rsquo;est pas un\ndémon à plein temps. Il est exécuté depuis des scripts de démarrage, des\ntravaux cron, ou explicitement.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003eanacron\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eCe dernier est souvent utilisé en tant qu\u0026rsquo;administrateur. On rajoute dans\nce cas les tâches à effectuer dans le fichier \u003ccode\u003e/etc/anacrontab\u003c/code\u003e puis on\nle lance à chaque démarrage avec une nouvelle entrée dans \u003ccode\u003e/etc/rc.local\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/usr/local/sbin/anacron -ds\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe n\u0026rsquo;est pas très intéressant sur une machine de bureau où l\u0026rsquo;on peut\nvouloir lancer des commandes spécifiques aux utilisateurs (pour utiliser\nles clés ssh par exemple).\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eOn crée le fichier \u003ccode\u003e~/.anacron/anacrontab\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ mkdir -p ~/.anacron/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ vi ~/.anacron/anacrontab\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn écrit dans ce fichier sur chaque ligne les tâches à lancer régulièrement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# period  delay  job-identifier  command\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sauvegarde des cours\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# \u0026lt;Tous les n jours\u0026gt; \u0026lt;séparé de 10 minutes avec les autres tâches\u0026gt; \u0026lt;nom de la tâche\u0026gt; \u0026lt;commande à lancer\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e1   10  educ /home/xavier/geek/bin/sauvegarde/synccours\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# sauvegarde des documents\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e7   10  backup /home/xavier/geek/bin/sauvegarde/backup_home\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#sauvegarde du serveur web\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e7   10  webbackup /home/xavier/geek/bin/sauvegarde/savewww\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNotez qu\u0026rsquo;inscrire \u003ccode\u003e1\u003c/code\u003e en premier revient à écrire \u003ccode\u003e@daily\u003c/code\u003e pour lancer\nla commande chaque jour, et \u003ccode\u003e7\u003c/code\u003e à \u003ccode\u003e@weekly\u003c/code\u003e pour la lancer de façon\nhebdomadaire.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Les commandes doivent être précisées avec leur chemins\ncomplets.\u003c/div\u003e\n\n\u003cp\u003eAfin d\u0026rsquo;avoir les droits de lancer anacron en tant qu\u0026rsquo;utilisateur et\nécrire dans la file d\u0026rsquo;attente, on peut s\u0026rsquo;ajouter dans le groupe \u003ccode\u003ewheel\u003c/code\u003e.\nIl existe peut-être une meilleure solution, comme définir un emplacement\nde file d\u0026rsquo;attente différent que celui par défaut, mais je ne l\u0026rsquo;ai pas\nencore trouvé.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# usermod -G wheel jdoe\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn donne les droits pour le groupe wheel d\u0026rsquo;écrire dans la liste d\u0026rsquo;attente :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chmod g+xrw /var/spool/anacron\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnfin, pour lancer anacron à chaque démarrage, on peut mettre dans le\nfichier \u003ccode\u003e~.profile\u003c/code\u003e ceci :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/usr/local/sbin/anacron -s -t ~/.anacron/anacrontab\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser l'ordonnanceur anacron pour gérer des tâches périodiques sous OpenBSD",
            "tags": ["OpenBSD", "anacron"],
            "date_published": "2020-01-19T14:35:54+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:07b3379e-85b4-751c-4f21-8a4ef3290336",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/pycharm/",
            "title": "PyCharm [ Python IDE ]",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description L\u0026rsquo;IDE PyCharm fournit une complétion de code intelligente, l\u0026rsquo;inspection du code, le surlignement des erreurs à la volée, des correctifs rapides, des modifications automatiques du code et offre des fonctionnalités avancées de navigation.\nArchitectures gérées : toutes ? Mainteneur : Rafael Sadowski Openports : https://openports.pl/path/devel/pycharm Site web officiel : https://download.jetbrains.com/python/ Installation Installez le paquet pycham.\nDocumentation Après l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier /usr/local/share/doc/pkg-readmes/pycharm ! ;-)\nDépannage Bad limit Au lancement, vous avez la fenêtre d\u0026rsquo;erreur xmessage :\nCannot increase datasize-cur to a least 2048000. Do you want to run PyCharm anyway? (If you don't increase this limits, PyCharm may fail to work properly). De même, si vous l\u0026rsquo;exécutez en mode console, vous avez le message suivant :\n$ pycharm /usr/local/bin/pycharm[41]: ulimit: bad -d limit: Invalid argument egrep: -: No such file or directory Error occurred during initialization of VM Could not reserve enough space for 768000KB object heap Il est nécessaire de modifier la limite système datasize-cur à une valeur minimale de 2G.\nRedémarrez votre session, avant de chercher à utiliser PyCharm !\nProblèmes de fenêtrage Si l’écran d’accueil s’affiche mais que vous ne voyez alors qu’un écran principal gris, installez le package wmname et exécutez :\nwmname LG3D C\u0026rsquo;est un problème vu avec certaines applications basées sur Java utilisées avec un gestionnaire de fenêtre non réparateur (tel que cwm (gestionnaire de fenêtres) / OpenBSD.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;IDE PyCharm fournit une complétion de code intelligente, l\u0026rsquo;inspection\ndu code, le surlignement des erreurs à la volée, des correctifs rapides,\ndes modifications automatiques du code et offre des fonctionnalités\navancées de navigation.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eArchitectures gérées : toutes ?\u003c/li\u003e\n\u003cli\u003eMainteneur : Rafael Sadowski\u003c/li\u003e\n\u003cli\u003eOpenports : \u003ca href=\"https://openports.pl/path/devel/pycharm\" rel=\"external\"\u003ehttps://openports.pl/path/devel/pycharm\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSite web officiel : \u003ca href=\"https://download.jetbrains.com/python/\" rel=\"external\"\u003ehttps://download.jetbrains.com/python/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003ccode\u003epycham\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eAprès l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de \u003cstrong\u003elire le fichier  \u003ccode\u003e/usr/local/share/doc/pkg-readmes/pycharm\u003c/code\u003e\u003c/strong\u003e ! ;-)\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"bad-limit\"\u003eBad limit\u003c/h3\u003e\n\u003cp\u003eAu lancement, vous avez la fenêtre d\u0026rsquo;erreur \u003ccode\u003exmessage\u003c/code\u003e :\u003c/p\u003e\n\u003cblockquote\u003eCannot increase datasize-cur to a least 2048000. \u003cbr\u003e\nDo you want to run PyCharm anyway? \u003cbr\u003e\n(If you don't increase this limits, PyCharm may fail to work properly).\n\u003c/blockquote\u003e\n\u003cp\u003eDe même, si vous l\u0026rsquo;exécutez en mode console, vous avez le message suivant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ pycharm                                                                                                                              \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e/usr/local/bin/pycharm\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e41\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e: ulimit: bad -d limit: Invalid argument\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eegrep: -: No such file or directory\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eError occurred during initialization of VM\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCould not reserve enough space \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e 768000KB object heap\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl est nécessaire de modifier la limite système \u003ccode\u003edatasize-cur\u003c/code\u003e à une\nvaleur minimale de \u003ccode\u003e2G\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eRedémarrez votre session, avant de chercher à utiliser PyCharm !\u003c/p\u003e\n\u003ch3 id=\"problèmes-de-fenêtrage\"\u003eProblèmes de fenêtrage\u003c/h3\u003e\n\u003cp\u003eSi l’écran d’accueil s’affiche mais que vous ne voyez alors qu’un écran\nprincipal gris, \u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez le package\u003c/a\u003e\n\n\u003ccode\u003ewmname\u003c/code\u003e et exécutez :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ewmname LG3D\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eC\u0026rsquo;est un problème vu avec certaines applications basées sur Java utilisées\navec un gestionnaire de fenêtre non réparateur (tel que\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/cwm/\" title=\"Lien interne vers l\u0026#39;article : 'cwm (gestionnaire de fenêtres) / OpenBSD'\"\u003ecwm (gestionnaire de fenêtres) / OpenBSD\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser l'IDE Pycharm sous OpenBSD",
            "tags": ["OpenBSD", "Python", "Pycharm"],
            "date_published": "2020-01-19T14:30:00+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:325c240b-9fed-3bd5-8e84-474b9a9c9536",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tor/",
            "title": "Tor : service d'anonymat par onion routage / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Tor est un système de communication anonyme à latence basse qui protège les flux TCP : navigation web, messagerie instantanée, irc, ssh, etc…\nNe pas confondre avec le logiciel Tor Browser / OpenBSD !\nArchitectures gérées : Mainteneur : Pascal Stumpf Openports : https://openports.pl/path/net/tor Site officiel : https://www.torproject.org/ Installation Installez le paquet tor.\nConfiguration Modifications système Par défaut, OpenBSD maintient une limite basse de fichiers ouverts en même temps. Le service tor a besoin pour fonctionner correctement qu\u0026rsquo;elles soient augmentées.\nFichier /etc/login.conf Ajoutez ce qui suit :\ntor:\\ :openfiles-max=13500:\\ :tc=daemon: sysctl kern.maxfiles Il semble nécessaire d\u0026rsquo;augmenter la limite des descripteurs de fichiers gérés par le noyau :\n# echo \u0026#34;kern.maxfiles=16000\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf $ sysctl kern.maxfiles=16000 Utilisation CLI Pour utiliser un logiciel réseau avec tor, après avoir activer et démarrer le service, utilisez le binaire torsocks tel que :\ntorsocks -s 127.0.0.1 -P 9050 nom-binaire GUI Pour un logiciel graphique, tel Firefox, allez dans les paramètres de préférences réseaux, puis configurez le proxy socks en choisissant, si possible :\n⇒ menu Édition \u0026gt; Paramètres\nonglet \u0026lsquo;Général\u0026rsquo; \u0026gt; Section \u0026lsquo;Paramètres réseaux\u0026rsquo; bouton [ Paramètres ] ⇒ puis, dans la fenêtre \u0026lsquo;Paramètre de connexion\u0026rsquo;, choisir :\n\u0026lsquo;Configuration manuelle du proxy\u0026rsquo; champ \u0026lsquo;Hôte\u0026rsquo; : remplir 127.0.0.1 cliquer sur la case à cocher [ ] \u0026lsquo;SOCKS v5\u0026rsquo; champ \u0026lsquo;Port\u0026rsquo; : remplir 9050 — normalement est le port par défaut de connexion établie par Tor Voir la capture écran ci-jointe : Paramètres réseau Proxy pour Firefox : menu Édition \u003e Paramètres ; onglet 'Général' \u003e Paramètres réseaux ; bouton [ Paramètres ], puis choix de 'Configuration manuelle du proxy' \u003e 'Hôte Socks', remplir : '127.0.0.1', puis 'Port', remplir : '9050' ; validez par appui/click sur le bouton [ OK ] Documentation Tutoriel complémentaire : https://community.torproject.org/relay/setup/guard/openbsd/\nRemerciements Merci à JDG pour ses petites explications sur l\u0026rsquo;utilisation de tor… Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eTor\u003c/strong\u003e est un système de communication anonyme à latence basse qui\nprotège les flux TCP : navigation web, messagerie instantanée, irc, ssh,\netc…\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eNe pas confondre avec le logiciel \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tor-browser/\" title=\"Lien interne vers l\u0026#39;article : 'Tor Browser / OpenBSD'\"\u003eTor Browser / OpenBSD\u003c/a\u003e !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eArchitectures gérées :\u003c/li\u003e\n\u003cli\u003eMainteneur : Pascal Stumpf\u003c/li\u003e\n\u003cli\u003eOpenports : \u003ca href=\"https://openports.pl/path/net/tor\" rel=\"external\"\u003ehttps://openports.pl/path/net/tor\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eSite officiel : \u003ca href=\"https://www.torproject.org/\" rel=\"external\"\u003ehttps://www.torproject.org/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003etor\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"modifications-système\"\u003eModifications système\u003c/h3\u003e\n\u003cp\u003ePar défaut, OpenBSD maintient une limite basse de fichiers ouverts en\nmême temps. Le service \u003ccode\u003etor\u003c/code\u003e a besoin pour fonctionner correctement\nqu\u0026rsquo;elles soient augmentées.\u003c/p\u003e\n\u003ch4 id=\"fichier-etcloginconf\"\u003eFichier \u003ccode\u003e/etc/login.conf\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003eAjoutez ce qui suit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etor:\\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e:openfiles-max\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e13500:\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    :tc=daemon:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"sysctl-kernmaxfiles\"\u003esysctl \u003ccode\u003ekern.maxfiles\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003eIl semble nécessaire d\u0026rsquo;augmenter la limite des descripteurs de fichiers\ngérés par le noyau :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# echo \u0026#34;kern.maxfiles=16000\u0026#34; \u0026gt;\u0026gt; /etc/sysctl.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sysctl kern.maxfiles\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e16000\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"cli\"\u003eCLI\u003c/h3\u003e\n\u003cp\u003ePour utiliser un logiciel réseau avec tor, après avoir\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eactiver\u003c/a\u003e\n et\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003edémarrer\u003c/a\u003e\n le service,\nutilisez le binaire \u003ccode\u003etorsocks\u003c/code\u003e tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etorsocks -s 127.0.0.1 -P \u003cspan style=\"color:#f99b15\"\u003e9050\u003c/span\u003e nom-binaire\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"gui\"\u003eGUI\u003c/h3\u003e\n\u003cp\u003ePour un logiciel graphique, tel Firefox, allez dans les paramètres de\npréférences réseaux, puis configurez le proxy socks en choisissant, si\npossible :\u003c/p\u003e\n\u003cp\u003e⇒ menu Édition \u0026gt; Paramètres\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eonglet \u0026lsquo;Général\u0026rsquo; \u0026gt; Section \u0026lsquo;Paramètres réseaux\u0026rsquo;\u003c/li\u003e\n\u003cli\u003ebouton [ Paramètres ]\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ puis, dans la fenêtre \u0026lsquo;Paramètre de connexion\u0026rsquo;, choisir :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u0026lsquo;Configuration manuelle du proxy\u0026rsquo;\u003c/li\u003e\n\u003cli\u003echamp \u0026lsquo;Hôte\u0026rsquo; : remplir \u003ccode\u003e127.0.0.1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ecliquer sur la case à cocher [ ] \u0026lsquo;SOCKS v5\u0026rsquo;\u003c/li\u003e\n\u003cli\u003echamp \u0026lsquo;Port\u0026rsquo; : remplir \u003ccode\u003e9050\u003c/code\u003e — \u003cem\u003enormalement est le port par défaut de\nconnexion établie par Tor\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eVoir la capture écran ci-jointe :\n\u003cfigure\u003e\n    \u003ca href=\"/images/openbsd/firefox-parametres-reseau-proxy.png\" title=\"Paramètres réseau Proxy pour Firefox : menu Édition \u0026gt; Paramètres ; onglet \u0026#39;Général\u0026#39; \u0026gt; Paramètres réseaux ; bouton [ Paramètres ], puis choix de \u0026#39;Configuration manuelle du proxy\u0026#39; \u0026gt; \u0026#39;Hôte Socks\u0026#39;, remplir : \u0026#39;127.0.0.1\u0026#39;, puis \u0026#39;Port\u0026#39;, remplir : \u0026#39;9050\u0026#39; ; validez par appui/click sur le bouton [ OK ]\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/openbsd/firefox-parametres-reseau-proxy_hu_c88f2843644a523d.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Paramètres réseau Proxy pour Firefox : menu Édition \u0026gt; Paramètres ; onglet \u0026#39;Général\u0026#39; \u0026gt; Paramètres réseaux ; bouton [ Paramètres ], puis choix de \u0026#39;Configuration manuelle du proxy\u0026#39; \u0026gt; \u0026#39;Hôte Socks\u0026#39;, remplir : \u0026#39;127.0.0.1\u0026#39;, puis \u0026#39;Port\u0026#39;, remplir : \u0026#39;9050\u0026#39; ; validez par appui/click sur le bouton [ OK ]\" height=\"271\" loading=\"lazy\" src=\"/images/openbsd/firefox-parametres-reseau-proxy_hu_f901b60f22bd2dd.png\" type=\"image/png\" width=\"250\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eParamètres réseau Proxy pour Firefox : menu Édition \u003e Paramètres ; onglet 'Général' \u003e Paramètres réseaux ; bouton [ Paramètres ], puis choix de 'Configuration manuelle du proxy' \u003e 'Hôte Socks', remplir : '127.0.0.1', puis 'Port', remplir : '9050' ; validez par appui/click sur le bouton [ OK ]\u003c/figcaption\u003e\n\u003c/figure\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eTutoriel complémentaire : \u003ca href=\"https://community.torproject.org/relay/setup/guard/openbsd/\" rel=\"external\"\u003ehttps://community.torproject.org/relay/setup/guard/openbsd/\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eMerci à JDG pour ses petites explications sur l\u0026rsquo;utilisation de tor…\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le service d'anonymat Tor sous OpenBSD",
            "tags": ["OpenBSD", "Tor"],
            "date_published": "2020-01-19T14:24:39+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:f1bc3683-b615-01c6-d796-9ba071261a56",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/jdk/",
            "title": "OpenJDK SDK, Standard Edition",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Le logiciel OpenJDK inclut des outils utiles pour le développement et les tests de programmes écrits dans le langage de programmation Java et s\u0026rsquo;exécutant dans une plate-forme Java.\nInstallation Installez le paquet jdk.\nVersion : 1.8.0 ou, version : 11-5 Documentation Le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/jdk ou pour jdk-11* : /usr/local/share/doc/pkg-readmes/jdk-11 Configuration Variable PATH Pensez à modifier votre variable d\u0026rsquo;environnement PATH, généralement depuis votre fichier personnel ~/.profile, pour y ajouter :\npour jdk 1.8.0.* : :/usr/local/jre-1.8.0/bin pour jdk 11.5* : :/ur/local/jdk-11/bin/ Puis redémarrez votre session !\nGestion de la mémoire Par défaut, l\u0026rsquo;empreinte de la mémoire est réduite à un usage de 256 Mo. Pour les applications nécessitant plus de mémoire, utilisez l\u0026rsquo;argument -XX:CompressedClassSpaceSize et augmentez en conséquence, selon le besoin.\nRéseau IPv4, IPv6 Le mappage d\u0026rsquo;adresses IPv4 et IPv6 est désactivé. La conséquence est que jdk utilisera soit les adresses IPv4, soit celles d\u0026rsquo;IPv6, mais pas les deux en même temps. La gestion de l\u0026rsquo;adressage IPv4 est activée par défaut. Pour activer IPv6, il vous faut paramétrer les propriétés suivantes au moment de démarrer Java :\n-Djava.net.preferIPv4Stack=false -Djava.net.preferIPv6Stack=true -Djava.net.preferIPv6Addresses=true Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe logiciel OpenJDK inclut des outils utiles pour le développement et les\ntests de programmes écrits dans le langage de programmation Java et\ns\u0026rsquo;exécutant dans une plate-forme Java.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003ccode\u003ejdk\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion : 1.8.0\u003c/li\u003e\n\u003cli\u003eou, version : 11-5\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier pkg-readme : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/jdk\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eou pour \u003ccode\u003ejdk-11*\u003c/code\u003e : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/jdk-11\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"variable-path\"\u003eVariable PATH\u003c/h3\u003e\n\u003cp\u003ePensez à modifier votre variable d\u0026rsquo;environnement \u003ccode\u003ePATH\u003c/code\u003e, généralement\ndepuis votre fichier personnel \u003ccode\u003e~/.profile\u003c/code\u003e, pour y ajouter :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour jdk 1.8.0.* : \u003ccode\u003e:/usr/local/jre-1.8.0/bin\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour jdk 11.5* : \u003ccode\u003e:/ur/local/jdk-11/bin/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePuis redémarrez votre session !\u003c/p\u003e\n\u003ch3 id=\"gestion-de-la-mémoire\"\u003eGestion de la mémoire\u003c/h3\u003e\n\u003cp\u003ePar défaut, l\u0026rsquo;empreinte de la mémoire est réduite à un usage de 256 Mo.\nPour les applications nécessitant plus de mémoire, utilisez l\u0026rsquo;argument\n\u003ccode\u003e-XX:CompressedClassSpaceSize\u003c/code\u003e et augmentez en conséquence, selon le besoin.\u003c/p\u003e\n\u003ch3 id=\"réseau-ipv4-ipv6\"\u003eRéseau IPv4, IPv6\u003c/h3\u003e\n\u003cp\u003eLe mappage d\u0026rsquo;adresses IPv4 et IPv6 est désactivé. La conséquence est que\njdk utilisera soit les adresses IPv4, soit celles d\u0026rsquo;IPv6, mais pas les\ndeux en même temps. La gestion de l\u0026rsquo;adressage IPv4 est activée par défaut.\nPour activer IPv6, il vous faut paramétrer les propriétés suivantes au\nmoment de démarrer Java :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003e-Djava.net.preferIPv4Stack\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003efalse\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  -Djava.net.preferIPv6Stack=true\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  -Djava.net.preferIPv6Addresses=true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser OpenJDK, JRE, sous OpenBSD",
            "tags": ["OpenBSD", "JDK", "JRE", "Java"],
            "date_published": "2020-01-19T14:18:10+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:caee76c1-0678-a979-6433-2212bb708aa9",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-unicode/",
            "title": "Gestion de l'Unicode sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD est UTF-8 !\nUnicode Néanmoins, votre clavier quelque soit la langue n\u0026rsquo;est pas forcément capable de gérer tous les codes Unicode en appuyant simplement sur une seule touche.\nPour pouvoir générer un code Unicode, c\u0026rsquo;est la combinaison des touches CTRL+Shift+u suivi du code relatif au caractère à imprimer, appelé code Unicode.\nExemples tiret \u0026ldquo;demi-cadratin\u0026rdquo; : combinaison CTRL+Shift+u + 2+0+1+3 : –\ntiret \u0026ldquo;cadratin\u0026rdquo; : CTRL+Shift+u + 2+0+1+4 : —\ncaractère ✓ : CTRL+Shift+u + 2+7+1+3\nun espace insécable : : CTRL+Shift+u + 0+0+A+0\nl\u0026rsquo;arobase @ : CTRL+Shift+u + 0+0+4+0\netc… oui, les trois points de suspension suivant etc sont un seul et même caractère unicode : CTRL+Shift+u + 2+0+2+6\nAstuce L\u0026rsquo;unicode peut être géré par le biais de la touche de composition …\nDocumentation Table de caractères Unicode : https://unicode-table.com/fr/ Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eOpenBSD est UTF-8 !\u003c/p\u003e\n\u003ch2 id=\"unicode\"\u003eUnicode\u003c/h2\u003e\n\u003cp\u003eNéanmoins, votre clavier quelque soit la langue n\u0026rsquo;est pas forcément\ncapable de gérer tous les codes Unicode en appuyant simplement sur une\nseule touche.\u003c/p\u003e\n\u003cp\u003ePour pouvoir générer un code Unicode, c\u0026rsquo;est la combinaison des touches\n\u003ckbd\u003eCTRL+Shift+u\u003c/kbd\u003e suivi du code relatif au caractère à imprimer,\nappelé code Unicode.\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003etiret \u0026ldquo;demi-cadratin\u0026rdquo; :\ncombinaison \u003ckbd\u003eCTRL+Shift+u\u003c/kbd\u003e + \u003ckbd\u003e2+0+1+3\u003c/kbd\u003e : \u003ccode\u003e–\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003etiret \u0026ldquo;cadratin\u0026rdquo; : \u003ckbd\u003eCTRL+Shift+u\u003c/kbd\u003e + \u003ckbd\u003e2+0+1+4\u003c/kbd\u003e : \u003ccode\u003e—\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ecaractère \u003ccode\u003e✓\u003c/code\u003e : \u003ckbd\u003eCTRL+Shift+u\u003c/kbd\u003e + \u003ckbd\u003e2+7+1+3\u003c/kbd\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eun espace insécable : \u003ccode\u003e \u003c/code\u003e : \u003ckbd\u003eCTRL+Shift+u\u003c/kbd\u003e + \u003ckbd\u003e0+0+A+0\u003c/kbd\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;arobase \u003ccode\u003e@\u003c/code\u003e : \u003ckbd\u003eCTRL+Shift+u\u003c/kbd\u003e + \u003ckbd\u003e0+0+4+0\u003c/kbd\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eetc… \u003cem\u003eoui, les trois points de suspension suivant \u003ccode\u003eetc\u003c/code\u003e sont un\nseul et même caractère unicode :\u003c/em\u003e\n\u003ckbd\u003eCTRL+Shift+u\u003c/kbd\u003e + \u003ckbd\u003e2+0+2+6\u003c/kbd\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"astuce\"\u003eAstuce\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;unicode peut être géré par le biais de la touche de\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-compose/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion de la touche de composition sous OpenBSD'\"\u003ecomposition\u003c/a\u003e\n…\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eTable de caractères Unicode : \u003ca href=\"https://unicode-table.com/fr/\" rel=\"external\"\u003ehttps://unicode-table.com/fr/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuce pour gérer l'unicode sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "unicode"],
            "date_published": "2020-01-19T14:03:51+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:d3d89a86-3af5-950d-9cf6-d51cbb26c123",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/cups/",
            "title": "Cups : Gestion de l'impression sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description CUPS fournit un calque d\u0026rsquo;impression portable pour les systèmes d\u0026rsquo;exploitation basés sur UNIX. CUPS fournit des interfaces en ligne de commande de System V et Berkeley.\nCUPS utilise IPP (Protocole d\u0026rsquo;Impression Internet) comme bases pour gérer les queues et travaux d\u0026rsquo;impressions. Les protocoles des services LPD, SMB et AppSocket (tel que JetDirect) sont supportés avec des fonctionnalités réduites.\nCUPS ajoute la recherche d\u0026rsquo;imprimantes réseaux et PPD (Description d\u0026rsquo;Imprimante PostScript) basé sur les options d\u0026rsquo;impression supportées dans le monde réel sous UNIX.\nInstallation Installez les paquets : cups cups-filters cups-libs foomatic-db gutenprint (cups-pdf en option)\nConfiguration ⇒ Depuis OpenBSD 6.5 : la version du driver Gutenprint a changé (v5.3.x au lieu de v5.2.x) ; modifiez les paramètres de l\u0026rsquo;imprimante pour lui changer le pilote vers cette nouvelle version !\nshell Depuis OpenBSD 6.2, les binaires lpq, lpr, et lprm ne sont plus liés symboliquement à /usr/bin. Il est nécessaire de les utiliser en les préfixant de /usr/local/bin/.\nAstucePensez à éditer votre fichier ~/.kshrc, afin de créer des alias qui vous seront utiles, en ajoutant le code suivant :\nfor i in lpq lpr lprm; do alias $i=/usr/local/bin/$i; done\nVous pourrez ainsi les utiliser comme avant !\nDécouverte des services multicast Pour la découverte des services multicast - mDNS (de type Avahi (Découverte de services multicast DNS), Bonjour, …)\nCups Il nous faut :\nActiver les services cupsd cups_browsed puis les démarrer Règles PF Voici les règles pare-feu si besoin :\npour l\u0026rsquo;accès à l\u0026rsquo;interface web de Cups : pass in on egress proto tcp from egress:network to egress port 631 flags S/SA modulate state InfoCes règles sont à adapter à vos besoins, et ne sont pas nécessairement justes ! Administration Web Cups, à ce moment, devrait être accessible par votre navigateur web préféré, par exemple Firefox , sur : http://localhost:631\nInfoL\u0026rsquo;interface d\u0026rsquo;administration web de Cups est celle qui fonctionne assurément, normalement. Entrez votre mot-de-passe root… et administrez ! Console cupsctl : # cupsctl --share-printers lpadmin : # lpadmin -E -p printer_name -o printer-is-shared=false l\u0026rsquo;option -E active le chiffrement des données avec le service ; elle est intégrée aussi aux autres outils ci-dessous. l\u0026rsquo;option printer-is-shared permet de partager ou non l\u0026rsquo;imprimante ; true autorise, false ne le permet pas lpoptions : affiche les options d\u0026rsquo;une imprimante -l : version détaillée lpstat : outil pour obtenir les informations sur les imprimantes ou le serveur Cups -l : affiche une liste détaillée des imprimantes, des travaux d\u0026rsquo;impression, etc. -p : restitue toutes les informations de toutes les imprimantes configurées ; pour cibler une seule, il suffit de donner son nom en argument de l\u0026rsquo;option, tel que dans la commande lpadmin ci-dessus. -r : l\u0026rsquo;état du serveur Cups -t : restitue toutes les informations d\u0026rsquo;état À toutes ces commandes, il existe pléthore d\u0026rsquo;options, veuillez lire les manpages correspondants.\nLes deux premières commandes doivent avoir des droits d\u0026rsquo;administration, ce qui n\u0026rsquo;est pas le cas des deux autres.\nInterface Graphique Pour gérer les imprimantes en mode graphiques, il est nécessaire d\u0026rsquo;installer les packages suivants : gtk+2-cups, gtk+3-cups et/ou gtk+4-cups selon votre bureau graphique.\nInfoIl est possible que l\u0026rsquo;administration ne soit pas complète, et de rencontrer des problèmes pour installer une ou des imprimantes par ces biais. Gestion USB Détection Imprimante USB Pour détecter votre imprimante usb, connectez-la sur un port usb, en premier, puis exécuter dans un terminal, la commande suivante :\n# usbdevs -vd Controller /dev/usb3: addr 1: full speed, self powered, config 1, UHCI root hub(0x0000), Intel(0x8086), rev 1.00 uhub3 port 1 powered port 2 addr 2: full speed, self powered, config 1, USB MFP(0x082f), EPSON(0x04b8), rev 1.00, iSerialNumber L83010704250947490 ugen0 Il faut repérer sur la ligne Controller /dev/usb quel numéro est affiché au périphérique ugen et usb, puis donner à ce périphérique les droits nécessaires - dans ce cas-là :\n# chown _cups /dev/ugen0.* /dev/usb3\nou pour une MFP (avec scanner intégré :\n# chown _cups:_saned /dev/ugen0.* /dev/usb3 # chmod 0660/dev/ugen0.* /dev/usb3 AstucePour préserver ces changements, au prochain redémarrage, ajoutez la commande à votre fichier /etc/[rc.local](http://man.openbsd.org/rc.local).\nBien-sûr, modifiez le numéro des périphériques ugen et usb utilisés.\nUne autre méthode est d\u0026rsquo;utiliser les scripts attach/detach du service hotplugd !\nConfiguration Imprimante USB Pour pouvoir utiliser correctement votre imprimante sur port usb, il est nécessaire de désactiver ulpt(4) du noyau (cf: [config(8)]http://man.openbsd.org/config.8)), autrement votre imprimante ne sera pas \u0026ldquo;visible\u0026rdquo;, car non disponible par le biais de la bibliothèque libusb.\n⇒ Depuis OpenBSD 7.0, il suffit de remplir/créer le fichier /etc/bsd.re-config avec :\ndisable ulpt\n# echo \u0026#39;disable ulpt\u0026#39; \u0026gt;\u0026gt;/etc/bsd.re-config puis redémarrer la machine !\n⇒ Avant OpenBSD 7.0 :\nPour cela, tapez : # printf 'disable ulpt\\nq\\n' | config -ef /bsd\nPuis, relinker le noyau : # sha256 /bsd \u0026gt;/var/db/kernel.SHA256\nPort parallèle Pour pouvoir imprimer sur une imprimante port parallèle, le service cups a besoin d\u0026rsquo;avoir accès aux périphériques spécifiques.\nExécutez la commande suivante : chown _cups /dev/lp[a,t]0\nAstucePour préserver ces changements, au prochain redémarrage, ajoutez la commande à votre fichier /etc/rc.local ! Imprimante partagée Par mDNS Il est nécessaire qu\u0026rsquo;Avahi (Découverte de services multicast DNS) soit installé et fonctionnel ; de même, le service cups_browsed doit être actif sur votre station !\nElle peut être administrée soit par l\u0026rsquo;interface d\u0026rsquo;administration web de Cups, soit avec des droits administrateurs…\nEn utilisant DNS-SD Veuillez lire le fichier pkg-readme de cups !\nDocumentation Après l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier :\n/usr/local/share/doc/pkg-readmes/cups, /usr/local/share/doc/pkg-readmes/cups-filters, et au cas où : /usr/local/share/doc/pkg-readmes/cups-pdf, ainsi que sous /usr/local/share/doc/cups-pdf/README. voire aussi : /usr/local/share/doc/pkg-readmes/foomatic-db-engine. manpage Depuis OpenBSD 6.2, l\u0026rsquo;accès aux pages de manuel est sensiblement différent :\nman -m /usr/local/man lpr\nCela est vrai pour les binaires lpq, lpr et lprm !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.cups.org/\" rel=\"external\"\u003eCUPS\u003c/a\u003e\u003c/strong\u003e fournit un calque d\u0026rsquo;impression portable\npour les systèmes d\u0026rsquo;exploitation basés sur UNIX. CUPS fournit des\ninterfaces en ligne de commande de System V et Berkeley.\u003c/p\u003e\n\u003cp\u003eCUPS utilise \u003cabbr title=\"Internet Print Protocol\"\u003eIPP\u003c/abbr\u003e\n\n(\u003cem\u003eProtocole d\u0026rsquo;Impression Internet\u003c/em\u003e) comme bases pour gérer\nles queues et travaux d\u0026rsquo;impressions. Les protocoles des services LPD, SMB\net AppSocket \u003cem\u003e(tel que JetDirect)\u003c/em\u003e sont supportés avec des fonctionnalités\nréduites.\u003c/p\u003e\n\u003cp\u003eCUPS ajoute la recherche d\u0026rsquo;imprimantes réseaux et PPD (Description\nd\u0026rsquo;Imprimante PostScript) basé sur les options d\u0026rsquo;impression supportées\ndans le monde réel sous UNIX.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n les\npaquets : \u003ccode\u003ecups cups-filters cups-libs foomatic-db gutenprint\u003c/code\u003e\u003c/strong\u003e \u003cbr\u003e\n\u003cem\u003e(\u003ccode\u003ecups-pdf\u003c/code\u003e en option)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003e⇒ Depuis OpenBSD 6.5 : la version du driver Gutenprint a changé\n(v5.3.x au lieu de v5.2.x) ; modifiez les paramètres de l\u0026rsquo;imprimante\npour lui changer le pilote vers cette nouvelle version !\u003c/p\u003e\n\u003ch3 id=\"shell\"\u003eshell\u003c/h3\u003e\n\u003cp\u003eDepuis OpenBSD 6.2, les binaires \u003ccode\u003elpq\u003c/code\u003e, \u003ccode\u003elpr\u003c/code\u003e, et \u003ccode\u003elprm\u003c/code\u003e ne sont plus\nliés symboliquement à \u003ccode\u003e/usr/bin\u003c/code\u003e. Il est nécessaire de les utiliser en\nles préfixant de \u003ccode\u003e/usr/local/bin/\u003c/code\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003ePensez à éditer votre fichier \u003ccode\u003e~/.kshrc\u003c/code\u003e, afin de créer des alias qui\nvous seront utiles, en ajoutant le code suivant :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003efor i in lpq lpr lprm; do alias $i=/usr/local/bin/$i; done\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVous pourrez ainsi les utiliser comme avant !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"découverte-des-services-multicast\"\u003eDécouverte des services multicast\u003c/h3\u003e\n\u003cp\u003ePour la découverte des services multicast - mDNS \u003cem\u003e(de type \u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003eAvahi (Découverte de services multicast DNS)\u003c/a\u003e,\nBonjour, …)\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"cups\"\u003eCups\u003c/h3\u003e\n\u003cp\u003eIl nous faut :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eActiver les services\u003c/a\u003e\n \u003cstrong\u003e\u003ccode\u003ecupsd cups_browsed\u003c/code\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003epuis les \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003edémarrer\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"règles-pf\"\u003eRègles PF\u003c/h3\u003e\n\u003cp\u003eVoici les règles pare-feu si besoin :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour l\u0026rsquo;accès à l\u0026rsquo;interface web de Cups : \u003cbr\u003e\n\u003ccode\u003epass in on egress proto tcp from egress:network to egress port 631 flags S/SA modulate state\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCes règles sont à adapter à vos besoins, et ne sont pas nécessairement justes !\u003c/div\u003e\n\n\u003ch2 id=\"administration\"\u003eAdministration\u003c/h2\u003e\n\u003ch3 id=\"web\"\u003eWeb\u003c/h3\u003e\n\u003cp\u003eCups, à ce moment, devrait être accessible par votre navigateur web\npréféré, par exemple \u003ca class=\"inside\" href=\"/fr/sys/openbsd/firefox/\" title=\"Lien interne vers l\u0026#39;article : 'Firefox / OpenBSD'\"\u003eFirefox\u003c/a\u003e\n,\nsur : http://localhost:631\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eL\u0026rsquo;interface d\u0026rsquo;administration web de Cups est celle qui fonctionne assurément,\nnormalement. Entrez votre mot-de-passe root… et administrez !\u003c/div\u003e\n\n\u003ch3 id=\"console\"\u003eConsole\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecupsctl\u003c/code\u003e : \u003ccode\u003e# cupsctl --share-printers\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elpadmin\u003c/code\u003e : \u003ccode\u003e# lpadmin -E -p printer_name -o printer-is-shared=false\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-E\u003c/code\u003e active le chiffrement des données avec le service ;\n\u003cem\u003eelle est intégrée aussi aux autres outils ci-dessous\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003eprinter-is-shared\u003c/code\u003e permet de partager ou non l\u0026rsquo;imprimante ;\n\u003ccode\u003etrue\u003c/code\u003e autorise, \u003ccode\u003efalse\u003c/code\u003e ne le permet pas\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elpoptions\u003c/code\u003e : affiche les options d\u0026rsquo;une imprimante\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-l\u003c/code\u003e : version détaillée\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elpstat\u003c/code\u003e : outil pour obtenir les informations sur les imprimantes\nou le serveur Cups\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-l\u003c/code\u003e : affiche une liste détaillée des imprimantes, des travaux\nd\u0026rsquo;impression, etc.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-p\u003c/code\u003e : restitue toutes les informations de toutes les imprimantes\nconfigurées ; pour cibler une seule, il suffit de donner son nom\nen argument de l\u0026rsquo;option, tel que dans la commande \u003ccode\u003elpadmin\u003c/code\u003e\nci-dessus.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-r\u003c/code\u003e : l\u0026rsquo;état du serveur Cups\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-t\u003c/code\u003e : restitue toutes les informations d\u0026rsquo;état\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eÀ toutes ces commandes, il existe pléthore d\u0026rsquo;options, veuillez lire les\nmanpages correspondants.\u003c/p\u003e\n\u003cp\u003eLes deux premières commandes doivent avoir des droits d\u0026rsquo;administration,\nce qui n\u0026rsquo;est pas le cas des deux autres.\u003c/p\u003e\n\u003ch3 id=\"interface-graphique\"\u003eInterface Graphique\u003c/h3\u003e\n\u003cp\u003ePour gérer les imprimantes en mode graphiques, il est nécessaire\nd\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n\nles packages suivants : \u003ccode\u003egtk+2-cups\u003c/code\u003e, \u003ccode\u003egtk+3-cups\u003c/code\u003e et/ou \u003ccode\u003egtk+4-cups\u003c/code\u003e\nselon votre bureau graphique.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eIl est possible que l\u0026rsquo;administration ne soit pas complète, et de\nrencontrer des problèmes pour installer une ou des imprimantes par ces\nbiais.\u003c/div\u003e\n\n\u003ch2 id=\"gestion\"\u003eGestion\u003c/h2\u003e\n\u003ch3 id=\"usb\"\u003eUSB\u003c/h3\u003e\n\u003ch4 id=\"détection-imprimante-usb\"\u003eDétection Imprimante USB\u003c/h4\u003e\n\u003cp\u003ePour détecter votre imprimante usb, connectez-la sur un port usb, en\npremier, puis exécuter dans un terminal, la commande suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# usbdevs -vd\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eController /dev/usb3:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaddr 1: full speed, self powered, config 1, UHCI root hub\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x0000\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, Intel\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x8086\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, rev 1.00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euhub3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eport \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e powered\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eport \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e addr 2: full speed, self powered, config 1, USB MFP\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x082f\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, EPSON\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x04b8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, rev 1.00, iSerialNumber L83010704250947490\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eugen0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl faut repérer sur la ligne \u003ccode\u003eController /dev/usb\u003c/code\u003e quel numéro est affiché\nau périphérique \u003ccode\u003eugen\u003c/code\u003e et \u003ccode\u003eusb\u003c/code\u003e, puis donner à ce périphérique les droits\nnécessaires - dans ce cas-là :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# chown _cups /dev/ugen0.* /dev/usb3\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eou pour une \u003cabbr title=\"Multi Functions Printer\"\u003eMFP\u003c/abbr\u003e\n (avec scanner\nintégré :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chown _cups:_saned /dev/ugen0.* /dev/usb3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chmod 0660/dev/ugen0.* /dev/usb3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003ePour préserver ces changements, au prochain redémarrage, ajoutez la\ncommande à votre fichier \u003ccode\u003e/etc/[rc.local](http://man.openbsd.org/rc.local)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eBien-sûr, modifiez le numéro des périphériques \u003ccode\u003eugen\u003c/code\u003e et \u003ccode\u003eusb\u003c/code\u003e utilisés.\u003c/p\u003e\n\u003cp\u003eUne autre méthode est d\u0026rsquo;utiliser les scripts \u003ccode\u003eattach\u003c/code\u003e/\u003ccode\u003edetach\u003c/code\u003e du service\n\u003ccode\u003ehotplugd\u003c/code\u003e !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"configuration-imprimante-usb\"\u003eConfiguration Imprimante USB\u003c/h4\u003e\n\u003cp\u003ePour pouvoir utiliser correctement votre imprimante sur port usb, il est\nnécessaire de désactiver \u003ca href=\"http://man.openbsd.org/ulpt.4\" rel=\"external\"\u003eulpt(4)\u003c/a\u003e du noyau\n(cf: [config(8)]http://man.openbsd.org/config.8)), autrement votre\nimprimante ne sera pas \u0026ldquo;visible\u0026rdquo;, car non disponible par le biais de la\nbibliothèque \u003ccode\u003elibusb\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eDepuis OpenBSD 7.0\u003c/strong\u003e, il suffit de remplir/créer le fichier\n\u003ccode\u003e/etc/bsd.re-config\u003c/code\u003e avec :\u003cbr\u003e\n\u003ccode\u003edisable ulpt\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# echo \u0026#39;disable ulpt\u0026#39; \u0026gt;\u0026gt;/etc/bsd.re-config\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003epuis redémarrer la machine !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eAvant OpenBSD 7.0 :\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePour cela, tapez : \u003cbr\u003e\n\u003ccode\u003e# printf 'disable ulpt\\nq\\n' | config -ef /bsd\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePuis, relinker le noyau : \u003cbr\u003e\n\u003ccode\u003e# sha256 /bsd \u0026gt;/var/db/kernel.SHA256\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"port-parallèle\"\u003ePort parallèle\u003c/h3\u003e\n\u003cp\u003ePour pouvoir imprimer sur une imprimante port parallèle, le service cups\na besoin d\u0026rsquo;avoir accès aux périphériques spécifiques.\u003c/p\u003e\n\u003cp\u003eExécutez la commande suivante : \u003cbr\u003e\n\u003ccode\u003echown _cups /dev/lp[a,t]0\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003ePour préserver ces changements, au prochain redémarrage, ajoutez la\ncommande à votre fichier \u003ccode\u003e/etc/rc.local\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch3 id=\"imprimante-partagée\"\u003eImprimante partagée\u003c/h3\u003e\n\u003ch4 id=\"par-mdns\"\u003ePar mDNS\u003c/h4\u003e\n\u003cp\u003eIl est nécessaire qu\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/avahi/\" title=\"Lien interne vers l\u0026#39;article : 'Avahi (Découverte de services multicast DNS)'\"\u003eAvahi (Découverte de services multicast DNS)\u003c/a\u003e soit installé\net fonctionnel ; de même, le service \u003ccode\u003ecups_browsed\u003c/code\u003e doit être actif sur\nvotre station !\u003c/p\u003e\n\u003cp\u003eElle peut être administrée soit par l\u0026rsquo;interface\nd\u0026rsquo;administration web de Cups, soit avec des droits administrateurs…\u003c/p\u003e\n\u003ch4 id=\"en-utilisant-dns-sd\"\u003eEn utilisant DNS-SD\u003c/h4\u003e\n\u003cp\u003eVeuillez lire le fichier pkg-readme de cups !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eAprès l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de \u003cstrong\u003elire le fichier\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/usr/local/share/doc/pkg-readmes/cups\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/usr/local/share/doc/pkg-readmes/cups-filters\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eet au cas où : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/cups-pdf\u003c/code\u003e, ainsi que sous \u003ccode\u003e/usr/local/share/doc/cups-pdf/README\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003evoire aussi : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/foomatic-db-engine\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manpage\"\u003emanpage\u003c/h3\u003e\n\u003cp\u003eDepuis OpenBSD 6.2, l\u0026rsquo;accès aux pages de manuel est sensiblement différent :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eman -m /usr/local/man lpr\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCela est vrai pour les binaires \u003ccode\u003elpq\u003c/code\u003e, \u003ccode\u003elpr\u003c/code\u003e et \u003ccode\u003elprm\u003c/code\u003e !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer les impressions sous OpenBSD, grâce au projet CUPS",
            "tags": ["OpenBSD", "cups"],
            "date_published": "2020-01-19T13:47:35+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:297e28c3-0c44-a289-614e-65654571db28",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/cabal/",
            "title": "Installer l'outil Cabal sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Le programme en ligne de commande cabal simplifie le processus de gestion des logiciels Haskell en automatisant la récupération, configuration, compilation et installation des programmes et bibliothèques Haskell.\narchitectures gérées : aarch64, amd64, i386 mainteneur : Matthias Kilian Openports : https://openports.pl/path/devel/cabal-install site web officiel : http://www.haskell.org/cabal/ Installation Installez le paquet cabal-install.\nConfiguration Du fait de la protection mémoire W^X, l\u0026rsquo;outil cabal ne fonctionne pas correctement. Pour résoudre cette situation, deux manières de faire :\nModifications système Pour remédier à la situation, nous allons modifier légèrement votre $HOME et /usr/local.\nCréation des répertoires nécessaires dans /usr/local, avec les droits administrateurs Attribution des droits utilisateurs nécessaires, toujours avec des droits administrateurs Suppression du répertoire ad hoc dans $HOME et, lien symbolique création d\u0026rsquo;un alias utile # mkdir -p /usr/local/cabal/build # chown -R user:wheel /usr/local/cabal $ rm -rf ~/.cabal $ ln -s /usr/local/cabal ~/.cabal Pour finir, créez donc un alias dans votre fichier personnel .khsrc, ou .profile : alias cabal='env TMPDIR=/usr/local/cabal/build/ cabal'\nAstuceAjouter le dossier .cabal à votre variable PATH pour pouvoir lancer les commandes facilement !\nPATH=$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:$HOME/.cabal/bin\nOption wxallowed AttentionPrenez conscience qu\u0026rsquo;utiliser cette possibilité aura pour conséquence de permettre l\u0026rsquo;exécution de binaire potentiellement dangereux depuis votre $HOME.\nMieux vaut éviter !\nIl est possible d\u0026rsquo;ajouter l\u0026rsquo;option de montage wxallowed à votre partition $HOME si vous l\u0026rsquo;avez créée.\nsource : https://deftly.net/posts/2017-10-12-using-cabal-on-openbsd.html\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe programme en ligne de commande \u003ccode\u003ecabal\u003c/code\u003e  simplifie le processus de\ngestion des logiciels Haskell en automatisant la récupération, configuration,\ncompilation et installation des programmes et bibliothèques Haskell.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003earchitectures gérées : aarch64, amd64, i386\u003c/li\u003e\n\u003cli\u003emainteneur : Matthias Kilian\u003c/li\u003e\n\u003cli\u003eOpenports : \u003ca href=\"https://openports.pl/path/devel/cabal-install\" rel=\"external\"\u003ehttps://openports.pl/path/devel/cabal-install\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003esite web officiel : \u003ca href=\"http://www.haskell.org/cabal/\" rel=\"external\"\u003ehttp://www.haskell.org/cabal/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003ecabal-install\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eDu fait de la protection mémoire W^X, l\u0026rsquo;outil \u003ccode\u003ecabal\u003c/code\u003e ne fonctionne pas\ncorrectement. Pour résoudre cette situation, deux manières de faire :\u003c/p\u003e\n\u003ch3 id=\"modifications-système\"\u003eModifications système\u003c/h3\u003e\n\u003cp\u003ePour remédier à la situation, nous allons modifier légèrement votre\n\u003ccode\u003e$HOME\u003c/code\u003e et \u003ccode\u003e/usr/local\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCréation des répertoires nécessaires dans \u003ccode\u003e/usr/local\u003c/code\u003e, avec les\ndroits administrateurs\u003c/li\u003e\n\u003cli\u003eAttribution des droits utilisateurs nécessaires, toujours avec des\ndroits administrateurs\u003c/li\u003e\n\u003cli\u003eSuppression du répertoire ad hoc dans \u003ccode\u003e$HOME\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet, lien symbolique\u003c/li\u003e\n\u003cli\u003ecréation d\u0026rsquo;un alias utile\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# mkdir -p /usr/local/cabal/build\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chown -R user:wheel /usr/local/cabal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ rm -rf ~/.cabal\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ln -s /usr/local/cabal ~/.cabal\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour finir, créez donc un alias dans votre fichier personnel \u003ccode\u003e.khsrc\u003c/code\u003e,\nou \u003ccode\u003e.profile\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003ealias cabal='env TMPDIR=/usr/local/cabal/build/ cabal'\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eAjouter le dossier .cabal à votre variable PATH pour pouvoir lancer les\ncommandes facilement !\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003ePATH=$HOME/bin:/bin:/sbin:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin:$HOME/.cabal/bin\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"option-wxallowed\"\u003eOption wxallowed\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003ePrenez conscience qu\u0026rsquo;utiliser cette possibilité aura pour conséquence de\npermettre l\u0026rsquo;exécution de binaire potentiellement dangereux depuis votre\n\u003ccode\u003e$HOME\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMieux vaut éviter\u003c/strong\u003e !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl est possible d\u0026rsquo;ajouter l\u0026rsquo;option de montage \u003ccode\u003ewxallowed\u003c/code\u003e à votre partition\n$HOME si vous l\u0026rsquo;avez créée.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003esource : \u003ca href=\"https://deftly.net/posts/2017-10-12-using-cabal-on-openbsd.html\" rel=\"external\"\u003ehttps://deftly.net/posts/2017-10-12-using-cabal-on-openbsd.html\u003c/a\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Installation, configuration de l'outil 'cabal' pour la gestion des programmes et bibliothèques Haskell, sous OpenBSD",
            "tags": ["OpenBSD", "cabal", "haskell"],
            "date_published": "2020-01-19T13:45:21+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:d8f7c009-efee-d743-5f8f-62d865a4f745",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/sane/",
            "title": "SANE : scannérisons des documents sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description SANE signifie Scanner Access Now Easy - que l\u0026rsquo;on pourait traduire par : Scannérisation Facile\nInstallation Installez le paquet sane-backends.\nCe paquet contient les bibliothèques SANE (le backend et la partie réseau) ainsi que l\u0026rsquo;outil en ligne de commande scanimage.\nConfiguration USB Puisque la scannerisation par USB peut être gérée par la bibliothèque libusb, nous avons besoin d\u0026rsquo;autoriser l\u0026rsquo;utilisateur _saned au point de montage USB correspondant.\nTrouvez où votre scanner est attaché : # usbdevs -vd afin de changer les droits appropriés.\nPour l\u0026rsquo;exemple suivant :\nController /dev/usb3: addr 1: full speed, self powered, config 1, UHCI root hub(0x0000), Intel(0x8086), rev 1.00 uhub3 port 1 powered port 2 addr 2: full speed, self powered, config 1, USB MFP(0x082f), EPSON(0x04b8), rev 1.00, iSerialNumber L83010704250947490 ugen0 il vous faudra utiliser : # chgrp _saned /dev/ugen0.* /dev/usb3 sur le périphérique /dev/usb3.\nInfoLa raison pour laquelle nous changeons le groupe et non pas l\u0026rsquo;utilisateur est que cela permet à des périphériques multi-fonctions de fonctionner à la fois pour l\u0026rsquo;impression et pour la scannérisation.\n(par exemple, en appartenant à _cups:_saned).\nPour préserver vos changements après une mise à niveau du système :\nutilisez rc.local(8) - par exemple pour une imprimante multi-fonctions, ajoutez la ligne suivante : chown _cups:_saned /dev/ugen0.* /dev/usb1 alternativement les scripts attach et detach d\u0026rsquo;hotplugd(8) peuvent l\u0026rsquo;automatiser. Vous pouvez aussi garantir l\u0026rsquo;accès direct au scanner en ajoutant les utilisateurs au groupe _saned.\nRéseau Par défaut, le service saned(8) fonctionne en tant que _saned, ainsi vous devez autoriser l\u0026rsquo;utilisateur _saned a accéder au nœud du périphérique du scanner.\nSCSI SANE prend en charge seulement les périphériques supportés par le pilote SCSI générique uk(4).\nAssurez-vous que votre utilisateur ait les accès sur le nœud du périphérique du scanner, sinon, vous ne serez pas capable de scanner.\nVerrouillage fichier Certains backends (tel que sane-plustek(5)) utilisent un verrouillage fichier (lockfile) pour permettre les accès multiples au scanner. Si vous utilisez de tels backends, vous devez vous ajouter au groupe _saned, sinon vous ne serez pas capable de scanner.\nDocumentation Le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/sane-backends La documentation /usr/local/share/doc/sane-backends/ SURTOUT celle liée aux différents problèmes : /usr/local/share/doc/sane-backends/PROBLEMS Les exemples : /usr/local/share/exemples/sane-backends/ Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eSANE\u003c/strong\u003e signifie \u003cstrong\u003eScanner Access Now Easy\u003c/strong\u003e - \u003cem\u003eque l\u0026rsquo;on pourait traduire\npar : Scannérisation Facile\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003ccode\u003esane-backends\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eCe paquet contient les bibliothèques SANE (le backend et la partie réseau)\nainsi que l\u0026rsquo;outil en ligne de commande \u003ccode\u003escanimage\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"usb\"\u003eUSB\u003c/h3\u003e\n\u003cp\u003ePuisque la scannerisation par USB peut être gérée par la bibliothèque\n\u003ccode\u003elibusb\u003c/code\u003e, nous avons besoin d\u0026rsquo;autoriser l\u0026rsquo;utilisateur \u003ccode\u003e_saned\u003c/code\u003e au point\nde montage USB correspondant.\u003c/p\u003e\n\u003cp\u003eTrouvez où votre scanner est attaché : \u003cbr\u003e\n\u003ccode\u003e# usbdevs -vd \u003c/code\u003e \u003cbr\u003e\nafin de changer les droits appropriés.\u003c/p\u003e\n\u003cp\u003ePour l\u0026rsquo;exemple suivant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eController /dev/usb3:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eaddr 1: full speed, self powered, config 1, UHCI root hub\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x0000\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, Intel\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x8086\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, rev 1.00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  uhub3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e port \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e powered\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e port \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e addr 2: full speed, self powered, config 1, USB MFP\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x082f\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, EPSON\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x04b8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, rev 1.00, iSerialNumber L83010704250947490\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   ugen0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eil vous faudra utiliser : \u003ccode\u003e# chgrp _saned /dev/ugen0.* /dev/usb3\u003c/code\u003e\nsur le périphérique \u003ccode\u003e/dev/usb3\u003c/code\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eLa raison pour laquelle nous changeons le groupe et non pas l\u0026rsquo;utilisateur\nest que cela permet à des périphériques multi-fonctions de fonctionner à\nla fois pour l\u0026rsquo;impression et pour la scannérisation.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e(par exemple, en appartenant à \u003ccode\u003e_cups:_saned\u003c/code\u003e).\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003ePour préserver vos changements après une mise à niveau du système :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eutilisez \u003ca href=\"https://man.openbsd.org/rc.local.8\" rel=\"external\"\u003erc.local(8)\u003c/a\u003e - par exemple\npour une imprimante multi-fonctions, ajoutez la ligne suivante : \u003cbr\u003e\n\u003ccode\u003echown _cups:_saned /dev/ugen0.* /dev/usb1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ealternativement les scripts \u003ccode\u003eattach\u003c/code\u003e et \u003ccode\u003edetach\u003c/code\u003e\nd\u0026rsquo;\u003ca href=\"https://man.openbsd.org/hotplugd.8\" rel=\"external\"\u003ehotplugd(8)\u003c/a\u003e peuvent l\u0026rsquo;automatiser.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVous pouvez aussi garantir l\u0026rsquo;accès direct au scanner en ajoutant les\nutilisateurs au groupe \u003ccode\u003e_saned\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"réseau\"\u003eRéseau\u003c/h3\u003e\n\u003cp\u003ePar défaut, le service saned(8) fonctionne en tant que \u003ccode\u003e_saned\u003c/code\u003e, ainsi\nvous devez autoriser l\u0026rsquo;utilisateur \u003ccode\u003e_saned\u003c/code\u003e a accéder au nœud du périphérique\ndu scanner.\u003c/p\u003e\n\u003ch3 id=\"scsi\"\u003eSCSI\u003c/h3\u003e\n\u003cp\u003eSANE prend en charge seulement les périphériques supportés par le pilote\nSCSI générique \u003ca href=\"https://man.openbsd.org/uk.4\" rel=\"external\"\u003euk(4)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAssurez-vous que votre utilisateur ait les accès sur le nœud du périphérique\ndu scanner, sinon, vous ne serez pas capable de scanner.\u003c/p\u003e\n\u003ch3 id=\"verrouillage-fichier\"\u003eVerrouillage fichier\u003c/h3\u003e\n\u003cp\u003eCertains backends \u003cem\u003e(tel que sane-plustek(5))\u003c/em\u003e utilisent un verrouillage\nfichier (lockfile) pour permettre les accès multiples au scanner. Si vous\nutilisez de tels backends, vous devez vous ajouter au groupe \u003ccode\u003e_saned\u003c/code\u003e,\nsinon vous ne serez pas capable de scanner.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier pkg-readme : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/sane-backends\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLa documentation \u003ccode\u003e/usr/local/share/doc/sane-backends/\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003eSURTOUT celle liée aux différents problèmes : \u003ccode\u003e/usr/local/share/doc/sane-backends/PROBLEMS\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLes exemples : \u003ccode\u003e/usr/local/share/exemples/sane-backends/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utilisons un scanner sous OpenBSD avec le projet SANE pour scanner des documents",
            "tags": ["OpenBSD", "SANE"],
            "date_published": "2020-01-19T13:35:42+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:c1d829ec-af23-5c18-a6fa-61751e6443a2",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/inkscape/",
            "title": "inkscape",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Inkscape est un logiciel d\u0026rsquo;édition de graphisme vectoriel utilisant le format de fichier SVG, norme du W3C.\nInstallation Installez le paquet inkscape.\nDocumentation le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/inkscape Gestion des extensions Ruby Aucune extension écrite dans le langage Ruby n\u0026rsquo;est fournie avec le paquet Inkscape.\nSi vous voulez en installer, ou en écrire, il vous faudra installer d\u0026rsquo;abord le langage Ruby :\nRuby 2.6 - le paquet ruby-2.6, pour OpenBSD 6.6, 6.7 Ruby 2.5 - le paquet ruby-2.5.5, au minimum, pour OpenBSD 6.5. Ruby 2.4 - le paquet ruby-2.4.4, au minimum, pour OpenBSD 6.4. Bogue Icône Inkscape n\u0026rsquo;est pas résilient sur l\u0026rsquo;oubli du paramétrage de l\u0026rsquo;icône et peut crasher (par exemple, lors de l\u0026rsquo;ouverture du menu fichier \u0026gt; \u0026ldquo;Propriétés du document\u0026rdquo;)\nSi vous voulez spécifier un icône personnalisé dans votre thème ~/.gtkrc-2.0, veuillez d\u0026rsquo;abord vous assurer de la présence effective sur votre système de fichiers et de sa bonne localisation !\nBogue #1238142\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eInkscape est un logiciel d\u0026rsquo;édition de graphisme vectoriel utilisant le format de fichier SVG, norme du W3C.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003ccode\u003einkscape\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele fichier pkg-readme : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/inkscape\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"gestion-des-extensions-ruby\"\u003eGestion des extensions Ruby\u003c/h2\u003e\n\u003cp\u003eAucune extension écrite dans le langage Ruby n\u0026rsquo;est fournie avec le paquet Inkscape.\u003c/p\u003e\n\u003cp\u003eSi vous voulez en installer, ou en écrire, il vous faudra\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n\nd\u0026rsquo;abord le langage Ruby :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eRuby \u003cstrong\u003e2.6\u003c/strong\u003e - le paquet \u003ccode\u003eruby-2.6\u003c/code\u003e, pour OpenBSD \u003cstrong\u003e6.6\u003c/strong\u003e, \u003cstrong\u003e6.7\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eRuby \u003cstrong\u003e2.5\u003c/strong\u003e - le paquet \u003ccode\u003eruby-2.5.5\u003c/code\u003e, au minimum, pour OpenBSD \u003cstrong\u003e6.5\u003c/strong\u003e.\u003c/li\u003e\n\u003cli\u003eRuby \u003cstrong\u003e2.4\u003c/strong\u003e - le paquet \u003ccode\u003eruby-2.4.4\u003c/code\u003e, au minimum, pour OpenBSD \u003cstrong\u003e6.4\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"bogue\"\u003eBogue\u003c/h2\u003e\n\u003ch3 id=\"icône\"\u003eIcône\u003c/h3\u003e\n\u003cp\u003eInkscape n\u0026rsquo;est pas résilient sur l\u0026rsquo;oubli du paramétrage de l\u0026rsquo;icône et\npeut crasher\n\u003cem\u003e(par exemple, lors de l\u0026rsquo;ouverture du menu fichier \u0026gt; \u0026ldquo;Propriétés du document\u0026rdquo;)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSi vous voulez spécifier un icône personnalisé dans votre thème\n\u003ccode\u003e~/.gtkrc-2.0\u003c/code\u003e, veuillez d\u0026rsquo;abord vous assurer de la présence effective\nsur votre système de fichiers et de sa bonne localisation !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eBogue #\u003ca href=\"https://bugs.launchpad.net/inkscape/+bug/1238142\" rel=\"external\"\u003e1238142\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Installation du logiciel 'inkscape' sous OpenBSD",
            "tags": ["OpenBSD", "inkscape"],
            "date_published": "2020-01-19T13:30:37+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:fb998062-b17f-8e9b-f88e-2f1101d68717",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/ffmpeg/",
            "title": "FFmpeg / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description FFmpeg est une solution complète pour enregistrer, convertir et émettre des flux audio et vidéo. Il inclut la principale bibliothèque de codec audio et vidéo libavcodec.\nSite officiel : https://ffmpeg.org Installation Installez le paquet ffmpeg.\nConfiguration Périphériques Brooktree Les périphériques de capture vidéo et tuners TV de la marque Brooktree sont gérés par le pilote bktr(4), seulement pris en charge sur les architectures amd64, i386 et powerpc.\nIls peuvent être contrôlés au moyen des variables d\u0026rsquo;environnements suivantes :\nBKTR_DEV={0|1|2|3|4} en sélectionnant le périphérique d\u0026rsquo;entrée adéquat (relatif au tuner, la caméra, etc…) BKTR_FORMAT={1|2|3|4|5|6} où : 1 : PAL 2 : NTSC 3 : SECAM 4 : PALN 5 : PALM 6 : NTSCJ BKTR_FREQUENCY=xxx.yy où xxx.yy représente la fréquence à paramétrer en Mhz. Documentation N\u0026rsquo;oubliez pas de lire le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/ffmpeg !\nVous pouvez lire aussi :\nla documentation à-propos : /usr/local/share/doc/ffmpeg et des exemples dans : /usr/local/share/examples/ffmpeg Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eFFmpeg\u003c/strong\u003e est une solution complète pour enregistrer, convertir et\némettre des flux audio et vidéo. Il inclut la principale bibliothèque de\ncodec audio et vidéo libavcodec.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite officiel : \u003ca href=\"https://ffmpeg.org\" rel=\"external\"\u003ehttps://ffmpeg.org\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003ccode\u003effmpeg\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"périphériques-brooktree\"\u003ePériphériques Brooktree\u003c/h3\u003e\n\u003cp\u003eLes périphériques de capture vidéo et tuners TV de la marque Brooktree\nsont gérés par le pilote \u003ca href=\"http://man.openbsd.org/bktr.4\" rel=\"external\"\u003ebktr(4)\u003c/a\u003e, seulement\npris en charge sur les architectures amd64, i386 et powerpc.\u003c/p\u003e\n\u003cp\u003eIls peuvent être contrôlés au moyen des variables d\u0026rsquo;environnements suivantes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eBKTR_DEV=\u003c/code\u003e{0|1|2|3|4} en sélectionnant le périphérique d\u0026rsquo;entrée adéquat\n(relatif au tuner, la caméra, etc…)\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBKTR_FORMAT=\u003c/code\u003e{1|2|3|4|5|6} où :\n\u003cul\u003e\n\u003cli\u003e1 : PAL\u003c/li\u003e\n\u003cli\u003e2 : NTSC\u003c/li\u003e\n\u003cli\u003e3 : SECAM\u003c/li\u003e\n\u003cli\u003e4 : PALN\u003c/li\u003e\n\u003cli\u003e5 : PALM\u003c/li\u003e\n\u003cli\u003e6 : NTSCJ\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eBKTR_FREQUENCY=\u003c/code\u003exxx.yy où \u003cstrong\u003exxx.yy\u003c/strong\u003e représente la fréquence à\nparamétrer en Mhz.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de lire le fichier pkg-readme : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/ffmpeg\u003c/code\u003e !\u003c/p\u003e\n\u003cp\u003eVous pouvez lire aussi :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela documentation à-propos : \u003ccode\u003e/usr/local/share/doc/ffmpeg\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet des exemples dans : \u003ccode\u003e/usr/local/share/examples/ffmpeg\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser sous OpenBSD l'outil `FFmpeg', un outil de gestion audio et vidéo.",
            "tags": ["OpenBSD", "FFmpeg"],
            "date_published": "2020-01-19T13:19:19+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:267caa49-9ffa-aefb-06ec-fc21fda988cd",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/qemu/",
            "title": "Qemu : Virtualisation sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description QEMU est un émulateur machine open source. Il peut exécuter des systèmes d\u0026rsquo;exploitations et des programmes faits pour une machine (càd, une carte ARM) sur une machine différente (càd, votre propre PC).\nInstallation Installez le paquet qemu.\nConfiguration Démarrage rapide Obtenez une image ISO Pour i386 : $ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/cd52.iso ou respectivement pour amd64 : $ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/amd64/cd52.iso voire SPARC : $ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/sparc/cd52.iso Créez un disque virtuel $ qemu-img create -f qcow2 virtual.img 10G\nInstallez le système d\u0026rsquo;exploitation pour i386 : $ qemu-system-i386 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d pour amd64 : $ qemu-system-x86_64 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d pour SPARC : $ qemu-system-sparc -m 32 -monitor stdio -hda virtual.img -cdrom cd52.iso -boot d InfoNotes :\nDémarrez dans un terminal xterm ou équivalent. Assurez-vous de choisir la console série durant l\u0026rsquo;installation l\u0026rsquo;option -no-fd-bootchk permet un démarrage plus rapide quand il n\u0026rsquo;y a pas de lecteur disquette ce n\u0026rsquo;est pas supporté par qemu-system-sparc. qemu-system-ppc* et qemu-system-sparc* échoue actuellement avec l\u0026rsquo;usage des drapeaux malloc J ou S Compressez le disque virtuel $ qemu-img convert -c -O qcow2 virtual.img v.tmp \u0026amp;\u0026amp; mv v.tmp virtual.img\nAttentionNote : Ne pas faire cela pendant que QEMU fonctionne ou utilise le disque virtuel Démarrez normalement le disque virtuel Pour i386 : $ qemu-system-i386 -m 32 -nographic -no-fd-bootchk -hda virtual.img Pour amd64 : $ qemu-system-x86_64 -m 32 -nographic -no-fd-bootchk -hda virtual.img Pour SPARC : $ qemu-system-sparc -m 32 -nographic -hda virtual.img Gestion du réseau Paramétrage par défaut Par défaut, QEMU définit les paramètres réseaux suivants :\n-net nic,vlan=0,model=e1000,macaddr=52:54:00:12:34:56 -net user,vlan=0 De même, à l\u0026rsquo;intérieur du mode réseau virtuel, il utilise le segment 10.0.2.0/24 et dessert DHCP à l\u0026rsquo;intérieur du réseau virtuel. Des adresses statiques peuvent être utilisées s\u0026rsquo;il n\u0026rsquo;est pas possible d\u0026rsquo;utiliser DHCP dans l\u0026rsquo;hôte invité :\nIP du système hôte : 10.0.2.15 Passerelle par défaut : 10.0.2.2 Serveur de nom : 10.0.2.3 C\u0026rsquo;est suffisant pour la plupart des opérations, QEMU assume la NAT lui-même et permet au réseau de l\u0026rsquo;espace utilisateur de faire des opérations TCP/UDP. ICMP et autres aspects réseaux ne sont pas possible dans ce mode.\nInfoNOTE : Si vous utilisez l\u0026rsquo;argument -net en ligne de commande, QEMU présume que vous savez ce que vous faîtes et nettoie les valeurs par défaut pour le reste des paramètres par défaut -net. AttentionNOTE : le réseau du mode invité ne supporte pas actuellement IPv6, QEMU se plaindra s\u0026rsquo;il ne peut pas trouver de serveur DNS, si /etc/resolv.conf contient seulement des serveurs DNS IPv6. Mode tap Parfois il est souhaitable de configurer QEMU pour accéder au réseau directement via la Couche de niveau 2. Une manière de faire cela sans exécuter QEMU avec les droits root est de laisser root ouvrir le périphérique /dev/tapN et de passer le fichier descripteur à QEMU. L\u0026rsquo;interface tap(4) devrait être de préférence configurée avant de démarrer QEMU : # ifconfig tap0 192.168.0.254\nL\u0026rsquo;interface peut aussi être configurée comme partie de bridge(4), dans ce cas l\u0026rsquo;adresse ip peut être omise : # ifconfig bridge0 add tap0 add em0 up\nLes interfaces tunnel et bridge peuvent aussi être configurées au démarrage du système en éditant les fichiers /etc/hostname.tapN et /etc/hostname.bridgeN, respectivement (voir hostname.if(5)).\nAprès la configuration du réseau virtuel, nous pouvons utiliser doas pour laisser root ouvrir le périphérique tunnel et ensuite utiliser encore doas pour supprimer les privilèges et démarrer QEMU :\n$ doas sh -c \u0026#34;doas -u $USER qemu-system-i386 -nographic -net nic -net tap,fd=3 -no-fd-bootchk -hda virtual.img 3\u0026lt;\u0026gt;/dev/tap0\u0026#34; InfoNOTE : si vous utilisez sudo à la place de doas, souvenez vous que sudo appelle closefrom(2). Avant d\u0026rsquo;avoir plus d\u0026rsquo;un fd passant l\u0026rsquo;interface tap, ajouter une ligne à sudoers ressemblant à : Defaults closefrom_override et appeler sudo via sudo -C 5 -u $USER qemu-system-i386 … est requis.\nVoir sudoers(5) et sudo(8) pour les détails.\nUne alternative à la procédure décrite ci-dessus est de laisser QEMU paramétrer le réseau via le fichier /etc/qemu-ifup. Ceci n\u0026rsquo;est toutefois pas recommandé, puisque vous allez exécuter QEMU avec les droits root, et qu\u0026rsquo;il n\u0026rsquo;y a pas de moyen de supprimer les privilèges root à ce niveau.\n/etc/qemu-ifup contient quelques paramètres par défaut qui permettent de faire ce qui suit : # qemu-system-i386 -net nic -net tap -no-fd-bootchk -hda virtual.img\nCela présume que vous souhaitez que l\u0026rsquo;interface tap(4) discute avec l\u0026rsquo;interface gérant la route IPv4 par défaut (basculant sur trunk0 si aucune route n\u0026rsquo;est trouvée), et que vous voulez que bridge0 soit utilisée en tant que bridge en second.\nParamétrer les variables d\u0026rsquo;environnement ETHER et BRIDGE surchargera ces paramètres, respectivement.\nLors du démarrage de QEMU, le script essaie de sortir les informations utiles, mais il peut y avoir des messages d\u0026rsquo;erreurs qui apparaissent, aussi bien. Sur mon laptop, je veux router NAT nativement en utilisant PF et aussi en ayant accès à la couche de niveau 2 vers le réseau de QEMU. J\u0026rsquo;ai donc ceci dans le fichier /etc/hostname.trunk101 :\ninet6 fe80::1c 64 lladdr 00:03:25:0d:7a:2c inet 10.7.255.1 255.255.255.0 inet6 alias 2001:240:58a:45::1c J\u0026rsquo;ai configuré dhcpd pour s\u0026rsquo;exécuter sur trunk101, et aussi rad.\nPour QEMU, le démarrage ressemble à cela :\n# export ETHER=trunk101 # export BRIDGE=bridge101 # qemu-system-i386 -net nic,vlan=0,macaddr=52:54:00:12:35:00 \\ -net tap,vlan=0 -vnc :0 -localtime -usb -usbdevice tablet \\ -m 256 -no-fd-bootchk -hda virtual.img -monitor stdio {tap0 (bridge101 \u0026lt;-\u0026gt; trunk101)ifconfig: bridge101: No such process ifconfig: bridge101: No such process } (qemu) Ces erreurs sont normales et doivent être ignorées. Vérifiez que le réseau est proprement configurée en vérifiant l\u0026rsquo;interface bridge :\n$ ifconfig bridge101 bridge101: flags=41\u0026lt;UP,RUNNING\u0026gt; groups: bridge priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp designated: id 00:00:00:00:00:00 priority 0 tap0 flags=3\u0026lt;LEARNING,DISCOVER\u0026gt; port 16 ifpriority 0 ifcost 0 trunk101 flags=3\u0026lt;LEARNING,DISCOVER\u0026gt; port 6 ifpriority 0 ifcost 0 Addresses (max cache: 100, timeout: 240): InfoNOTE : Lors de l\u0026rsquo;exécution de sessions multiples simultanées sur le même bridge, il faut faire attention car l\u0026rsquo;adresse MAC du réseau par défaut est 52:54:00:12:34:56 pour chaque instance QEMU. Pour changer cela, observez la syntaxe macaddr= dans l\u0026rsquo;exemple ci-dessus et choisissez un lladdr unique par interface QEMU. Gestion de la souris NOTE : Certains systèmes d\u0026rsquo;exploitation fonctionnent mieux avec le périphérique USB tablet qu\u0026rsquo;avec le périphérique normal de souris PS/2. Voir l\u0026rsquo;exemple ci-dessus pour l\u0026rsquo;usage.\n-usb -usbdevice tablet\nGestion de la console série Installer OpenBSD via la console série est parfois désirable. X peut ne pas être disponible… Il y a deux manières d\u0026rsquo;accomplir cela, les deux offrant la même solution :\na. qemu-system-i386 -vnc :0 -serial stdio .. virtual.img -cdrom install52.iso -boot d\ncette option vous permet d\u0026rsquo;utiliser VNC depuis tout système pour vous connecter à l\u0026rsquo;instance QEMU et d\u0026rsquo;utiliser set tty com0 à l\u0026rsquo;invite boot\u0026gt;. vous pouvez alors déconnecter VNC et utiliser le terminal avec lequel vous avez démarré QEMU pour faire l\u0026rsquo;installation. b. qemu-system-i386 -nographic .. virtual.img -fda floppy52.fs -boot a\ncela mappe à la fois le port série et l\u0026rsquo;invite du moniteur (qemu) sur le terminal où QEMU a été démarré. pour basculer entre eux, utilisez Ctrl-a c lire la page de manuel QEMU pour les autres commandes qui fonctionnent dans le mode -nographic. la préparation de l\u0026rsquo;image de disquette pour forcer le mode de console série est simple : vnconfig vnd0 floppy52.fs mount /dev/vnd0c /mnt mkdir /mnt/etc echo set tty com0 \u0026gt; /mnt/etc/boot.conf umount /mnt vnconfig -u vnd0 Assurez-vous de choisir yes pour paramétrer com0 en tant que console série. InfoNOTE : L\u0026rsquo;arrêt d\u0026rsquo;OpenBSD fonctionne avec QEMU, ce qui provoque effectivement la sortie de QEMU. C\u0026rsquo;est une bonne chose, car il n\u0026rsquo;est actuellement pas possible de définir le périphérique de blocage à partir duquel QEMU est démarré au moment de l\u0026rsquo;exécution. Par conséquent, si vous démarrez une installation à partir d\u0026rsquo;un CD-ROM, vous démarrerez toujours à partir d\u0026rsquo;un CD-ROM chaque fois que vous redémarrerez cette session QEMU jusqu\u0026rsquo;à ce que vous quittiez et redémarriez QEMU à partir du disque dur virtuel. Gestion du service Parfois, vous voulez que QEMU démarre en tant que script système.\nEn plus des options ci-dessus, l\u0026rsquo;option -daemonize est très pratique, de même que pour désigner telnet: pour -serial et -monitor.\nhddir=/var/vm USER=qemu if [ -x /usr/local/bin/qemu ]; then echo -n \u0026#39;Qemu: vmi386\u0026#39; ( ifconfig bridge101 add trunk101 add tap0 up sh -c \u0026#34;doas -u $USER \\ /usr/local/bin/qemu-system-i386 \\ -daemonize \\ -nographic \\ -net nic,vlan=0,macaddr=52:54:00:4e:62:8f \\ -net tap,vlan=0,fd=3 \\ -m 128 \\ -hda $hddir/virtual.img \\ -serial telnet:127.0.0.1:1080,server,nowait \\ -monitor telnet:127.0.0.1:1081,server,nowait \\ -no-fd-bootchk 3\u0026lt;\u0026gt;/dev/tap0\u0026#34; ) echo \u0026#34;.\u0026#34; fi InfoNOTE : cela présume que l\u0026rsquo;utilisateur qemu existe, créez-le ou paramétrez USER= en lui donnant un utilisateur existant pour utiliser cet exemple. Documentation Lire le fichier pkg-readme : /usr/local/share/doc/pkg-readmes/qemu Historique J\u0026rsquo;ai écrit historiquement de manière collaborative cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eQEMU\u003c/strong\u003e est un émulateur machine open source. Il peut exécuter des\nsystèmes d\u0026rsquo;exploitations et des programmes faits pour une machine (càd,\nune carte ARM) sur une machine différente (càd, votre propre PC).\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le paquet \u003ccode\u003eqemu\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"démarrage-rapide\"\u003eDémarrage rapide\u003c/h3\u003e\n\u003ch4 id=\"obtenez-une-image-iso\"\u003eObtenez une image ISO\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003ePour i386 : \u003cbr\u003e\n\u003ccode\u003e$ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/i386/cd52.iso\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eou respectivement pour amd64 : \u003cbr\u003e\n\u003ccode\u003e$ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/amd64/cd52.iso\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003evoire SPARC : \u003cbr\u003e\n\u003ccode\u003e$ ftp ftp://ftp.openbsd.org/pub/OpenBSD/snapshots/sparc/cd52.iso\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"créez-un-disque-virtuel\"\u003eCréez un disque virtuel\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003e$ qemu-img create -f qcow2 virtual.img 10G\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"installez-le-système-dexploitation\"\u003eInstallez le système d\u0026rsquo;exploitation\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003epour i386 : \u003cbr\u003e\n\u003ccode\u003e$ qemu-system-i386 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour amd64 : \u003cbr\u003e\n\u003ccode\u003e$ qemu-system-x86_64 -m 32 -monitor stdio -no-fd-bootchk -hda virtual.img -cdrom cd52.iso -boot d\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour SPARC : \u003cbr\u003e\n\u003ccode\u003e$ qemu-system-sparc -m 32 -monitor stdio -hda virtual.img -cdrom cd52.iso -boot d\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eNotes :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDémarrez dans un terminal \u003ccode\u003exterm\u003c/code\u003e ou équivalent.\u003c/li\u003e\n\u003cli\u003eAssurez-vous de choisir la console série durant l\u0026rsquo;installation\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-no-fd-bootchk\u003c/code\u003e permet un démarrage plus rapide quand il\nn\u0026rsquo;y a pas de lecteur disquette\n\u003cul\u003e\n\u003cli\u003ece n\u0026rsquo;est pas supporté par \u003ccode\u003eqemu-system-sparc\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eqemu-system-ppc*\u003c/code\u003e et \u003ccode\u003eqemu-system-sparc*\u003c/code\u003e échoue actuellement avec\nl\u0026rsquo;usage des drapeaux malloc \u003ccode\u003eJ\u003c/code\u003e ou \u003ccode\u003eS\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\u003c/div\u003e\n\n\u003ch4 id=\"compressez-le-disque-virtuel\"\u003eCompressez le disque virtuel\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003e$ qemu-img convert -c -O qcow2 virtual.img v.tmp \u0026amp;\u0026amp; mv v.tmp virtual.img\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNote : Ne pas faire cela pendant que QEMU fonctionne ou utilise le disque\nvirtuel\u003c/div\u003e\n\n\u003ch4 id=\"démarrez-normalement-le-disque-virtuel\"\u003eDémarrez normalement le disque virtuel\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003ePour i386 : \u003cbr\u003e\n\u003ccode\u003e$ qemu-system-i386 -m 32 -nographic -no-fd-bootchk -hda virtual.img\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour amd64 : \u003cbr\u003e\n\u003ccode\u003e$ qemu-system-x86_64 -m 32 -nographic -no-fd-bootchk -hda virtual.img\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour SPARC : \u003cbr\u003e\n\u003ccode\u003e$ qemu-system-sparc -m 32 -nographic -hda virtual.img\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"gestion-du-réseau\"\u003eGestion du réseau\u003c/h3\u003e\n\u003ch4 id=\"paramétrage-par-défaut\"\u003eParamétrage par défaut\u003c/h4\u003e\n\u003cp\u003ePar défaut, QEMU définit les paramètres réseaux suivants :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e-net nic,vlan\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0,model=e1000,macaddr=52:54:00:12:34:56\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e-net user,vlan\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDe même, à l\u0026rsquo;intérieur du mode réseau virtuel, il utilise le segment\n\u003ccode\u003e10.0.2.0/24\u003c/code\u003e et dessert DHCP à l\u0026rsquo;intérieur du réseau virtuel.\nDes adresses statiques peuvent être utilisées s\u0026rsquo;il n\u0026rsquo;est pas possible\nd\u0026rsquo;utiliser DHCP dans l\u0026rsquo;hôte invité :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIP du système hôte     : 10.0.2.15\u003c/li\u003e\n\u003cli\u003ePasserelle par défaut : 10.0.2.2\u003c/li\u003e\n\u003cli\u003eServeur de nom      : 10.0.2.3\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eC\u0026rsquo;est suffisant pour la plupart des opérations, QEMU assume la NAT lui-même\net permet au réseau de l\u0026rsquo;espace utilisateur de faire des opérations\nTCP/UDP. ICMP et autres aspects réseaux ne sont pas possible dans ce mode.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eNOTE : Si vous utilisez l\u0026rsquo;argument \u003ccode\u003e-net\u003c/code\u003e en ligne de commande, QEMU\nprésume que vous savez ce que vous faîtes et nettoie les valeurs par défaut\npour le reste des paramètres par défaut \u003ccode\u003e-net\u003c/code\u003e.\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNOTE : le réseau du mode invité ne supporte pas actuellement IPv6, QEMU\nse plaindra s\u0026rsquo;il ne peut pas trouver de serveur DNS, si \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e\ncontient seulement des serveurs DNS IPv6.\u003c/div\u003e\n\n\u003ch4 id=\"mode-tap\"\u003eMode tap\u003c/h4\u003e\n\u003cp\u003eParfois il est souhaitable de configurer QEMU pour accéder au réseau\ndirectement via la Couche de niveau 2. Une manière de faire cela sans\nexécuter QEMU avec les droits root est de laisser root ouvrir le\npériphérique \u003ccode\u003e/dev/tapN\u003c/code\u003e et de passer le fichier descripteur à QEMU.\nL\u0026rsquo;interface \u003ca href=\"https://man.openbsd.org/tap.4\" rel=\"external\"\u003etap(4)\u003c/a\u003e devrait être de\npréférence configurée avant de démarrer QEMU : \u003cbr\u003e\n\u003ccode\u003e# ifconfig tap0 192.168.0.254\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;interface peut aussi être configurée comme partie de\n\u003ca href=\"ttps://man.openbsd.org/bridge.4\" rel=\"external\"\u003ebridge(4)\u003c/a\u003e, dans ce cas l\u0026rsquo;adresse ip\npeut être omise : \u003cbr\u003e\n\u003ccode\u003e# ifconfig bridge0 add tap0 add em0 up\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLes interfaces tunnel et bridge peuvent aussi être configurées au démarrage\ndu système en éditant les fichiers \u003ccode\u003e/etc/hostname.tapN\u003c/code\u003e et\n\u003ccode\u003e/etc/hostname.bridgeN\u003c/code\u003e, respectivement\n\u003cem\u003e(voir \u003ca href=\"https://man.openbsd.org/hostname.if.5\" rel=\"external\"\u003ehostname.if(5)\u003c/a\u003e)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eAprès la configuration du réseau virtuel, nous pouvons utiliser \u003ccode\u003edoas\u003c/code\u003e\npour laisser root ouvrir le périphérique tunnel et ensuite utiliser encore\n\u003ccode\u003edoas\u003c/code\u003e pour supprimer les privilèges et démarrer QEMU :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ doas sh -c \u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas -u \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e qemu-system-i386 -nographic -net nic -net tap,fd=3 -no-fd-bootchk -hda virtual.img 3\u0026lt;\u0026gt;/dev/tap0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eNOTE : si vous utilisez \u003ccode\u003esudo\u003c/code\u003e à la place de \u003ccode\u003edoas\u003c/code\u003e, souvenez vous que\nsudo appelle \u003ca href=\"https://man.openbsd.org/closefrom.2\" rel=\"external\"\u003e\u003ccode\u003eclosefrom(2)\u003c/code\u003e\u003c/a\u003e.\nAvant d\u0026rsquo;avoir plus d\u0026rsquo;un \u003ccode\u003efd\u003c/code\u003e passant l\u0026rsquo;interface \u003ccode\u003etap\u003c/code\u003e, ajouter une ligne\nà \u003ccode\u003esudoers\u003c/code\u003e ressemblant à : \u003cbr\u003e\n\u003ccode\u003eDefaults closefrom_override\u003c/code\u003e \u003cbr\u003e\net appeler \u003ccode\u003esudo\u003c/code\u003e via \u003ccode\u003esudo -C 5 -u $USER qemu-system-i386 …\u003c/code\u003e est requis.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eVoir \u003ca href=\"https://man.openbsd.org/sudoers.5\" rel=\"external\"\u003esudoers(5)\u003c/a\u003e et \u003ca href=\"https://man.openbsd.org/sudo.8\" rel=\"external\"\u003esudo(8)\u003c/a\u003e pour les détails\u003c/em\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eUne alternative à la procédure décrite ci-dessus est de laisser QEMU\nparamétrer le réseau via le fichier \u003ccode\u003e/etc/qemu-ifup\u003c/code\u003e. Ceci n\u0026rsquo;est toutefois\npas recommandé, puisque vous allez exécuter QEMU avec les droits root,\net qu\u0026rsquo;il n\u0026rsquo;y a pas de moyen de supprimer les privilèges root à ce niveau.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e/etc/qemu-ifup\u003c/code\u003e contient quelques paramètres par défaut qui permettent\nde faire ce qui suit : \u003cbr\u003e\n\u003ccode\u003e# qemu-system-i386 -net nic -net tap -no-fd-bootchk -hda virtual.img\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCela présume que vous souhaitez que l\u0026rsquo;interface \u003ca href=\"https://man.openbsd.org/tap.4\" rel=\"external\"\u003etap(4)\u003c/a\u003e\ndiscute avec l\u0026rsquo;interface gérant la route IPv4 par défaut (basculant sur\n\u003ccode\u003etrunk0\u003c/code\u003e si aucune route n\u0026rsquo;est trouvée), et que vous voulez que \u003ccode\u003ebridge0\u003c/code\u003e\nsoit utilisée en tant que bridge en second.\u003c/p\u003e\n\u003cp\u003eParamétrer les variables d\u0026rsquo;environnement \u003ccode\u003eETHER\u003c/code\u003e et \u003ccode\u003eBRIDGE\u003c/code\u003e surchargera\nces paramètres, respectivement.\u003c/p\u003e\n\u003cp\u003eLors du démarrage de QEMU, le script essaie de sortir les informations\nutiles, mais il peut y avoir des messages d\u0026rsquo;erreurs qui apparaissent,\naussi bien. Sur mon laptop, je veux router NAT nativement en utilisant PF\net aussi en ayant accès à la couche de niveau 2 vers le réseau de QEMU.\nJ\u0026rsquo;ai donc ceci dans le fichier \u003ccode\u003e/etc/hostname.trunk101\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einet6 fe80::1c 64 lladdr 00:03:25:0d:7a:2c\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einet 10.7.255.1 255.255.255.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einet6 alias 2001:240:58a:45::1c\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eJ\u0026rsquo;ai configuré dhcpd pour s\u0026rsquo;exécuter sur trunk101, et aussi rad.\u003c/p\u003e\n\u003cp\u003ePour QEMU, le démarrage ressemble à cela :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# export ETHER=trunk101\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# export BRIDGE=bridge101\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# qemu-system-i386 -net nic,vlan=0,macaddr=52:54:00:12:35:00 \\\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t-net tap,vlan\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e -vnc :0 -localtime -usb -usbdevice tablet \u003cspan style=\"color:#f99b15\"\u003e\\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t-m \u003cspan style=\"color:#f99b15\"\u003e256\u003c/span\u003e -no-fd-bootchk -hda virtual.img -monitor stdio\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003etap0 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ebridge101 \u0026lt;-\u0026gt; trunk101\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003eifconfig: bridge101: No such process\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ifconfig: bridge101: No such process\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eqemu\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCes erreurs sont normales et doivent être ignorées. Vérifiez que le réseau\nest proprement configurée en vérifiant l\u0026rsquo;interface bridge :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ifconfig bridge101\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebridge101: \u003cspan style=\"color:#ef6155\"\u003eflags\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e41\u0026lt;UP,RUNNING\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egroups: bridge\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epriority \u003cspan style=\"color:#f99b15\"\u003e32768\u003c/span\u003e hellotime \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e fwddelay \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e maxage \u003cspan style=\"color:#f99b15\"\u003e20\u003c/span\u003e holdcnt \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e proto rstp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edesignated: id 00:00:00:00:00:00 priority \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etap0 \u003cspan style=\"color:#ef6155\"\u003eflags\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\u0026lt;LEARNING,DISCOVER\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tport \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e ifpriority \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ifcost \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etrunk101 \u003cspan style=\"color:#ef6155\"\u003eflags\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e3\u0026lt;LEARNING,DISCOVER\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\tport \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e ifpriority \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e ifcost \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAddresses \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003emax cache: 100, timeout: 240\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eNOTE : Lors de l\u0026rsquo;exécution de sessions multiples simultanées sur le même\nbridge, il faut faire attention car l\u0026rsquo;adresse MAC du réseau par défaut\nest \u003ccode\u003e52:54:00:12:34:56\u003c/code\u003e pour chaque instance QEMU. Pour changer cela,\nobservez la syntaxe \u003ccode\u003emacaddr=\u003c/code\u003e dans l\u0026rsquo;exemple ci-dessus et choisissez un\n\u003ccode\u003elladdr\u003c/code\u003e unique par interface QEMU.\u003c/div\u003e\n\n\u003ch3 id=\"gestion-de-la-souris\"\u003eGestion de la souris\u003c/h3\u003e\n\u003cp\u003eNOTE : Certains systèmes d\u0026rsquo;exploitation fonctionnent mieux avec le périphérique\nUSB \u003ccode\u003etablet\u003c/code\u003e qu\u0026rsquo;avec le périphérique normal de souris PS/2.\nVoir l\u0026rsquo;exemple ci-dessus pour l\u0026rsquo;usage.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e-usb -usbdevice tablet\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-de-la-console-série\"\u003eGestion de la console série\u003c/h3\u003e\n\u003cp\u003eInstaller OpenBSD via la console série est parfois désirable. X peut ne\npas être disponible… Il y a deux manières d\u0026rsquo;accomplir cela, les deux\noffrant la même solution :\u003c/p\u003e\n\u003cp\u003ea. \u003ccode\u003eqemu-system-i386 -vnc :0 -serial stdio .. virtual.img -cdrom install52.iso -boot d\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecette option vous permet d\u0026rsquo;utiliser VNC depuis tout système pour vous\nconnecter à l\u0026rsquo;instance QEMU et d\u0026rsquo;utiliser \u003ccode\u003eset tty com0\u003c/code\u003e à l\u0026rsquo;invite\n\u003ccode\u003eboot\u0026gt;\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003evous pouvez alors déconnecter VNC et utiliser le terminal avec lequel\nvous avez démarré QEMU pour faire l\u0026rsquo;installation.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eb. \u003ccode\u003eqemu-system-i386 -nographic .. virtual.img -fda floppy52.fs -boot a\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecela mappe à la fois le port série et l\u0026rsquo;invite du moniteur (qemu) sur\nle terminal où QEMU a été démarré.\u003c/li\u003e\n\u003cli\u003epour basculer entre eux, utilisez \u003ckey\u003eCtrl-a c\u003c/key\u003e\n\u003cul\u003e\n\u003cli\u003elire la page de manuel QEMU pour les autres commandes qui fonctionnent dans le mode \u003ccode\u003e-nographic\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ela préparation de l\u0026rsquo;image de disquette pour forcer le mode de console\nsérie est simple : \u003cbr\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evnconfig vnd0 floppy52.fs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emount /dev/vnd0c /mnt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emkdir /mnt/etc\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho set tty com0 \u0026gt; /mnt/etc/boot.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eumount /mnt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evnconfig -u vnd0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eAssurez-vous de choisir \u003ccode\u003eyes\u003c/code\u003e pour paramétrer \u003ccode\u003ecom0\u003c/code\u003e en tant que console série.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eNOTE : L\u0026rsquo;arrêt d\u0026rsquo;OpenBSD fonctionne avec QEMU, ce qui provoque effectivement\nla sortie de QEMU. C\u0026rsquo;est une bonne chose, car il n\u0026rsquo;est actuellement pas\npossible de définir le périphérique de blocage à partir duquel QEMU est\ndémarré au moment de l\u0026rsquo;exécution. Par conséquent, si vous démarrez une\ninstallation à partir d\u0026rsquo;un CD-ROM, vous démarrerez toujours à partir d\u0026rsquo;un\nCD-ROM chaque fois que vous redémarrerez cette session QEMU jusqu\u0026rsquo;à ce\nque vous quittiez et redémarriez QEMU à partir du disque dur virtuel.\u003c/div\u003e\n\n\u003ch3 id=\"gestion-du-service\"\u003eGestion du service\u003c/h3\u003e\n\u003cp\u003eParfois, vous voulez que QEMU démarre en tant que script système.\u003c/p\u003e\n\u003cp\u003eEn plus des options ci-dessus, l\u0026rsquo;option \u003ccode\u003e-daemonize\u003c/code\u003e est très pratique,\nde même que pour désigner \u003ccode\u003etelnet:\u003c/code\u003e pour \u003ccode\u003e-serial\u003c/code\u003e et \u003ccode\u003e-monitor\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ehddir\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/var/vm\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eUSER\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eqemu\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -x /usr/local/bin/qemu \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    echo -n \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Qemu: vmi386\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            ifconfig bridge101 add trunk101 add tap0 up\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            sh -c \u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas -u \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                /usr/local/bin/qemu-system-i386 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -daemonize \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -nographic \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -net nic,vlan=0,macaddr=52:54:00:4e:62:8f \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -net tap,vlan=0,fd=3 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -m 128 \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -hda \u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$hddir\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/virtual.img \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -serial telnet:127.0.0.1:1080,server,nowait \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -monitor telnet:127.0.0.1:1081,server,nowait \\\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e                -no-fd-bootchk 3\u0026lt;\u0026gt;/dev/tap0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    echo \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eNOTE : cela présume que l\u0026rsquo;utilisateur \u003ccode\u003eqemu\u003c/code\u003e existe, créez-le ou paramétrez\n\u003ccode\u003eUSER=\u003c/code\u003e en lui donnant un utilisateur existant pour utiliser cet exemple.\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLire le fichier pkg-readme : \u003ccode\u003e/usr/local/share/doc/pkg-readmes/qemu\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement de manière collaborative cette documentation\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Virtualisation de système d'exploitations, grâce à qemu, sous OpenBSD",
            "tags": ["OpenBSD", "Virtualisation", "qemu"],
            "date_published": "2020-01-19T12:49:07+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:32cb4ea8-d26b-9ac0-da27-77fd2a1cd1e2",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/memcached/",
            "title": "memcached / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description memcached est un service de mise en cache d\u0026rsquo;objet mémoire flexible conçu pour alléger la charge des bases de données dans les applications Web dynamiques en stockant des objets en mémoire.\nInstallation Installez le paquet \u0026lsquo;\u0026lsquo;memcached\u0026rsquo;\u0026rsquo;.\nConfiguration Pour améliorer la \u0026ldquo;sécurité\u0026rdquo; du service :\nParamétrons le service memcached pour n\u0026rsquo;utiliser que l\u0026rsquo;utilisateur _memcached, l\u0026rsquo;interface locale, et interdire toute activité UDP :\n\u0026quot;-u _memcached -l 127.0.0.1 -U 0\u0026quot;\nDémarrons le service memcached.\nRègles PF Il est possible d\u0026rsquo;utiliser la règle PF suivante pour interdire toute connexion sur le port d\u0026rsquo;écoute du service de memcached :\nblock in log on egress proto tcp to egress port 11211 Documentation La principale documentation est le manpage :\n$ man memcached\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://www.memcached.org/\" rel=\"external\"\u003ememcached\u003c/a\u003e\u003c/strong\u003e est un service de mise en\ncache d\u0026rsquo;objet mémoire flexible conçu pour alléger la charge des bases de\ndonnées dans les applications Web dynamiques en stockant des objets en\nmémoire.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u0026lsquo;\u0026lsquo;memcached\u0026rsquo;\u0026rsquo;\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003ePour améliorer la \u0026ldquo;sécurité\u0026rdquo; du service :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#param%c3%a9trer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eParamétrons\u003c/a\u003e\n\nle service \u003ccode\u003ememcached\u003c/code\u003e pour n\u0026rsquo;utiliser que l\u0026rsquo;utilisateur \u003ccode\u003e_memcached\u003c/code\u003e,\nl\u0026rsquo;interface locale, et interdire toute activité UDP :\u003cbr\u003e\n\u003ccode\u003e\u0026quot;-u _memcached -l 127.0.0.1 -U 0\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eDémarrons le service\u003c/a\u003e\n \u003cstrong\u003ememcached\u003c/strong\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"règles-pf\"\u003eRègles PF\u003c/h3\u003e\n\u003cp\u003eIl est possible d\u0026rsquo;utiliser la règle PF suivante pour interdire toute\nconnexion sur le port d\u0026rsquo;écoute du service de memcached :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in log on egress proto tcp to egress port 11211\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eLa principale documentation est le manpage :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ man memcached\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "memcached, un service de cache mémoire pour base de données sous OpenBSD",
            "tags": ["OpenBSD", "memcached"],
            "date_published": "2020-01-19T12:30:03+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:e2a9bcf5-e921-27fc-6ff8-1faccdf01a24",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-depannage/",
            "title": "OpenBSD - Dépannage",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Horloge matérielle défectueuse InfoCe problème existait sous OpenBSD 6.3, 6.4.\nIl semble que cela soit corrigé depuis OpenBSD 6.6 !\nVotre clavier dysfonctionne et accentue de plusieurs fois la touche appuyée sans que vous désiriez la doubler.\nNe cherchez pas à modifier vos paramétrages clavier - ce n\u0026rsquo;est pas votre clavier qui pose problème en réalité !\nC\u0026rsquo;est l\u0026rsquo;horloge matérielle par défaut * tsc* qui dans certains cas pose ce problème - que votre architecture soit basée sur un CPU Intel ou AMD n\u0026rsquo;y change rien.\nIl est nécessaire de la changer pour choisir acpihpet0 :\nsysctl -w kern.timecounter.hardware=acpihpet0\nPour que le changement soit permanent, veuillez créer, avec des droits administrateurs, si ce n\u0026rsquo;est pas déjà fait, le fichier /etc/sysctl.conf\npour y ajouter kern.timecounter.hardware=acpihpet0.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"horloge-matérielle-défectueuse\"\u003eHorloge matérielle défectueuse\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eCe problème existait sous OpenBSD 6.3, 6.4.\u003c/p\u003e\n\u003cp\u003eIl semble que cela soit corrigé depuis OpenBSD 6.6 !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eVotre clavier dysfonctionne et accentue de plusieurs fois la touche\nappuyée sans que vous désiriez la doubler.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eNe cherchez pas à modifier vos paramétrages clavier - ce n\u0026rsquo;est pas\nvotre clavier qui pose problème en réalité !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est l\u0026rsquo;horloge matérielle par défaut * tsc*  qui dans certains cas pose\nce problème - que votre architecture soit basée sur un CPU Intel ou AMD\nn\u0026rsquo;y change rien.\u003c/p\u003e\n\u003cp\u003eIl est nécessaire de la changer pour choisir \u003ccode\u003eacpihpet0\u003c/code\u003e  :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003esysctl -w kern.timecounter.hardware=acpihpet0\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour que le changement soit permanent, veuillez créer, avec des droits\nadministrateurs, si ce n\u0026rsquo;est pas déjà fait, le fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e\u003cbr\u003e\npour y ajouter \u003ccode\u003ekern.timecounter.hardware=acpihpet0\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour se dépanner sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Dépannage"],
            "date_published": "2020-01-19T08:07:13+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:8cd3b8fd-1954-75dd-bb0a-8053260d7a0d",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-wifi/",
            "title": "Gestion du Wifi / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Configuration Créez un fichier /etc/hostname.interface - où interface est le nom de l\u0026rsquo;interface réseau - et remplissez-le avec les informations suivantes.\nExemple de fichier /etc/hostname.rtwn0 :\nOpenBSD ≥ 6.9 Depuis OpenBSD 6.9, le démon dhcpleased(8) est apparu, pour gérer le protocole dhcpd sur les stations clientes.\nUtiliser la configuration autoconf plutôt que dhcp, tel que pour l\u0026rsquo;exemple :\nnwid nom_du_point_d_acces wpakey cle_wpa_impossible_à_deviner inet autoconf inet6 autoconf Selon le manpage hostname.if(5) actuel, le terme dhcp est/devient l\u0026rsquo;abbréviation de la commande inet autoconf.\nOpenBSD ≥ 6.4 Conformément au changement de syntaxe et recommandation faites depuis OpenBSD 6.4, le mot clé wpakey doit être sur la même ligne que le mot clé nwid ou join.\nnwid nom_du_point_d_acces wpakey cle_wpa_impossible_à_deviner dhcp OpenBSD ≤ 6.3 nwid nom_du_point_d_acces wpa-key cle_wpa_impossible_à_deviner dhcp Empêcher la déconnexion Ajouter à votre fichier de configuration, le flag : nwflag stayauth\nTrouver un AP Pour (re?)trouver votre point d’accès, exécutez : # ifconfig rtwn0 scan\nExemples Retrouvez ci-dessous des exemples de configuration - à adapter à vos besoins !\nAutoriser un utilisateur à manipuler une carte wifi pour se connecter Pour trouver et me connecter facilement aux différents réseaux wifi, je me suis créé un petit script.\nIl est rudimentaire et peut être amélioré mais il fonctionne :)\n$ vi /usr/local/bin/wifiup #!/bin/sh # On réveille la carte : ifconfig iwn0 up # On scanne les réseaux pour trouver leur identifiant : ifconfig iwn0 scan | grep -i nwid # Choix du réseau : echo \u0026#34;A quel réseau se connecter ?\u0026#34; read _NWID echo \u0026#34;\\nPhrase de passe ?\u0026#34; # Attention, la phrase de passe apparaît en clair l\u0026#39;écran : read _PASS # Connexion au réseau utilisant une clé WPA (qui utilise encore du WEP ?) : ifconfig iwn0 nwid \u0026#34;$_NWID\u0026#34; wpakey \u0026#34;$_PASS\u0026#34; # Abtention d\u0026#39;une adresse IP : dhclient iwn0 Pour que ce script puisse être lancé en simple utilisateur, ajouter l\u0026rsquo;entrée suivante dans /etc/doas.conf :\npermit nopass $USER as root cmd /usr/local/bin/wifiup Bien entendu, changez \u0026ldquo;$USER\u0026rdquo; par votre login.\nPour lancer le script, il suffit de lancer :\n# /usr/local/bin/wifiup Et vite s\u0026rsquo;en faire un alias pour plus de confort ! :)\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eCréez un fichier \u003ccode\u003e/etc/hostname.interface\u003c/code\u003e - \u003cem\u003eoù \u003ccode\u003einterface\u003c/code\u003e est le nom\nde l\u0026rsquo;interface réseau\u003c/em\u003e - et remplissez-le avec les informations suivantes.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eExemple de fichier \u003ccode\u003e/etc/hostname.rtwn0\u003c/code\u003e :\u003c/p\u003e\n\u003ch3 id=\"openbsd--69\"\u003eOpenBSD ≥ 6.9\u003c/h3\u003e\n\u003cp\u003eDepuis OpenBSD 6.9, le démon \u003ca href=\"https://man.openbsd.org/dhcpleased\" rel=\"external\"\u003edhcpleased(8)\u003c/a\u003e\nest apparu, pour gérer le protocole dhcpd sur les stations clientes.\u003c/p\u003e\n\u003cp\u003eUtiliser la configuration \u003ccode\u003eautoconf\u003c/code\u003e plutôt que \u003ccode\u003edhcp\u003c/code\u003e, tel que pour\nl\u0026rsquo;exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003enwid nom_du_point_d_acces wpakey cle_wpa_impossible_à_deviner\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einet autoconf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einet6 autoconf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSelon le manpage \u003ca href=\"https://man.openbsd.org/hostname.if.5#DYNAMIC_ADDRESS_CONFIGURATION\" rel=\"external\"\u003ehostname.if(5)\u003c/a\u003e\nactuel, le terme \u003ccode\u003edhcp\u003c/code\u003e est/devient l\u0026rsquo;abbréviation de la commande\n\u003ccode\u003einet autoconf\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"openbsd--64\"\u003eOpenBSD ≥ 6.4\u003c/h3\u003e\n\u003cp\u003eConformément au \u003ca href=\"https://www.openbsd.org/faq/upgrade64.html#ConfigChanges\" rel=\"external\"\u003echangement de syntaxe et recommandation faites depuis OpenBSD 6.4\u003c/a\u003e,\nle mot clé \u003ccode\u003ewpakey\u003c/code\u003e doit être sur la même ligne que le mot clé \u003ccode\u003enwid\u003c/code\u003e ou\n\u003ccode\u003ejoin\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003enwid nom_du_point_d_acces wpakey cle_wpa_impossible_à_deviner\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edhcp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"openbsd--63\"\u003eOpenBSD ≤ 6.3\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003enwid nom_du_point_d_acces\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ewpa-key cle_wpa_impossible_à_deviner\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003edhcp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"empêcher-la-déconnexion\"\u003eEmpêcher la déconnexion\u003c/h3\u003e\n\u003cp\u003eAjouter à votre fichier de configuration, le flag : \u003ccode\u003enwflag stayauth\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"trouver-un-ap\"\u003eTrouver un AP\u003c/h2\u003e\n\u003cp\u003ePour (re?)trouver votre point d’accès, exécutez : \u003cbr\u003e\n\u003ccode\u003e# ifconfig rtwn0 scan\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003eRetrouvez ci-dessous des exemples de configuration - \u003cstrong\u003eà adapter à vos besoins\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"autoriser-un-utilisateur-à-manipuler-une-carte-wifi-pour-se-connecter\"\u003eAutoriser un utilisateur à manipuler une carte wifi pour se connecter\u003c/h3\u003e\n\u003cp\u003ePour trouver et me connecter facilement aux différents réseaux wifi,\nje me suis créé un petit script.\u003c/p\u003e\n\u003cp\u003eIl est rudimentaire et peut être amélioré mais il fonctionne :)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ vi /usr/local/bin/wifiup\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# On réveille la carte :\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifconfig iwn0 up\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# On scanne les réseaux pour trouver leur identifiant :\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifconfig iwn0 scan | grep -i nwid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Choix du réseau :\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#48b685\"\u003e\u0026#34;A quel réseau se connecter ?\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eread _NWID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eecho \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\\nPhrase de passe ?\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Attention, la phrase de passe apparaît en clair l\u0026#39;écran :\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eread _PASS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Connexion au réseau utilisant une clé WPA (qui utilise encore du WEP ?) :\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifconfig iwn0 nwid \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$_NWID\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e wpakey \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$_PASS\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Abtention d\u0026#39;une adresse IP :\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edhclient iwn0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour que ce script puisse être lancé en simple utilisateur, ajouter\nl\u0026rsquo;entrée suivante dans \u003ccode\u003e/etc/doas.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epermit nopass $USER as root cmd /usr/local/bin/wifiup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eBien entendu, changez \u0026ldquo;$USER\u0026rdquo; par votre login.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003ePour lancer le script, il suffit de lancer :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# /usr/local/bin/wifiup\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eEt vite s\u0026rsquo;en faire un alias pour plus de confort\u003c/em\u003e ! :)\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuce pour gérer le Wifi sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Wifi"],
            "date_published": "2020-01-19T07:39:11+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:9fb05996-0a18-1bdd-1b09-1186734f5e7b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-webcam/",
            "title": "Webcam / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Activer l\u0026rsquo;enregistrement vidéo En premier lieu, il vous faut activer la vidéo .\nVérifier le support Sous OpenBSD, la webcam est souvent identifiée par /dev/video0.\nAfin de vérifier que votre webcam est reconnue, utilisez usbdevs :\n$ usbdevs -v Controller /dev/usb0: (…) port 6 addr 4: high speed, power 200 mA, config 1, Integrated Camera(0xb221), Chicony Electronics Co., Ltd.(0x04f2), rev 7.52 (…) Ou encore dmesg :\n$ dmesg | grep video0 (…) uvideo0 at uhub3 port 6 configuration 1 interface 0 \u0026#34;Chicony Electronics Co., Ltd. Integrated Camera\u0026#34; rev 2.00/7.52 addr 4 Accès à la webcam Afin que le logiciel que vous préférez puisse accéder à la webcam sans les droits administrateurs, il faut modifier les droits d\u0026rsquo;écriture sur /dev/video0.\nCela consiste à vous déclarer propriétaire de /dev/video0 :\n$ doas chown votre_nom_d_utilisateur /dev/video0\nInfoNote : Si plusieurs utilisateurs utilisent l\u0026rsquo;ordinateur, il faudra insérer cette commande au lancement de la session. Si le gestionnaire de connexion est xenodm , ça sera dans le fichier /etc/X11/xenodm/TakeConsole ou /etc/X11/xenodm/Xstartup.\nDésignez dans ce cas le nom d\u0026rsquo;utilisateur avec $USER.\nAstuceL\u0026rsquo;astuce est de modifier votre fichier .xsession, tel que :\nif [ -c /dev/video0 ]; then doas chown $USER /dev/video0; fi\nParamétrages Le contrôle des paramètres de la webcam se fait avec la commande video(1), tel que :\n$ video -c\nPar exemple, le paramétrage de la luminosité ainsi :\nvideo brightness=200 brightness: 128 -\u0026gt; 200 Exemples mpv Pour afficher en direct ce que votre caméra filme avec mpv :\n$ mpv av://v4l2:/dev/video0\nfswebcam Lire la page fswebcam .\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"activer-lenregistrement-vidéo\"\u003eActiver l\u0026rsquo;enregistrement vidéo\u003c/h2\u003e\n\u003cp\u003eEn premier lieu, il vous faut activer la \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-video/\" title=\"Lien interne vers l\u0026#39;article : 'Gérer la vidéo sous OpenBSD'\"\u003evidéo\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch2 id=\"vérifier-le-support\"\u003eVérifier le support\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD, la webcam est souvent identifiée par \u003ccode\u003e/dev/video0\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAfin de vérifier que votre webcam est reconnue, utilisez \u003ccode\u003eusbdevs\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ usbdevs -v\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eController /dev/usb0:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  port \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e addr 4: high speed, power \u003cspan style=\"color:#f99b15\"\u003e200\u003c/span\u003e mA, config 1, Integrated Camera\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0xb221\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, Chicony Electronics Co., Ltd.\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e0x04f2\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e, rev 7.52\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOu encore dmesg :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ dmesg | grep video0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euvideo0 at uhub3 port \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e configuration \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e interface \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Chicony Electronics Co., Ltd. Integrated Camera\u0026#34;\u003c/span\u003e rev 2.00/7.52 addr \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"accès-à-la-webcam\"\u003eAccès à la webcam\u003c/h2\u003e\n\u003cp\u003eAfin que le logiciel que vous préférez puisse accéder à la webcam sans\nles droits administrateurs, il faut modifier les droits d\u0026rsquo;écriture sur\n\u003ccode\u003e/dev/video0\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCela consiste à vous déclarer propriétaire de \u003ccode\u003e/dev/video0\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ doas chown votre_nom_d_utilisateur /dev/video0\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eNote : Si plusieurs utilisateurs utilisent l\u0026rsquo;ordinateur, il faudra\ninsérer cette commande au lancement de la session. Si le gestionnaire de\nconnexion est \u003ca class=\"inside\" href=\"/fr/sys/openbsd/xenodm/\" title=\"Lien interne vers l\u0026#39;article : 'xenodm : Gestionnaire de sessions X pour OpenBSD'\"\u003exenodm\u003c/a\u003e\n, ça sera\ndans le fichier \u003ccode\u003e/etc/X11/xenodm/TakeConsole\u003c/code\u003e ou \u003ccode\u003e/etc/X11/xenodm/Xstartup\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDésignez dans ce cas le nom d\u0026rsquo;utilisateur avec \u003ccode\u003e$USER\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eL\u0026rsquo;astuce est de modifier votre fichier \u003ccode\u003e.xsession\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eif [ -c /dev/video0 ]; then doas chown $USER /dev/video0; fi\u003c/code\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch2 id=\"paramétrages\"\u003eParamétrages\u003c/h2\u003e\n\u003cp\u003eLe contrôle des paramètres de la webcam se fait avec la commande\n\u003ccode\u003evideo(1)\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ video -c\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePar exemple, le paramétrage de la luminosité ainsi :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evideo \u003cspan style=\"color:#ef6155\"\u003ebrightness\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ebrightness: \u003cspan style=\"color:#f99b15\"\u003e128\u003c/span\u003e -\u0026gt; \u003cspan style=\"color:#f99b15\"\u003e200\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003ch3 id=\"mpv\"\u003empv\u003c/h3\u003e\n\u003cp\u003ePour afficher en direct ce que votre caméra filme avec mpv :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ mpv av://v4l2:/dev/video0\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"fswebcam\"\u003efswebcam\u003c/h3\u003e\n\u003cp\u003eLire la page \u003ca class=\"inside\" href=\"/fr/sys/openbsd/fswebcam/\" title=\"Lien interne vers l\u0026#39;article : 'fswebcam / OpenBSD'\"\u003efswebcam\u003c/a\u003e\n.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces de gestion de webcam sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Webcam", "Audio", "Video"],
            "date_published": "2020-01-19T07:29:50+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:fa34c0ca-bbae-bf41-f027-15fafb04300e",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-usb/",
            "title": "Gestion des clés USB / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Monter \u0026ldquo;automatiquement\u0026rdquo; Lisez notre page de configuration système : [[tutoriel:openbsd-mount-usb]]\nMonter \u0026ldquo;manuellement\u0026rdquo; Merci de lire le chapitre notre page : [[tutoriel:openbsd-mount-usb#methode-manuelle]]\nFormatage Pour formater une clé USB, de même que tout type de disque dur, on utilisera la commande newfs(8).\nLes types de formats de fichiers suivants sont supportés :\ncd9660 ext2fs ffs mfs msdos nfs ntfs swap tmpfs udf vnd Ce sont ceux pris en charge par fstab(5).\nIl y a deux manières de s\u0026rsquo;y prendre :\nnewfs -t *type* device où type est le type de format, parmi ceux sus-cités newfs_*type* device newfs est une commande suffisamment intelligente, qui lorsqu\u0026rsquo;elle est écrite avec l\u0026rsquo;option -t redirige vers l\u0026rsquo;équivalente de la seconde écriture.\nExemple : FAT32 Après avoir utilisé dmesg pour identifier notre périphérique comme expliqué ici, nous allons utiliser la commande newfs_msdos pour formater une clé USB en FAT32 :\nAdmettons que la clé soit remontée en tant que /dev/sd2 et qu\u0026rsquo;une partition soit présente dessus.\n# newfs_msdos -F 32 /dev/rsd2a Une fois formatée, la partition apparaîtra en tant que /dev/sd2i et pourra être montée et utilisée.\nNorme FIDO/U2F Les clés USB de sécurité, à la norme FIDO/U2F, sont utilisables depuis OpenBSD 6.7, grâce au pilote fido(4).\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"monter-automatiquement\"\u003eMonter \u0026ldquo;automatiquement\u0026rdquo;\u003c/h2\u003e\n\u003cp\u003eLisez notre page de configuration système : \u003cstrong\u003e[[tutoriel:openbsd-mount-usb]]\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"monter-manuellement\"\u003eMonter \u0026ldquo;manuellement\u0026rdquo;\u003c/h2\u003e\n\u003cp\u003eMerci de lire le chapitre notre page : [[tutoriel:openbsd-mount-usb#methode-manuelle]]\u003c/p\u003e\n\u003ch2 id=\"formatage\"\u003eFormatage\u003c/h2\u003e\n\u003cp\u003ePour formater une clé USB, de même que tout type de disque dur, on\nutilisera la commande \u003ca href=\"https://man.openbsd.org/newfs.8\" rel=\"external\"\u003e\u003ccode\u003enewfs\u003c/code\u003e(8)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eLes types de formats de fichiers suivants sont supportés :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecd9660\u003c/li\u003e\n\u003cli\u003eext2fs\u003c/li\u003e\n\u003cli\u003effs\u003c/li\u003e\n\u003cli\u003emfs\u003c/li\u003e\n\u003cli\u003emsdos\u003c/li\u003e\n\u003cli\u003enfs\u003c/li\u003e\n\u003cli\u003entfs\u003c/li\u003e\n\u003cli\u003eswap\u003c/li\u003e\n\u003cli\u003etmpfs\u003c/li\u003e\n\u003cli\u003eudf\u003c/li\u003e\n\u003cli\u003evnd\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCe sont ceux pris en charge par \u003ca href=\"https://man.openbsd.org/fstab.5\" rel=\"external\"\u003efstab(5)\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIl y a deux manières de s\u0026rsquo;y prendre :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enewfs -t *type* device\u003c/code\u003e où type est le type de format, parmi ceux sus-cités\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003enewfs_*type* device\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003enewfs\u003c/code\u003e est une commande suffisamment intelligente, qui lorsqu\u0026rsquo;elle est\nécrite avec l\u0026rsquo;option \u003ccode\u003e-t\u003c/code\u003e redirige vers l\u0026rsquo;équivalente de la seconde\nécriture.\u003c/p\u003e\n\u003ch3 id=\"exemple--fat32\"\u003eExemple : FAT32\u003c/h3\u003e\n\u003cp\u003eAprès avoir utilisé \u003ccode\u003edmesg\u003c/code\u003e pour identifier notre périphérique comme\nexpliqué ici, nous allons utiliser la commande \u003ccode\u003enewfs_msdos\u003c/code\u003e pour\nformater une clé USB en FAT32 :\u003c/p\u003e\n\u003cp\u003eAdmettons que la clé soit remontée en tant que \u003ccode\u003e/dev/sd2\u003c/code\u003e et qu\u0026rsquo;une\npartition soit présente dessus.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# newfs_msdos -F 32 /dev/rsd2a\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUne fois formatée, la partition apparaîtra en tant que \u003ccode\u003e/dev/sd2i\u003c/code\u003e et\npourra être montée et utilisée.\u003c/p\u003e\n\u003ch2 id=\"norme-fidou2f\"\u003eNorme FIDO/U2F\u003c/h2\u003e\n\u003cp\u003eLes clés USB de sécurité, à la norme FIDO/U2F, sont utilisables depuis\nOpenBSD 6.7, grâce au pilote \u003ca href=\"https://man.openbsd.org/fido.4\" rel=\"external\"\u003efido(4)\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour gérer différents formats de clés USB sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "USB"],
            "date_published": "2020-01-19T07:20:03+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:d19ae734-1c4c-a851-f551-2fd50084cdd7",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-python/",
            "title": "Python : Gestion de l'environnement / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Python fait partie du système de base d\u0026rsquo;OpenBSD.\nERROR: The executable $HOME/(\u0026hellip;)/python3 could not be run: [Errno 13] Permission denied: Cette erreur est générée par le fait de la protection mémoire W^X !\nDeux manières de résoudre le problème :\nModifications système Pour remédier à la situation, nous allons modifier légèrement votre $HOME et /usr/local, avec les droits administrateurs.\nCréation des répertoires nécessaires dans /usr/local, Attribution des droits utilisateurs nécessaires, et, lien symbolique # mkdir -p /usr/local/${my_user}/python # chown -R ${my_user}:wheel /usr/local/${my_user} # ln -s /usr/local/${my_user}/python $home/python … où ${my_user} représente votre identifiant utilisateur.\npipenv Pour l\u0026rsquo;utilitaire pipenv, il faut modifier ceci aussi :\n$ mkdir /usr/local/$USER/python/virtualenvs $ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs Option wxallowed DangerPrenez conscience qu\u0026rsquo;utiliser cette possibilité aura pour conséquence de permettre l\u0026rsquo;exécution de binaire potentiellement dangereux depuis votre $HOME.\nMieux vaut éviter !\nIl est possible d\u0026rsquo;ajouter l\u0026rsquo;option de montage wxallowed à votre partition $HOME si vous l\u0026rsquo;avez créée.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePython fait partie du système de base d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"error-the-executable-homepython3-could-not-be-run-errno-13-permission-denied\"\u003eERROR: The executable $HOME/(\u0026hellip;)/python3 could not be run: [Errno 13] Permission denied:\u003c/h2\u003e\n\u003cp\u003eCette erreur est générée par le fait de la protection mémoire W^X !\u003c/p\u003e\n\u003cp\u003eDeux manières de résoudre le problème :\u003c/p\u003e\n\u003ch3 id=\"modifications-système\"\u003eModifications système\u003c/h3\u003e\n\u003cp\u003ePour remédier à la situation, nous allons modifier légèrement votre\n\u003ccode\u003e$HOME\u003c/code\u003e et \u003ccode\u003e/usr/local\u003c/code\u003e, avec les droits administrateurs.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCréation des répertoires nécessaires dans \u003ccode\u003e/usr/local\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eAttribution des droits utilisateurs nécessaires,\u003c/li\u003e\n\u003cli\u003eet, lien symbolique\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# mkdir -p /usr/local/${my_user}/python\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# chown -R ${my_user}:wheel /usr/local/${my_user}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ln -s /usr/local/${my_user}/python $home/python\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e… où \u003ccode\u003e${my_user}\u003c/code\u003e représente votre identifiant utilisateur.\u003c/p\u003e\n\u003ch4 id=\"pipenv\"\u003epipenv\u003c/h4\u003e\n\u003cp\u003ePour l\u0026rsquo;utilitaire \u003ca href=\"https://docs.pipenv.org/en/latest/\" rel=\"external\"\u003e\u003ccode\u003epipenv\u003c/code\u003e\u003c/a\u003e, il\nfaut modifier ceci aussi :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ mkdir /usr/local/\u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e/python/virtualenvs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ln -s /usr/local/\u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e/python/virtualenvs \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/.local/share/virtualenvs\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"option-wxallowed\"\u003eOption wxallowed\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cp\u003ePrenez conscience qu\u0026rsquo;utiliser cette possibilité aura pour conséquence de\npermettre l\u0026rsquo;exécution de binaire potentiellement dangereux depuis votre\n\u003ccode\u003e$HOME\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMieux vaut éviter\u003c/strong\u003e !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl est possible d\u0026rsquo;ajouter l\u0026rsquo;option de montage \u003ccode\u003ewxallowed\u003c/code\u003e à votre\npartition $HOME si vous l\u0026rsquo;avez créée.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour la gestion de l'environnement de Python sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Python"],
            "date_published": "2020-01-19T06:53:27+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:62917530-7387-aa59-80a6-5a4572e07102",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-themes/",
            "title": "Thèmes ; Polices ; Émoticônes / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Installer polices et émojis # for file in $(pkg_info -Q fonts | grep -v installed); do pkg_add $file; done Installer thèmes d\u0026rsquo;icônes # for file in $(pkg_info -Q icon-theme | grep -v installed); do pkg_add $file; done Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"installer-polices-et-émojis\"\u003eInstaller polices et émojis\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# for file in $(pkg_info -Q fonts | grep -v installed); do pkg_add $file; done\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"installer-thèmes-dicônes\"\u003eInstaller thèmes d\u0026rsquo;icônes\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# for file in $(pkg_info -Q icon-theme | grep -v installed); do pkg_add $file; done\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuce de gestion de thèmes sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Themes"],
            "date_published": "2020-01-19T06:37:13+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:c7b6ea5b-424a-89b3-0786-8631c12471c0",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/pf/",
            "title": "PF : Packet Filter",
            "author": { "name": "Stéphane HUC" },
            "content_text": "PF : Packet Filter Cette documentation traitera de l\u0026rsquo;usage du gestionnaire de filtrage \u0026ldquo;pare-feu\u0026rdquo; nommé PF…\nL\u0026rsquo;outil pfctl permet de contrôler l\u0026rsquo;état du parefeu.\nLe fichier /etc/pf.conf permet de gérer la configuration\nInstallation Par défaut, rien à installer par soi-même… il est inclus de base.\nDepuis la version 4.6 d\u0026rsquo;OpenBSD, il n\u0026rsquo;est plus nécessaire de l\u0026rsquo;activer, puisqu\u0026rsquo;il l\u0026rsquo;est par défaut.\nUtilisation Cette section traite de l\u0026rsquo;usage de l\u0026rsquo;outil pfctl :\nNote : L\u0026rsquo;usage de l\u0026rsquo;outil pfctl nécessite des droits administrateur… pensez-y !\nQuelques informations à-propos des options de pfctl :\nl\u0026rsquo;option -d : arrête le parefeu l\u0026rsquo;option -e : activer, vérifier l\u0026rsquo;état de pf l\u0026rsquo;option -ef : activer le parefeu tout en ciblant le fichier de configuration, tel que : -ef /etc/pf.conf l\u0026rsquo;option -f : permet de recharger les nouvelles règles à partir du fichier. l\u0026rsquo;option -F : permet de vider toutes les règles et autres tables du parefeu l\u0026rsquo;option -nf : permet de vérifier les règles écrites dans un fichier, sans les charger. l\u0026rsquo;option -r : permet de faire du reverse dns l\u0026rsquo;option -s : afficher les informations d\u0026rsquo;état… voir plus bas, pour plus d\u0026rsquo;infos. l\u0026rsquo;option -t : spécifie une action précise sur une table particulière, tel que : -t \u0026lt;table_nom\u0026gt; -T command adr_ip l\u0026rsquo;option -v : est le mode verbeux De plus amples informations dans le manpage correspondant !\nConfiguration Le fichier de configuration principal du pare-feu PF se nomme : /etc/pf.conf\nIl est possible de créer des sous-fichiers de configuration qui seront appelés par la directive : include /etc/pf/filename.conf\nLe fichier de configuration est décomposé en plusieurs sections :\ndéclarations de listes, macros, tables - de préférence - absolument en premier gestion de la bande passante - au besoin, en suivant déclaration des règles bloquantes, et/ou filtrantes - absolument en dernier De plus amples informations dans le manpage correspondant !\nGestion des listes Les listes définissent des critères multiples similaires, tels que les noms de ports, des numéros de protocoles, plusieurs adresses IP, etc.\nLes listes sont définies en spécifiant les items par l\u0026rsquo;usage des crochets { }, chaque item pouvant être séparé soit par un espace, soit par une virgule.\nblock out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any\nUne liste peut contenir une autre liste imbriquée.\nLà où les listes se trouvent limiter en usage, les macros prennent facilement le relais\nGestion des macros Les macros sont l\u0026rsquo;équivalent de variables dans les langages informatiques.\nElles définissent une valeur ou un ensemble de valeurs… celles-ci peuvent être une ou plusieurs interfaces réseaux, une ou plusieurs adresses ip, un ou plusieurs numéros de ports, etc… voire une partie d\u0026rsquo;écriture de règles.\nLes macros peuvent contenir des listes, d\u0026rsquo;autres macros.\n⇒ Définition :\nLes noms de ces macros doivent ABSOLUMENT commencer par une lettre, un chiffre ou le symbole _. Il est interdit d\u0026rsquo;utiliser des mots réservés, tels que : pass, in, out… Ces macros, une fois définies, sont utilisées dans le contexte des règles.\n⇒ Exemple :\niface = \u0026#34;em0\u0026#34; http_ports = \u0026#34;{ 80 443 }\u0026#34; pre = \u0026#34;pass in quick on ep0 inet proto tcp from \u0026#34; post = \u0026#34;to any port { 80, 6667 }\u0026#34; Pour plus d\u0026rsquo;informations, lire : https://www.openbsd.org/faq/pf/shortcuts.html#macros\nGestion des tables Les tables sont une collection d\u0026rsquo;adresses et/ou de réseaux.\nC\u0026rsquo;est une manière très efficace et puissante de gérer un ensemble d\u0026rsquo;informations, consommant moins de ressources processeur et mémoire.\nÀ privilégier, plutôt qu\u0026rsquo;une liste de macros, dès que vous voulez gérer un ensemble d\u0026rsquo;adresses ip !\n⇒ Définition :\nTout comme pour les macros, les noms réservés ne DOIVENT pas être utilisés ! Une table initialisée avec une liste vide { } sera purgée, lors du chargement… Elles peuvent être définies en étant suivies d\u0026rsquo;un de ces trois attributs : const, counters, ou persist ⇒ Drapeaux :\nconst : empêche que la table soit ultérieurement altérée, une fois chargée. counter : active le compte des bits et autres paquets par adresse ip. persist : force le noyau à garder la table, même si aucune règle se réfère à elle. Ce drapeau permet l\u0026rsquo;ajout ultérieur d\u0026rsquo;informations… ⇒ Exemple :\niface = \u0026#34;axe0\u0026#34; table \u0026lt;private\u0026gt; const { 10/8, 172.16/12, 192.168/16 } table \u0026lt;badips\u0026gt; persist block on $iface from { \u0026lt;private\u0026gt;, \u0026lt;badips\u0026gt; } to any # pfctl -t badips -T add 204.92.77.111 Note : Une table peut être gérée par un ou plusieurs fichiers, qui seront une liste d\u0026rsquo;adresses ip ou de noms de machines. Une ligne commençant par le symbole dièse \u0026lsquo;#\u0026rsquo; est considérée comme un commentaire et sera ignorée.\ntable \u0026lt;spam\u0026gt; persist file \u0026#34;/dir/filename1\u0026#34; block on fxp0 from \u0026lt;spam\u0026gt; to any Gestion des ancres Les ancres sont un ensemble de règles, qui peuvent être manipulées de manière dynamique.\nElles sont au jeu de règles, ce que les tables sont à la gestion dynamique des adresses ip ou réseaux.\nUne ancre est une collection de règles… de tables… voire même d\u0026rsquo;ancres.\nAttention : Pour nommer une ancre, veillez à ne pas utiliser un nom déjà défini auparavant, même s\u0026rsquo;il définit une table. L\u0026rsquo;outil pfctl vous avertira, sinon, d\u0026rsquo;une collision de noms dans l\u0026rsquo;espace global de noms… à juste titre !\n⇒ Utilisation :\nanchor nom_ancre { jeu de règles } L\u0026rsquo;ajout dynamique à la main peut se faire ainsi :\n# echo \u0026quot;pass in proto tcp from 192.0.2.3 to any port 22\u0026quot; | pfctl -a nom_ancre -f -\nElles peuvent aussi être écrite dans un fichier, qui aura soit un jeu de règles définies, et/ou pourra être géré dynamiquement, tel que :\nancre nom_ancre load nom_ancre from \u0026#34;/etc/pf/fichier_ancre\u0026#34; Pour de plus amples informations, lire : https://www.openbsd.org/faq/pf/anchors.html\nGestion de la bande passante Les paquets peuvent être assignés à une ou plusieurs queues, afin de gérer la bande passante.\nIl faut définir au moins une queue pour la configurer, et ensuite créer des règles qui feront référence à la queue par son nom. Si une queue appelée n\u0026rsquo;existe pas pour une interface réseau, c\u0026rsquo;est la queue par défaut qui sera utilisée.\nIl DOIT y avoir une queue maître, qui fait référence spécifiquement à une interface réseau. Les autres queues, appelées enfants, sont créées relativement à la queue maître.\n⇒ Exemple :\niface = \u0026#34;em0\u0026#34; queue rq on $iface bandwidth 100M queue ssh parent rq bandwidth 10M queue http parent rq bandwidth 80M queue std parent rq bandwidth 10M default block return out on $iface inet all set queue std ⇒ Définition des mots clés réservés :\ndefault : spécifie la queue par défaut on : spécifie une interface réseau parent : attache une queue à une queue maître qlimit : définit le nombre maximum de paquets capturés dans une queue. Par défault : 50 ⇒ Définition de valeurs de bande passante :\nLes valeurs de bande passante DOIVENT absolument être des entiers ; ces valeurs peuvent être suffixées des lettres suivantes K, M, ou G, qui respectivement représentent le nombre de bits par secondes gérés, tels que Kilobits, Megabits, ou Gigabits.\nCes valeurs ne doivent pas dépasser la taille de la bande passante allouée à une interface réseau !\n⇒ Attributs possibles :\nmax : spécifie la limite maximale de bande passante allouée à une queue min : cible la taille minimale, réservée, de bande passante à une queue donnée burst : est un attribut qui permet à une bande passante d\u0026rsquo;être outrepassée dans un laps de temps donnée, pour une queue précise ⇒ Exemples :\nqueue ssh parent std bandwidth 10M, min 5M, max 25M queue ssh parent std bandwidth 10M burst 90M for 100ms Gestion des règles La première des règles la plus basique, et sécuritaire est celle de tout bloquer :\nblock\nRègles de syntaxe Il existe des règles de grammaire et de simplifications d\u0026rsquo;écriture des règles PF.\nRègles \u0026ldquo;block\u0026rdquo; ⇒ Cela ne sert à rien d\u0026rsquo;écrire ce qui suit :\nblock in all block out all Ni :\nblock all\nÉcrire block suffit !\n⇒ De même, il ne sert à rien de spécifier :\nblock drop\nou :\nblock return\n⇒ Sauf à utiliser ces mots-clés, dans le contexte de certaines règles PF, spécifier la politique de rejet, puis utiliser juste le mot clé block, tel que :\nset block-policy return block Autres règles L\u0026rsquo;usage du mot clé reservé all ou de l\u0026rsquo;expression réservé from any to any ne servent à rien non plus. Ce sont des règles implicites, par défaut !\nPour plus d\u0026rsquo;informations, lire : https://www.openbsd.org/faq/pf/shortcuts.html#grammar\nRecommandations Suivi de connexions Le mot clé keep state permet de gérer le suivi de connexion des flux sur les protocoles TCP, UDP et/ou ICMP. Ce mot clé permet de gérer les messages ICMP relatifs à la régulation du trafic, tel que les messages \u0026ldquo;source quench\u0026rdquo;, de fait il n\u0026rsquo;y a pas besoin de créer de règles spécifiques.\nTCP Pour s\u0026rsquo;assurer de n\u0026rsquo;autoriser QUE les nouvelles connexions, ou plutôt l\u0026rsquo;initiation de nouvelles connexions, on utilisera seulement les drapeaux S/SA - SYN sans ACK -… le suivi de connexion gérera le reste correctement.\n⇒ Exemple :\npass in on em0 proto tcp flags S/SA keep state\nNote : c\u0026rsquo;est une bonne habitude à prendre de gérer l\u0026rsquo;état de connexion à partir de nouvelles initialisation !\nVeuillez lire la page de la FAQ Filter pour mieux comprendre ce qu\u0026rsquo;est la notion de suivi d\u0026rsquo;états, la syntaxe des règles PF à-propos des états, les différentes options possibles, etc…\nInformations d\u0026rsquo;états Ainsi que vu plus haut, en début de page, c\u0026rsquo;est l\u0026rsquo;option -s qui permet d\u0026rsquo;obtenir différentes informations relatives aux états du pare-feu. Cette option utilise des drapeaux pour afficher différemment les informations.\n# pfctl -s flag\n⇒ Définition des drapeaux :\nVoir toutes les informations : -sa\nne pas confondre avec l\u0026rsquo;option pour voir les ancres ! info : affiche les statistiques globales\nversion abrégée : -si nat : affiche les informations de traduction d\u0026rsquo;adresses réseaux, de type nat, et rdr.\nrules : affiche les règles de filtrage chargées en mémoire - un peu, l\u0026rsquo;équivalent des options \u0026lsquo;-Lnv\u0026rsquo; à iptables\nversion abrégée : -sr state : affiche l\u0026rsquo;état des connexions ouvertes.\nversion abrégée : -ss Anchor : option -s Anchor, avec ou sans un \u0026rsquo;s\u0026rsquo; final, permet de connaître le nom des tables utilisées. Les ancres peuvent aussi être gérées en utilisant directement l\u0026rsquo;option -sa, ainsi que l\u0026rsquo;ajout d\u0026rsquo;un de ses drapeaux -f, -F, ou -s…\nLabel : option -s label, avec ou sans un \u0026rsquo;s\u0026rsquo; final, permet d\u0026rsquo;obtenir les informations liées à des labels.\nversion abrégée : -sl Queue : option -s queue\nversion abrégée : -sA - avec un A majuscule ; à ne pas confondre avec les ancres ! Table : option -s Tables, avec ou sans un \u0026rsquo;s\u0026rsquo; final, permet de connaître le nom des tables utilisées. Si une table est gérée par une ancre, il est possible de la contrôler en appelant d\u0026rsquo;abord l\u0026rsquo;ancre puis la table, telle que :\npfctl -a ancre -t table -T command…\nversion abrégée : -sT Note : Pensez à utiliser l\u0026rsquo;option -vs, voire -vvs qui permet d\u0026rsquo;avoir un état plus complet de l\u0026rsquo;information recherchée, si celui est possible.\nPour de plus amples informations, veuillez lire le manpage correspondant à l\u0026rsquo;outil \u0026lsquo;pfctl\u0026rsquo;…\nPF : Nombre maximum d\u0026rsquo;états Par défaut, PF gère un nombre maximal d\u0026rsquo;entrées dans sa table d\u0026rsquo;états qui est de 10 000.\nPour connaître le nombre d\u0026rsquo;entrées dans la table d\u0026rsquo;états, en cours : # pfctl -ss | wc -l\nSi et seulement si vous êtes proche de cette limite, vous pouvez agrandir le nombre d\u0026rsquo;entrées dans la table, en paramétrant votre fichier /etc/pf.conf, tel que : set limit states 20000\nExemples Ci-dessous, retrouvez un exemple basique de règles PF qui sont donnés pour le flux sur ipv4. Il faudra faire les modifications nécessaires pour ipv6 ;)\nPF pour station Version minimale block pass out all keep state Ces deux règles \u0026ldquo;disent\u0026rdquo; :\nrefusent tout le trafic entrant accepte le trafic sortant et relatif aux connexions. Version améliorée # $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $ # # See pf.conf(5) and /etc/examples/pf.conf table \u0026lt;t_bogons\u0026gt; persist file \u0026#34;/etc/pf_table_bogons\u0026#34; set block-policy return set optimization normal set reassemble yes set ruleset-optimization none set skip on lo antispoof for egress match in all scrub (max-mss 1440 no-df random-id reassemble tcp) block drop in quick on egress from { \u0026lt;t_bogons\u0026gt; } to any block drop out quick on egress from any to { \u0026lt;t_bogons\u0026gt; } # By default, do not permit remote connections to X11 block in on ! lo0 proto tcp to port 6000:6010 # Prevent dns leaks : best to use with unbound, dnscrypt-proxy block in log on egress inet proto { tcp udp } from any to ! egress port 53 block # block stateless traffic pass # establish keep-state ⇒ Quelques petites explications :\negress est un nom définissant toute(s) le(s) interface(s) réseau(x) correspondant à la ou le(s) route(s) par défaut, vers la ou le(s) passerelles. La règle antispoof est une mesure de protection dite \u0026rsquo;no spoofing\u0026rsquo;, afin que ne soit possible de lui \u0026ldquo;piquer\u0026rdquo; son ou ses adresses réseau(x). on charge une table contenant les segments réseaux appelés BOGON ne devant pas se trouver sur le net. Est supprimé tout trafic correspondant, sans aucun état d\u0026rsquo;âme, en entrée et en sortie. Le fichier /etc/pf_table_bogons est donné en exemple ci-dessous ! PF pour serveur Les deux versions basiques de règles PF sont exactement les mêmes - la deuxième utilise plus profondément les listes et macros pour ne pas avoir à réécrire certaines portions !\nVersion normale # $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $ # # See pf.conf(5) and /etc/examples/pf.conf # lists, macros auth_tcp_ports =\u0026#34;{ http ftp whois }\u0026#34; # ajouter imap, smtp, rsync ou autres flux TCP nécessaires en sortie auth_tcps_ports = \u0026#34;{ https }\u0026#34; # ajouter imaps, smtps ou autres flux TCP \u0026#34;secure\u0026#34; nécessaires en sortie auth_udp_ports = \u0026#34;{ domain }\u0026#34; # ajouter tout flux UDP nécessaire en sortie web_ports = \u0026#34;{ http https }\u0026#34; # modifier entrée services web table \u0026lt;t_bogons\u0026gt; persist file \u0026#34;/etc/pf_table_bogons\u0026#34; table \u0026lt;t_abuse_ssh\u0026gt; persist table \u0026lt;t_abuse_web\u0026gt; persist set block-policy return set optimization normal set reassemble yes set ruleset-optimization none set skip on lo antispoof for lo antispoof for egress #scrub in all fragment reassemble no-df max-mss 1440 \u0026lt;= old version; do not using-it! match in all scrub (max-mss 1440 no-df random-id reassemble tcp) # Prevent dns leaks : best to use with unbound, dnscrypt-proxy block in log on egress inet proto { tcp udp } from any to ! egress port 53 block drop in quick on egress from { \u0026lt;t_bogons\u0026gt; } to any block drop out quick on egress from any to { \u0026lt;t_bogons\u0026gt; } # block abuses block in log quick proto tcp from \u0026lt;t_abuse_ssh\u0026gt; to any port ssh block in log quick proto tcp from \u0026lt;t_abuse_web\u0026gt; to any port $web_ports block # block stateless traffic # pass few udp ports pass quick inet proto icmp all icmp-type { echoreq, unreach } pass proto udp from any to egress port mdns allow-opts # pass in pass in on egress proto tcp to any port ssh flags S/SA modulate state (max-src-conn-rate 3/60, overload \u0026lt;t_abuse_ssh\u0026gt; flush global) pass in on egress proto tcp to any port $web_ports flags S/SA modulate state (max-src-conn 100, max-src-conn-rate 40/5, overload \u0026lt;t_abuse_web\u0026gt; flush global) # pass out pass out log on egress proto tcp to any port $auth_tcp_ports modulate state pass out log on egress proto tcp to any port $auth_tcps_ports modulate state pass out on egress proto udp to any port $auth_udp_ports allow-opts keep state Version améliorée # $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $ # # See pf.conf(5) and /etc/examples/pf.conf # lists, macros auth_tcp_ports =\u0026#34;{ http ftp whois }\u0026#34; # ajouter imap, smtp, rsync ou autres flux TCP nécessaires en sortie auth_tcps_ports = \u0026#34;{ https }\u0026#34; # ajouter imaps, smtps ou autres flux TCP \u0026#34;secure\u0026#34; nécessaires en sortie auth_udp_ports = \u0026#34;{ domain ntp mdns }\u0026#34; # ajouter tout flux UDP nécessaire en sortie # ports web_ports = \u0026#34;{ http https }\u0026#34; # modifier entrée services web # statefull tracking options - sto ssh_sto = \u0026#34;(max-src-conn-rate 3/60, overload \u0026lt;t_abuse_ssh\u0026gt; flush global)\u0026#34; web_sto = \u0026#34;(max-src-conn 100, max-src-conn-rate 40/5, overload \u0026lt;t_abuse_web\u0026gt; flush global)\u0026#34; # state flag_syn = \u0026#34;flags S/SA modulate state\u0026#34; # others edropin = \u0026#34;block drop in quick on egress from\u0026#34; edropout = \u0026#34;block drop out quick on egress from\u0026#34; epassout = \u0026#34;pass out log on egress proto tcp to any port\u0026#34; inblocktcp = \u0026#34;block in log quick proto tcp from\u0026#34; inpasstcp = \u0026#34;pass in on egress proto tcp to any port\u0026#34; table \u0026lt;t_bogons\u0026gt; persist file \u0026#34;/etc/pf_table_bogons\u0026#34; table \u0026lt;t_abuse_ssh\u0026gt; persist table \u0026lt;t_abuse_web\u0026gt; persist set block-policy return set optimization normal set reassemble yes set ruleset-optimization none set skip on lo antispoof for { lo, egress } #scrub in all fragment reassemble no-df max-mss 1440 \u0026lt;= old version; do not using-it! match in all scrub (max-mss 1440 no-df random-id reassemble tcp) # Prevent dns leaks : best to use with unbound, dnscrypt-proxy block in log on egress inet proto { tcp udp } from any to ! egress port 53 $edropin { \u0026lt;t_bogons\u0026gt; } to any $edropout any to { \u0026lt;t_bogons\u0026gt; } # block abuses $inblocktcp \u0026lt;t_abuse_ssh\u0026gt; to any port ssh $inblocktcp \u0026lt;t_abuse_web\u0026gt; to any port $web_ports block # block stateless traffic # pass few udp ports pass quick inet proto icmp all icmp-type { echoreq, unreach } pass proto udp from any to egress port mdns allow-opts # pass in $inpasstcp ssh $flag_syn $ssh_sto $inpasstcp $web_ports $flag_syn $web_sto # pass out $epassout $auth_tcp_ports $flag_syn $epassout $auth_tcps_ports $flag_syn pass out on egress proto udp to any port $auth_udp_ports allow-opts table bogons Ces adresses ne doivent en aucun cas se retrouver sur Internet - malheureusement de petits malins les utilisent, d\u0026rsquo;où la raison de les filtrer !\nLe fichier /etc/pf_table_bogons doit contenir des adresses CIDR, telles que :\n0.0.0.0 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 128.0.0.0/16 169.254.0.0/16 172.16.0.0/12 191.255.0.0/16 192.0.0.0/24 192.0.2.0/24 192.88.99.0/24 #192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 223.255.255.0/24 224.0.0.0/4 240.0.0.0/4 255.255.255.255 ⇒ Pour information :\n10.0.0.0/8 # private network ( RFC 1918 ) 100.64.0.0/10 # cf RFC 6598 127.0.0.0/8, 128.0.0.0/16 # Loopback ( RFC 1122 ), IANA reservations ( RFC 3330 ) 169.254.0.0/16, 172.16.0.0/12 # Link Local Block ( RFC 3927 ), private network ( RFC 1918 ) 191.255.0.0/16, 192.0.0.0/24, 192.0.2.0/24, 192.88.99.0/24 # ?, IETF Protocol 5 ( RFC 5736 ), Test-Net 1 ( RFC 1166 ), 6to4 Relay Anycast ( RFC 3068 ) 192.168.0.0/16 # privates classes networks ( RFC 1918 ) \u0026lt;= à commenter pour pouvoir \u0026ldquo;contacter\u0026rdquo; stations/serveurs locaux 198.18.0.0/15, 198.51.100.0/24 # Network Interconnect Device Benchmark Testing ( RFC 2544 ), Test-Net 2 ( RFC 5737 ) 203.0.113.0/24, 223.255.255.0/24, 224.0.0.0/4, 240.0.0.0/4 # Test-Net 3 ( RFC 5737 ), ?, Class D Reserved ( RFC 3171 ), Class E Reserved ( RFC 1112 ),… 255.255.255.255 # limited broadcast destination address Note : Le site Team Cymru met à jour une liste + ou - régulière des adresses dites \u0026ldquo;bogons\u0026rdquo;…\npour IPv4 et IPv6 Table badips De même que la table gérant les réseaux bogons, il est possible d\u0026rsquo;utiliser des listes sur internet pour filtrer des adresses IP et/ou des segments entiers de réseaux, qui sont reconnus par plusieurs entités, elles-mêmes reconnues officiellement ou non, pour aider à lutter contre.\ntable \u0026lt;t_badips\u0026gt; persist file \u0026#34;/dir/badips_ipv4\u0026#34; counters table \u0026lt;t_badips6\u0026gt; persist file \u0026#34;/dir/badips_ipv6\u0026#34; counters block drop in quick on egress from { \u0026lt;t_badips\u0026gt; } to any block drop out quick on egress from any to { \u0026lt;t_badips\u0026gt; } block drop in quick on egress inet6 from { \u0026lt;t_badips6\u0026gt; } to any block drop out quick on egress inet6 from any to { \u0026lt;t_badips6\u0026gt; } Astuces Les astuces concernant ICMP, ICMPv6, et Traceroute sont tirées du livre \u0026ldquo;The Book of PF\u0026rdquo; !\nRetrouvez une \u0026ldquo;cheat sheet\u0026quot;…\nInfoATTENTION : Les astuces ci-dessous ne sont que des exemples .\nIl est de votre devoir de les adapter, en ayant bien compris les principes de gestion de PF !\nElles pourraient probablement ne pas fonctionner ou ne pas restituer le résultat attendu, surtout si vous ne savez pas les adapter à vos besoins !\nICMP, ICMPv6 # macros icmp_types=\u0026#34;{ echoreq unreach }\u0026#34; icmp6_types=\u0026#34;{ unreach toobig timex paramprob echoreq routeradv neighbrsol neighbradv }\u0026#34; (…) # icmp (pass in+out) pass quick inet proto icmp icmp-type $icmp_types pass quick inet6 proto icmp6 icmp6-type $icmp6_types Note : N\u0026rsquo;hésitez pas à lire les manpages icmp(4) et icmp6(4)\nAvahi (mDNS, SSDP) Voici des règles IPv4 et IPv6 pour le trafic multicast et SSDP liés à la bibliothèque Avahi !\n⇒ pour le trafic mDNS :\npass proto udp from any to 224.0.0.251 port mdns allow-opts pass inet6 proto udp from any to ff02::fb port mdns allow-opts ⇒ pour le trafic SSDP :\npour IPv6 : \u0026lsquo;\u0026lsquo;ff02::c\u0026rsquo;\u0026rsquo; est l\u0026rsquo;adresse multicast de lien local \u0026lsquo;\u0026lsquo;ff05::c\u0026rsquo;\u0026rsquo; est l\u0026rsquo;adresse multicast de site local \u0026lsquo;\u0026lsquo;ff08::c\u0026rsquo;\u0026rsquo; est l\u0026rsquo;adresse multicast d\u0026rsquo;organisation local il existe aussi \u0026lsquo;\u0026lsquo;ff0e::c\u0026rsquo;\u0026rsquo; pour l\u0026rsquo;adresse multicast global - que nous n\u0026rsquo;utiliserons pas dans le contexte local ! pass proto udp from any to 239.255.255.250 port ssdp allow-opts pass inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port ssdp allow-opts multiports Exemple pour du flux torrent : 6881:6891\npass in quick on egress inet proto tcp from any to 192.168.0.3 port 6881:6891 flags S/SA samba smb_ports_tcp = \u0026#34;{ 135 137 139 445 }\u0026#34; smb_ports_udp = \u0026#34;{ 135 137 138 445 }\u0026#34; # samba in pass in quick on egress proto tcp from egress:network to egress port $smb_ports_tcp flags S/SA modulate state pass in quick on egress proto udp from egress:network to egress port $smb_ports_udp allow-opts keep state # samba out pass out on egress proto tcp from egress to egress:network port $smb_ports_tcp flags S/SA modulate state pass out on egress proto udp from egress to egress:network port $smb_ports_udp allow-opts keep state syncthing # syncthing in pass in quick on egress inet proto tcp from { 192.168.1.0/24 } to egress port 22000 flags S/SA modulate state pass in quick on egress inet proto udp from { 192.168.1.0/24 } to egress port 21027 # syncthing out pass out quick on egress inet proto tcp from egress to { 192.168.1.0/24 } port 22000 flags S/SA modulate state pass out quick on egress inet proto udp from egress to { 192.168.1.0/24 } port 21027 Traceroute Il n\u0026rsquo;est pas forcément nécessaire de créer des règles pour utiliser l\u0026rsquo;outil traceroute, en effet l\u0026rsquo;option -I permet de l\u0026rsquo;utiliser en ciblant UDP. Néanmoins, si vous souhaitez obtenir le comportement par défaut, il faut utiliser les règles suivantes :\npass out on egress inet proto udp to port 33433:33626 # For IPv4 pass out on egress inet6 proto udp to port 33433:33626 # For IPv6 Note : N\u0026rsquo;hésitez pas à lire le manpage traceroute(8)\nPersonnalisation Shell Rajoutez dans votre fichier ~/.kshrc, les alias suivants :\nalias pf_clean_all=\u0026#34;doas pfctl -F all\u0026#34; alias pf_clean_counters=\u0026#34;doas pfctl -z\u0026#34; alias pf_clean_info=\u0026#34;doas pfctl -F info\u0026#34; alias pf_clean_queue=\u0026#34;doas pfctl -F queue\u0026#34; alias pf_clean_rules=\u0026#34;doas pfctl -F rules\u0026#34; alias pf_edit=\u0026#34;doas nano /etc/pf.conf\u0026#34; alias pf_info=\u0026#34;doas pfctl -si\u0026#34; alias pf_info_tables=\u0026#34;doas pfctl -vvsT\u0026#34; alias pf_less=\u0026#34;doas pfctl -vf /etc/pf.conf\u0026#34; alias pf_load_table=\u0026#34;doas pfctl -T load -f /etc/pf.conf\u0026#34; alias pf_reload=\u0026#34;doas pfctl -f /etc/pf.conf\u0026#34; alias pf_restart=\u0026#34;doas pfctl -d \u0026amp;\u0026amp; doas pfctl -ef /etc/pf.conf\u0026#34; alias pf_start=\u0026#34;doas pfctl -ef /etc/pf.conf\u0026#34; alias pf_stop=\u0026#34;doas pfctl -d\u0026#34; alias pf_test=\u0026#34;doas pfctl -nf /etc/pf.conf\u0026#34; alias pf_view=\u0026#34;doas pfctl -sr\u0026#34; alias pf_view_tables=\u0026#34;doas pfctl -sT\u0026#34; alias pf_watch=\u0026#34;doas tcpdump -n -e -ttt -i pflog0\u0026#34; Exécutez à nouveau : . .kshrc\nMaintenant, vous pourrez vous faciliter la vie, en exécutant un des alias, commençant par pf_* ;-)\nInformations avancées ICMP, ICMPv6 ATTENTION : les recommandations de l\u0026rsquo;IETF - Internet Engineering Task Force -, voire de l\u0026rsquo;IANA - Internet Assigned Numbers Authority - sont de supprimer : drop - impérativement les codes suivants :\n⇒ ICMP :\n3/6 - Destination Network Unknown 3/8 - Source Host Isolated 4/0 - Source Quench \u0026lt;= voire de journaliser ! 15/0 - Information Request Message 16/0 - Information Reply Message ⇒ ICMP v6 :\nle code 137 - Redirect Message le code 138 - Router Renumbering le code 139 - ICMP Node Information Query le code 140 - ICMP Node Information Response le code 144 - Home Agent Address Discovery Request Message le code 145 - Home Agent Address Discovery Reply Message le code 146 - Mobile Prefix Solicitation le code 147 - Mobile Prefix Advertisement Note : Il semble, selon le manpage icmp6(4), que les codes 144 à 147 ne soient pas gérés… par OpenBSD !\nL\u0026rsquo;IANA recommande aussi de filtrer - soit drop, soit reject - à la discrétion de l\u0026rsquo;administrateur - tous les codes suivants :\n⇒ ICMP :\ncode 6/0 - Alternate Host Address code 15 - Information Request code 16 - Information Reply code 17 - Address Mask Request code 18 - Address Mask Reply code 30 - Traceroute code 31 - Datagram Conversion Error code 32 - Mobile Host Redirect code 33 - IPv6 Where-Are-You code 34 - IPv6 I-Am-Here code 35 - Mobile Registration Request code 36 - Mobile Registration Reply code 37 - Domain Name Request code 38 - Domain Name Reply code 38 - SKIP Les autres codes, icmp et icmp6, sont à \u0026ldquo;limiter\u0026rdquo; en entrée et/ou en sortie… Pour en savoir plus, veuillez ABSOLUMENT vous informer - cf, la documentation dans la note finale !\nCe qui donne pour le propos les règles suivantes :\n# macros blockicmp = \u0026#34;block drop quick on egress inet proto icmp icmp-type\u0026#34; blockicmplog = \u0026#34;block drop quick log on egress inet proto icmp icmp-type\u0026#34; blockicmp6 = \u0026#34;block drop quick on egress inet6 proto icmp6 icmp6-type\u0026#34; inpassicmplan = \u0026#34;pass in quick on egress inet proto icmp from egress:network to egress icmp-type\u0026#34; inpassicmpwan = \u0026#34;pass in quick on egress inet proto icmp from any to egress icmp-type\u0026#34; outpassicmplan = \u0026#34;pass out quick on egress inet proto icmp from egress to egress:network icmp-type\u0026#34; outpassicmpwan = \u0026#34;pass out quick on egress inet proto icmp from egress to any icmp-type\u0026#34; icmp6_types=\u0026#34;{ echoreq unreach timex paramprob }\u0026#34; # statefull tracking options icmp_sto = \u0026#34;keep state (max-src-conn-rate 3/1)\u0026#34; (…) # autres macros set block-policy return (…) # autres set # block icmp $blockicmp 3 code 6 $blockicmp 3 code 8 $blockicmplog 4 $blockicmp 6 $blockicmp 15 $blockicmp 16 $blockicmp6 137 $blockicmp6 138 $blockicmp6 139 $blockicmp6 140 $blockicmp6 144 $blockicmp6 145 $blockicmp6 146 $blockicmp6 147 (…) # autres block si nécessaires block (…) # icmp in $inpassicmplan 0 $icmp_sto $inpassicmplan 3 code 0 $icmp_sto $inpassicmplan 3 code 1 $icmp_sto $inpassicmpwan 3 code 3 $icmp_sto $inpassicmpwan 8 $icmp_sto $inpassicmpwan 11 $icmp_sto $inpassicmplan 12 $icmp_sto # icmp out $outpassicmplan 0 $icmp_sto $outpassicmplan 3 code 0 $icmp_sto $outpassicmplan 3 code 1 $icmp_sto $outpassicmpwan 3 code 3 $icmp_sto $outpassicmpwan 8 $icmp_sto $outpassicmpwan 11 $icmp_sto $outpassicmplan 12 $icmp_sto # icmpv6 (in+out) pass quick inet6 proto icmp6 icmp6-type $icmp6_types $icmp_sto Documentation https://www.openbsd.org/faq/pf/index.html https://home.nuug.no/~peter/pf/en/long-firewall.html Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"pf--packet-filter\"\u003ePF : Packet Filter\u003c/h2\u003e\n\u003cp\u003eCette documentation traitera de l\u0026rsquo;usage du gestionnaire de filtrage\n\u0026ldquo;pare-feu\u0026rdquo; nommé \u003cstrong\u003ePF\u003c/strong\u003e…\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;outil \u003ccode\u003epfctl\u003c/code\u003e permet de \u003cstrong\u003econtrôler l\u0026rsquo;état du parefeu\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/pf.conf\u003c/code\u003e permet de \u003cstrong\u003egérer la configuration\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003ePar défaut, rien à installer par soi-même… il est inclus de base.\u003c/p\u003e\n\u003cp\u003eDepuis la version 4.6 d\u0026rsquo;OpenBSD, il n\u0026rsquo;est plus nécessaire de l\u0026rsquo;activer,\npuisqu\u0026rsquo;il l\u0026rsquo;est par défaut.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eCette section traite de l\u0026rsquo;usage de l\u0026rsquo;outil \u003ccode\u003epfctl\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eNote\u003c/strong\u003e : L\u0026rsquo;usage de l\u0026rsquo;outil \u003ccode\u003epfctl\u003c/code\u003e nécessite des droits administrateur…\npensez-y !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eQuelques informations à-propos des options de pfctl :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-d\u003c/code\u003e : arrête le parefeu\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-e\u003c/code\u003e : activer, vérifier l\u0026rsquo;état de pf\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-ef\u003c/code\u003e : activer le parefeu tout en ciblant le fichier de\nconfiguration, tel que : \u003ccode\u003e-ef /etc/pf.conf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-f\u003c/code\u003e : permet de recharger les nouvelles règles à partir du fichier.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-F\u003c/code\u003e : permet de vider toutes les règles et autres tables du parefeu\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-nf\u003c/code\u003e : permet de vérifier les règles écrites dans un fichier,\nsans les charger.\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-r\u003c/code\u003e : permet de faire du \u003cstrong\u003ereverse dns\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-s\u003c/code\u003e : afficher les informations d\u0026rsquo;état…\n\u003cem\u003evoir plus bas, pour plus d\u0026rsquo;infos.\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-t\u003c/code\u003e : spécifie une action précise sur une table particulière,\ntel que : \u003ccode\u003e-t \u0026lt;table_nom\u0026gt; -T command adr_ip\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003el\u0026rsquo;option \u003ccode\u003e-v\u003c/code\u003e : est le mode verbeux\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eDe plus amples informations dans le \u003ca href=\"http://man.openbsd.org/OpenBSD-current/man8/pfctl.8\" rel=\"external\"\u003emanpage\u003c/a\u003e\ncorrespondant !\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe \u003cstrong\u003efichier de configuration principal\u003c/strong\u003e du pare-feu \u003cstrong\u003ePF\u003c/strong\u003e se nomme :\n\u003ccode\u003e/etc/pf.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eIl est possible de créer des sous-fichiers de configuration qui seront\nappelés par la directive : \u003cbr\u003e\n\u003ccode\u003einclude /etc/pf/filename.conf\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLe fichier de configuration est décomposé en plusieurs sections :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edéclarations de listes, macros, tables - de préférence - absolument en premier\u003c/li\u003e\n\u003cli\u003egestion de la bande passante - au besoin, en suivant\u003c/li\u003e\n\u003cli\u003edéclaration des règles bloquantes, et/ou filtrantes - absolument en dernier\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eDe plus amples informations dans le \u003ca href=\"http://man.openbsd.org/pf.conf.5\" rel=\"external\"\u003emanpage\u003c/a\u003e\ncorrespondant !\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-des-listes\"\u003eGestion des listes\u003c/h3\u003e\n\u003cp\u003eLes listes définissent des critères multiples similaires, tels que les\nnoms de ports, des numéros de protocoles, plusieurs adresses IP, etc.\u003c/p\u003e\n\u003cp\u003eLes listes sont définies en spécifiant les items par l\u0026rsquo;usage des crochets\n{ }, chaque item pouvant être séparé soit par un espace, soit par une\nvirgule.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eblock out on fxp0 from { 192.168.0.1, 10.5.32.6 } to any\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUne liste peut contenir une autre liste imbriquée.\u003c/p\u003e\n\u003cp\u003eLà où les listes se trouvent limiter en usage, les macros prennent\nfacilement le relais\u003c/p\u003e\n\u003ch3 id=\"gestion-des-macros\"\u003eGestion des macros\u003c/h3\u003e\n\u003cp\u003eLes macros sont l\u0026rsquo;équivalent de variables dans les langages informatiques.\u003c/p\u003e\n\u003cp\u003eElles définissent une valeur ou un ensemble de valeurs… celles-ci peuvent\nêtre une ou plusieurs interfaces réseaux, une ou plusieurs adresses ip,\nun ou plusieurs numéros de ports, etc… \u003cbr\u003e\nvoire une partie d\u0026rsquo;écriture de règles.\u003c/p\u003e\n\u003cp\u003eLes macros peuvent contenir des listes, d\u0026rsquo;autres macros.\u003c/p\u003e\n\u003cp\u003e⇒ Définition :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLes noms de ces macros doivent ABSOLUMENT commencer par une lettre,\nun chiffre ou le symbole \u003ccode\u003e_\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eIl est interdit d\u0026rsquo;utiliser des mots réservés, tels que :\n\u003ccode\u003epass\u003c/code\u003e, \u003ccode\u003ein\u003c/code\u003e, \u003ccode\u003eout\u003c/code\u003e…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCes macros, une fois définies, sont utilisées dans le contexte des règles.\u003c/p\u003e\n\u003cp\u003e⇒ Exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eiface\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;em0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ehttp_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ 80 443 }\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pass in quick on ep0 inet proto tcp from \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epost\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;to any port { 80, 6667 }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003ePour plus d\u0026rsquo;informations, lire\u003c/em\u003e : \u003ca href=\"https://www.openbsd.org/faq/pf/shortcuts.html#macros\" rel=\"external\"\u003ehttps://www.openbsd.org/faq/pf/shortcuts.html#macros\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-des-tables\"\u003eGestion des tables\u003c/h3\u003e\n\u003cp\u003eLes tables sont une collection d\u0026rsquo;adresses et/ou de réseaux.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est une manière très efficace et puissante de gérer un ensemble\nd\u0026rsquo;informations, consommant moins de ressources processeur et mémoire.\u003c/p\u003e\n\u003cp\u003eÀ privilégier, plutôt qu\u0026rsquo;une liste de macros, dès que vous voulez gérer\nun ensemble d\u0026rsquo;adresses ip !\u003c/p\u003e\n\u003cp\u003e⇒ Définition :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTout comme pour les macros, les noms réservés ne DOIVENT pas être utilisés !\u003c/li\u003e\n\u003cli\u003eUne table initialisée avec une liste vide \u003ccode\u003e{ }\u003c/code\u003e sera purgée, lors du chargement…\u003c/li\u003e\n\u003cli\u003eElles peuvent être définies en étant suivies d\u0026rsquo;un de ces trois attributs :\n\u003ccode\u003econst\u003c/code\u003e, \u003ccode\u003ecounters\u003c/code\u003e, ou \u003ccode\u003epersist\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Drapeaux :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econst\u003c/code\u003e : empêche que la table soit ultérieurement altérée, une fois chargée.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecounter\u003c/code\u003e : active le compte des bits et autres paquets par adresse ip.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epersist\u003c/code\u003e : force le noyau à garder la table, même si aucune règle se\nréfère à elle. Ce drapeau permet l\u0026rsquo;ajout ultérieur d\u0026rsquo;informations…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eiface\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;axe0\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;private\u0026gt; const { 10/8, 172.16/12, 192.168/16 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;badips\u0026gt; persist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock on $iface from { \u0026lt;private\u0026gt;, \u0026lt;badips\u0026gt; } to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pfctl -t badips -T add 204.92.77.111\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e : Une table peut être gérée par un ou plusieurs fichiers, qui\nseront une liste d\u0026rsquo;adresses ip ou de noms de machines. Une ligne commençant\npar le symbole dièse \u0026lsquo;#\u0026rsquo; est considérée comme un commentaire et sera ignorée.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;spam\u0026gt; persist file \u0026#34;/dir/filename1\u0026#34; \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock on fxp0 from \u0026lt;spam\u0026gt; to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"gestion-des-ancres\"\u003eGestion des ancres\u003c/h3\u003e\n\u003cp\u003eLes ancres sont un ensemble de règles, qui peuvent être manipulées de\nmanière dynamique.\u003c/p\u003e\n\u003cp\u003eElles sont au jeu de règles, ce que les tables sont à la gestion dynamique\ndes adresses ip ou réseaux.\u003c/p\u003e\n\u003cp\u003eUne ancre est une collection de règles… de tables… voire même d\u0026rsquo;ancres.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAttention\u003c/strong\u003e : Pour nommer une ancre, \u003cstrong\u003eveillez à ne pas utiliser un nom\ndéjà défini auparavant\u003c/strong\u003e, même s\u0026rsquo;il définit une table. L\u0026rsquo;outil \u003ccode\u003epfctl\u003c/code\u003e\nvous avertira, sinon, d\u0026rsquo;une collision de noms dans l\u0026rsquo;espace global de noms…\nà juste titre !\u003c/p\u003e\n\u003cp\u003e⇒ Utilisation :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eanchor nom_ancre {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ejeu de règles\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;ajout dynamique à la main peut se faire ainsi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# echo \u0026quot;pass in proto tcp from 192.0.2.3 to any port 22\u0026quot; | pfctl -a nom_ancre -f -\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eElles peuvent aussi être écrite dans un fichier, qui aura soit un jeu de\nrègles définies, et/ou pourra être géré dynamiquement, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eancre nom_ancre\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eload nom_ancre from \u0026#34;/etc/pf/fichier_ancre\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003ePour de plus amples informations, lire\u003c/em\u003e : \u003ca href=\"https://www.openbsd.org/faq/pf/anchors.html\" rel=\"external\"\u003ehttps://www.openbsd.org/faq/pf/anchors.html\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"gestion-de-la-bande-passante\"\u003eGestion de la bande passante\u003c/h3\u003e\n\u003cp\u003eLes paquets peuvent être assignés à une ou plusieurs queues, afin de\ngérer la bande passante.\u003c/p\u003e\n\u003cp\u003eIl faut définir au moins une queue pour la configurer, et ensuite créer\ndes règles qui feront référence à la queue par son nom. Si une queue\nappelée n\u0026rsquo;existe pas pour une interface réseau, c\u0026rsquo;est la queue par défaut\nqui sera utilisée.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIl DOIT\u003c/strong\u003e y avoir une queue maître, qui fait référence spécifiquement\nà une interface réseau. Les autres queues, appelées \u003cem\u003eenfants\u003c/em\u003e, sont\ncréées relativement à la queue \u003cem\u003emaître\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ Exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eiface\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;em0\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e  \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003equeue rq on $iface bandwidth 100M \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003equeue ssh parent rq bandwidth 10M\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003equeue http parent rq bandwidth 80M\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003equeue std parent rq bandwidth 10M default \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock return out on $iface inet all set queue std \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Définition des mots clés réservés :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edefault\u003c/code\u003e : spécifie la queue par défaut\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eon\u003c/code\u003e : spécifie une interface réseau\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eparent\u003c/code\u003e : attache une queue à une queue maître\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eqlimit\u003c/code\u003e : définit le nombre maximum de paquets capturés dans une queue.\n\u003cem\u003ePar défault : 50\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Définition de valeurs de bande passante :\u003c/p\u003e\n\u003cp\u003eLes valeurs de bande passante \u003cstrong\u003eDOIVENT\u003c/strong\u003e absolument être des entiers ;\nces valeurs peuvent être suffixées des lettres suivantes \u003ccode\u003eK\u003c/code\u003e, \u003ccode\u003eM\u003c/code\u003e, ou \u003ccode\u003eG\u003c/code\u003e,\nqui respectivement représentent le nombre de bits par secondes gérés,\ntels que Kilobits, Megabits, ou Gigabits.\u003c/p\u003e\n\u003cp\u003eCes valeurs ne doivent pas dépasser la taille de la bande passante allouée\nà une interface réseau !\u003c/p\u003e\n\u003cp\u003e⇒ Attributs possibles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emax\u003c/code\u003e : spécifie la limite maximale de bande passante allouée à une queue\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emin\u003c/code\u003e : cible la taille minimale, réservée, de bande passante à une queue\ndonnée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eburst\u003c/code\u003e : est un attribut qui permet à une bande passante d\u0026rsquo;être outrepassée\ndans un laps de temps donnée, pour une queue précise\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Exemples :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003equeue ssh parent std bandwidth 10M, min 5M, max 25M\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003equeue ssh parent std bandwidth 10M burst 90M for 100ms\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"gestion-des-règles\"\u003eGestion des règles\u003c/h3\u003e\n\u003cp\u003eLa première des règles la plus basique, et sécuritaire est celle de tout\nbloquer :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eblock\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"règles-de-syntaxe\"\u003eRègles de syntaxe\u003c/h2\u003e\n\u003cp\u003eIl existe des règles de grammaire et de simplifications d\u0026rsquo;écriture des\nrègles PF.\u003c/p\u003e\n\u003ch3 id=\"règles-block\"\u003eRègles \u0026ldquo;block\u0026rdquo;\u003c/h3\u003e\n\u003cp\u003e⇒ Cela ne sert à rien d\u0026rsquo;écrire ce qui suit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eblock in all\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eblock out all\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNi :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eblock all\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eÉcrire\u003c/strong\u003e \u003ccode\u003eblock\u003c/code\u003e \u003cstrong\u003esuffit !\u003c/strong\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ De même, il ne sert à rien de spécifier :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eblock drop\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eou :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eblock return\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Sauf à utiliser ces mots-clés, dans le contexte de certaines règles PF,\n\u003cstrong\u003espécifier la politique de rejet, puis\u003c/strong\u003e utiliser juste le mot clé \u003cstrong\u003eblock\u003c/strong\u003e,\ntel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset block-policy return\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"autres-règles\"\u003eAutres règles\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;usage du mot clé reservé \u003ccode\u003eall\u003c/code\u003e ou de l\u0026rsquo;expression réservé \u003ccode\u003efrom any to any\u003c/code\u003e\n\u003cstrong\u003ene servent à rien\u003c/strong\u003e non plus. Ce sont des règles implicites, par défaut !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePour plus d\u0026rsquo;informations, lire\u003c/em\u003e : \u003ca href=\"https://www.openbsd.org/faq/pf/shortcuts.html#grammar\" rel=\"external\"\u003ehttps://www.openbsd.org/faq/pf/shortcuts.html#grammar\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"recommandations\"\u003eRecommandations\u003c/h2\u003e\n\u003ch3 id=\"suivi-de-connexions\"\u003eSuivi de connexions\u003c/h3\u003e\n\u003cp\u003eLe mot clé \u003ccode\u003ekeep state\u003c/code\u003e permet de gérer le suivi de connexion des flux\nsur les protocoles TCP, UDP et/ou ICMP. Ce mot clé permet de gérer les\nmessages ICMP relatifs à la régulation du trafic, tel que les messages\n\u0026ldquo;source quench\u0026rdquo;, de fait il n\u0026rsquo;y a pas besoin de créer de règles spécifiques.\u003c/p\u003e\n\u003ch3 id=\"tcp\"\u003eTCP\u003c/h3\u003e\n\u003cp\u003ePour s\u0026rsquo;assurer de n\u0026rsquo;autoriser QUE les nouvelles connexions, ou plutôt\nl\u0026rsquo;initiation de nouvelles connexions, on utilisera seulement les drapeaux\n\u003ccode\u003eS/SA\u003c/code\u003e - SYN sans ACK -… le suivi de connexion gérera le reste correctement.\u003c/p\u003e\n\u003cp\u003e⇒ Exemple :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epass in on em0 proto tcp flags S/SA keep state\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e : c\u0026rsquo;est une bonne habitude à prendre de gérer l\u0026rsquo;état de connexion\nà partir de nouvelles initialisation !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eVeuillez lire la page de la \u003ca href=\"https://www.openbsd.org/faq/pf/filter.html\" rel=\"external\"\u003eFAQ Filter\u003c/a\u003e\npour mieux comprendre ce qu\u0026rsquo;est la notion de suivi d\u0026rsquo;états, la syntaxe\ndes règles PF à-propos des états, les différentes options possibles, etc…\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"informations-détats\"\u003eInformations d\u0026rsquo;états\u003c/h3\u003e\n\u003cp\u003eAinsi que vu plus haut, en début de page, c\u0026rsquo;est l\u0026rsquo;option \u003ccode\u003e-s\u003c/code\u003e qui permet\nd\u0026rsquo;obtenir différentes informations relatives aux états du pare-feu.\nCette option utilise des drapeaux pour afficher différemment les informations.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e# pfctl -s flag\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Définition des drapeaux :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eVoir toutes les informations : \u003ccode\u003e-sa\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003ene pas confondre avec l\u0026rsquo;option\npour voir les ancres !\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003einfo\u003c/code\u003e : affiche les statistiques globales\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eversion abrégée : \u003ccode\u003e-si\u003c/code\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003enat\u003c/code\u003e : affiche les informations de traduction d\u0026rsquo;adresses réseaux, de\ntype \u003ccode\u003enat\u003c/code\u003e, et \u003ccode\u003erdr\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003erules\u003c/code\u003e : affiche les règles de filtrage chargées en mémoire - un peu,\nl\u0026rsquo;équivalent des options \u0026lsquo;-Lnv\u0026rsquo; à iptables\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eversion abrégée : \u003ccode\u003e-sr\u003c/code\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003estate\u003c/code\u003e : affiche l\u0026rsquo;état des connexions ouvertes.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eversion abrégée : \u003ccode\u003e-ss\u003c/code\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAnchor : option \u003ccode\u003e-s Anchor\u003c/code\u003e, avec ou sans un \u0026rsquo;s\u0026rsquo; final, permet de connaître\nle nom des tables utilisées. \u003cem\u003eLes ancres peuvent aussi être gérées en\nutilisant directement l\u0026rsquo;option \u003ccode\u003e-sa\u003c/code\u003e, ainsi que l\u0026rsquo;ajout d\u0026rsquo;un de ses\ndrapeaux \u003ccode\u003e-f\u003c/code\u003e, \u003ccode\u003e-F\u003c/code\u003e, ou \u003ccode\u003e-s\u003c/code\u003e\u003c/em\u003e…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLabel : option \u003ccode\u003e-s label\u003c/code\u003e, avec ou sans un \u0026rsquo;s\u0026rsquo; final, permet d\u0026rsquo;obtenir\nles informations liées à des labels.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eversion abrégée : \u003ccode\u003e-sl\u003c/code\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eQueue : option \u003ccode\u003e-s queue\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eversion abrégée : \u003ccode\u003e-sA\u003c/code\u003e\u003c/em\u003e - avec un A majuscule ;\u003c/li\u003e\n\u003cli\u003eà ne pas confondre avec les ancres !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTable : option \u003ccode\u003e-s Tables\u003c/code\u003e, avec ou sans un \u0026rsquo;s\u0026rsquo; final, permet de connaître\nle nom des tables utilisées. \u003cem\u003eSi une table est gérée par une ancre,\nil est possible de la contrôler en appelant d\u0026rsquo;abord l\u0026rsquo;ancre puis la\ntable, telle que :\u003cbr\u003e\n\u003ccode\u003epfctl -a ancre -t table -T command\u003c/code\u003e\u003c/em\u003e…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eversion abrégée : \u003ccode\u003e-sT\u003c/code\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e : Pensez à utiliser l\u0026rsquo;option \u003ccode\u003e-vs\u003c/code\u003e, voire \u003ccode\u003e-vvs\u003c/code\u003e qui permet\nd\u0026rsquo;avoir un état plus complet de l\u0026rsquo;information recherchée, si celui est\npossible.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePour de plus amples informations, veuillez lire le manpage correspondant\nà l\u0026rsquo;outil \u0026lsquo;pfctl\u0026rsquo;\u003c/em\u003e…\u003c/p\u003e\n\u003ch2 id=\"pf--nombre-maximum-détats\"\u003ePF : Nombre maximum d\u0026rsquo;états\u003c/h2\u003e\n\u003cp\u003ePar défaut, PF gère un nombre maximal d\u0026rsquo;entrées dans sa table d\u0026rsquo;états\nqui est de 10 000.\u003c/p\u003e\n\u003cp\u003ePour connaître le nombre d\u0026rsquo;entrées dans la table d\u0026rsquo;états, en cours : \u003cbr\u003e\n\u003ccode\u003e# pfctl -ss | wc -l\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eSi et seulement si vous êtes proche de cette limite, vous pouvez agrandir\nle nombre d\u0026rsquo;entrées dans la table, en paramétrant votre fichier \u003ccode\u003e/etc/pf.conf\u003c/code\u003e,\ntel que : \u003cbr\u003e\n\u003ccode\u003eset limit states 20000\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"exemples\"\u003eExemples\u003c/h2\u003e\n\u003cp\u003eCi-dessous, retrouvez un exemple basique de règles PF qui sont donnés\npour le flux sur ipv4. \u003cbr\u003e\nIl faudra faire les modifications nécessaires pour ipv6 ;)\u003c/p\u003e\n\u003ch3 id=\"pf-pour-station\"\u003ePF pour station\u003c/h3\u003e\n\u003ch4 id=\"version-minimale\"\u003eVersion minimale\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out all keep state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCes deux règles \u0026ldquo;disent\u0026rdquo; :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003erefusent tout le trafic entrant\u003c/li\u003e\n\u003cli\u003eaccepte le trafic sortant et relatif aux connexions.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"version-améliorée\"\u003eVersion améliorée\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#       $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# See pf.conf(5) and /etc/examples/pf.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_bogons\u0026gt; persist file \u0026#34;/etc/pf_table_bogons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset block-policy return\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset optimization normal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset reassemble yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset ruleset-optimization none\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset skip on lo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eantispoof for egress\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch in all scrub (max-mss 1440 no-df random-id reassemble tcp)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop in quick on egress from { \u0026lt;t_bogons\u0026gt; } to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop out quick on egress from any to { \u0026lt;t_bogons\u0026gt; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# By default, do not permit remote connections to X11\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in on ! lo0 proto tcp to port 6000:6010\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Prevent dns leaks : best to use with unbound, dnscrypt-proxy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in log on egress inet proto { tcp udp } from any to ! egress port 53\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock           # block stateless traffic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass            # establish keep-state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Quelques petites explications :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eegress\u003c/code\u003e est un nom définissant toute(s) le(s) interface(s) réseau(x)\ncorrespondant à la ou le(s) route(s) par défaut, vers la ou le(s)\npasserelles. La règle \u003ccode\u003eantispoof\u003c/code\u003e est une mesure de protection dite\n\u0026rsquo;no spoofing\u0026rsquo;, afin que ne soit possible de lui \u0026ldquo;piquer\u0026rdquo; son ou ses\nadresses réseau(x).\u003c/li\u003e\n\u003cli\u003eon charge une table contenant les segments réseaux appelés BOGON ne\ndevant pas se trouver sur le net. Est supprimé tout trafic correspondant,\nsans aucun état d\u0026rsquo;âme, en entrée et en sortie.\nLe fichier \u003ccode\u003e/etc/pf_table_bogons\u003c/code\u003e est donné en exemple ci-dessous !\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"pf-pour-serveur\"\u003ePF pour serveur\u003c/h3\u003e\n\u003cp\u003eLes deux versions basiques de règles PF sont exactement les mêmes - la\ndeuxième utilise plus profondément les listes  et macros pour ne pas avoir\nà réécrire certaines portions !\u003c/p\u003e\n\u003ch4 id=\"version-normale\"\u003eVersion normale\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#       $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# See pf.conf(5) and /etc/examples/pf.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# lists, macros\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauth_tcp_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ http ftp whois }\u0026#34; # ajouter imap, smtp, rsync ou autres flux TCP nécessaires en sortie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauth_tcps_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ https }\u0026#34; # ajouter imaps, smtps ou autres flux TCP \u0026#34;secure\u0026#34; nécessaires en sortie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauth_udp_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ domain }\u0026#34; # ajouter tout flux UDP nécessaire en sortie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eweb_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ http https }\u0026#34; # modifier entrée services web\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_bogons\u0026gt; persist file \u0026#34;/etc/pf_table_bogons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_abuse_ssh\u0026gt; persist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_abuse_web\u0026gt; persist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset block-policy return\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset optimization normal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset reassemble yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset ruleset-optimization none\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset skip on lo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eantispoof for lo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eantispoof for egress\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#scrub in all fragment reassemble no-df max-mss 1440 \u0026lt;= old version; do not using-it!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch in all scrub (max-mss 1440 no-df random-id reassemble tcp)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Prevent dns leaks : best to use with unbound, dnscrypt-proxy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in log on egress inet proto { tcp udp } from any to ! egress port 53\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop in quick on egress from { \u0026lt;t_bogons\u0026gt; } to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop out quick on egress from any to { \u0026lt;t_bogons\u0026gt; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# block abuses\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in log quick proto tcp from \u0026lt;t_abuse_ssh\u0026gt; to any port ssh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in log quick proto tcp from \u0026lt;t_abuse_web\u0026gt; to any port $web_ports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock           # block stateless traffic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pass few udp ports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass quick inet proto icmp all icmp-type { echoreq, unreach }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to egress port mdns allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pass in\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in on egress proto tcp to any port ssh flags S/SA modulate state (max-src-conn-rate 3/60, overload \u0026lt;t_abuse_ssh\u0026gt; flush global)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in on egress proto tcp to any port $web_ports flags S/SA modulate state (max-src-conn 100, max-src-conn-rate 40/5, overload \u0026lt;t_abuse_web\u0026gt; flush global)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pass out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out log on egress proto tcp to any port $auth_tcp_ports modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out log on egress proto tcp to any port $auth_tcps_ports modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out on egress proto udp to any port $auth_udp_ports allow-opts keep state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"version-améliorée-1\"\u003eVersion améliorée\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#       $OpenBSD: pf.conf,v 1.54 2014/08/23 05:49:42 deraadt Exp $\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# See pf.conf(5) and /etc/examples/pf.conf\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# lists, macros\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauth_tcp_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ http ftp whois }\u0026#34; # ajouter imap, smtp, rsync ou autres flux TCP nécessaires en sortie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauth_tcps_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ https }\u0026#34; # ajouter imaps, smtps ou autres flux TCP \u0026#34;secure\u0026#34; nécessaires en sortie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eauth_udp_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ domain ntp mdns }\u0026#34; # ajouter tout flux UDP nécessaire en sortie\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eweb_ports\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ http https }\u0026#34; # modifier entrée services web\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# statefull tracking options - sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003essh_sto\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;(max-src-conn-rate 3/60, overload \u0026lt;t_abuse_ssh\u0026gt; flush global)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eweb_sto\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;(max-src-conn 100, max-src-conn-rate 40/5, overload \u0026lt;t_abuse_web\u0026gt; flush global)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eflag_syn\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;flags S/SA modulate state\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# others\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eedropin\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;block drop in quick on egress from\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eedropout\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;block drop out quick on egress from\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eepassout\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pass out log on egress proto tcp to any port\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einblocktcp\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;block in log quick proto tcp from\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einpasstcp\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pass in on egress proto tcp to any port\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_bogons\u0026gt; persist file \u0026#34;/etc/pf_table_bogons\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_abuse_ssh\u0026gt; persist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_abuse_web\u0026gt; persist\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset block-policy return\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset optimization normal\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset reassemble yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset ruleset-optimization none\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset skip on lo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eantispoof for { lo, egress }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#scrub in all fragment reassemble no-df max-mss 1440 \u0026lt;= old version; do not using-it!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ematch in all scrub (max-mss 1440 no-df random-id reassemble tcp)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Prevent dns leaks : best to use with unbound, dnscrypt-proxy\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock in log on egress inet proto { tcp udp } from any to ! egress port 53\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$edropin { \u0026lt;t_bogons\u0026gt; } to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$edropout any to { \u0026lt;t_bogons\u0026gt; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# block abuses\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inblocktcp \u0026lt;t_abuse_ssh\u0026gt; to any port ssh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inblocktcp \u0026lt;t_abuse_web\u0026gt; to any port $web_ports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock           # block stateless traffic\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pass few udp ports\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass quick inet proto icmp all icmp-type { echoreq, unreach }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to egress port mdns allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pass in\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpasstcp ssh $flag_syn $ssh_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpasstcp $web_ports $flag_syn $web_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# pass out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$epassout $auth_tcp_ports $flag_syn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$epassout $auth_tcps_ports $flag_syn\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out on egress proto udp to any port $auth_udp_ports allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"table-bogons\"\u003etable bogons\u003c/h3\u003e\n\u003cp\u003eCes adresses ne doivent \u003cstrong\u003een aucun cas se retrouver sur Internet\u003c/strong\u003e -\n\u003cem\u003emalheureusement de petits malins les utilisent, d\u0026rsquo;où la raison de les filtrer !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eLe fichier \u003ccode\u003e/etc/pf_table_bogons\u003c/code\u003e doit contenir des adresses CIDR,\ntelles que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e0.0.0.0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e10.0.0.0/8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e100.64.0.0/10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e127.0.0.0/8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e128.0.0.0/16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e169.254.0.0/16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e172.16.0.0/12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e191.255.0.0/16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e192.0.0.0/24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e192.0.2.0/24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e192.88.99.0/24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#192.168.0.0/16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e198.18.0.0/15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e198.51.100.0/24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e203.0.113.0/24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e223.255.255.0/24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e224.0.0.0/4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e240.0.0.0/4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e255.255.255.255\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ Pour information :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e10.0.0.0/8\u003c/code\u003e # private network ( RFC 1918 )\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e100.64.0.0/10\u003c/code\u003e # cf RFC 6598\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e127.0.0.0/8\u003c/code\u003e, \u003ccode\u003e128.0.0.0/16\u003c/code\u003e   # Loopback ( RFC 1122 ),\nIANA reservations ( RFC 3330 )\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e169.254.0.0/16\u003c/code\u003e, \u003ccode\u003e172.16.0.0/12\u003c/code\u003e    # Link Local Block ( RFC 3927 ),\nprivate network ( RFC 1918 )\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e191.255.0.0/16\u003c/code\u003e, \u003ccode\u003e192.0.0.0/24\u003c/code\u003e, \u003ccode\u003e192.0.2.0/24\u003c/code\u003e, \u003ccode\u003e192.88.99.0/24\u003c/code\u003e # ?,\nIETF Protocol 5 ( RFC 5736 ), Test-Net 1 ( RFC 1166 ), 6to4 Relay Anycast ( RFC 3068 )\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e192.168.0.0/16\u003c/code\u003e    # privates classes networks ( RFC 1918 )\n\u0026lt;= à commenter pour pouvoir \u0026ldquo;contacter\u0026rdquo; stations/serveurs locaux\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e198.18.0.0/15\u003c/code\u003e, \u003ccode\u003e198.51.100.0/24\u003c/code\u003e   # Network Interconnect Device\nBenchmark Testing ( RFC 2544 ), Test-Net 2 ( RFC 5737 )\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e203.0.113.0/24\u003c/code\u003e, \u003ccode\u003e223.255.255.0/24\u003c/code\u003e, \u003ccode\u003e224.0.0.0/4\u003c/code\u003e, \u003ccode\u003e240.0.0.0/4\u003c/code\u003e # Test-Net 3\n( RFC 5737 ), ?,  Class D Reserved ( RFC 3171 ), Class E Reserved ( RFC 1112 ),…\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e255.255.255.255\u003c/code\u003e   # limited broadcast destination address\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cstrong\u003eNote\u003c/strong\u003e : Le site \u003ca href=\"https://www.team-cymru.org/bogon-reference.html\" rel=\"external\"\u003eTeam Cymru\u003c/a\u003e\nmet à jour une \u003ca href=\"https://www.team-cymru.org/Services/Bogons/bogon-bn-agg.txt\" rel=\"external\"\u003eliste\u003c/a\u003e +\nou - régulière des adresses dites \u0026ldquo;bogons\u0026rdquo;…\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour \u003ca href=\"https://www.team-cymru.org/Services/Bogons/fullbogons-ipv4.txt\" rel=\"external\"\u003eIPv4\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eet \u003ca href=\"https://www.team-cymru.org/Services/Bogons/fullbogons-ipv6.txt\" rel=\"external\"\u003eIPv6\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"table-badips\"\u003eTable badips\u003c/h3\u003e\n\u003cp\u003eDe même que la table gérant les réseaux bogons, il est possible d\u0026rsquo;utiliser\ndes listes sur internet pour filtrer des adresses IP et/ou des segments\nentiers de réseaux, qui sont reconnus par plusieurs entités, elles-mêmes\nreconnues officiellement ou non, pour aider à lutter contre.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_badips\u0026gt; persist file \u0026#34;/dir/badips_ipv4\u0026#34; counters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003etable \u0026lt;t_badips6\u0026gt; persist file \u0026#34;/dir/badips_ipv6\u0026#34; counters\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop in quick on egress from { \u0026lt;t_badips\u0026gt; } to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop out quick on egress from any to { \u0026lt;t_badips\u0026gt; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop in quick on egress inet6 from { \u0026lt;t_badips6\u0026gt; } to any\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop out quick on egress inet6 from any to { \u0026lt;t_badips6\u0026gt; }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"astuces\"\u003eAstuces\u003c/h2\u003e\n\u003cp\u003eLes astuces concernant ICMP, ICMPv6, et Traceroute sont tirées du livre\n\u0026ldquo;The Book of PF\u0026rdquo; !\u003c/p\u003e\n\u003cp\u003eRetrouvez une \u0026ldquo;\u003ca href=\"https://gist.github.com/tracphil/4353170\" rel=\"external\"\u003echeat sheet\u003c/a\u003e\u0026quot;…\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eATTENTION : Les astuces ci-dessous ne sont que des exemples .\u003cbr\u003e\nIl est de votre devoir de les adapter, en ayant bien compris les principes\nde gestion de PF !\u003c/p\u003e\n\u003cp\u003eElles pourraient probablement ne pas fonctionner ou ne pas restituer le\nrésultat attendu, surtout si vous ne savez pas les adapter à vos besoins !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"icmp-icmpv6\"\u003eICMP, ICMPv6\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-vfg\" data-lang=\"vfg\"\u003e# macros\nicmp_types=\u0026#34;{ echoreq unreach }\u0026#34;\nicmp6_types=\u0026#34;{ unreach toobig timex paramprob echoreq routeradv neighbrsol neighbradv }\u0026#34;\n(…)\n# icmp (pass in+out)\npass quick inet proto icmp icmp-type $icmp_types\npass quick inet6 proto icmp6 icmp6-type $icmp6_types\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003e\u003cstrong\u003eNote\u003c/strong\u003e : N\u0026rsquo;hésitez pas à lire les manpages \u003ca href=\"http://man.openbsd.org/OpenBSD-current/man4/icmp.4\" rel=\"external\"\u003eicmp(4)\u003c/a\u003e\net \u003ca href=\"http://man.openbsd.org/OpenBSD-current/man4/icmp6.4\" rel=\"external\"\u003eicmp6(4)\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"avahi-mdns-ssdp\"\u003eAvahi (mDNS, SSDP)\u003c/h3\u003e\n\u003cp\u003eVoici des règles IPv4 et IPv6 pour le trafic multicast et SSDP liés à la\nbibliothèque Avahi !\u003c/p\u003e\n\u003cp\u003e⇒ pour le trafic mDNS :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to 224.0.0.251 port mdns allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass inet6 proto udp from any to ff02::fb port mdns allow-opts \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ pour le trafic SSDP :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour IPv6 :\n\u003cul\u003e\n\u003cli\u003e\u0026lsquo;\u0026lsquo;ff02::c\u0026rsquo;\u0026rsquo; est l\u0026rsquo;adresse multicast de lien local\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;\u0026lsquo;ff05::c\u0026rsquo;\u0026rsquo; est l\u0026rsquo;adresse multicast de site local\u003c/li\u003e\n\u003cli\u003e\u0026lsquo;\u0026lsquo;ff08::c\u0026rsquo;\u0026rsquo; est l\u0026rsquo;adresse multicast d\u0026rsquo;organisation local\u003c/li\u003e\n\u003cli\u003eil existe aussi \u0026lsquo;\u0026lsquo;ff0e::c\u0026rsquo;\u0026rsquo; pour l\u0026rsquo;adresse multicast global - \u003cem\u003eque\nnous n\u0026rsquo;utiliserons pas dans le contexte local\u003c/em\u003e !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass proto udp from any to 239.255.255.250 port ssdp allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port ssdp allow-opts \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"multiports\"\u003emultiports\u003c/h3\u003e\n\u003cp\u003eExemple pour du flux torrent : \u003ccode\u003e6881:6891\u003c/code\u003e\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress inet proto tcp from any to 192.168.0.3 port 6881:6891 flags S/SA\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"samba\"\u003esamba\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003esmb_ports_tcp\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ 135 137 139 445 }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003esmb_ports_udp\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ 135 137 138 445 }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# samba in\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress proto tcp from egress:network to egress port $smb_ports_tcp flags S/SA modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress proto udp from egress:network to egress port $smb_ports_udp allow-opts keep state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# samba out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out on egress proto tcp from egress to egress:network port $smb_ports_tcp flags S/SA modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out on egress proto udp from egress to egress:network port $smb_ports_udp allow-opts keep state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"syncthing\"\u003esyncthing\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# syncthing in\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress inet proto tcp from { 192.168.1.0/24 } to egress port 22000 flags S/SA modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in quick on egress inet proto udp from { 192.168.1.0/24 } to egress port 21027\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# syncthing out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet proto tcp from egress to { 192.168.1.0/24 } port 22000 flags S/SA modulate state\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet proto udp from egress to { 192.168.1.0/24 } port 21027\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"traceroute\"\u003eTraceroute\u003c/h3\u003e\n\u003cp\u003eIl n\u0026rsquo;est pas forcément nécessaire de créer des règles pour utiliser\nl\u0026rsquo;outil traceroute, en effet l\u0026rsquo;option \u003ccode\u003e-I\u003c/code\u003e permet de l\u0026rsquo;utiliser en ciblant\nUDP. Néanmoins, si vous souhaitez obtenir le comportement par défaut, il\nfaut utiliser les règles suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out on egress inet proto udp to port 33433:33626 # For IPv4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out on egress inet6 proto udp to port 33433:33626 # For IPv6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003e\u003cstrong\u003eNote\u003c/strong\u003e : N\u0026rsquo;hésitez pas à lire le manpage \u003ca href=\"http://man.openbsd.org/OpenBSD-current/man8/traceroute.8\" rel=\"external\"\u003etraceroute(8)\u003c/a\u003e\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"personnalisation-shell\"\u003ePersonnalisation Shell\u003c/h3\u003e\n\u003cp\u003eRajoutez dans votre fichier \u003ccode\u003e~/.kshrc\u003c/code\u003e, les alias suivants :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_clean_all\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -F all\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_clean_counters\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -z\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_clean_info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -F info\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_clean_queue\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -F queue\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_clean_rules\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -F rules\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_edit\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas nano /etc/pf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_info\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -si\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_info_tables\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -vvsT\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_less\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -vf /etc/pf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_load_table\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -T load -f /etc/pf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_reload\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -f /etc/pf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_restart\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -d \u0026amp;\u0026amp; doas pfctl -ef /etc/pf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_start\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -ef /etc/pf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_stop\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -d\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_test\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -nf /etc/pf.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_view\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -sr\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_view_tables\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas pfctl -sT\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ealias pf_watch\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;doas tcpdump -n -e -ttt -i pflog0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExécutez à nouveau : \u003ccode\u003e. .kshrc\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMaintenant, vous pourrez vous faciliter la vie, en exécutant un des\nalias, commençant par \u003ccode\u003epf_*\u003c/code\u003e ;-)\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"informations-avancées\"\u003eInformations avancées\u003c/h2\u003e\n\u003ch3 id=\"icmp-icmpv6-1\"\u003eICMP, ICMPv6\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : les recommandations de l\u0026rsquo;IETF - \u003cstrong\u003eInternet Engineering Task Force\u003c/strong\u003e -,\nvoire de l\u0026rsquo;IANA - \u003cstrong\u003eInternet Assigned Numbers Authority\u003c/strong\u003e - sont de supprimer :\n\u003ccode\u003edrop\u003c/code\u003e - impérativement les codes suivants :\u003c/p\u003e\n\u003cp\u003e⇒ ICMP :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e3/6 - Destination Network Unknown\u003c/li\u003e\n\u003cli\u003e3/8 - Source Host Isolated\u003c/li\u003e\n\u003cli\u003e4/0 - Source Quench \u0026lt;= voire de journaliser !\u003c/li\u003e\n\u003cli\u003e15/0 - Information Request Message\u003c/li\u003e\n\u003cli\u003e16/0 - Information Reply Message\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ ICMP v6 :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele code 137 - Redirect Message\u003c/li\u003e\n\u003cli\u003ele code 138 - Router Renumbering\u003c/li\u003e\n\u003cli\u003ele code 139 - ICMP Node Information Query\u003c/li\u003e\n\u003cli\u003ele code 140 - ICMP Node Information Response\u003c/li\u003e\n\u003cli\u003ele code 144 - Home Agent Address Discovery Request Message\u003c/li\u003e\n\u003cli\u003ele code 145 - Home Agent Address Discovery Reply Message\u003c/li\u003e\n\u003cli\u003ele code 146 - Mobile Prefix Solicitation\u003c/li\u003e\n\u003cli\u003ele code 147 - Mobile Prefix Advertisement\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eNote\u003c/strong\u003e : Il semble, selon le manpage \u003ca href=\"http://man.openbsd.org/OpenBSD-current/man4/icmp6.4\" rel=\"external\"\u003eicmp6(4)\u003c/a\u003e,\nque les codes 144 à 147 ne soient pas gérés… par OpenBSD !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;IANA recommande aussi de filtrer - soit \u003ccode\u003edrop\u003c/code\u003e, soit \u003ccode\u003ereject\u003c/code\u003e - \u003cem\u003eà la\ndiscrétion de l\u0026rsquo;administrateur\u003c/em\u003e - tous les codes suivants :\u003c/p\u003e\n\u003cp\u003e⇒ ICMP :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecode 6/0 - Alternate Host Address\u003c/li\u003e\n\u003cli\u003ecode 15 - Information Request\u003c/li\u003e\n\u003cli\u003ecode 16 - Information Reply\u003c/li\u003e\n\u003cli\u003ecode 17 - Address Mask Request\u003c/li\u003e\n\u003cli\u003ecode 18 - Address Mask Reply\u003c/li\u003e\n\u003cli\u003ecode 30 - Traceroute\u003c/li\u003e\n\u003cli\u003ecode 31 - Datagram Conversion Error\u003c/li\u003e\n\u003cli\u003ecode 32 - Mobile Host Redirect\u003c/li\u003e\n\u003cli\u003ecode 33 - IPv6 Where-Are-You\u003c/li\u003e\n\u003cli\u003ecode 34 - IPv6 I-Am-Here\u003c/li\u003e\n\u003cli\u003ecode 35 - Mobile Registration Request\u003c/li\u003e\n\u003cli\u003ecode 36 - Mobile Registration Reply\u003c/li\u003e\n\u003cli\u003ecode 37 - Domain Name Request\u003c/li\u003e\n\u003cli\u003ecode 38 - Domain Name Reply\u003c/li\u003e\n\u003cli\u003ecode 38 - SKIP\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eLes autres codes, icmp et icmp6, sont à \u0026ldquo;limiter\u0026rdquo; en entrée et/ou en sortie…\u003c/strong\u003e \u003cbr\u003e\n\u003cem\u003ePour en savoir plus, veuillez ABSOLUMENT vous informer - cf, la documentation dans la note finale !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eCe qui donne pour le propos les règles suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# macros\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblockicmp\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;block drop quick on egress inet proto icmp icmp-type\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblockicmplog\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;block drop quick log on egress inet proto icmp icmp-type\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblockicmp6\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;block drop quick on egress inet6 proto icmp6 icmp6-type\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einpassicmplan\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pass in quick on egress inet proto icmp from egress:network to egress icmp-type\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einpassicmpwan\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pass in quick on egress inet proto icmp from any to egress icmp-type\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eoutpassicmplan\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pass out quick on egress inet proto icmp from egress to egress:network icmp-type\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eoutpassicmpwan\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;pass out quick on egress inet proto icmp from egress to any icmp-type\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_types\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ echoreq unreach timex paramprob }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# statefull tracking options\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp_sto\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;keep state (max-src-conn-rate 3/1)\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…) # autres macros\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eset block-policy return\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…) # autres set\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# block icmp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp 3 code 6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp 3 code 8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmplog 4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp 6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp 15\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp 16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 137\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 138\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 139\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 140\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 144\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 145\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 146\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$blockicmp6 147\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…) # autres block si nécessaires\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e(…) \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# icmp in\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpassicmplan 0 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpassicmplan 3 code 0 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpassicmplan 3 code 1 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpassicmpwan 3 code 3 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpassicmpwan 8 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpassicmpwan 11 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$inpassicmplan 12 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# icmp out\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$outpassicmplan 0 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$outpassicmplan 3 code 0 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$outpassicmplan 3 code 1 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$outpassicmpwan 3 code 3 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$outpassicmpwan 8 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$outpassicmpwan 11 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$outpassicmplan 12 $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# icmpv6 (in+out)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass quick inet6 proto icmp6 icmp6-type $icmp6_types $icmp_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/pf/index.html\" rel=\"external\"\u003ehttps://www.openbsd.org/faq/pf/index.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://home.nuug.no/~peter/pf/en/long-firewall.html\" rel=\"external\"\u003ehttps://home.nuug.no/~peter/pf/en/long-firewall.html\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Documentation sur l'usage du parefeu, nommé PF, sous OpenBSD",
            "tags": ["Network", "PF", "packet-filter", "parefeu"],
            "date_published": "2020-01-19T06:35:57+02:00",
            "date_modified": "2023-04-30T17:05:08+02:00"
        },{
            "id": "urn:uuid:9b97d0f9-8b27-8720-a3b7-c4b1a661d5f6",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-terminal/",
            "title": "Gestion d'un terminal ou d'une console sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Comment télécharger en ligne de commande sous OpenBSD InfoIl n\u0026rsquo;y a ni wget ni curl par défaut ! Mais il y a la commande ftp qui les remplace très bien, même pour télécharger un fichier en http :\n$ ftp -o /chemin/vers/fichier.zip http://URL.com/fichier.zip Gestion des erreurs Error opening terminal: unknown Vous exécutez une commande, telle que l\u0026rsquo;ouverture d\u0026rsquo;un éditeur texte, - pour l\u0026rsquo;exemple : vi ou nano - et le système vous répond par cette erreur :\nError opening terminal: unknown\nLa raison ? Le système ne reconnaît pas le TERMinal !\nCommencez par vérifier quel est ce fameux terminal non reconnu :\n$ tset -s TERM=vt220 Modifions le :\n$ export TERM=vt100\nVérifier la prise en charge de ce terminal avec la commande tset, ci-dessus !\nNormalement, vous pourrez exécuter à nouveau le lancement de votre éditeur de texte console préféré, ou la commande console qui posait problème !\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"comment-télécharger-en-ligne-de-commande-sous-openbsd\"\u003eComment télécharger en ligne de commande sous OpenBSD\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cstrong\u003eIl n\u0026rsquo;y a ni wget ni curl par défaut !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003eMais il y a la commande \u003ccode\u003eftp\u003c/code\u003e qui les remplace très bien, même pour\ntélécharger un fichier en http :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ftp -o /chemin/vers/fichier.zip http://URL.com/fichier.zip\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"gestion-des-erreurs\"\u003eGestion des erreurs\u003c/h2\u003e\n\u003ch3 id=\"error-opening-terminal-unknown\"\u003eError opening terminal: unknown\u003c/h3\u003e\n\u003cp\u003eVous exécutez une commande, telle que l\u0026rsquo;ouverture d\u0026rsquo;un éditeur texte, -\npour l\u0026rsquo;exemple : \u003ccode\u003evi\u003c/code\u003e ou \u003ccode\u003enano\u003c/code\u003e - et le système vous répond par cette\nerreur :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003eError opening terminal: unknown\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLa raison ? Le système ne reconnaît pas le TERMinal !\u003c/p\u003e\n\u003cp\u003eCommencez par vérifier quel est ce fameux terminal non reconnu :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ tset -s\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eTERM\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003evt220\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eModifions le :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e$ export TERM=vt100\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVérifier la prise en charge de ce terminal avec la commande \u003ccode\u003etset\u003c/code\u003e,\nci-dessus !\u003c/p\u003e\n\u003cp\u003eNormalement, vous pourrez exécuter à nouveau le lancement de votre\néditeur de texte console préféré, ou la commande console qui posait\nproblème !\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces pour le terminal sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Terminal"],
            "date_published": "2020-01-19T06:31:00+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:0dcb2cbd-199f-e6d2-69a9-e6a2ac167476",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/tip-session/",
            "title": "Gestion de la session utilisateur / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Fichier ~/.profile Paramétrez vos variables d\u0026rsquo;environnements et vos alias dans votre fichier personnel ~/.profile.\nEnvironnement ksh Sous OpenBSD, l\u0026rsquo;environnement par défaut est le Public Domain Korn Shell .\nDémarrer la session graphique automatiquement sans XDM En mettant ces lignes //à la fin du// fichier ~/.profile, votre session graphique sera lancée dès que vous vous connecterez dans le tty1 (celui par défaut).\nAdaptez le fichier ~/.xinitrc pour choisir votre session :\nif [ \u0026#34;$(tty)\u0026#34; == \u0026#34;/dev/ttyC0\u0026#34; ]; then startx fi Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"fichier-profile\"\u003eFichier \u003ccode\u003e~/.profile\u003c/code\u003e\u003c/h2\u003e\n\u003cp\u003eParamétrez vos variables d\u0026rsquo;environnements et vos\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-alias/\" title=\"Lien interne vers l\u0026#39;article : 'Les alias / OpenBSD'\"\u003ealias\u003c/a\u003e\n dans votre fichier\npersonnel \u003ccode\u003e~/.profile\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"environnement-ksh\"\u003eEnvironnement ksh\u003c/h2\u003e\n\u003cp\u003eSous OpenBSD, l\u0026rsquo;environnement par défaut est le\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-pdksh/\" title=\"Lien interne vers l\u0026#39;article : 'KSH : Korn shell'\"\u003ePublic Domain Korn Shell\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch2 id=\"démarrer-la-session-graphique-automatiquement-sans-xdm\"\u003eDémarrer la session graphique automatiquement sans XDM\u003c/h2\u003e\n\u003cp\u003eEn mettant ces lignes //à la fin du// fichier \u003ccode\u003e~/.profile\u003c/code\u003e, votre\nsession graphique sera lancée dès que vous vous connecterez dans le tty1\n\u003cem\u003e(celui par défaut)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eAdaptez le fichier \u003ccode\u003e~/.xinitrc\u003c/code\u003e pour choisir votre session :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eif [ \u0026#34;$(tty)\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e= \u0026#34;/dev/ttyC0\u0026#34; ]; then\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e    startx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Astuces de gestion des sessions utilisateurs sous OpenBSD",
            "tags": ["OpenBSD", "Astuce", "Session"],
            "date_published": "2020-01-19T06:24:37+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:842b4a4d-4c7f-2ccc-75df-dc41fc208eae",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/sct/",
            "title": "sct : Gestion de la température de couleur de l'écran / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Installation Installez le paquet sct.\nUtilisation Quelques styles de température de couleur :\n⇒ Feu de camp : :$ sct 4500\n⇒ Tempête de poussière sur Mars : :$ sct 2000\n⇒ Café gratuit toute la nuit : :$ sct 8000\nDocumentation man sct man sct Synopsis sct [temp] sct version\nDescription sct est un outil léger pour paramétrer la température de l\u0026rsquo;écran. Si l\u0026rsquo;argument optionnel temp est donné, la température de couleur est configurée à cette valeur.\nLes arguments sont les suivants :\ntemp : optionnel, spécifie la température. version : affiche le numéro de version et les informations de droits d\u0026rsquo;auteur de sct sur la sortie standard, puis termine. sct attend une valeur de température entre 1000 et 10000. La valeur de température par défaut est de 6500.\nStatut de sortie L\u0026rsquo;utilitaire sct sort avec un code 0 en cas de succès, et un code supérieur à 0 si une erreur existe.\nExemples ⇒ Exécuter sct pour régler la température de l\u0026rsquo;écran sur un style \u0026ldquo;feu de camp\u0026rdquo; : :$ sct 4500\n⇒ Afficher les informations de version et de droits d\u0026rsquo;auteur de sct sur la sortie standard et sortir avec succès : :$ sct version\nVoir aussi Xorg(1), xrandr(1), X(7), XStandards(7) Normes L\u0026rsquo;utilitaire sct suit et utilise les normes XStandards(7).\nHistoire La première version de l\u0026rsquo;utilitaire sct est apparue en Novembre 2015 dans l\u0026rsquo;article suivant : \\\nhttp://www.tedunangst.com/flak/post/sct-set-color-temperature Auteurs L\u0026rsquo;utilitaire sct a été écrit par Ted Unangst [[tedu@openbsd.org]], puis ensuite amélioré par Joerg Jung [[mail@umaxx.net]].\nBogues sct arrondit les valeurs de température par palier de 500.\nPage d\u0026rsquo;accueil https://www.umaxx.net Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003esct\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eQuelques styles de température de couleur :\u003c/p\u003e\n\u003cp\u003e⇒ Feu de camp : \u003ccode\u003e:$ sct 4500\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Tempête de poussière sur Mars : \u003ccode\u003e:$ sct 2000\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Café gratuit toute la nuit : \u003ccode\u003e:$ sct 8000\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/sct/#man-sct\"\u003eman sct\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"man-sct\"\u003eman sct\u003c/h3\u003e\n\u003ch4 id=\"synopsis\"\u003eSynopsis\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esct\u003c/strong\u003e [temp] \u003cbr\u003e\n\u003cstrong\u003esct version\u003c/strong\u003e\u003c/p\u003e\n\u003ch4 id=\"description\"\u003eDescription\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esct\u003c/strong\u003e est un outil léger pour paramétrer la température de l\u0026rsquo;écran.\nSi l\u0026rsquo;argument optionnel \u003ccode\u003etemp\u003c/code\u003e est donné, la température de couleur est\nconfigurée à cette valeur.\u003c/p\u003e\n\u003cp\u003eLes arguments sont les suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etemp\u003c/code\u003e : optionnel, spécifie la température.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eversion\u003c/strong\u003e : affiche le numéro de \u003cstrong\u003eversion\u003c/strong\u003e et les informations de\ndroits d\u0026rsquo;auteur de sct sur la sortie standard, puis termine.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003esct\u003c/strong\u003e attend une valeur de température entre 1000 et 10000. La valeur\nde température par défaut est de 6500.\u003c/p\u003e\n\u003ch4 id=\"statut-de-sortie\"\u003eStatut de sortie\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;utilitaire \u003cstrong\u003esct\u003c/strong\u003e sort avec un code \u003ccode\u003e0\u003c/code\u003e en cas de succès, et un code\nsupérieur à 0 si une erreur existe.\u003c/p\u003e\n\u003ch4 id=\"exemples\"\u003eExemples\u003c/h4\u003e\n\u003cp\u003e⇒ Exécuter \u003cstrong\u003esct\u003c/strong\u003e pour régler la température de l\u0026rsquo;écran sur un style\n\u0026ldquo;feu de camp\u0026rdquo; : \u003ccode\u003e:$ sct 4500\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ Afficher les informations de version et de droits d\u0026rsquo;auteur de sct sur\nla sortie standard et sortir avec succès : \u003ccode\u003e:$ sct version\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"voir-aussi\"\u003eVoir aussi\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://man.openbsd.org/Xorg.1\" rel=\"external\"\u003eXorg(1)\u003c/a\u003e, \u003ca href=\"http://man.openbsd.org/xrandr.1\" rel=\"external\"\u003exrandr(1)\u003c/a\u003e, \u003ca href=\"http://man.openbsd.org/X.7\" rel=\"external\"\u003eX(7)\u003c/a\u003e, \u003ca href=\"http://man.openbsd.org/XStandards.7\" rel=\"external\"\u003eXStandards(7)\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"normes\"\u003eNormes\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;utilitaire \u003cstrong\u003esct\u003c/strong\u003e suit et utilise les normes XStandards(7).\u003c/p\u003e\n\u003ch4 id=\"histoire\"\u003eHistoire\u003c/h4\u003e\n\u003cp\u003eLa première version de l\u0026rsquo;utilitaire \u003cstrong\u003esct\u003c/strong\u003e est apparue en Novembre 2015\ndans l\u0026rsquo;article suivant : \\\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://www.tedunangst.com/flak/post/sct-set-color-temperature\" rel=\"external\"\u003ehttp://www.tedunangst.com/flak/post/sct-set-color-temperature\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"auteurs\"\u003eAuteurs\u003c/h4\u003e\n\u003cp\u003eL\u0026rsquo;utilitaire \u003cstrong\u003esct\u003c/strong\u003e a été écrit par Ted Unangst [[tedu@openbsd.org]],\npuis ensuite amélioré par Joerg Jung [[mail@umaxx.net]].\u003c/p\u003e\n\u003ch4 id=\"bogues\"\u003eBogues\u003c/h4\u003e\n\u003cp\u003e\u003cstrong\u003esct\u003c/strong\u003e arrondit les valeurs de température par palier de 500.\u003c/p\u003e\n\u003ch4 id=\"page-daccueil\"\u003ePage d\u0026rsquo;accueil\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://www.umaxx.net\" rel=\"external\"\u003ehttps://www.umaxx.net\u003c/a\u003e\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gérer la température de couleur de l'écran avec l'outil 'sct' sous OpenBSD",
            "tags": ["OpenBSD", "sct"],
            "date_published": "2020-01-19T05:11:23+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:66c5934f-b402-d384-59f7-70a94aa36712",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/mplayer/",
            "title": "MPlayer / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description MPlayer est un lecteur multimédias.\nIl peut vous faire écouter des fichiers au format MPEG/VOB, AVI, ASF/WMA/WMV, FLV, RM, QT/MOV/MP4, Ogg/OGM, MKV, VIVO, FLI, NuppelVideo, yuv4mpeg, FILM et RoQ. Mais vous pouvez aussi regarder des films au format VCD, SVCD, DVD, 3ivx, DivX 3/4/5, WMV, et même H.264.\nMPlayer prend en charge un grand nombre de sortie vidéos. Il fonctionne avec X11, Xv, OpenGL et en options AAlib ou SDL.\nSaveurs Voici les différentes saveurs de paquets MPlayer :\naa : active l\u0026rsquo;ASCII Art, et requiert la bibliothèque graphique aalib jack : active l\u0026rsquo;utilisation de jack, et requiert le paquet audio jack Installation Installez le paquet mplayer.\nUtilisation L\u0026rsquo;utilisation de l\u0026rsquo;interface graphique de MPlayer est dépréciée et n\u0026rsquo;est pas recommandée sur aucune des architectures supportées par OpenBSD. Elle n\u0026rsquo;est donc pas intégrée dans le paquet de MPlayer.\nUtilisez gnome-player ou smplayer à la place.\nMencoder n\u0026rsquo;est pas censé faire un bon travail de multiplexage avec des formats de conteneurs autres qu\u0026rsquo;AVI ou MPEG.\nConfiguration arm Il est possible de rencontrer des problèmes de lenteurs vidéo. Dans ce cas, vous pouvez désactiver la rotation de l\u0026rsquo;écran de X.org dans le fichier /etc/X11/xorg.conf.\nSelon votre configuration, vous pouvez passer les options -framedrop ou -hardframedrop à l\u0026rsquo;usage de mplayer.\ni386 Puisque les codecs open source sont de bonne qualité, à l\u0026rsquo;heure actuelle, les codecs Win32 sont maintenant désactivés.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMPlayer\u003c/strong\u003e est un lecteur multimédias.\u003c/p\u003e\n\u003cp\u003eIl peut vous faire écouter des fichiers au format MPEG/VOB, AVI,\nASF/WMA/WMV, FLV, RM, QT/MOV/MP4, Ogg/OGM, MKV, VIVO, FLI, NuppelVideo,\nyuv4mpeg, FILM et RoQ. Mais vous pouvez aussi regarder des films au\nformat VCD, SVCD, DVD, 3ivx, DivX 3/4/5, WMV, et même H.264.\u003c/p\u003e\n\u003cp\u003eMPlayer prend en charge un grand nombre de sortie vidéos. Il fonctionne\navec X11, Xv, OpenGL et en options AAlib ou SDL.\u003c/p\u003e\n\u003ch3 id=\"saveurs\"\u003eSaveurs\u003c/h3\u003e\n\u003cp\u003eVoici les différentes saveurs de paquets MPlayer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eaa\u003c/code\u003e : active l\u0026rsquo;ASCII Art, et requiert la bibliothèque graphique \u003cstrong\u003eaalib\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ejack\u003c/code\u003e : active l\u0026rsquo;utilisation de jack, et requiert le paquet audio \u003cstrong\u003ejack\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003emplayer\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eL\u0026rsquo;utilisation de \u003cstrong\u003el\u0026rsquo;interface graphique de MPlayer est dépréciée\u003c/strong\u003e\net n\u0026rsquo;est pas recommandée sur aucune des architectures supportées par\nOpenBSD. Elle n\u0026rsquo;est donc \u003cstrong\u003epas intégrée dans le paquet de MPlayer\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eUtilisez gnome-player ou smplayer à la place.\u003c/p\u003e\n\u003cp\u003eMencoder n\u0026rsquo;est pas censé faire un bon travail de multiplexage avec des\nformats de conteneurs autres qu\u0026rsquo;AVI ou MPEG.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"arm\"\u003earm\u003c/h3\u003e\n\u003cp\u003eIl est possible de rencontrer des problèmes de lenteurs vidéo. Dans ce\ncas, vous pouvez désactiver la rotation de l\u0026rsquo;écran de X.org dans le\nfichier \u003ccode\u003e/etc/X11/xorg.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSelon votre configuration, vous pouvez passer les options \u003ccode\u003e-framedrop\u003c/code\u003e\nou \u003ccode\u003e-hardframedrop\u003c/code\u003e à l\u0026rsquo;usage de mplayer.\u003c/p\u003e\n\u003ch3 id=\"i386\"\u003ei386\u003c/h3\u003e\n\u003cp\u003ePuisque les codecs open source sont de bonne qualité, à l\u0026rsquo;heure actuelle,\nles codecs Win32 sont maintenant désactivés.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le lecteur multimédia MPlayer sous OpenBSD",
            "tags": ["OpenBSD", "MPlayer"],
            "date_published": "2020-01-19T05:05:51+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:c04a8523-2865-0fa1-3ee1-d2a59fe0494b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/lumina/",
            "title": "Lumina (environnement de bureau graphique) / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Le bureau Lumina !\nPage du projet : https://lumina-desktop.org\nInstallation Installez le paquet lumina.\nConfiguration Gestionnaire de connexion Fichier ~/.xsession Disponible à partir d\u0026rsquo;OpenBSD 6.1 !\nCréer/modifier le fichier de session ~/.xsession, et y ajouter à minima :\n#!/bin/sh PATH=$PATH:/usr/local/bin start-lumina-desktop AstuceIl semble que l\u0026rsquo;ajout du PATH soit nécessaire pour le démarrage par le biais de xenodm ! Pensez à redémarrer le service xenodm !\nImpression Merci de lire notre page du service cups , pour configurer correctement la gestion de l\u0026rsquo;impression ;)\nRéseau Samba Pour l\u0026rsquo;instant, cela ne semble pas possible !\nUSB Il faut plutôt s\u0026rsquo;inspirer d\u0026rsquo;une des méthodes fournies dans notre page \u0026ldquo;[[tutoriel:openbsd-mount-usb|Monter un disque / une clé USB en tant qu’utilisateur]]\u0026rdquo; ;-)\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe bureau \u003cstrong\u003eLumina\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003ePage du projet : \u003ca href=\"https://lumina-desktop.org\" rel=\"external\"\u003ehttps://lumina-desktop.org\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003elumina\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"gestionnaire-de-connexion\"\u003eGestionnaire de connexion\u003c/h3\u003e\n\u003ch4 id=\"fichier-xsession\"\u003eFichier \u003ccode\u003e~/.xsession\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003eDisponible à partir d\u0026rsquo;OpenBSD 6.1 !\u003c/p\u003e\n\u003cp\u003eCréer/modifier le fichier de session \u003ccode\u003e~/.xsession\u003c/code\u003e, et y ajouter à minima :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ePATH\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e$PATH:/usr/local/bin start-lumina-desktop\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eIl semble que l\u0026rsquo;ajout du PATH soit nécessaire pour le démarrage par le\nbiais de xenodm !\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003ePensez à \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#red%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eredémarrer le service\u003c/a\u003e\n\n\u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/xenodm/\" title=\"Lien interne vers l\u0026#39;article : 'xenodm : Gestionnaire de sessions X pour OpenBSD'\"\u003exenodm\u003c/a\u003e\n\u003c/code\u003e !\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"impression\"\u003eImpression\u003c/h3\u003e\n\u003cp\u003eMerci de lire notre page du service \u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003ecups\u003c/a\u003e\n,\npour configurer correctement la gestion de l\u0026rsquo;impression ;)\u003c/p\u003e\n\u003ch3 id=\"réseau\"\u003eRéseau\u003c/h3\u003e\n\u003ch4 id=\"samba\"\u003eSamba\u003c/h4\u003e\n\u003cp\u003ePour l\u0026rsquo;instant, cela ne semble pas possible !\u003c/p\u003e\n\u003ch3 id=\"usb\"\u003eUSB\u003c/h3\u003e\n\u003cp\u003eIl faut plutôt s\u0026rsquo;inspirer d\u0026rsquo;une des méthodes fournies dans notre page\n\u0026ldquo;\u003cstrong\u003e[[tutoriel:openbsd-mount-usb|Monter un disque / une clé USB en tant qu’utilisateur]]\u003c/strong\u003e\u0026rdquo; ;-)\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le bureau graphique nommé 'Lumina' sous OpenBSD",
            "tags": ["OpenBSD", "Lumina"],
            "date_published": "2020-01-19T04:52:52+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:a2d825bf-7b9e-65df-7707-08187fe6a648",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/intel/",
            "title": "Gestion intel (pilote graphique)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Configuration Le fichier de config /etc/X11/xorg.conf n\u0026rsquo;existe pas, par défaut ! Il faut le créer !!!\nmachdep.allowaperture Quand ajouter l\u0026rsquo;option machdep.allowaperture ?\nSi le log du serveur X vous informe du message suivant :\n$ head /var/log/Xorg.0.log [ 33.839] (WW) checkDevMem: failed to open /dev/xf86 and /dev/mem (Operation not permitted) Check that you have set \u0026#39;machdep.allowaperture=1\u0026#39; in /etc/sysctl.conf and reboot your machine refer to xf86(4) for details [ 33.839] linear framebuffer access unavailable [ 33.888] (--) Using wscons driver on /dev/ttyC4 [ 33.997] X.Org X Server 1.19.6 Release Date: 2017-12-20 Donc, comme le dit le message d\u0026rsquo;avertissement, il est nécessaire d\u0026rsquo;éditer le fichier /etc/sysctl.conf et d\u0026rsquo;y ajouter la variable suivante : machdep.allowaperture=1, puis il faut redémarrer la machine - non, apparemment, redémarrer le serveur X ne suffit pas !\nAmélioration du tearing Si votre affichage vidéo saccade, vous souffrez de tearing.\nUne manière de le régler est d\u0026rsquo;ajouter à votre fichier /etc/X11/xorg.conf, les options suivantes, dans la Section \u0026quot;Device\u0026quot; :\nOption \u0026quot;TearFree\u0026quot;\t\u0026quot;true\u0026quot; - cette option principale est par défaut désactivée ; donc, il faut l\u0026rsquo;activer ! Option\t\u0026quot;SwapbuffersWait\u0026quot;\t\u0026quot;true\u0026quot; - normalement cette option est activée par défaut Option\t\u0026quot;VSync\u0026quot;\t\u0026quot;true\u0026quot; - normalement cette option est activée par défaut - elle gère, entres autres, le tearing vertical. Désactiver le compositeur Il peut être intéressant de désactiver l\u0026rsquo;extension du compositeur ; il faut donc rajouter la gestion de l\u0026rsquo;option Composite dans la Section \u0026quot;Extensions\u0026quot; - bien-sûr, si cette dernière n\u0026rsquo;existe pas dans votre fichier de config, créez-la, telle que :\nSection \u0026#34;Extensions\u0026#34; # fixes tearing with vdpau/vsync Option\t\u0026#34;Composite\u0026#34;\t\u0026#34;Disable\u0026#34; EndSection AttentionATTENTION : Si l\u0026rsquo;ensemble peut paraître plus fluide, il faut bien comprendre que cela désactive la gestion des ombrages de fenêtres, entres autres…\nDe même, il est possible que votre interface graphique vous semble moins \u0026ldquo;léché\u0026rdquo;.\nExemples de configuration AttentionATTENTION : Du fait, de l\u0026rsquo;activation de l\u0026rsquo;option \u0026ldquo;HotPlug\u0026rdquo;, dans la section \u0026ldquo;Device\u0026rdquo;, il n\u0026rsquo;est pas nécessaire de configurer certaines entrées, telles que celles pour le clavier, la souris, le touchpad, etc…\nces entrées seront détectées et configurées automatiquement !\nminimum pour le tearfree Section \u0026#34;Device\u0026#34; Identifier\t\u0026#34;intel\u0026#34;\tDriver\t\u0026#34;intel\u0026#34; Option\t\u0026#34;HotPlug\u0026#34;\t\u0026#34;true\u0026#34; Option \u0026#34;TearFree\u0026#34;\t\u0026#34;true\u0026#34;\t#false by default\t(avoid tearing) EndSection fichier de config fonctionnel AttentionL\u0026rsquo;exemple de fichier ci-dessous est configuré pour une haute résolution \u0026ldquo;1920x1080\u0026rdquo;\nASSUREZ-vous que votre écran et votre GPU soit capable de gérer celle-ci ; sinon, modifiez-le en conséquence !!! Si votre écran ou votre GPU n\u0026rsquo;est pas capable de gérer cette résolution, à minima le serveur X ne démarrera pas ; au pire, une mauvaise configuration peut endommager irrémédiablement votre matériel !\nPréférez commencer avec l\u0026rsquo;exemple de base ci-dessus !\nSection \u0026#34;Device\u0026#34; Identifier\t\u0026#34;intel\u0026#34;\t#modesetting, or Intel Graphics Driver\t\u0026#34;intel\u0026#34; #modesetting Option \u0026#34;AccelMethod\u0026#34;\t\u0026#34;sna\u0026#34;\t#sna by default Option\t\u0026#34;DDC\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default Option\t\u0026#34;DRI\u0026#34;\t\u0026#34;true\u0026#34; Option\t\u0026#34;HotPlug\u0026#34;\t\u0026#34;true\u0026#34; Option\t\u0026#34;NoAccel\u0026#34;\t\u0026#34;false\u0026#34;\t#false by default Option\t\u0026#34;RelaxedFencing\u0026#34;\t\u0026#34;true\u0026#34;\t#true if G33 Model \u0026amp; \u0026gt; Option\t\u0026#34;SwapbuffersWait\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default (avoid tearing) Option \u0026#34;TearFree\u0026#34;\t\u0026#34;true\u0026#34;\t#false by default\t(avoid tearing) Option\t\u0026#34;Throttle\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default Option\t\u0026#34;Tiling\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default Option\t\u0026#34;TripleBuffer\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default #Option\t\u0026#34;VideoRAM\u0026#34;\t??? Option\t\u0026#34;VSync\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default\t(avoid tearing) EndSection Section \u0026#34;Monitor\u0026#34; Identifier \u0026#34;Monitor0\u0026#34; EndSection Section \u0026#34;Screen\u0026#34; Identifier \u0026#34;Screen0\u0026#34; Device \u0026#34;intel\u0026#34; Monitor \u0026#34;Monitor0\u0026#34; DefaultDepth 24 #Choose the depth (16|24) SubSection \u0026#34;Display\u0026#34; Depth 16 Modes \u0026#34;1920x1080\u0026#34; \u0026#34;1400x1050\u0026#34; \u0026#34;1290X1024\u0026#34; \u0026#34;1280X960\u0026#34; \u0026#34;1024x768\u0026#34; \u0026#34;800x600\u0026#34; EndSubSection SubSection \u0026#34;Display\u0026#34; Depth 24 Modes\t\u0026#34;1920x1080\u0026#34; \u0026#34;1400x1050\u0026#34; \u0026#34;1290X1024\u0026#34; \u0026#34;1280X960\u0026#34; \u0026#34;1024x768\u0026#34; \u0026#34;800x600\u0026#34; EndSubSection EndSection Section \u0026#34;ServerLayout\u0026#34; Identifier \u0026#34;Default Layout\u0026#34; Screen \u0026#34;Screen0\u0026#34; EndSection Documentation le [[http://man.openbsd.org/intel.4|manpage intel(4)]]… le [[http://man.openbsd.org/inteldrm.4|manpage inteldrm(4)]] Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eLe fichier de config \u003ccode\u003e/etc/X11/xorg.conf\u003c/code\u003e n\u0026rsquo;existe pas, par défaut ! \u003cbr\u003e\nIl faut le créer !!!\u003c/strong\u003e\u003c/p\u003e\n\u003ch3 id=\"machdepallowaperture\"\u003emachdep.allowaperture\u003c/h3\u003e\n\u003cp\u003eQuand ajouter l\u0026rsquo;option \u003ccode\u003emachdep.allowaperture\u003c/code\u003e ?\u003c/p\u003e\n\u003cp\u003eSi le log du serveur X vous informe du message suivant :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-log\" data-lang=\"log\"\u003e$ head /var/log/Xorg.0.log\n[    33.839] (WW) checkDevMem: failed to open /dev/xf86 and /dev/mem\n        (Operation not permitted)\n        Check that you have set \u0026#39;machdep.allowaperture=1\u0026#39;\n        in /etc/sysctl.conf and reboot your machine\n        refer to xf86(4) for details\n[    33.839]    linear framebuffer access unavailable\n[    33.888] (--) Using wscons driver on /dev/ttyC4\n[    33.997] \nX.Org X Server 1.19.6\nRelease Date: 2017-12-20\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDonc, comme le dit le message d\u0026rsquo;avertissement, il est nécessaire\nd\u0026rsquo;éditer le fichier \u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e et d\u0026rsquo;y ajouter la variable\nsuivante : \u003ccode\u003emachdep.allowaperture=1\u003c/code\u003e, puis il faut redémarrer la machine\n- non, apparemment, redémarrer le serveur X ne suffit pas !\u003c/p\u003e\n\u003ch3 id=\"amélioration-du-tearing\"\u003eAmélioration du tearing\u003c/h3\u003e\n\u003cp\u003eSi votre affichage vidéo saccade, vous souffrez de \u003ccode\u003etearing\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eUne manière de le régler est d\u0026rsquo;ajouter à votre fichier \u003ccode\u003e/etc/X11/xorg.conf\u003c/code\u003e,\nles options suivantes, dans la \u003ccode\u003eSection \u0026quot;Device\u0026quot;\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eOption  \u0026quot;TearFree\u0026quot;\t\t\u0026quot;true\u0026quot;\u003c/code\u003e - cette \u003cstrong\u003eoption principale\u003c/strong\u003e est\npar défaut désactivée ; donc, \u003cstrong\u003eil faut l\u0026rsquo;activer\u003c/strong\u003e !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOption\t\u0026quot;SwapbuffersWait\u0026quot;\t\u0026quot;true\u0026quot;\u003c/code\u003e - normalement cette option est\nactivée par défaut\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eOption\t\u0026quot;VSync\u0026quot;\t\t\t\u0026quot;true\u0026quot;\u003c/code\u003e - normalement cette option est\nactivée par défaut - elle gère, entres autres, le \u003ccode\u003etearing vertical\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"désactiver-le-compositeur\"\u003eDésactiver le compositeur\u003c/h3\u003e\n\u003cp\u003eIl peut être intéressant de désactiver l\u0026rsquo;extension du compositeur ; il\nfaut donc rajouter la gestion de l\u0026rsquo;option \u003ccode\u003eComposite\u003c/code\u003e dans la\n\u003ccode\u003eSection \u0026quot;Extensions\u0026quot;\u003c/code\u003e\n- bien-sûr, si cette dernière n\u0026rsquo;existe pas dans votre fichier de config,\ncréez-la, telle que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSection \u0026#34;Extensions\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#776e71\"\u003e# fixes tearing with vdpau/vsync\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;Composite\u0026#34;\t\t\u0026#34;Disable\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEndSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Si l\u0026rsquo;ensemble peut paraître plus fluide, il faut bien\ncomprendre que cela désactive la gestion des ombrages de fenêtres,\nentres autres…\u003c/p\u003e\n\u003cp\u003eDe même, il est possible que votre interface graphique vous semble moins\n\u0026ldquo;léché\u0026rdquo;.\u003c/p\u003e\n\u003c/div\u003e\n\u003ch3 id=\"exemples-de-configuration\"\u003eExemples de configuration\u003c/h3\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Du fait, de l\u0026rsquo;activation de l\u0026rsquo;option \u0026ldquo;HotPlug\u0026rdquo;, dans la\nsection \u0026ldquo;Device\u0026rdquo;, il n\u0026rsquo;est pas nécessaire de configurer certaines entrées,\ntelles que celles pour le clavier, la souris, le touchpad, etc…\u003c/p\u003e\n\u003cp\u003eces entrées seront détectées et configurées automatiquement !\u003c/p\u003e\n\u003c/div\u003e\n\u003ch4 id=\"minimum-pour-le-tearfree\"\u003eminimum pour le tearfree\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSection \u0026#34;Device\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eIdentifier\t\u0026#34;intel\u0026#34;\t\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eDriver\t\u0026#34;intel\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;HotPlug\u0026#34;\t\t\u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;TearFree\u0026#34;\t\t\u0026#34;true\u0026#34;\t#false by default\t(avoid tearing)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEndSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"fichier-de-config-fonctionnel\"\u003efichier de config fonctionnel\u003c/h4\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eL\u0026rsquo;exemple de fichier ci-dessous est configuré pour une haute résolution\n\u0026ldquo;1920x1080\u0026rdquo;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eASSUREZ-vous que votre écran et votre GPU soit capable de gérer\ncelle-ci ; sinon, modifiez-le en conséquence !!!\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eSi votre écran ou votre GPU n\u0026rsquo;est pas capable de gérer cette résolution,\nà minima le serveur X ne démarrera pas ; au pire, une mauvaise\nconfiguration peut endommager irrémédiablement votre matériel !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003ePréférez commencer avec l\u0026rsquo;exemple de base ci-dessus !\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSection \u0026#34;Device\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eIdentifier\t\u0026#34;intel\u0026#34;\t#modesetting, or Intel Graphics\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eDriver\t\u0026#34;intel\u0026#34; #modesetting\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;AccelMethod\u0026#34;\t\u0026#34;sna\u0026#34;\t#sna by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;DDC\u0026#34;\t\t\t\u0026#34;true\u0026#34;\t#true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;DRI\u0026#34;\t\t\t\u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;HotPlug\u0026#34;\t\t\u0026#34;true\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;NoAccel\u0026#34;\t\t\u0026#34;false\u0026#34;\t#false by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;RelaxedFencing\u0026#34;\t\u0026#34;true\u0026#34;\t#true if G33 Model \u0026amp; \u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;SwapbuffersWait\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default (avoid tearing)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption  \u0026#34;TearFree\u0026#34;\t\t\u0026#34;true\u0026#34;\t#false by default\t(avoid tearing)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;Throttle\u0026#34;\t\t\u0026#34;true\u0026#34;\t#true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;Tiling\u0026#34;\t\t\u0026#34;true\u0026#34;\t#true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;TripleBuffer\u0026#34;\t\u0026#34;true\u0026#34;\t#true by default\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#776e71\"\u003e#Option\t\u0026#34;VideoRAM\u0026#34;\t\t???\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\t\u003cspan style=\"color:#06b6ef\"\u003eOption\t\u0026#34;VSync\u0026#34;\t\t\t\u0026#34;true\u0026#34;\t#true by default\t(avoid tearing)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEndSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSection \u0026#34;Monitor\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eIdentifier             \u0026#34;Monitor0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEndSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSection \u0026#34;Screen\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eIdentifier             \u0026#34;Screen0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eDevice                 \u0026#34;intel\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eMonitor                \u0026#34;Monitor0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eDefaultDepth           24 #Choose the depth (16|24)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eSubSection             \u0026#34;Display\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eDepth              16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eModes              \u0026#34;1920x1080\u0026#34; \u0026#34;1400x1050\u0026#34; \u0026#34;1290X1024\u0026#34; \u0026#34;1280X960\u0026#34; \u0026#34;1024x768\u0026#34; \u0026#34;800x600\u0026#34; \u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eEndSubSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eSubSection \u0026#34;Display\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eDepth        \t\t24\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eModes\t\t\t\t\u0026#34;1920x1080\u0026#34; \u0026#34;1400x1050\u0026#34; \u0026#34;1290X1024\u0026#34; \u0026#34;1280X960\u0026#34; \u0026#34;1024x768\u0026#34; \u0026#34;800x600\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eEndSubSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEndSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eSection \u0026#34;ServerLayout\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eIdentifier    \u0026#34;Default Layout\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eScreen        \u0026#34;Screen0\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eEndSection\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ele [[http://man.openbsd.org/intel.4|manpage intel(4)]]…\u003c/li\u003e\n\u003cli\u003ele [[http://man.openbsd.org/inteldrm.4|manpage inteldrm(4)]]\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Gestion du pilote logiciel Intel sous OpenBSD",
            "tags": ["OpenBSD", "intel"],
            "date_published": "2020-01-19T04:43:09+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:2294a0a3-b7be-7037-73c4-ebd1ee1baf98",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/gigolo/",
            "title": "Gigolo / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Gigolo est une interface graphique pour se connecter facilement à des systèmes de fichiers distants utilisant GIO/GVfs. Il permet de rapidement connecter/monter un système de fichiers distant et de gérer des signets à ce propos.\nGVfs est un système de fichiers virtuel dans l\u0026rsquo;espace utilisateur, succédant à GnomeVfs mais ne dépendant pas de Gnome lui-même. Il requiert seulement une version récente de GLib et un système DBus proprement paramétré. Il fournit alors les accès transparent à des ressources distantes, telles que des connexions FTP ou SFTP (SSH), SMB (partages Windows), ou des ressources spéciales telles que la Corbeille (trash://), la Gravure (burn://) ou même les accès à votre caméra/appareil photo digital (gphoto2://).\nInstallation Installez le paquet gigolo.\nConfiguration Dans un premier temps, le plus simple est de créer un ou plusieurs signets :\nCliquez sur le menu Éditer \u0026gt; Modifier les signets Ctrl+B… Cliquez sur le bouton [Ajouter] ; vous obtiendrez la fenêtre \u0026lsquo;Créer un signet\u0026rsquo;. Cela vous permettra de créer des signets pour un des services suivants :\nFTP Partage Windows (Samba) SSH Webdav Webdav (sécurisé) Donnez un nom à ce nouveau signet Choisissez le type de service Indiquez le serveur à contacter Indiquez le port du serveur à contacter Indiquez le dossier distant (optionnel) Indiquez votre nom d\u0026rsquo;utilisateur : c\u0026rsquo;est votre identifiant nécessaire vers le service, si besoin. Documentation Retrouvez de la documentation dans /usr/local/share/doc/gigolo/.\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://www.uvena.de/gigolo/\" rel=\"external\"\u003eGigolo\u003c/a\u003e\u003c/strong\u003e est une interface graphique\npour se connecter facilement à des systèmes de fichiers distants utilisant\nGIO/GVfs. Il permet de rapidement connecter/monter un système de fichiers\ndistant et de gérer des signets à ce propos.\u003c/p\u003e\n\u003cp\u003eGVfs est un système de fichiers virtuel dans l\u0026rsquo;espace utilisateur,\nsuccédant à GnomeVfs mais ne dépendant pas de Gnome lui-même. Il requiert\nseulement une version récente de GLib et un système \u003ca class=\"inside\" href=\"/fr/sys/openbsd/dbus/\" title=\"Lien interne vers l\u0026#39;article : 'D-Bus [système de bus de messages] / OpenBSD'\"\u003eDBus\u003c/a\u003e\n\nproprement paramétré. Il fournit alors les accès transparent à des\nressources distantes, telles que des connexions FTP ou SFTP \u003cem\u003e(SSH)\u003c/em\u003e,\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/samba/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Introduction à Samba'\"\u003eSMB\u003c/a\u003e\n \u003cem\u003e(partages Windows)\u003c/em\u003e, ou\ndes ressources spéciales telles que la Corbeille \u003cem\u003e(trash://)\u003c/em\u003e, la Gravure\n\u003cem\u003e(burn://)\u003c/em\u003e ou même les accès à votre caméra/appareil photo digital\n\u003cem\u003e(gphoto2://)\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003egigolo\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eDans un premier temps, le plus simple est de créer un ou plusieurs signets :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCliquez sur le menu \u003cstrong\u003e\u003cu\u003eÉ\u003c/u\u003editer \u0026gt; \u003cu\u003eM\u003c/u\u003eodifier les signets Ctrl+B\u003c/strong\u003e…\u003c/li\u003e\n\u003cli\u003eCliquez sur le bouton [A\u003cu\u003ej\u003c/u\u003eouter] ; vous obtiendrez la fenêtre\n\u0026lsquo;Créer un signet\u0026rsquo;.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCela vous permettra de créer des signets pour un des services suivants :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eFTP\u003c/li\u003e\n\u003cli\u003ePartage Windows (Samba)\u003c/li\u003e\n\u003cli\u003eSSH\u003c/li\u003e\n\u003cli\u003eWebdav\u003c/li\u003e\n\u003cli\u003eWebdav (sécurisé)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003eDonnez un nom à ce nouveau signet\u003c/li\u003e\n\u003cli\u003eChoisissez le type de service\u003c/li\u003e\n\u003cli\u003eIndiquez le serveur à contacter\u003c/li\u003e\n\u003cli\u003eIndiquez le port du serveur à contacter\u003c/li\u003e\n\u003cli\u003eIndiquez le dossier distant (optionnel)\u003c/li\u003e\n\u003cli\u003eIndiquez votre nom d\u0026rsquo;utilisateur : c\u0026rsquo;est votre identifiant nécessaire\nvers le service, si besoin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eRetrouvez de la documentation dans \u003ccode\u003e/usr/local/share/doc/gigolo/\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le logiciel nommé 'Gigolo' pour vous connecter à des systèmes de fichiers distants, sous OpenBSD",
            "tags": ["OpenBSD", "Gigolo", "GVfs"],
            "date_published": "2020-01-19T04:33:51+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:ee89ddd0-4af6-617a-6ace-219f6c7224e2",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/dbus/",
            "title": "D-Bus [système de bus de messages] / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description D-Bus est un système de bus de messages. C\u0026rsquo;est un moyen simple pour permettre aux applications de discuter entre elles.\nEn plus de la communication inter-processus (IPC), D-Bus aide à coordonner le cycle de vie des processus ; il est ainsi plus simple et fiable de coder une \u0026ldquo;instance unique\u0026rdquo; d\u0026rsquo;une application ou d\u0026rsquo;un service (daemon) et à exécuter les applications et services à la demande, lorsque leurs services sont requis.\nInstallation Installez le paquet dbus et ensuite, activez les services apmd et messagebus et démarrez -les. Configuration InfoCertains gestionnaires de sessions, tel que Gnome , gèrent D-Bus toujours de manière pratique automatiquement !\nLes modifications suivantes ne seront donc pas prises en compte !!!\nPour démarrer une instance du service de D-Bus, il faut ajouter le code suivant à votre script gérant votre session X, avant le démarrage de gestionnaire de fenêtre :\nFichier ~/.xinitrc Pour rappel, ce fichier sert à démarrer un environnement de bureau depuis votre session locale, sans exécution d\u0026rsquo;un gestionnaire d\u0026rsquo;affichage :\nif [ -x /usr/local/bin/dbus-launch -a -z \u0026#34;${DBUS_SESSION_BUS_ADDRESS}\u0026#34; ]; then eval `dbus-launch --sh-syntax --exit-with-session` fi Fichier ~/.xsession Pour rappel, ce fichier est à utiliser en relation avec un gestionnaire d\u0026rsquo;affichage, tel xenodm :\nif [ -x /usr/local/bin/dbus-launch -a -z \u0026#34;${DBUS_SESSION_BUS_ADDRESS}\u0026#34; ]; then eval `dbus-launch --sh-syntax --exit-with-x11` fi Documentation N\u0026rsquo;oubliez pas de lire le fichier /usr/local/share/doc/pkg-readmes/dbus\nVous pouvez aussi lire :\nla documentation à-propos : /usr/local/share/doc/dbus/ et des exemples depuis /usr/local/share/examples/dbus/, voire /usr/local/share/examples/dbus-glib/ Historique J\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"http://dbus.freedesktop.org/\" rel=\"external\"\u003eD-Bus\u003c/a\u003e\u003c/strong\u003e est un système de bus de messages.\nC\u0026rsquo;est un moyen simple pour permettre aux applications de discuter entre elles.\u003c/p\u003e\n\u003cp\u003eEn plus de la communication inter-processus (IPC), D-Bus aide à coordonner\nle cycle de vie des processus ; il est ainsi plus simple et fiable de\ncoder une \u0026ldquo;instance unique\u0026rdquo; d\u0026rsquo;une application ou d\u0026rsquo;un service (daemon)\net à exécuter les applications et services à la demande, lorsque leurs\nservices sont requis.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n\nle paquet \u003ccode\u003edbus\u003c/code\u003e\u003c/strong\u003e et ensuite,\u003c/li\u003e\n\u003cli\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#activer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003eactivez les services\u003c/a\u003e\n\n\u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/apm/\" title=\"Lien interne vers l\u0026#39;article : 'Apm : Programme de contrôle de la gestion de l\u0026#39;énergie et de l\u0026#39;hibernation'\"\u003eapmd\u003c/a\u003e\n\u003c/code\u003e et\n\u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/consolekit/\" title=\"Lien interne vers l\u0026#39;article : 'Consolekit2 (bus de messages) / OpenBSD'\"\u003emessagebus\u003c/a\u003e\n\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet \u003ca class=\"inside\" href=\"/fr/sys/openbsd/rcctl/#d%c3%a9marrer\" title=\"Lien interne vers l\u0026#39;article : 'rcctl : configurer et contrôler les services sous OpenBSD'\"\u003edémarrez\u003c/a\u003e\n-les.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eCertains gestionnaires de sessions, tel que \u003ca class=\"inside\" href=\"/fr/sys/openbsd/gnome/\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Utiliser Gnome'\"\u003eGnome\u003c/a\u003e\n,\ngèrent D-Bus toujours de manière pratique automatiquement !\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eLes modifications suivantes ne seront donc pas prises en compte !!!\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003ePour démarrer une instance du service de D-Bus, il faut ajouter le code\nsuivant à votre script gérant votre session X, avant le démarrage de\ngestionnaire de fenêtre :\u003c/p\u003e\n\u003ch3 id=\"fichier-xinitrc\"\u003eFichier \u003ccode\u003e~/.xinitrc\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003ePour rappel, ce fichier sert à démarrer un environnement de bureau\ndepuis votre session locale, sans exécution d\u0026rsquo;un gestionnaire d\u0026rsquo;affichage :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -x /usr/local/bin/dbus-launch -a -z \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eDBUS_SESSION_BUS_ADDRESS\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\teval \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003edbus-launch --sh-syntax --exit-with-session\u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"fichier-xsession\"\u003eFichier \u003ccode\u003e~/.xsession\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003ePour rappel, ce fichier est à utiliser en relation avec un gestionnaire\nd\u0026rsquo;affichage, tel \u003ca class=\"inside\" href=\"/fr/sys/openbsd/xenodm/\" title=\"Lien interne vers l\u0026#39;article : 'xenodm : Gestionnaire de sessions X pour OpenBSD'\"\u003exenodm\u003c/a\u003e\n :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif [ -x /usr/local/bin/dbus-launch -a -z \u0026#34;${DBUS_SESSION_BUS_ADDRESS}\u0026#34; ]; then\n\teval `dbus-launch --sh-syntax --exit-with-x11`\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de lire le fichier \u003ccode\u003e/usr/local/share/doc/pkg-readmes/dbus\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVous pouvez aussi lire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela documentation à-propos : \u003ccode\u003e/usr/local/share/doc/dbus/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet des exemples depuis \u003ccode\u003e/usr/local/share/examples/dbus/\u003c/code\u003e,\nvoire \u003ccode\u003e/usr/local/share/examples/dbus-glib/\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le système de bus de messages sous OpenBSD, nommé 'dbus'.",
            "tags": ["OpenBSD", "dbus"],
            "date_published": "2020-01-19T04:23:24+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:43234f45-3924-1f5b-d76d-ffc96d3ef8b8",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/cwm/",
            "title": "cwm (gestionnaire de fenêtres) / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description cwm est un gestionnaire de fenêtres, léger et efficace, présent par défaut dans OpenBSD.\nUtilisation Si vous utilisez le gestionnaire de connexion xenodm , présent par défaut lui-aussi, vous pouvez démarrer cwm en l\u0026rsquo;appelant dans le fichier ~/.xsession :\nxsetroot -solid steelblue \u0026amp; # feh --bg-scale /Images/background.jpg cwm La première ligne permet de définir une couleur de fond. Vous pouvez la remplacer par la seconde actuellement commentée afin de définir un fond d\u0026rsquo;écran à partir d\u0026rsquo;une image.\nPrise en main cwm peut se contrôler aussi bien avec le clavier que la souris.\nPar la suite, nous utiliserons les mêmes abréviations que dans le fichier de configuration, à savoir :\nC : Ctrl M : Alt S : Shift 4 : Touche \u0026ldquo;windows\u0026rdquo; Pour déplacer une fenêtre, il faut maintenir M appuyé puis glisser-déposer avec la souris.\nPour la redimensionner, c\u0026rsquo;est avec un clic-milieu.\nUn clic-gauche sur le bureau vous affiche la liste des fenêtres ouverts.\nUn clic-milieu affiche la liste des groupes de fenêtres (sortes d\u0026rsquo;espace de travail).\nUn clic-droit affiche le menu des applications que vous aurez configuré dans le fichier de configuration.\nLes raccourcis claviers par défaut sont (non-exhaustif) :\nM-? : invite de commande pour lancer un programme. CM-Entrée : ouvre un terminal. CM-Suppr : verrouille la session. M-Tab : circule entre les fenêtres. M-/ : recherche une fenêtre. Appuyez ensuite sur C-a pour les lister toutes. CM-x : ferme la fenêtre. CM-f : met la fenêtre en plein écran. CM-=, CMS-=, CM-m : respectivement, maximise la fenêtre verticalement, horizontalement et totalement. CMS-r : relance cwm CMS-q : quitte cwm Configuration Fichier ~/.cwmrc La configuration de cwm se déroule en éditant un fichier .cwmrc dans votre dossier personnel : ~/.cwmrc\nVous pouvez y définir notamment :\nApparence borderwidth 2 # Épaisseur des bordures color activeborder \u0026#34;#2aa198\u0026#34; # Couleur des bordures des fenêtres sélectionnées color inactiveborder \u0026#34;002B36\u0026#34; # Couleur des bordures si la fenêtre est inactive gap 20 0 0 0 # je souhaite avoir une marge en haut de l\u0026#39;écran # de 20 pixels # Configuration de l\u0026#39;apparence des menus color font \u0026#34;#839496\u0026#34; # Couleur du texte color selfont \u0026#34;#eee\u0026#34; # Couleur du texte sélectionnée color menubg \u0026#34;#002b36\u0026#34; # Couleur d\u0026#39;arrière plan color menufg \u0026#34;#2aa198\u0026#34; # Couleur de bordure des éléments sélectionnées fontname \u0026#34;Hack:pixelsize=14\u0026#34; # La police des menus Commandes personnalisées # Les commandes terminal et de verouillage. # Autant utiliser les défauts d\u0026#39;OpenBSD command term st command lock \u0026#34;slock\u0026#34; # activer avec C-M-Suppr Menu par clic-droit command \u0026#34; Web \u0026#34; firefox command \u0026#34; Mail \u0026#34; thunderbird command \u0026#34; Files \u0026#34; pcmanfm command \u0026#34;\u0026gt;\u0026gt; next \u0026#34; \u0026#34;mpc next\u0026#34; command \u0026#34;\u0026lt;\u0026lt; prev \u0026#34; \u0026#34;mpc prev\u0026#34; command \u0026#34;|\u0026gt; toggle\u0026#34; \u0026#34;mpc toggle\u0026#34; command \u0026#34; top \u0026#34; \u0026#34;xterm -e top\u0026#34; Groupes automatiques Vous pouvez mettre des fenêtres directement dans certains groupes pour facilement vous y retrouver :\n# Groupes, à retrouver avec xprop # autogroup n \u0026#34;name,class\u0026#34; autogroup 2 \u0026#34;Navigator,Firefox\u0026#34; autogroup 3 \u0026#34;mutt,mutt\u0026#34; autogroup 3 \u0026#34;mutt,st-256color\u0026#34; Raccourcis clavier Les groupes facilement accessibles pour un clavier azerty Pour voir un groupe : M-n où n est le chiffre correspondant au groupe.\nSur un clavier azerty, c\u0026rsquo;est \u0026amp;é\u0026quot;\u0026rsquo;(…\nPour envoyer une fenêtre dans un groupe, c\u0026rsquo;est MS-n.\nbind-key M-ampersand group-only-1 bind-key M-eacute group-only-2 bind-key M-quotedbl group-only-3 bind-key M-apostrophe group-only-4 bind-key M-parenleft group-only-5 bind-key M-minus group-only-6 bind-key M-egrave group-only-7 bind-key M-underscore group-only-8 bind-key M-ccedilla group-only-9 bind-key M-agrave group-toggle-all # Déplacer les fenêtres dans un groupe bind-key MS-ampersand window-movetogroup-1 bind-key MS-eacute window-movetogroup-2 bind-key MS-quotedbl window-movetogroup-3 bind-key MS-apostrophe window-movetogroup-4 bind-key MS-parenleft window-movetogroup-5 bind-key MS-minus window-movetogroup-6 bind-key MS-egrave window-movetogroup-7 bind-key MS-underscore window-movetogroup-8 bind-key MS-ccedilla window-movetogroup-9 Agencement en tuile Ces raccourcis permettent d\u0026rsquo;agencer très rapidement les fenêtres en tuile pour occuper tout l\u0026rsquo;espace disponible (comme dwm)\n# Du tiling !!! bind-key M-t window-vtile bind-key M-Return window-vtile bind-key MS-t window-htile Raccourcis clavier personnels Vous pouvez lancer des commandes avec un raccourci clavier. Par exemple ceci ouvre firefox :\nbind-key M-w firefox Redimensionnement avec clic-droit Pour redimensionner avec le bouton droit de la souris, on peut désactiver le raccourci précédent :\n# Souris # Désactive le redimensionnement avec le clic milieu unbind-mouse M-2 # Alt+ clic droit redimensionne bind-mouse M-3 window-resize Documentations Manpages man cwm man cwmrc Historique Cette documentation a été écrite de manière collaborative sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003ecwm\u003c/strong\u003e est un gestionnaire de fenêtres, léger et efficace, présent par\ndéfaut dans OpenBSD.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eSi vous utilisez le gestionnaire de connexion \u003ca class=\"inside\" href=\"/fr/sys/openbsd/xenodm/\" title=\"Lien interne vers l\u0026#39;article : 'xenodm : Gestionnaire de sessions X pour OpenBSD'\"\u003exenodm\u003c/a\u003e\n,\nprésent par défaut lui-aussi, vous pouvez démarrer \u003ccode\u003ecwm\u003c/code\u003e en l\u0026rsquo;appelant\ndans le fichier \u003ccode\u003e~/.xsession\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003exsetroot -solid steelblue \u0026amp;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# feh --bg-scale /Images/background.jpg\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecwm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa première ligne permet de définir une couleur de fond. Vous pouvez la\nremplacer par la seconde actuellement commentée afin de définir un fond\nd\u0026rsquo;écran à partir d\u0026rsquo;une image.\u003c/p\u003e\n\u003ch3 id=\"prise-en-main\"\u003ePrise en main\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ecwm\u003c/code\u003e peut se contrôler aussi bien avec le clavier que la souris.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePar la suite, nous utiliserons les mêmes abréviations que dans le fichier\nde configuration, à savoir :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eC\u003c/code\u003e : Ctrl\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eM\u003c/code\u003e : Alt\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eS\u003c/code\u003e : Shift\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e4\u003c/code\u003e : Touche \u0026ldquo;windows\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePour déplacer une fenêtre, il faut maintenir M appuyé puis glisser-déposer\navec la souris.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePour la redimensionner, c\u0026rsquo;est avec un clic-milieu.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUn clic-gauche sur le bureau vous affiche la liste des fenêtres ouverts.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUn clic-milieu affiche la liste des groupes de fenêtres (sortes d\u0026rsquo;espace\nde travail).\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eUn clic-droit affiche le menu des applications que vous aurez configuré\ndans le fichier de configuration.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes raccourcis claviers par défaut sont (non-exhaustif) :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eM-?\u003c/code\u003e : invite de commande pour lancer un programme.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCM-Entrée\u003c/code\u003e : ouvre un terminal.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCM-Suppr\u003c/code\u003e : verrouille la session.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eM-Tab\u003c/code\u003e : circule entre les fenêtres.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eM-/\u003c/code\u003e : recherche une fenêtre. Appuyez ensuite sur C-a pour les lister\ntoutes.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCM-x\u003c/code\u003e : ferme la fenêtre.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCM-f\u003c/code\u003e : met la fenêtre en plein écran.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCM-=\u003c/code\u003e, \u003ccode\u003eCMS-=\u003c/code\u003e, \u003ccode\u003eCM-m\u003c/code\u003e : respectivement, maximise la fenêtre\nverticalement, horizontalement et totalement.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCMS-r\u003c/code\u003e : relance cwm\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCMS-q\u003c/code\u003e : quitte cwm\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"fichier-cwmrc\"\u003eFichier \u003ccode\u003e~/.cwmrc\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eLa configuration de cwm se déroule en éditant un fichier \u003ccode\u003e.cwmrc\u003c/code\u003e dans\nvotre dossier personnel : \u003ccode\u003e~/.cwmrc\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVous pouvez y définir notamment :\u003c/p\u003e\n\u003ch4 id=\"apparence\"\u003eApparence\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eborderwidth 2                  # Épaisseur des bordures\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecolor activeborder \u0026#34;#2aa198\u0026#34;   # Couleur des bordures des fenêtres sélectionnées\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecolor inactiveborder \u0026#34;002B36\u0026#34;  # Couleur des bordures si la fenêtre est inactive\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003egap 20 0 0 0                   # je souhaite avoir une marge en haut de l\u0026#39;écran\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                               \u003cspan style=\"color:#776e71\"\u003e# de 20 pixels\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Configuration de l\u0026#39;apparence des menus\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecolor font           \u0026#34;#839496\u0026#34; # Couleur du texte\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecolor selfont        \u0026#34;#eee\u0026#34;    # Couleur du texte sélectionnée\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecolor menubg         \u0026#34;#002b36\u0026#34; # Couleur d\u0026#39;arrière plan\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecolor menufg         \u0026#34;#2aa198\u0026#34; # Couleur de bordure des éléments sélectionnées\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003efontname \u0026#34;Hack:pixelsize\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e14\u0026#34;   # La police des menus\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"commandes-personnalisées\"\u003eCommandes personnalisées\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Les commandes terminal et de verouillage.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Autant utiliser les défauts d\u0026#39;OpenBSD\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand term st\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand lock \u0026#34;slock\u0026#34; # activer avec C-M-Suppr\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"menu-par-clic-droit\"\u003eMenu par clic-droit\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand \u0026#34;   Web   \u0026#34; firefox\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand \u0026#34;   Mail  \u0026#34; thunderbird\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand \u0026#34;  Files  \u0026#34; pcmanfm\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand \u0026#34;\u0026gt;\u0026gt; next  \u0026#34; \u0026#34;mpc next\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand \u0026#34;\u0026lt;\u0026lt; prev  \u0026#34; \u0026#34;mpc prev\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand \u0026#34;|\u0026gt; toggle\u0026#34; \u0026#34;mpc toggle\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ecommand \u0026#34;   top   \u0026#34; \u0026#34;xterm -e top\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"groupes-automatiques\"\u003eGroupes automatiques\u003c/h4\u003e\n\u003cp\u003eVous pouvez mettre des fenêtres directement dans certains groupes pour\nfacilement vous y retrouver :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Groupes, à retrouver avec xprop\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# autogroup n \u0026#34;name,class\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eautogroup 2 \u0026#34;Navigator,Firefox\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eautogroup 3 \u0026#34;mutt,mutt\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eautogroup 3 \u0026#34;mutt,st-256color\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"raccourcis-clavier\"\u003eRaccourcis clavier\u003c/h4\u003e\n\u003ch5 id=\"les-groupes-facilement-accessibles-pour-un-clavier-azerty\"\u003eLes groupes facilement accessibles pour un clavier azerty\u003c/h5\u003e\n\u003cp\u003ePour voir un groupe : \u003ccode\u003eM-n\u003c/code\u003e où \u003ccode\u003en\u003c/code\u003e est le chiffre correspondant au groupe.\u003c/p\u003e\n\u003cp\u003eSur un clavier azerty, c\u0026rsquo;est \u003ckbd\u003e\u0026amp;é\u0026quot;\u0026rsquo;(\u003c/kbd\u003e…\u003c/p\u003e\n\u003cp\u003ePour envoyer une fenêtre dans un groupe, c\u0026rsquo;est \u003ccode\u003eMS-n\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-ampersand        group-only-1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-eacute           group-only-2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-quotedbl         group-only-3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-apostrophe       group-only-4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-parenleft        group-only-5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-minus            group-only-6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-egrave           group-only-7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-underscore       group-only-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-ccedilla         group-only-9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-agrave           group-toggle-all\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Déplacer les fenêtres dans un groupe\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-ampersand        window-movetogroup-1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-eacute           window-movetogroup-2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-quotedbl         window-movetogroup-3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-apostrophe       window-movetogroup-4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-parenleft        window-movetogroup-5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-minus            window-movetogroup-6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-egrave           window-movetogroup-7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-underscore       window-movetogroup-8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-ccedilla         window-movetogroup-9\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch5 id=\"agencement-en-tuile\"\u003eAgencement en tuile\u003c/h5\u003e\n\u003cp\u003eCes raccourcis permettent d\u0026rsquo;agencer très rapidement les fenêtres en\ntuile pour occuper tout l\u0026rsquo;espace disponible (comme dwm)\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Du tiling !!!\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-t window-vtile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-Return window-vtile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key MS-t window-htile\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch5 id=\"raccourcis-clavier-personnels\"\u003eRaccourcis clavier personnels\u003c/h5\u003e\n\u003cp\u003eVous pouvez lancer des commandes avec un raccourci clavier. Par exemple\nceci ouvre firefox :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ebind-key M-w firefox\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"redimensionnement-avec-clic-droit\"\u003eRedimensionnement avec clic-droit\u003c/h4\u003e\n\u003cp\u003ePour redimensionner avec le bouton droit de la souris, on peut désactiver\nle raccourci précédent :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# Souris\n# Désactive le redimensionnement avec le clic milieu\nunbind-mouse M-2\n# Alt+ clic droit redimensionne\nbind-mouse M-3 window-resize\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://man.openbsd.org/cwm\" rel=\"external\"\u003eman cwm\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://man.openbsd.org/cwmrc\" rel=\"external\"\u003eman cwmrc\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eCette documentation a été écrite de manière collaborative\nsur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le gestionnaire de fenêtres nommé 'cwn' sous OpenBSD",
            "tags": ["OpenBSD", "cwm"],
            "date_published": "2020-01-19T04:11:24+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:04f29b23-ab9d-c3ff-a74d-2ccbd1ed6869",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/iridium/",
            "title": "Iridium / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Iridium est une libre, ouverte, et gratuite modification du code de la base du navigateur Chromium , avec de la confidentialité activée sur beaucoup de clés : la transmission automatique de requêtes partielles, les mots clés, la télémétrie aux services centralisant sont inhibés et exécutés que seulement avec le consentement.\nInstallation Installez le paquet iridium.\nConfiguration Extensions KeePassXC-Browser Depuis OpenBSD 6.6, le logiciel de confidentialité KeePassXC est installable.\nPour fonctionner correctement avec iridium, il est nécessaire d\u0026rsquo;installer le module KeePassXC-Browser.\nhttps://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk Lire la page KeePassXC pour avoir plus d\u0026rsquo;informations concernant le module KeePassXC-Browser Unveil et KeepassXC Proxy Ajouter au fichier de configuration unveil de iridium unveil.main :\n/usr/local/bin r /usr/local/bin/keepassxc-proxy rx Ainsi le proxy de KeePassXC pourra communiquer avec le module KeePassXC-Browser.\nSupport Pledge et Unveil iridium sur OpenBSD est sécurisé par pledge(2) et unveil(2) - afin de limiter les appels systèmes et les accès au système de fichier.\nRetrouvez ces fichiers dans le répertoire /etc/chromium et tout particulièrement :\n/etc/iridium/pledge.main /etc/iridium/unveil.main Dépannage Protonmail Si votre navigateur plante lorsque vous utilisez protonmail ou une autre bibliothèque de chiffrement javascript, dirigez-vous dans chrome://flags puis indiquez :\nExperimental Validate Asm.js and convert to WebAssembly when valid à false. Documentation Pas de fichier pkg_readme ! ;) Historique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIridium est une libre, ouverte, et gratuite modification du code de la\nbase du navigateur \u003ca class=\"inside\" href=\"/fr/sys/openbsd/chromium/\" title=\"Lien interne vers l\u0026#39;article : 'Chromium / OpenBSD'\"\u003eChromium\u003c/a\u003e\n,\navec de la confidentialité activée sur beaucoup de clés : la transmission\nautomatique de requêtes partielles, les mots clés, la télémétrie aux\nservices centralisant sont inhibés et exécutés que seulement avec le\nconsentement.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003eiridium\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"extensions\"\u003eExtensions\u003c/h3\u003e\n\u003ch4 id=\"keepassxc-browser\"\u003eKeePassXC-Browser\u003c/h4\u003e\n\u003cp\u003eDepuis OpenBSD 6.6, le logiciel de confidentialité\n\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/keepassxc/\" title=\"Lien interne vers l\u0026#39;article : 'KeepassXC : outil de gestion de données sensibles / OpenBSD'\"\u003eKeePassXC\u003c/a\u003e\n\u003c/strong\u003e est installable.\u003c/p\u003e\n\u003cp\u003ePour fonctionner correctement avec iridium, il est nécessaire\nd\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n le\nmodule \u003cstrong\u003eKeePassXC-Browser\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\" rel=\"external\"\u003ehttps://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLire la page \u003cstrong\u003eKeePassXC\u003c/strong\u003e pour avoir plus d\u0026rsquo;informations concernant le\nmodule \u003ca class=\"inside\" href=\"/fr/sys/openbsd/keepassxc/#keepassxc-browser\" title=\"Lien interne vers l\u0026#39;article : 'KeepassXC : outil de gestion de données sensibles / OpenBSD'\"\u003eKeePassXC-Browser\u003c/a\u003e\n\u003c/p\u003e\n\u003ch5 id=\"unveil-et-keepassxc-proxy\"\u003eUnveil et KeepassXC Proxy\u003c/h5\u003e\n\u003cp\u003eAjouter au \u003ca href=\"/fr/sys/openbsd/iridium/#unveil\"\u003efichier de configuration unveil\u003c/a\u003e de iridium \u003ccode\u003eunveil.main\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/usr/local/bin r\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/usr/local/bin/keepassxc-proxy rx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi le proxy de KeePassXC pourra communiquer avec le module\nKeePassXC-Browser.\u003c/p\u003e\n\u003ch3 id=\"support-pledge-et-unveil\"\u003eSupport Pledge et Unveil\u003c/h3\u003e\n\u003cp\u003eiridium sur OpenBSD est sécurisé par pledge(2) et unveil(2) - afin de\nlimiter les appels systèmes et les accès au système de fichier.\u003c/p\u003e\n\u003cp\u003eRetrouvez ces fichiers dans le répertoire \u003ccode\u003e/etc/chromium\u003c/code\u003e et tout particulièrement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/iridium/pledge.main\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/iridium/unveil.main\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"protonmail\"\u003eProtonmail\u003c/h3\u003e\n\u003cp\u003eSi votre navigateur plante lorsque vous utilisez protonmail ou une autre\nbibliothèque de chiffrement javascript, dirigez-vous dans \u003ccode\u003echrome://flags\u003c/code\u003e\npuis indiquez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eExperimental Validate Asm.js and convert to WebAssembly when valid\u003c/code\u003e à \u003ccode\u003efalse\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003ePas de fichier pkg_readme ! ;)\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Iridium : navigateur web open source, basé sur Chromium, sous OpenBSD",
            "tags": ["OpenBSD", "iridium", "Chromium"],
            "date_published": "2020-01-19T03:53:48+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:0c4f25a4-7d0f-b82b-d74b-5c57d06d0df2",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/firefox-esr/",
            "title": "Firefox ESR / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Firefox-esr est un navigateur web conforme aux normes, pleinement équipés, construit sur la base du code de Mozilla par des centaines de contributeurs dans le monde. Il est extensible à-travers des centaines d\u0026rsquo;extensions, contributions d\u0026rsquo;utilisateurs, et de fonctionnalités :\nNavigation par onglets améliorée, avec regroupement des onglets Navigation privée Vérification orthographique Suggestions de recherche Restauration de session Lecteurs Web (RSS) Titres en direct Recherche intégrée Signets en direct Bloqueur de Pop-up Protection contre le phishing Gestionnaire de Moteur de Recherche Installation Installez le paquet firefox-esr.\nConfiguration Accélération Graphique AttentionCes fonctionnalités ne sont utilisables qu\u0026rsquo;avec Firefox Quantum, et tout particulièrement à partir de la version 59.x !\nIl est important que votre architecture matérielle gère OpenGL 4, et WebGL 2 ; autrement, OUBLIEZ !\n⇒ Par défaut, l\u0026rsquo;accélération graphique OpenGL est désactivée. Il est possible de l\u0026rsquo;activer de deux manières :\nAjoutez à votre environnement la variable suivante : MOZ_ACCELERATED=1 L\u0026rsquo;autre moyen étant d\u0026rsquo;utiliser l\u0026rsquo;éditeur de configuration et de modifier la valeur binaire layers.acceleration.force-enable pour la positionner sur true. Pour vérifier le support, cherchez les champs HW_COMPOSITING et OPENGL_COMPOSITING dans la section Accélération graphique. ⇒ Pour activer le compositeur basé sur Rust, deux manières possibles :\nAjoutez à votre environnement la variable suivante : MOZ_WEBRENDER=1 L\u0026rsquo;autre moyen étant d\u0026rsquo;utiliser l\u0026rsquo;éditeur de configuration et de modifier la valeur binaire gfx.webrender.enabled pour la positionner sur true. Pour vérifier le support, cherchez le champ WEBRENDER dans la section Accélération graphique. InfoSi vous voulez avoir plus de détails, lisez : https://wiki.mozilla.org/Platform/GFX/Quantum_Render ! Anti-aliasing Pour désactiver l\u0026rsquo;anti-aliasing, il est nécessaire de créer la variable d\u0026rsquo;environnement suivante GDK_USE_XFT=0.\nD-Bus Pour une intégration propre avec les composants des environnements de bureau, Firefox-ESR a besoin d\u0026rsquo;une instance de D-Bus fonctionnelle.\nVeuillez lire D-Bus [système de bus de messages] / OpenBSD\nAudio, Vidéo HTML5 Pour ajouter le support audio et vidéo HTML5, installez le paquet ffmpeg .\nKerberosV Pour utiliser Firefox en mode KerberosV :\nil faut *installer le paquet \u0026ldquo;heimdal\u0026rdquo;**. puis configurer votre client Kerberos. ajouter à votre environnement la variable LD_LIBRARY_PATH=/usr/local/heimdal/lib ceci peut être fait de multiple façons, via le shell, via un script., ou modifier shlib_dirs dans le fichier /etc/rc.conf.local Si vous désirez spécifier l\u0026rsquo;usage de Kerberos en ciblant certains domaines, écrivez \u0026ldquo;about:config\u0026rdquo; dans la barre d\u0026rsquo;URL, puis modifiez la clé network.negotiate-auth.trusted-uris en ajoutant votre domaine, tel que : .example.com.\nLiens mailto À-propos de la gestion des liens mailto :\nÉcrivez \u0026ldquo;about:config\u0026rdquo; dans la barre d\u0026rsquo;URL, cherchez l\u0026rsquo;option network.protocol-handler.app.mailto. si elle existe, vérifiez le chemin absolu de votre client mail, tel que : /usr/local/bin/thunderbird sinon créez-la en ajoutant une \u0026ldquo;nouvelle chaîne\u0026rdquo; (new string) Support Pledge et Unveil Firefox sur OpenBSD est sécurisé par pledge(2) et unveil(2) - afin de limiter les appels systèmes et les accès au système de fichier.\nPar défaut, seuls les répertoires /tmp et ~/Downloads sont autorisés en écriture. De même, la lecture des fichiers locaux est autorisé en préfixant le chemin vers le fichier par file://.\nSi votre répertoire personnel ~/Downloads n\u0026rsquo;existe pas, créez-le puis relancez Firefox.\nDepuis OpenBSD 6.7 : unveil est activé par défaut présent depuis la version -current la précédant. Avant OpenBSD 6.7 : Par défaut, unveil est désactivé ! Les permissions pour chaque type de processus sont localisées par défaut dans des fichiers contenus dans etc/firefox qui est une copie de /usr/local/lib/firefox-esr/browser/defaults/preferences/ lors de l\u0026rsquo;installation.\nGestion MIME paquets tiers Du fait d\u0026rsquo;unveil(2), il est nécessaire de gérer finement les gestionnaires MIME.\nPar exemple pour permettre l\u0026rsquo;utilisation d\u0026rsquo;un lecteur PDF avec Firefox, il faut :\ndéclarer par défaut le lecteur PDF en tant gestionnaire MIME, tel que\npour xpdf : $ xdg-mime default xpdf.desktop application/pdf pour mupdf : $ xdg-mime default mupdf.desktop application/pdf modifier le fichier /etc/firefox-esr/unveil.main pour gérer les droits sur le binaire correspondant, tel que :\npour xpdf : /usr/local/bin/xpdf rx pour mupdf : /usr/local/bin/mupdf rx Ainsi vous pourrez lire le fichier PDF avec l\u0026rsquo;option \u0026ldquo;Ouvrir avec…\u0026rdquo;.\n$ xdg-mime query default application/pdf permet de connaître le lecteur PDF par défaut.\nWebRTC Le support des webcams est normalement géré par Firefox, qui par défaut a accès aux périphériques vidéo /dev/video et /dev/video0.\n⇒ OpenBSD ≥ 6.9 : Il faut aussi : - activer l\u0026rsquo;enregistrement vidéo - puis vérifier le support et accéder à la webcam - et pour finir l\u0026rsquo;enregistrement audio .\n⇒ OpenBSD ≥ 6.4 : Pour que la fonctionnalité WebRTC fonctionne correctement, il faut activer l\u0026rsquo;enregistrement audio .\nDépannage Firefox-esr a un comportement étrange Si Firefox-esr a un comportement étrange, essayez de créer un nouveau profil :\nsoit, vous redémarrez Firefox en mode console, en utilisant l\u0026rsquo;option -ProfileManager, puis vous cliquez sur [ Create Profile ] soit, vous écrivez \u0026ldquo;about:profiles\u0026rdquo; dans la barre d\u0026rsquo;URL, puis vous cliquez sur le bouton [ Créer un nouveau profile ] Firefox-esr ne démarre pas Si Firefox-esr ne démarre pas, essayez de le démarrer en mode console, avec l\u0026rsquo;option -safe-mode - cela aura pour effet d\u0026rsquo;essayer à le démarrer après avoir désactiver toutes vos extensions, vos thèmes.\nFirefox-esr et Firefox en même temps AttentionVous ne pouvez faire fonctionner les deux versions en même temps, si vous n\u0026rsquo;avez pas de profils d\u0026rsquo;exécution différents. Pour exécuter les deux versions en même temps, Firefox et celle-ci, vous devez créer des profils différents :\nPour firefox : firefox -p Pour firefox-esr : firefox-esr -p Il suffit de créer et d\u0026rsquo;attribuer un profil différent…\nImpression Êtes-vous sûr d\u0026rsquo;avoir installé le paquet Cups et son pendant gtk-+2 ou 3 ?!\nprefers-color-scheme Cette caractéristique de média CSS est fonctionnelle à partir de la v67.\nAttentionSi l\u0026rsquo;option de configuration de confidentialité relative à la prise d\u0026rsquo;empreinte privacy.resistFingerprinting est paramétrée sur true, la gestion de cette option ne fonctionnera pas ; ce sera le schéma light qui sera choisi par défaut. Documentation Après l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de lire le fichier /usr/local/share/doc/pkg-readmes/firefox-esr\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://www.mozilla.org/firefox/\" rel=\"external\"\u003eFirefox-esr\u003c/a\u003e\u003c/strong\u003e est un navigateur web\nconforme aux normes, pleinement équipés, construit sur la base du code\nde Mozilla par des centaines de contributeurs dans le monde. Il est\nextensible à-travers des centaines d\u0026rsquo;extensions, contributions\nd\u0026rsquo;utilisateurs, et de fonctionnalités :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNavigation par onglets améliorée, avec regroupement des onglets\u003c/li\u003e\n\u003cli\u003eNavigation privée\u003c/li\u003e\n\u003cli\u003eVérification orthographique\u003c/li\u003e\n\u003cli\u003eSuggestions de recherche\u003c/li\u003e\n\u003cli\u003eRestauration de session\u003c/li\u003e\n\u003cli\u003eLecteurs Web (RSS)\u003c/li\u003e\n\u003cli\u003eTitres en direct\u003c/li\u003e\n\u003cli\u003eRecherche intégrée\u003c/li\u003e\n\u003cli\u003eSignets en direct\u003c/li\u003e\n\u003cli\u003eBloqueur de Pop-up\u003c/li\u003e\n\u003cli\u003eProtection contre le phishing\u003c/li\u003e\n\u003cli\u003eGestionnaire de Moteur de Recherche\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003efirefox-esr\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"accélération-graphique\"\u003eAccélération Graphique\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eCes fonctionnalités ne sont utilisables qu\u0026rsquo;avec Firefox Quantum, et\ntout particulièrement à partir de la version 59.x !\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eIl est important que votre architecture matérielle gère\nOpenGL 4, et WebGL 2 ; autrement, OUBLIEZ !\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003e⇒ Par défaut, l\u0026rsquo;accélération graphique OpenGL est désactivée. Il est\npossible de l\u0026rsquo;activer de deux manières :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAjoutez à votre environnement la variable suivante : \u003ccode\u003eMOZ_ACCELERATED=1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;autre moyen étant d\u0026rsquo;utiliser l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox-esr/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e\net de modifier la valeur binaire \u003ccode\u003elayers.acceleration.force-enable\u003c/code\u003e\npour la positionner sur \u003ccode\u003etrue\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePour vérifier le \u003ca href=\"/fr/sys/openbsd/firefox-esr/#aboutsupport\"\u003esupport\u003c/a\u003e, cherchez les\nchamps \u003ccode\u003eHW_COMPOSITING\u003c/code\u003e et \u003ccode\u003eOPENGL_COMPOSITING\u003c/code\u003e dans la section\n\u003cstrong\u003eAccélération graphique\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e⇒ Pour activer le compositeur basé sur Rust, deux manières possibles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAjoutez à votre environnement la variable suivante : \u003ccode\u003eMOZ_WEBRENDER=1\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;autre moyen étant d\u0026rsquo;utiliser l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/firefox-esr/#aboutconfig\"\u003eéditeur de configuration\u003c/a\u003e\net de modifier la valeur binaire \u003ccode\u003egfx.webrender.enabled\u003c/code\u003e pour la\npositionner sur \u003ccode\u003etrue\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePour vérifier le \u003ca href=\"/fr/sys/openbsd/firefox-esr/#aboutsupport\"\u003esupport\u003c/a\u003e, cherchez le\nchamp \u003ccode\u003eWEBRENDER\u003c/code\u003e dans la section \u003cstrong\u003eAccélération graphique\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eSi vous voulez avoir plus de détails, lisez : \u003cbr\u003e\n\u003ca href=\"https://wiki.mozilla.org/Platform/GFX/Quantum_Render\" rel=\"external\"\u003ehttps://wiki.mozilla.org/Platform/GFX/Quantum_Render\u003c/a\u003e  !\u003c/div\u003e\n\n\u003ch3 id=\"anti-aliasing\"\u003eAnti-aliasing\u003c/h3\u003e\n\u003cp\u003ePour désactiver l\u0026rsquo;anti-aliasing, il est nécessaire de créer la variable\nd\u0026rsquo;environnement suivante \u003ccode\u003eGDK_USE_XFT=0\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"d-bus\"\u003eD-Bus\u003c/h3\u003e\n\u003cp\u003ePour une intégration propre avec les composants des environnements de\nbureau, Firefox-ESR a besoin d\u0026rsquo;une instance de D-Bus fonctionnelle.\u003c/p\u003e\n\u003cp\u003eVeuillez lire \u003ca class=\"inside\" href=\"/fr/sys/openbsd/dbus/\" title=\"Lien interne vers l\u0026#39;article : 'D-Bus [système de bus de messages] / OpenBSD'\"\u003eD-Bus [système de bus de messages] / OpenBSD\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"audio-vidéo-html5\"\u003eAudio, Vidéo HTML5\u003c/h3\u003e\n\u003cp\u003ePour \u003cstrong\u003eajouter le support audio et vidéo HTML5\u003c/strong\u003e,\n\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/ffmpeg/\" title=\"Lien interne vers l\u0026#39;article : 'FFmpeg / OpenBSD'\"\u003effmpeg\u003c/a\u003e\n\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch3 id=\"kerberosv\"\u003eKerberosV\u003c/h3\u003e\n\u003cp\u003ePour utiliser Firefox en mode KerberosV :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eil faut *\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n\nle paquet \u0026ldquo;heimdal\u0026rdquo;**.\u003c/li\u003e\n\u003cli\u003epuis configurer votre client Kerberos.\u003c/li\u003e\n\u003cli\u003eajouter à votre environnement la variable\n\u003ccode\u003eLD_LIBRARY_PATH=/usr/local/heimdal/lib\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003ececi peut être fait de multiple façons, via le shell, via un script.\u003c/em\u003e,\u003c/li\u003e\n\u003cli\u003eou modifier \u003ccode\u003eshlib_dirs\u003c/code\u003e dans le fichier \u003ccode\u003e/etc/rc.conf.local\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi vous désirez spécifier l\u0026rsquo;usage de Kerberos en ciblant certains domaines,\nécrivez \u0026ldquo;about:config\u0026rdquo; dans la barre d\u0026rsquo;URL, puis modifiez la clé\n\u003ccode\u003enetwork.negotiate-auth.trusted-uris\u003c/code\u003e en ajoutant votre domaine, tel que : \u003cbr\u003e\n\u003ccode\u003e.example.com\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"liens-mailto\"\u003eLiens mailto\u003c/h3\u003e\n\u003cp\u003eÀ-propos de la \u003cstrong\u003egestion des liens mailto\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eÉcrivez \u0026ldquo;about:config\u0026rdquo; dans la barre d\u0026rsquo;URL, cherchez l\u0026rsquo;option\n\u003ccode\u003enetwork.protocol-handler.app.mailto\u003c/code\u003e.\n\u003cul\u003e\n\u003cli\u003esi elle existe, vérifiez le chemin absolu de votre client mail,\ntel que : \u003ccode\u003e/usr/local/bin/thunderbird\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esinon créez-la en ajoutant une \u0026ldquo;nouvelle chaîne\u0026rdquo; (\u003ccode\u003enew string\u003c/code\u003e)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"support-pledge-et-unveil\"\u003eSupport Pledge et Unveil\u003c/h3\u003e\n\u003cp\u003eFirefox sur OpenBSD est sécurisé par pledge(2) et unveil(2) - afin de\nlimiter les appels systèmes et les accès au système de fichier.\u003c/p\u003e\n\u003cp\u003ePar défaut, seuls les répertoires \u003ccode\u003e/tmp\u003c/code\u003e et \u003ccode\u003e~/Downloads\u003c/code\u003e sont autorisés\nen écriture. De même, la lecture des fichiers locaux est autorisé en\npréfixant le chemin vers le fichier par \u003ccode\u003efile://\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSi votre répertoire personnel \u003ccode\u003e~/Downloads\u003c/code\u003e n\u0026rsquo;existe pas, créez-le puis\nrelancez Firefox.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eDepuis OpenBSD 6.7 : unveil est activé par défaut\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eprésent depuis la version -current la précédant\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eAvant OpenBSD 6.7 : Par défaut, unveil est désactivé !\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes permissions pour chaque type de processus sont localisées par défaut\ndans des fichiers contenus dans \u003ccode\u003eetc/firefox\u003c/code\u003e qui est une copie de\n\u003ccode\u003e/usr/local/lib/firefox-esr/browser/defaults/preferences/\u003c/code\u003e lors de\nl\u0026rsquo;installation.\u003c/p\u003e\n\u003ch4 id=\"gestion-mime-paquets-tiers\"\u003eGestion MIME paquets tiers\u003c/h4\u003e\n\u003cp\u003eDu fait d\u0026rsquo;unveil(2), il est nécessaire de gérer finement les gestionnaires\nMIME.\u003c/p\u003e\n\u003cp\u003ePar exemple pour permettre l\u0026rsquo;utilisation d\u0026rsquo;un lecteur PDF avec Firefox,\nil faut :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003edéclarer par défaut le lecteur PDF en tant gestionnaire MIME, tel que\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour xpdf : \u003ccode\u003e$ xdg-mime default xpdf.desktop application/pdf\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour mupdf : \u003ccode\u003e$ xdg-mime default mupdf.desktop application/pdf\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003emodifier le fichier \u003ccode\u003e/etc/firefox-esr/unveil.main\u003c/code\u003e pour gérer les droits\nsur le binaire correspondant, tel que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour xpdf : \u003ccode\u003e/usr/local/bin/xpdf rx\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour mupdf : \u003ccode\u003e/usr/local/bin/mupdf rx\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eAinsi vous pourrez lire le fichier PDF avec l\u0026rsquo;option \u0026ldquo;Ouvrir avec…\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003ccode\u003e$ xdg-mime query default application/pdf\u003c/code\u003e permet de connaître le lecteur\nPDF par défaut.\u003c/p\u003e\n\u003ch3 id=\"webrtc\"\u003eWebRTC\u003c/h3\u003e\n\u003cp\u003eLe support des webcams est normalement géré par Firefox, qui par défaut\na accès aux périphériques vidéo  \u003ccode\u003e/dev/video\u003c/code\u003e et \u003ccode\u003e/dev/video0\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eOpenBSD ≥ 6.9\u003c/strong\u003e : Il faut aussi :\n- activer l\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-video/#enregistrement-video\" title=\"Lien interne vers l\u0026#39;article : 'Gérer la vidéo sous OpenBSD'\"\u003eenregistrement vidéo\u003c/a\u003e\n\n- puis \u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-webcam/#enregistrement-video\" title=\"Lien interne vers l\u0026#39;article : 'Webcam / OpenBSD'\"\u003evérifier le support et accéder à la webcam\u003c/a\u003e\n\n- et pour finir l\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-audio/#enregistrement-audio\" title=\"Lien interne vers l\u0026#39;article : 'Gestion du Son / OpenBSD'\"\u003eenregistrement audio\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eOpenBSD ≥ 6.4\u003c/strong\u003e : Pour que la fonctionnalité WebRTC fonctionne\ncorrectement, il faut activer l\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-audio/#enregistrement-audio\" title=\"Lien interne vers l\u0026#39;article : 'Gestion du Son / OpenBSD'\"\u003eenregistrement audio\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"firefox-esr-a-un-comportement-étrange\"\u003eFirefox-esr a un comportement étrange\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSi Firefox-esr a un comportement étrange\u003c/strong\u003e, essayez de créer un\nnouveau profil :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esoit, vous redémarrez Firefox en mode console, en utilisant l\u0026rsquo;option\n\u003ccode\u003e-ProfileManager\u003c/code\u003e, puis vous cliquez sur [ Create Profile ]\u003c/li\u003e\n\u003cli\u003esoit, vous écrivez \u0026ldquo;about:profiles\u0026rdquo; dans la barre d\u0026rsquo;URL, puis vous\ncliquez sur le bouton [ Créer un nouveau profile ]\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"firefox-esr-ne-démarre-pas\"\u003eFirefox-esr ne démarre pas\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSi Firefox-esr ne démarre pas\u003c/strong\u003e, essayez de le démarrer en mode\nconsole, avec l\u0026rsquo;option \u003ccode\u003e-safe-mode\u003c/code\u003e\n- \u003cem\u003ecela aura pour effet d\u0026rsquo;essayer à le démarrer après avoir\ndésactiver toutes vos extensions, vos thèmes.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"firefox-esr-et-firefox-en-même-temps\"\u003eFirefox-esr et Firefox en même temps\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVous ne pouvez faire fonctionner les deux versions en même temps, si\nvous n\u0026rsquo;avez pas de profils d\u0026rsquo;exécution différents.\u003c/div\u003e\n\n\u003cp\u003ePour exécuter les deux versions en même temps,\n\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/firefox/\" title=\"Lien interne vers l\u0026#39;article : 'Firefox / OpenBSD'\"\u003eFirefox\u003c/a\u003e\n\u003c/strong\u003e et celle-ci,\nvous devez créer des profils différents :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour firefox : \u003ccode\u003efirefox -p\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour firefox-esr : \u003ccode\u003efirefox-esr -p\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl suffit de créer et d\u0026rsquo;attribuer un profil différent…\u003c/p\u003e\n\u003ch3 id=\"impression\"\u003eImpression\u003c/h3\u003e\n\u003cp\u003eÊtes-vous sûr d\u0026rsquo;avoir installé le paquet \u003ca class=\"inside\" href=\"/fr/sys/openbsd/cups/\" title=\"Lien interne vers l\u0026#39;article : 'Cups : Gestion de l\u0026#39;impression sous OpenBSD'\"\u003eCups\u003c/a\u003e\n\net son pendant gtk-+2 ou 3 ?!\u003c/p\u003e\n\u003ch3 id=\"prefers-color-scheme\"\u003eprefers-color-scheme\u003c/h3\u003e\n\u003cp\u003eCette \u003ca href=\"https://developer.mozilla.org/fr/docs/Web/CSS/@media/prefers-color-scheme\" rel=\"external\"\u003ecaractéristique de média CSS\u003c/a\u003e\nest fonctionnelle à partir de la v67.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eSi l\u0026rsquo;option de \u003ca href=\"/fr/sys/openbsd/firefox-esr/#aboutconfig\"\u003econfiguration\u003c/a\u003e de confidentialité relative à la\nprise d\u0026rsquo;empreinte \u003ccode\u003eprivacy.resistFingerprinting\u003c/code\u003e est paramétrée sur \u003ccode\u003etrue\u003c/code\u003e, la\ngestion de cette option ne fonctionnera pas ; ce sera le schéma \u003ccode\u003elight\u003c/code\u003e qui\nsera choisi par défaut.\u003c/div\u003e\n\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eAprès l\u0026rsquo;installation, n\u0026rsquo;oubliez pas de \u003cstrong\u003elire le fichier\u003c/strong\u003e\n\u003ccode\u003e/usr/local/share/doc/pkg-readmes/firefox-esr\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser le navigateur web Firefox ESR sous OpenBSD",
            "tags": ["OpenBSD", "Firefox"],
            "date_published": "2020-01-19T02:42:52+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:6e636415-3ab5-0c05-20db-66b59d73078a",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/chromium/",
            "title": "Chromium / OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Chromium et un projet open source de navigation qui vise à créer un moyen plus sûr, rapide et stable pour que tous les utilisateurs d’Internet puissent utiliser le Web.\nCertains utilisateurs préfèrent Chromium à Google Chrome car ils jugent inutiles ou néfastes les apports de Google Chrome par rapport à Chromium (en particulier les fonctionnalités de pistage télémétrie).\nMalgré tous les défaut en terme de vie privée qu\u0026rsquo;on peut tout de même attribuer à cette version libérée, il reste un navigateur très intéressant en terme de sécurité. De plus, l\u0026rsquo;équipe d\u0026rsquo;OpenBSD y a ajouté des fonctionnalités très intéressants, notamment le support de pledge et unveil.\nInstallation Installez le paquet chromium.\nConfiguration Confidentialité Dirigez-vous dans les préférences de chrome puis modifiez au moins les paramètres suivants : (utilisez la barre de recherche pour trouver facilement)\ndésactivez Connexion automatique Changez le moteur de recherche par défaut pour qwant ou duckduckgo désactivez Utiliser un service de prédiction afin de compléter les recherches et les URL saisies dans la barre d'adresse désactivez Utiliser un service de prédiction pour charger les pages plus rapidement désactivez Utiliser un service Web pour résoudre les erreurs de navigation désactivez Navigation sécurisée désactivez Contribuer à l'amélioration de la navigation sécurisée désactivez Envoyer une demande \u0026quot;Interdire le suivi\u0026quot; pendant la navigation. Ça ne vous rend que plus identifiable. désactivez Me proposer de traduire les pages qui sont écrites dans une langue que je ne connais pas désactivez Afficher des notifications lorsque de nouvelles imprimantes sont détectées sur le réseau désactivez Poursuivre l'exécution des applications en arrière-plan après la fermeture de Chromium activez Bloquer les cookies tiers Ensuite, configurez après avoir noté dans la barre d\u0026rsquo;URL : chrome://flags\nUI Layout for the browser's top chrome : Normal. Identity consistency between browser and cookie jar : Disabled pour éviter que Google vous connecte à un compte Chrome si vous vous connectez à un compte Google. SafeSearch URLs reporting : disabled Dark Mode C\u0026rsquo;est une fonctionnalité spécifique native à Chrome - qui ne tient pas compte des paramètres personnels de session utilisateur X !\nNécessite v78 ≥ : Il est possible d\u0026rsquo;activer le mode Dark en définissant l\u0026rsquo;URL suivante : chrome://flags/#enable-force-dark\nNe pas confondre avec le mode CSS prefers-color-scheme !\nprefers-color-scheme Ce mode est un mode de gestion de préférence du schéma de couleurs par le biais de la feuille CSS. Si le site web que vous visitez propose cette fonctionnalité, ce mode tient compte de vos préférences utilisateurs de votre session X. C\u0026rsquo;est \u0026ldquo;automatique\u0026rdquo;.\nNécessite v76 ≥ Extensions Les extensions suivantes semblent essentielles :\nμblock origin decentraleyes KeePassXC-Browser Depuis OpenBSD 6.6, le logiciel de confidentialité KeePassXC est installable.\nPour fonctionner correctement avec Chromium, il est nécessaire d\u0026rsquo;installer le module KeePassXC-Browser.\nhttps://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk Lire la page KeePassXC pour avoir plus d\u0026rsquo;informations concernant le module KeePassXC-Browser Unveil et KeepassXC Proxy Ajouter au fichier de configuration unveil de Chromium unveil.main :\n/usr/local/bin r /usr/local/bin/keepassxc-proxy rx Ainsi le proxy de KeePassXC pourra communiquer avec le module KeePassXC-Browser.\nSupport Pledge et Unveil Chromium sur OpenBSD est sécurisé par pledge(2) et unveil(2) - afin de limiter les appels systèmes et les accès au système de fichier.\npledge : tous les processus en bénéficient avec chromium afin de restreindre les droits de chromium. unveil : depuis OpenBSD 6.4, cette protection est activée par défaut ; par défaut, Chromium ne pourra lire et écrire que dans le dossier de téléchargements de l\u0026rsquo;utilisateur. Retrouvez ces fichiers dans le répertoire /etc/chromium et tout particulièrement :\n/etc/chromium/pledge.main /etc/chromium/unveil.main WebRTC Par défaut, Chromium a accès au périphérique /dev/video.\n⇒ OpenBSD ≥ 6.9 : Il faut aussi activer l\u0026rsquo;Gérer la vidéo sous OpenBSD !\n⇒ OpenBSD ≥ 6.4 : Pour que la fonctionnalité WebRTC fonctionne correctement, il faut activer l\u0026rsquo;Gestion du Son / OpenBSD.\nDépannage Protonmail Si votre navigateur plante lorsque vous utilisez protonmail ou une autre bibliothèque de chiffrement javascript, définissez l\u0026rsquo;URL chrome://flags puis indiquez :\nExperimental Validate Asm.js and convert to WebAssembly when valid à false. Zoom Activez la variable d\u0026rsquo;environnement : ENABLE_WASM=1\nHistorique J\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté \u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca href=\"https://www.chromium.org/\" rel=\"external\"\u003eChromium\u003c/a\u003e\u003c/strong\u003e et un projet open source de\nnavigation qui vise à créer un moyen plus sûr, rapide et stable pour que\ntous les utilisateurs d’Internet puissent utiliser le Web.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eCertains utilisateurs préfèrent Chromium à Google Chrome car ils jugent\ninutiles ou néfastes les apports de Google Chrome par rapport à Chromium\n\u003cem\u003e(en particulier les fonctionnalités de \u003cdel\u003epistage\u003c/del\u003e télémétrie)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eMalgré tous les défaut en terme de vie privée qu\u0026rsquo;on peut tout de même\nattribuer à cette version libérée, il reste un navigateur\n\u003ca href=\"https://marc.info/?l=openbsd-misc\u0026amp;m=152872551609819\u0026amp;w=2\" rel=\"external\"\u003etrès intéressant\u003c/a\u003e\nen terme de sécurité. De plus, l\u0026rsquo;équipe d\u0026rsquo;OpenBSD y a ajouté des\nfonctionnalités très intéressants, notamment le\n\u003ca href=\"/fr/sys/openbsd/chromium/#support-pledge-et-unveil\"\u003esupport de pledge et unveil\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n le\npaquet \u003ccode\u003echromium\u003c/code\u003e\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"confidentialité\"\u003eConfidentialité\u003c/h3\u003e\n\u003cp\u003eDirigez-vous dans les préférences de chrome puis modifiez au\n\u003ca href=\"https://www.c0ffee.net/blog/openbsd-on-a-laptop/#chromium\" rel=\"external\"\u003emoins les paramètres suivants\u003c/a\u003e : \u003cbr\u003e\n\u003cem\u003e(utilisez la barre de recherche pour trouver facilement)\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edésactivez \u003ccode\u003eConnexion automatique\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eChangez le moteur de recherche par défaut pour qwant ou duckduckgo\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003eUtiliser un service de prédiction afin de compléter les recherches et les URL saisies dans la barre d'adresse\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edésactivez  \u003ccode\u003eUtiliser un service de prédiction pour charger les pages plus rapidement\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003eUtiliser un service Web pour résoudre les erreurs de navigation\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003eNavigation sécurisée\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003eContribuer à l'amélioration de la navigation sécurisée\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003eEnvoyer une demande \u0026quot;Interdire le suivi\u0026quot; pendant la navigation\u003c/code\u003e. \u003cem\u003eÇa ne vous rend que plus identifiable\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003eMe proposer de traduire les pages qui sont écrites dans une langue que je ne connais pas\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003eAfficher des notifications lorsque de nouvelles imprimantes sont détectées sur le réseau\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edésactivez \u003ccode\u003ePoursuivre l'exécution des applications en arrière-plan après la fermeture de Chromium\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eactivez \u003ccode\u003eBloquer les cookies tiers\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEnsuite, configurez après avoir noté dans la barre d\u0026rsquo;URL : \u003ccode\u003echrome://flags\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eUI Layout for the browser's top chrome\u003c/code\u003e : \u003ccode\u003eNormal\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eIdentity consistency between browser and cookie jar\u003c/code\u003e :  \u003ccode\u003eDisabled\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003epour éviter que Google vous connecte à un compte Chrome si vous\nvous connectez à un compte Google\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eSafeSearch URLs reporting\u003c/code\u003e : \u003ccode\u003edisabled\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"dark-mode\"\u003eDark Mode\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est une fonctionnalité spécifique native à Chrome - \u003cem\u003equi ne tient pas\ncompte des paramètres personnels de session utilisateur X\u003c/em\u003e !\u003c/p\u003e\n\u003cp\u003eNécessite v78 ≥ : Il est possible d\u0026rsquo;activer le mode Dark en définissant\nl\u0026rsquo;URL suivante : \u003cbr\u003e\n\u003ccode\u003echrome://flags/#enable-force-dark\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eNe pas confondre avec le mode CSS\n\u003cstrong\u003e\u003ca href=\"/fr/sys/openbsd/chromium/#prefers-color-scheme\"\u003eprefers-color-scheme\u003c/a\u003e\u003c/strong\u003e !\u003c/p\u003e\n\u003ch3 id=\"prefers-color-scheme\"\u003eprefers-color-scheme\u003c/h3\u003e\n\u003cp\u003eCe mode est un mode de gestion de préférence du schéma de couleurs par\nle biais de la feuille CSS. Si le site web que vous visitez propose cette\nfonctionnalité, ce mode tient compte de vos préférences utilisateurs de\nvotre session X. C\u0026rsquo;est \u0026ldquo;automatique\u0026rdquo;.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNécessite v76 ≥\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"extensions\"\u003eExtensions\u003c/h3\u003e\n\u003cp\u003eLes extensions suivantes semblent essentielles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eμblock origin\u003c/li\u003e\n\u003cli\u003edecentraleyes\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"keepassxc-browser\"\u003eKeePassXC-Browser\u003c/h4\u003e\n\u003cp\u003eDepuis OpenBSD 6.6, le logiciel de confidentialité\n\u003cstrong\u003e\u003ca class=\"inside\" href=\"/fr/sys/openbsd/keepassxc/\" title=\"Lien interne vers l\u0026#39;article : 'KeepassXC : outil de gestion de données sensibles / OpenBSD'\"\u003eKeePassXC\u003c/a\u003e\n\u003c/strong\u003e est installable.\u003c/p\u003e\n\u003cp\u003ePour fonctionner correctement avec Chromium, il est nécessaire\nd\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003einstaller\u003c/a\u003e\n le\nmodule \u003cstrong\u003eKeePassXC-Browser\u003c/strong\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\" rel=\"external\"\u003ehttps://chrome.google.com/webstore/detail/keepassxc-browser/oboonakemofpalcgghocfoadofidjkkk\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLire la page \u003cstrong\u003eKeePassXC\u003c/strong\u003e pour avoir plus d\u0026rsquo;informations concernant le\nmodule \u003ca class=\"inside\" href=\"/fr/sys/openbsd/keepassxc/#keepassxc-browser\" title=\"Lien interne vers l\u0026#39;article : 'KeepassXC : outil de gestion de données sensibles / OpenBSD'\"\u003eKeePassXC-Browser\u003c/a\u003e\n\u003c/p\u003e\n\u003ch5 id=\"unveil-et-keepassxc-proxy\"\u003eUnveil et KeepassXC Proxy\u003c/h5\u003e\n\u003cp\u003eAjouter au \u003ca href=\"/fr/sys/openbsd/chromium/#unveil\"\u003efichier de configuration unveil\u003c/a\u003e de Chromium \u003ccode\u003eunveil.main\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ini\" data-lang=\"ini\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/usr/local/bin r\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/usr/local/bin/keepassxc-proxy rx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAinsi le proxy de KeePassXC pourra communiquer avec le module\nKeePassXC-Browser.\u003c/p\u003e\n\u003ch3 id=\"support-pledge-et-unveil\"\u003eSupport Pledge et Unveil\u003c/h3\u003e\n\u003cp\u003eChromium sur OpenBSD est sécurisé par pledge(2) et unveil(2) - afin de\nlimiter les appels systèmes et les accès au système de fichier.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epledge : tous les processus en bénéficient avec chromium afin de\nrestreindre les droits de chromium.\u003c/li\u003e\n\u003cli\u003eunveil : depuis OpenBSD 6.4, cette protection est activée par défaut ;\npar défaut, Chromium ne pourra lire et écrire que dans le dossier de\ntéléchargements de l\u0026rsquo;utilisateur.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRetrouvez ces fichiers dans le répertoire \u003ccode\u003e/etc/chromium\u003c/code\u003e et tout particulièrement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/etc/chromium/pledge.main\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e/etc/chromium/unveil.main\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"webrtc\"\u003eWebRTC\u003c/h3\u003e\n\u003cp\u003ePar défaut, Chromium a accès au périphérique \u003ccode\u003e/dev/video\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eOpenBSD ≥ 6.9\u003c/strong\u003e : Il faut aussi activer l\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-video/\" title=\"Lien interne vers l\u0026#39;article : 'Gérer la vidéo sous OpenBSD'\"\u003eGérer la vidéo sous OpenBSD\u003c/a\u003e !\u003c/p\u003e\n\u003cp\u003e⇒ \u003cstrong\u003eOpenBSD ≥ 6.4\u003c/strong\u003e : Pour que la fonctionnalité WebRTC fonctionne\ncorrectement, il faut activer l\u0026rsquo;\u003ca class=\"inside\" href=\"/fr/sys/openbsd/tip-audio/\" title=\"Lien interne vers l\u0026#39;article : 'Gestion du Son / OpenBSD'\"\u003eGestion du Son / OpenBSD\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"protonmail\"\u003eProtonmail\u003c/h3\u003e\n\u003cp\u003eSi votre navigateur plante lorsque vous utilisez protonmail ou une autre\nbibliothèque de chiffrement javascript, définissez l\u0026rsquo;URL \u003ccode\u003echrome://flags\u003c/code\u003e\npuis indiquez :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eExperimental Validate Asm.js and convert to WebAssembly when valid\u003c/code\u003e à \u003ccode\u003efalse\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"zoom\"\u003eZoom\u003c/h3\u003e\n\u003cp\u003eActivez la variable d\u0026rsquo;environnement : \u003ccode\u003eENABLE_WASM=1\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"historique\"\u003eHistorique\u003c/h2\u003e\n\u003cp\u003eJ\u0026rsquo;ai écrit historiquement cette documentation sur le wiki de la communauté\n\u0026ldquo;OpenBSD Pour Tous\u0026rdquo;.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Chromium : navigateur web open source, sous OpenBSD",
            "tags": ["OpenBSD", "Chromium"],
            "date_published": "2020-01-19T02:22:49+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:a23915b4-0a3e-1e87-156e-e7f4ced11a9b",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-openbsd/",
            "title": "Hugo : Utilisation du binaire fourni par le projet (OpenBSD)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Utiliser Hugo sous OpenBSD est possible, sans soucis.\nIl existe en tant que paquet tiers, installable par le gestionnaire de paquets : # pkg_add hugo\nversion d\u0026rsquo;Hugo : 0.53 : Hugo Static Site Generator v0.53 openbsd/amd64 BuildDate: unknown OpenBSD : 6.6 Architecture : amd64 Bon, maintenant soyons réaliste, cette version date d\u0026rsquo;un an et a son lot de bogues.\nUtilisation Quoiqu\u0026rsquo;il en soit le projet Hugo semble fournir pour chaque nouvelle version des archives tar.gz qu\u0026rsquo;il suffit de télécharger et décompresser ; il y a trois fichiers généralement dedans, le fichier LICENSE, README.md et le binaire hugo. Les archives sont à destination des architectures 32 bits (donc i386), 64 bits (donc amd64), et ARM.\nPour autant que dans votre variable d\u0026rsquo;environnement PATH vous ayez inclu ~/bin/, il suffit de créer un lien symbolique dedans pour pouvoir utiliser ce nouveau binaire.\nLe propos de cet article est de \u0026ldquo;remonter\u0026rdquo; les différents écueils liés à ces binaires officiels, qui parfois générent des changements dans la configuration de Hugo, voire des dysfonctionnements.\nLa dernière version fonctionnelle est : la 0.59.1.\nChangements importants v0.54.0 version : Hugo Static Site Generator v0.54.0-B1A82C61 openbsd/amd64 BuildDate: 2019-02-01T09:41:10Z Malheureusement, un simple hugo server ne fonctionne pas !\nL\u0026rsquo;erreur restituée : Error: Error building site: EOF\nAu suivant !\nv0.55.0 version : Hugo Static Site Generator v0.55.0-4333CC77 openbsd/amd64 BuildDate: 2019-04-08T16:41:18Z AttentionATTENTION : cette version apporte des changements dans le fonctionnement des shortcodes, dans la taxonomie (les tags, entres autres), … v0.6x Depuis la version 0.60.0, il y a un changement du \u0026ldquo;moteur\u0026rdquo; par défaut, qui est le goldmark.\nCela implique de modifier le fichier de configuration pour ajouter ce qui suit, pour le format TOML (Tom\u0026#39;s Obvious Minimal Language) :\n[markup.goldmark.renderer] unsafe = true` Il y a un bogue dans la restitution du code HTML (HyperText Markup Language) au sein des shortcodes.\nDépréciations Page.Hugo is deprecated Le message suivant :\nPage.Hugo is deprecated and will be removed in a future release. Use the global hugo function.\ninforme simplement que la variable .Hugo est obsolète, dépréciée ; il est recommandé de la remplacer par la fonction globale hugo. Donc, parcourez tous vos fichiers _default, partials, voire shortcodes et remplacez !\nVoir la page Hugo Documentation : Variables \u0026gt; Hugo Page\u0026rsquo;s .RSSLink is deprecated Le message suivant :\nPage's .RSSLink is deprecated and will be removed in a future release. Use the Output Format's link\ninforme que la variable .RSSLink est osbolète et dépréciée.\nIl est recommandé d\u0026rsquo;utiliser le formatage de sortie , tel que : {{`` with .OutputFormats.Get \u0026quot;RSS\u0026quot; }}{{ .RelPermalink }}{{ end }}\nVoir la page Hugo Documentation : Templates \u0026gt; Output formats Page\u0026rsquo;s .URL is deprecated Le message suivant :\nPage's .URL is deprecated and will be removed in a future release. Use .Permalink or .RelPermalink.\nexplique en fait que la variable .URL ne doit plus être utilisée dans le corps d\u0026rsquo;une page. Donc, parcourez tous vos fichiers _default, partials, voire shortcodes et remplacez la variable .URL au minimum par .Permalink.\nInfoNe pas confondre avec la présence de la variable .URL qui est toujours permise dans le contexte des menus ! (cf: Hugo Documentation : Variables \u0026gt; Menus ) Recommandations Shortcodes Il est donc recommandé de ne plus utiliser la syntaxe {{``% shortcode %}} mais de lui préférer la syntaxe {{``\u0026lt; shortcode \u0026gt;}} et d\u0026rsquo;utiliser la fonction markdownify.\nVoir la page : Hugo Documentation : Functions \u0026gt; Markdownify .\nTaxonomy Les nœuds de taxonomies ont un nouvel accesseur nommé .Page qui simplifie l\u0026rsquo;usage aux différentes variables, telle que .Titre.\nAu lieu d\u0026rsquo;utiliser l\u0026rsquo;ensemble suivant {{ range .Data.Terms.Alphabetical }}, utilisez plutôt {{ range .Site.Taxonomies.tags }}.\n",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUtiliser Hugo sous OpenBSD est possible, sans soucis.\u003c/p\u003e\n\u003cp\u003eIl existe en tant que paquet tiers, installable par le gestionnaire de paquets : \u003cbr\u003e\n\u003ccode\u003e# pkg_add hugo\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eversion d\u0026rsquo;Hugo : \u003cstrong\u003e0.53\u003c/strong\u003e : \u003ccode\u003eHugo Static Site Generator v0.53 openbsd/amd64 BuildDate: unknown\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eOpenBSD : \u003cstrong\u003e6.6\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eArchitecture : \u003cstrong\u003eamd64\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBon, maintenant soyons réaliste, cette version date d\u0026rsquo;un an et a son lot de bogues.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003eQuoiqu\u0026rsquo;il en soit le projet Hugo semble fournir pour chaque nouvelle version\ndes archives tar.gz qu\u0026rsquo;il suffit de télécharger et décompresser ; il y a trois\nfichiers généralement dedans, le fichier \u003ccode\u003eLICENSE\u003c/code\u003e, \u003ccode\u003eREADME.md\u003c/code\u003e et le binaire\n\u003ccode\u003ehugo\u003c/code\u003e. Les archives sont à destination des architectures 32 bits \u003cem\u003e(donc i386)\u003c/em\u003e,\n64 bits \u003cem\u003e(donc amd64)\u003c/em\u003e, et ARM.\u003c/p\u003e\n\u003cp\u003ePour autant que dans votre variable d\u0026rsquo;environnement \u003ccode\u003ePATH\u003c/code\u003e vous ayez inclu\n\u003ccode\u003e~/bin/\u003c/code\u003e, il suffit de créer un lien symbolique dedans pour pouvoir utiliser ce\nnouveau binaire.\u003c/p\u003e\n\u003cp\u003eLe propos de cet article est de \u0026ldquo;remonter\u0026rdquo; les différents écueils liés à ces\nbinaires officiels, qui parfois générent des changements dans la configuration\nde Hugo, voire des dysfonctionnements.\u003c/p\u003e\n\u003cp\u003eLa dernière version fonctionnelle est : la \u003cstrong\u003e0.59.1\u003c/strong\u003e.\u003c/p\u003e\n\u003ch2 id=\"changements-importants\"\u003eChangements importants\u003c/h2\u003e\n\u003ch3 id=\"v0540\"\u003ev0.54.0\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eversion : \u003ccode\u003eHugo Static Site Generator v0.54.0-B1A82C61 openbsd/amd64 BuildDate: 2019-02-01T09:41:10Z\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMalheureusement, un simple \u003ccode\u003ehugo server\u003c/code\u003e ne fonctionne pas !\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;erreur restituée : \u003ccode\u003eError: Error building site: EOF\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAu suivant !\u003c/p\u003e\n\u003ch3 id=\"v0550\"\u003ev0.55.0\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eversion : \u003ccode\u003eHugo Static Site Generator v0.55.0-4333CC77 openbsd/amd64 BuildDate: 2019-04-08T16:41:18Z\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION : cette version apporte des changements dans le fonctionnement des\n\u003ca href=\"/fr/web/hugo/hugo-openbsd/#shortcodes\"\u003eshortcodes\u003c/a\u003e, dans la \u003ca href=\"/fr/web/hugo/hugo-openbsd/#taxonomy\"\u003etaxonomie\u003c/a\u003e\n\u003cem\u003e(les tags, entres autres)\u003c/em\u003e, …\u003c/div\u003e\n\n\u003ch3 id=\"v06x\"\u003ev0.6x\u003c/h3\u003e\n\u003cp\u003eDepuis la version 0.60.0, il y a un changement du \u0026ldquo;moteur\u0026rdquo; par défaut, qui est\nle \u003cstrong\u003egoldmark\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eCela implique de modifier le fichier de configuration pour ajouter ce qui suit,\npour le format \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eTOML \u003cem\u003e(Tom\u0026#39;s Obvious Minimal Language)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emarkup\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003egoldmark\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003erenderer\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eunsafe\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e`\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cdel\u003eIl y a un \u003ca href=\"https://github.com/gohugoio/hugo/issues/6553\" rel=\"external\"\u003ebogue\u003c/a\u003e dans la\nrestitution du code \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eHTML \u003cem\u003e(HyperText Markup Language)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n au sein des shortcodes.\u003c/del\u003e\u003c/p\u003e\n\u003ch2 id=\"dépréciations\"\u003eDépréciations\u003c/h2\u003e\n\u003ch3 id=\"pagehugo-is-deprecated\"\u003ePage.Hugo is deprecated\u003c/h3\u003e\n\u003cp\u003eLe message suivant :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003ePage.Hugo is deprecated and will be removed in a future release. Use the global hugo function.\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003einforme simplement que la variable \u003ccode\u003e.Hugo\u003c/code\u003e est obsolète, dépréciée ; il est\nrecommandé de la remplacer par la fonction globale \u003ccode\u003ehugo\u003c/code\u003e. \u003cbr\u003e\nDonc, parcourez tous vos fichiers \u003ccode\u003e_default\u003c/code\u003e, \u003ccode\u003epartials\u003c/code\u003e, voire \u003ccode\u003eshortcodes\u003c/code\u003e et\nremplacez !\u003c/p\u003e\n\u003cp\u003eVoir la page \u003ca href=\"https://gohugo.io/variables/hugo/\" title=\"Lien vers la page du site officiel Hugo : Variables \u0026gt; Hugo\"\u003eHugo Documentation : Variables \u0026gt; Hugo\u003c/a\u003e\n\u003c/p\u003e\n\u003ch3 id=\"pages-rsslink-is-deprecated\"\u003ePage\u0026rsquo;s .RSSLink is deprecated\u003c/h3\u003e\n\u003cp\u003eLe message suivant :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003ePage's .RSSLink is deprecated and will be removed in a future release. Use the Output Format's link\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003einforme que la variable \u003ccode\u003e.RSSLink\u003c/code\u003e est osbolète et dépréciée.\u003c/p\u003e\n\u003cp\u003eIl est recommandé d\u0026rsquo;utiliser le formatage de sortie , tel que : \u003cbr\u003e\n\u003ccode\u003e{{`` with .OutputFormats.Get \u0026quot;RSS\u0026quot; }}{{ .RelPermalink }}{{ end }}\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eVoir la page \u003ca href=\"https://gohugo.io/templates/output-formats/\" title=\"Lien vers la page du site officiel Hugo : Templates \u0026gt; Output formats\"\u003eHugo Documentation : Templates \u0026gt; Output formats\u003c/a\u003e\n\u003c/p\u003e\n\u003ch3 id=\"pages-url-is-deprecated\"\u003ePage\u0026rsquo;s .URL is deprecated\u003c/h3\u003e\n\u003cp\u003eLe message suivant :\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003ccode\u003ePage's .URL is deprecated and will be removed in a future release. Use .Permalink or .RelPermalink.\u003c/code\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eexplique en fait que la variable \u003ccode\u003e.URL\u003c/code\u003e ne doit plus être utilisée dans le corps\nd\u0026rsquo;une page. \u003cbr\u003e\nDonc, parcourez tous vos fichiers \u003ccode\u003e_default\u003c/code\u003e, \u003ccode\u003epartials\u003c/code\u003e, voire \u003ccode\u003eshortcodes\u003c/code\u003e et\nremplacez la variable \u003ccode\u003e.URL\u003c/code\u003e au minimum par \u003ccode\u003e.Permalink\u003c/code\u003e.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eNe pas confondre avec la présence de la variable \u003ccode\u003e.URL\u003c/code\u003e qui est toujours permise\ndans le contexte des menus ! \u003cbr\u003e\n\u003cem\u003e(cf: \u003ca href=\"https://gohugo.io/variables/menus/#menu-entry-variables\" title=\"Lien vers la page du site officiel Hugo : Variables \u0026gt; Menus\"\u003eHugo Documentation : Variables \u0026gt; Menus\u003c/a\u003e\n)\u003c/em\u003e\u003c/div\u003e\n\n\u003ch2 id=\"recommandations\"\u003eRecommandations\u003c/h2\u003e\n\u003ch3 id=\"shortcodes\"\u003eShortcodes\u003c/h3\u003e\n\u003cp\u003eIl est donc recommandé de ne plus utiliser la syntaxe \u003ccode\u003e{{``% shortcode %}}\u003c/code\u003e\nmais de lui préférer la syntaxe \u003ccode\u003e{{``\u0026lt; shortcode \u0026gt;}}\u003c/code\u003e et d\u0026rsquo;utiliser la fonction\n\u003ccode\u003emarkdownify\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eVoir la page : \u003ca href=\"https://gohugo.io/functions/markdownify/\" title=\"Lien vers la page du site officiel Hugo : Functions \u0026gt; Markdownify\"\u003eHugo Documentation : Functions \u0026gt; Markdownify\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch3 id=\"taxonomy\"\u003eTaxonomy\u003c/h3\u003e\n\u003cp\u003eLes nœuds de taxonomies ont un nouvel accesseur nommé \u003ccode\u003e.Page\u003c/code\u003e qui simplifie\nl\u0026rsquo;usage aux différentes variables, telle que \u003ccode\u003e.Titre\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eAu lieu d\u0026rsquo;utiliser l\u0026rsquo;ensemble suivant \u003ccode\u003e{{ range .Data.Terms.Alphabetical }}\u003c/code\u003e,\nutilisez plutôt \u003ccode\u003e{{ range .Site.Taxonomies.tags }}\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser les différentes versions d'Hugo fournies par le projet sur OpenBSD stable",
            "tags": ["Hugo", "OpenBSD"],
            "date_published": "2020-01-02T16:02:59+01:00",
            "date_modified": "2020-02-25T00:30:59+01:00"
        },{
            "id": "urn:uuid:ced2cdbe-0b69-cce5-8034-22e0dabdbfed",
            "url": "http://doc.huc.fr.eu.org/fr/web/nextcloud/nextcloud-loop-login/",
            "title": "Nextcloud : connexion en boucle (astuce)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Par un beau matin, vous cherchez à vous connecter à votre serveur Nextcloud avec vos identifiants.\nEt, ce jour-là, le drame arrive : impossible de vous connecter, l\u0026rsquo;URL est renvoyée vers login?redirect_url=/apps/files/ et vos identifiants sont redemandés !\nPas la peine de chercher dans votre configuration, si un changement est intervenu ; ce n\u0026rsquo;est pas non plus un problème lié à l\u0026rsquo;authentification, voire à la 2FA .\nRésolution Vérifiez :\nles droits en lecture, écriture sur les répertoires : netcloud : 0750 cache : 0755 et celui des sessions PHP : 0750 semble être fonctionnel, sinon 0755. les droits utilisateurs sur les mêmes répertoires : celui de votre utilisateur web et groupe web ; par défaut, sous OpenBSD, www, mais cela peut différer selon votre système d\u0026rsquo;exploitation, voire le service web utilisé (tel, Apache, Nginx, …) OpenBSD Sur OpenBSD, j\u0026rsquo;ai remarqué un petit problème : lors de la mise à jour de PHP, les droits sur les répertoires cache et tmp dans votre chroot (càd normalement : /var/www), ceux-ci étaient non seulement réinitialisés pour root:daemon, mais aussi sur 0700 plus le sticky bit activé.\nIl semble nécessaire de les réattribuer à l\u0026rsquo;utilisateur et au groupe web www, et de remettre des droits en lecture, écriture sur 0755.\nRemerciements source ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePar un beau matin, vous cherchez à vous connecter à votre serveur Nextcloud avec\nvos identifiants.\u003c/p\u003e\n\u003cp\u003eEt, ce jour-là, le drame arrive : impossible de vous connecter, l\u0026rsquo;URL est renvoyée\nvers \u003ccode\u003elogin?redirect_url=/apps/files/\u003c/code\u003e et vos identifiants sont redemandés !\u003c/p\u003e\n\u003cp\u003ePas la peine de chercher dans votre configuration, si un changement est intervenu ;\nce n\u0026rsquo;est pas non plus un problème lié à l\u0026rsquo;authentification, voire à la\n\u003cabbr title=\"Two Factor Authentification\"\u003e2FA\u003c/abbr\u003e\n.\u003c/p\u003e\n\u003ch2 id=\"résolution\"\u003eRésolution\u003c/h2\u003e\n\u003cp\u003e\u003cspan class=\"red\"\u003eVérifiez\u003c/span\u003e\n :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles \u003cstrong\u003edroits en lecture, écriture\u003c/strong\u003e sur les répertoires :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enetcloud\u003c/code\u003e : \u003ccode\u003e0750\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecache\u003c/code\u003e : \u003ccode\u003e0755\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eet celui des sessions PHP : \u003ccode\u003e0750\u003c/code\u003e semble être fonctionnel, sinon \u003ccode\u003e0755\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eles \u003cstrong\u003edroits utilisateurs\u003c/strong\u003e sur les mêmes répertoires : celui de votre\nutilisateur web et groupe web ; par défaut, sous OpenBSD, \u003ccode\u003ewww\u003c/code\u003e, mais cela\npeut différer selon votre système d\u0026rsquo;exploitation, voire le service web\nutilisé \u003cem\u003e(tel, Apache, Nginx, …)\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"openbsd\"\u003eOpenBSD\u003c/h3\u003e\n\u003cp\u003eSur OpenBSD, j\u0026rsquo;ai remarqué un petit problème : lors de la mise à jour de PHP,\nles droits sur les répertoires \u003ccode\u003ecache\u003c/code\u003e et \u003ccode\u003etmp\u003c/code\u003e dans votre chroot\n\u003cem\u003e(\u003cabbr title=\"c'est-à-dire\"\u003ecàd\u003c/abbr\u003e\n normalement : \u003ccode\u003e/var/www\u003c/code\u003e)\u003c/em\u003e, ceux-ci étaient\nnon seulement réinitialisés pour \u003ccode\u003eroot:daemon\u003c/code\u003e, mais aussi sur \u003ccode\u003e0700\u003c/code\u003e plus le\n\u003ccode\u003esticky bit\u003c/code\u003e activé.\u003c/p\u003e\n\u003cp\u003eIl semble nécessaire de les réattribuer à l\u0026rsquo;utilisateur et au groupe web \u003ccode\u003ewww\u003c/code\u003e,\net de remettre des droits en lecture, écriture sur \u003ccode\u003e0755\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003e\u003ca href=\"https://www.ryadel.com/en/nextcloud-13-login-page-redirect-loop-how-to-fix-it/\" rel=\"external\"\u003esource\u003c/a\u003e\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Nextcloud : Comment résoudre le problème de connexion qui tourne en boucle…",
            "tags": ["Nextcloud", "login", "astuce"],
            "date_published": "2019-12-23T18:27:34+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:7ad60c11-eedd-ea1d-fcee-4663f53a5621",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/bioctl-fde/",
            "title": "OpenBSD: Chiffrement intégral de disque dur (FDE, bioctl)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Le Chiffrement Intégral de Disque (Full Disk Encryption, en anglais) est une opération simple à réaliser sous OpenBSD.\nElle nécessite l\u0026rsquo;usage du binaire de chiffrement bioctl qui utilise le sous-système softraid - même si cela utilise le principe du RAID logiciel, ne pas confondre avec la mise en place de RAID, qui est un processus assez similaire, dans l\u0026rsquo;usage de binaire et sous-système ; les deux usages cumulés sont impossibles.\nDans cet article, nous verrons succinctement comment chiffrer dès l\u0026rsquo;installation un disque entier et l\u0026rsquo;utiliser soit avec une passphrase de sécurité, soit avec une clé USB.\nDocumentation https://www.openbsd.org/faq/faq14.html (en anglais) https://wiki.obsd4a.net/openbsd.org:faq:faq14 softraid(4) bioctl(8) fdisk(8) disklabel(8) Installation Dès le démarrage du binaire d\u0026rsquo;installation, l\u0026rsquo;invite de commande de l\u0026rsquo;installateur propose le choix suivant :\nWelcome to the OpenBSD/*** X.X installation program. (I)nstall, (U)pgrade, (A)utoinstall or (S)hell? s Il faut choisir d\u0026rsquo;aller dans le shell ; tapez donc s puis la touche ENTRÉE .\nEn admettant que le disque principal se nomme sd0…\nMakedev Dans un premier temps, il nous faut nous assurer que le nœud existe réellement :\n:# cd /dev \u0026amp;\u0026amp; sh MAKEDEV sd0\nurandom InfoCette étape prend un temps certain, qui dépend de la taille de votre disque dur, mais attendez vous à patienter quelques heures… Assurons-nous que le disque dur soit vierge de toutes données :\n:# dd if=/dev/urandom of=/dev/rsd0c bs=1m\nCe processus remplit le disque dur dans son entier de données aléatoire. Cela permet d\u0026rsquo;éviter la déduction par une tierce personne de l\u0026rsquo;espace disque réellement utilisé.\nfdisk Initialisons le disque dur à l\u0026rsquo;aide de l\u0026rsquo;outil fdisk :\nMBR Si vous avez démarré sur un Bios, utilisant la structure de partitionnement MBR , la commande sera :\n:# fdisk -iy sd0\nGPT Par contre si vous utilisez une structure GPT , généralement utilisée dans le contexte d\u0026rsquo;un Bios UEFI, mais peut aussi être utilisée dans le contexte des BIOS \u0026ldquo;historiques\u0026rdquo; (PC BIOS), l\u0026rsquo;usage deviendra :\n:# fdisk -iy -g -b 960 sd0\ndisklabel AttentionCe n\u0026rsquo;est pas parce que nous utilisons le formatage RAID que nous créons un RAID. Rappelez-vous, nous utilisons le sous-système softraid pour utiliser le binaire bioctl qui permet le chiffrement du disque, excluant l\u0026rsquo;usage d\u0026rsquo;un RAID. InfoDans cet exemple, nous utiliserons tout l\u0026rsquo;espace disque disponible dans une seule partition. Il est bien sûr possible de partitionner à votre souhait… ce qui nécessitera autant de clé de chiffrement ! La commande disklabel nous sert à créer le schéma de partitionnement :\n# disklabel -E sd0 Label editor (enter \u0026#39;?\u0026#39; for help at any prompt) sd0\u0026gt; Ajoutons une partition de la taille totale, de type RAID :\nsd0\u0026gt; a a offset: [64] size: [39825135] * FS type: [4.2BSD] RAID sd0\u0026gt; Puis, enregistrons et quittons :\nsd0\u0026gt; w sd0\u0026gt; q No label changes. bioctl Créons le périphérique chiffré sd1 sur la partition a ; nous le ferons en utilisant le binaire bioctl :\n:# bioctl -c C -l sd0a softraid0 New passphrase: Re-type passphrase: sd1 at scsibus2 targ 1 lun 0: \u0026lt;OPENBSD, SR CRYPTO, 005\u0026gt; SCSI2 0/direct fixed sd1: 19445MB, 512 bytes/sector, 39824607 sectors softraid0: CRYPTO volume attached as sd1 Nous verrons comment utiliser une clé USB pour déverouiller le système au moment du démarrage en lieu et place de la passphrase !\nmakedev Mais dans un premier temps, il nous faut créer le nœud du périphérique sd1 ; répétez donc l\u0026rsquo;étape du makedev en remplaçant par sd1.\nzero Ensuite, il faut remplir de zéro ou de données aléatoires le premier secteur de ce nouveau périphérique, soit :\n:# dd if=/dev/zero of=/dev/rsd1c bs=1m count=1\nou par :\n:# dd if=/dev/urandom of=/dev/rsd1c bs=1m count=1\nexit Cela étant fini, il sera possible de reprendre le processus d\u0026rsquo;installation, après avoir écrit exit dans l\u0026rsquo;invite de commande shell (appelé prompt, en anglais)\nLorsque le processus d\u0026rsquo;installation demandera sur quel disque il faut installer le système d\u0026rsquo;exploitation, ne vous trompez pas, répondez bien sd1, tel que :\nAvailable disks are: sd0 sd1. Which disk is the root disk? (\u0026#39;?\u0026#39; for details) [sd0] sd1 Clé USB : Déverrouillage Dans l\u0026rsquo;état actuel, une fois le système d\u0026rsquo;exploitation OpenBSD installé, lors du démarrage, il sera demandé de taper la passphrase correspondante. Néanmoins, il est possible et intéressant de pouvoir utiliser une clé USB - ce qui est même recommandé, car celle-ci sera chiffrée elle aussi - en lieu et place !\nDonc, après le redémarrage du système d\u0026rsquo;exploitation, il faudra connecter la clé USB, pour :\nl\u0026rsquo;initialiser, créer le schéma de partitionnement adéquat puis la chiffrer. Ce processus peut normalement être fait après l\u0026rsquo;usage de biotcl… il faudra adapter ce qui doit l\u0026rsquo;être !\nEn admettant que la clé soit reconnue en tant que périphérique sd2…\nClé USB : fdisk Comme lors du processus d\u0026rsquo;installation, nous utiliserons à nouveau fdisk, tel que :\n:# fdisk -iy sd2\nClé USB : disklabel Nous avons juste besoin d\u0026rsquo;une partition de type RAID, d\u0026rsquo;un seul Mo !\nAstuceIl est possible de spécifier la taille ainsi : 1024, au lieu de 1M ! :# disklabel -E sd2 Label editor (enter \u0026#39;?\u0026#39; for help at any prompt) sd0\u0026gt; a a offset: [64] size: [39825135] 1M FS type: [4.2BSD] RAID sd0\u0026gt; w sd0\u0026gt; q No label changes. Clé USB : bioctl Maintenant, chiffrons notre clé USB :\n:# bioctl -c C -k sd2a -l sd0a softraid0 sd3 at scsibus3 targ 1 lun 0: \u0026lt;OPENBSD, SR CRYPTO, 005\u0026gt; SCSI2 0/direct fixed sd3: 19445MB, 512 bytes/sector, 39824607 sectors softraid0: CRYPTO volume attached as sd3 Et voilà !\nIl ne vous reste plus qu\u0026rsquo;à connecter votre clé USB, pour pouvoir démarrer votre système d\u0026rsquo;exploitation avant le démarrage de celui-ci. La passphrase correspondante ne vous sera pas demandée !\nClé USB : Sauvegarde AttentionATTENTION à votre fichier img. Ne le laissez pas à la portée de tout le monde. Protégez-le ! Pour sauvegarder la clé USB, en faire une image et pouvoir en créer une deuxième ou la restaurer au besoin, nous utiliserons l\u0026rsquo;utilitaire dd, tel que :\n:# dd bs=8192 skip=1 if=/dev/rsd2a of=bckp-key.img\nAstuceJe vous encourage TRÈS FORTEMENT à chiffrer ce fichier .img avec GPG, puis à détruire le fichier .img ; par exemple, sous OpenBSD :\n:$ gpg2 --output bckp-key.gpg --encrypt --recipient courriel@domaine.tld bckp-key.img :$ rm -fP bckp-key.img Bien sûr, cela nécessite que vous ayez créer une clé GPG pour votre courriel !\nClé USB : Restauration AstuceSi vous avez suivi ma recommandation de chiffrer avec GPG votre sauvegarde ; il vous faudra utiliser GPG pour déchiffrer le fichier GPG avant la restauration, tel que : gpg2 --output bckp-key.img --decrypt bckp-key.gpg Pour la restaurer, il faudra utiliser dd, tel que :\n:# dd bs=8192 seek=1 if=bckp-key.img of=/dev/rsd2a\nClé USB : Copie AttentionNe laissez pas traîner votre clé de secours n\u0026rsquo;importe où ! Rangez-la dans un endroit évident pour vous, seulement vous… Pour créer une nouvelle clé USB de secours, il faudra :\nl\u0026rsquo;initialiser, créer la table de partitionnement, et copier la sauvegarde comme si c\u0026rsquo;était une restauration. Documentations tierces Master_boot_record WP GUID_Partition_Table WP ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe \u003cstrong\u003eChiffrement Intégral de Disque\u003c/strong\u003e \u003cem\u003e(\u003cstrong\u003e\u003cspan lang=\"en\"\u003eFull Disk Encryption\u003c/span\u003e\u003c/strong\u003e,\nen anglais)\u003c/em\u003e est une opération simple à réaliser sous OpenBSD.\u003c/p\u003e\n\u003cp\u003eElle nécessite l\u0026rsquo;usage du binaire de chiffrement \u003ccode\u003ebioctl\u003c/code\u003e qui utilise le\nsous-système \u003ccode\u003esoftraid\u003c/code\u003e - \u003cem\u003emême si cela utilise le principe du RAID logiciel,\nne pas confondre avec la mise en place de RAID, qui est un processus assez\nsimilaire, dans l\u0026rsquo;usage de binaire et sous-système ; les deux usages cumulés\nsont impossibles\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eDans cet article, nous verrons succinctement comment chiffrer dès l\u0026rsquo;installation\nun disque entier et l\u0026rsquo;utiliser soit avec une passphrase de sécurité, soit avec\nune \u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-déverrouillage\"\u003eclé USB\u003c/a\u003e.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/faq14.html\" rel=\"external\"\u003ehttps://www.openbsd.org/faq/faq14.html\u003c/a\u003e \u003cem\u003e(en anglais)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://wiki.obsd4a.net/openbsd.org:faq:faq14\" rel=\"external\"\u003ehttps://wiki.obsd4a.net/openbsd.org:faq:faq14\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/softraid.4\" title=\"Page du Manuel OpenBSD pour : softraid\"\u003esoftraid(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/bioctl.8\" title=\"Page du Manuel OpenBSD pour : bioctl\"\u003ebioctl(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/fdisk.8\" title=\"Page du Manuel OpenBSD pour : fdisk\"\u003efdisk(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/disklabel.8\" title=\"Page du Manuel OpenBSD pour : disklabel\"\u003edisklabel(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003eDès le démarrage du binaire d\u0026rsquo;installation, l\u0026rsquo;invite de commande de\nl\u0026rsquo;installateur propose le choix suivant :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWelcome to the OpenBSD/*** X.X installation program.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eI\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003enstall, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eU\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003epgrade, \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eA\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003eutoinstall or \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eS\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003ehell? s\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl faut choisir d\u0026rsquo;aller dans le shell ; tapez donc \u003ckbd\u003es\u003c/kbd\u003e\n puis la touche\n\u003ckbd\u003eENTRÉE\u003c/kbd\u003e\n.\u003c/p\u003e\n\u003cp\u003eEn admettant que le disque principal se nomme \u003ccode\u003esd0\u003c/code\u003e…\u003c/p\u003e\n\u003ch3 id=\"makedev\"\u003eMakedev\u003c/h3\u003e\n\u003cp\u003eDans un premier temps, il nous faut nous assurer que le nœud existe réellement :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# cd /dev \u0026amp;\u0026amp; sh MAKEDEV sd0\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"urandom\"\u003eurandom\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCette étape prend un temps certain, qui dépend de la taille de votre disque dur,\nmais attendez vous à patienter quelques heures…\u003c/div\u003e\n\n\u003cp\u003eAssurons-nous que le disque dur soit vierge de toutes données :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# dd if=/dev/urandom of=/dev/rsd0c bs=1m\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCe processus remplit le disque dur dans son entier de données aléatoire. Cela\npermet d\u0026rsquo;éviter la déduction par une tierce personne de l\u0026rsquo;espace disque réellement\nutilisé.\u003c/p\u003e\n\u003ch3 id=\"fdisk\"\u003efdisk\u003c/h3\u003e\n\u003cp\u003eInitialisons le disque dur à l\u0026rsquo;aide de l\u0026rsquo;outil \u003ccode\u003efdisk\u003c/code\u003e :\u003c/p\u003e\n\u003ch4 id=\"mbr\"\u003eMBR\u003c/h4\u003e\n\u003cp\u003eSi vous avez démarré sur un Bios, utilisant la structure de partitionnement\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Master Boot Record\"\u003eMBR\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, la commande sera :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# fdisk -iy sd0\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"gpt\"\u003eGPT\u003c/h4\u003e\n\u003cp\u003ePar contre si vous utilisez une structure \u003cabbr title=\"GUID Partition Table\"\u003eGPT\u003c/abbr\u003e\n,\ngénéralement utilisée dans le contexte d\u0026rsquo;un Bios UEFI, mais peut aussi être\nutilisée dans le contexte des BIOS \u0026ldquo;historiques\u0026rdquo; \u003cem\u003e(PC BIOS)\u003c/em\u003e, l\u0026rsquo;usage deviendra :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# fdisk -iy -g -b 960 sd0\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"disklabel\"\u003edisklabel\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCe n\u0026rsquo;est pas parce que nous utilisons le formatage RAID que nous créons un RAID. \u003cbr\u003e\nRappelez-vous, nous utilisons le sous-système \u003ccode\u003esoftraid\u003c/code\u003e pour utiliser le binaire\n\u003ccode\u003ebioctl\u003c/code\u003e qui permet le chiffrement du disque, excluant l\u0026rsquo;usage d\u0026rsquo;un RAID.\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eDans cet exemple, nous utiliserons tout l\u0026rsquo;espace disque disponible dans une\nseule partition. Il est bien sûr possible de partitionner à votre souhait… \u003cbr\u003e\nce qui nécessitera autant de clé de chiffrement !\u003c/div\u003e\n\n\u003cp\u003eLa commande \u003ccode\u003edisklabel\u003c/code\u003e nous sert à créer le schéma de partitionnement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# disklabel -E sd0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLabel editor \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eenter \u003cspan style=\"color:#48b685\"\u003e\u0026#39;?\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e help at any prompt\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esd0\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAjoutons une partition de la taille totale, de type RAID :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd0\u0026gt; a a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  offset: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e64\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  size: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e39825135\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e *\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  FS type: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e4.2BSD\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e RAID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd0\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, enregistrons et quittons :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd0\u0026gt; w\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd0\u0026gt; q\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  No label changes.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"bioctl\"\u003ebioctl\u003c/h3\u003e\n\u003cp\u003eCréons le périphérique chiffré \u003ccode\u003esd1\u003c/code\u003e sur la partition \u003ccode\u003ea\u003c/code\u003e ; nous le ferons en\nutilisant le binaire \u003ccode\u003ebioctl\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# bioctl -c C -l sd0a softraid0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  New passphrase:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Re-type passphrase:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd1 at scsibus2 targ \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e lun 0: \u0026lt;OPENBSD, SR CRYPTO, 005\u0026gt; SCSI2 0/direct fixed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd1: 19445MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e39824607\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  softraid0: CRYPTO volume attached as sd1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNous verrons comment utiliser une \u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-déverrouillage\"\u003eclé USB\u003c/a\u003e pour\ndéverouiller le système au moment du démarrage en lieu et place de la\npassphrase !\u003c/p\u003e\n\u003ch4 id=\"makedev-1\"\u003emakedev\u003c/h4\u003e\n\u003cp\u003eMais dans un premier temps, il nous faut créer le nœud du périphérique \u003ccode\u003esd1\u003c/code\u003e ;\nrépétez donc l\u0026rsquo;étape du \u003ca href=\"/fr/sys/openbsd/bioctl-fde/#makedev\"\u003emakedev\u003c/a\u003e en remplaçant par \u003ccode\u003esd1\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"zero\"\u003ezero\u003c/h4\u003e\n\u003cp\u003eEnsuite, il faut remplir de zéro ou de données aléatoires le premier secteur de\nce nouveau périphérique, soit :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# dd if=/dev/zero of=/dev/rsd1c bs=1m count=1\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eou par :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# dd if=/dev/urandom of=/dev/rsd1c bs=1m count=1\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"exit\"\u003eexit\u003c/h3\u003e\n\u003cp\u003eCela étant fini, il sera possible de reprendre le processus d\u0026rsquo;installation,\naprès avoir écrit \u003ccode\u003eexit\u003c/code\u003e dans l\u0026rsquo;invite de commande shell \u003cem\u003e(appelé\n\u003cspan lang=\"en\"\u003eprompt\u003c/span\u003e, en anglais)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eLorsque le processus d\u0026rsquo;installation demandera sur quel disque il faut installer\nle système d\u0026rsquo;exploitation, ne vous trompez pas, répondez bien \u003ccode\u003esd1\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAvailable disks are: sd0 sd1.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Which disk is the root disk? \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;?\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e details\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003esd0\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e sd1\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"clé-usb--déverrouillage\"\u003eClé USB : Déverrouillage\u003c/h2\u003e\n\u003cp\u003eDans l\u0026rsquo;état actuel, une fois le système d\u0026rsquo;exploitation OpenBSD installé, lors\ndu démarrage, il sera demandé de taper la passphrase correspondante. \u003cbr\u003e\nNéanmoins, il est possible et intéressant de pouvoir utiliser une clé USB -\n\u003cem\u003ece qui est même recommandé, car celle-ci sera chiffrée elle aussi\u003c/em\u003e - en lieu\net place !\u003c/p\u003e\n\u003cp\u003eDonc, après le redémarrage du système d\u0026rsquo;exploitation, il faudra connecter la\nclé USB, pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-fdisk\"\u003einitialiser\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003ecréer le \u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-disklabel\"\u003eschéma de partitionnement\u003c/a\u003e adéquat\u003c/li\u003e\n\u003cli\u003epuis la \u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-bioctl\"\u003echiffrer\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCe processus peut normalement être fait après l\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/bioctl-fde/#bioctl\"\u003eusage de \u003ccode\u003ebiotcl\u003c/code\u003e\u003c/a\u003e… \u003cbr\u003e\nil faudra adapter ce qui doit l\u0026rsquo;être !\u003c/p\u003e\n\u003cp\u003eEn admettant que la clé soit reconnue en tant que périphérique \u003ccode\u003esd2\u003c/code\u003e…\u003c/p\u003e\n\u003ch3 id=\"clé-usb--fdisk\"\u003eClé USB : fdisk\u003c/h3\u003e\n\u003cp\u003eComme lors du processus d\u0026rsquo;installation, nous utiliserons à nouveau \u003ccode\u003efdisk\u003c/code\u003e, tel\nque :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# fdisk -iy sd2\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"clé-usb--disklabel\"\u003eClé USB : disklabel\u003c/h3\u003e\n\u003cp\u003eNous avons juste besoin d\u0026rsquo;une partition de type RAID, d\u0026rsquo;un seul Mo !\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eIl est possible de spécifier la taille ainsi : \u003ccode\u003e1024\u003c/code\u003e, au lieu de \u003ccode\u003e1M\u003c/code\u003e !\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# disklabel -E sd2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Label editor \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eenter \u003cspan style=\"color:#48b685\"\u003e\u0026#39;?\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e help at any prompt\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd0\u0026gt; a a\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  offset: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e64\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  size: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e39825135\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e 1M\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  FS type: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e4.2BSD\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e RAID\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd0\u0026gt; w\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd0\u0026gt; q\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  No label changes.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"clé-usb--bioctl\"\u003eClé USB : bioctl\u003c/h3\u003e\n\u003cp\u003eMaintenant, chiffrons notre clé USB :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# bioctl -c C -k sd2a -l sd0a softraid0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd3 at scsibus3 targ \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e lun 0: \u0026lt;OPENBSD, SR CRYPTO, 005\u0026gt; SCSI2 0/direct fixed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  sd3: 19445MB, \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e bytes/sector, \u003cspan style=\"color:#f99b15\"\u003e39824607\u003c/span\u003e sectors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  softraid0: CRYPTO volume attached as sd3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt voilà !\u003c/p\u003e\n\u003cp\u003eIl ne vous reste plus qu\u0026rsquo;à connecter votre clé USB, pour pouvoir démarrer votre\nsystème d\u0026rsquo;exploitation avant le démarrage de celui-ci. La passphrase correspondante\nne vous sera pas demandée !\u003c/p\u003e\n\u003ch3 id=\"clé-usb--sauvegarde\"\u003eClé USB : Sauvegarde\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION à votre fichier \u003ccode\u003eimg\u003c/code\u003e. Ne le laissez pas à la portée de tout le monde.\n\u003cstrong\u003eProtégez-le !\u003c/strong\u003e\u003c/div\u003e\n\n\u003cp\u003ePour sauvegarder la clé USB, en faire une image et pouvoir en créer une deuxième\nou la restaurer au besoin, nous utiliserons l\u0026rsquo;utilitaire \u003ccode\u003edd\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# dd bs=8192 skip=1 if=/dev/rsd2a of=bckp-key.img\u003c/code\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003e\u003cp\u003eJe vous encourage TRÈS FORTEMENT à chiffrer ce fichier .img avec GPG, puis à\ndétruire le fichier .img ; par exemple, sous OpenBSD :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ gpg2 --output bckp-key.gpg --encrypt --recipient courriel@domaine.tld bckp-key.img\n:$ rm -fP bckp-key.img\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBien sûr, cela nécessite que vous ayez créer une clé GPG pour votre courriel !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"clé-usb--restauration\"\u003eClé USB : Restauration\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eSi vous avez suivi ma recommandation de chiffrer avec GPG votre sauvegarde ; il\nvous faudra utiliser GPG pour déchiffrer le fichier GPG avant la restauration,\ntel que : \u003cbr\u003e\n\u003ccode\u003egpg2 --output bckp-key.img --decrypt bckp-key.gpg\u003c/code\u003e\u003c/div\u003e\n\n\u003cp\u003ePour la restaurer, il faudra utiliser \u003ccode\u003edd\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:# dd bs=8192 seek=1 if=bckp-key.img of=/dev/rsd2a\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"clé-usb--copie\"\u003eClé USB : Copie\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNe laissez pas traîner votre clé de secours n\u0026rsquo;importe où ! \u003cbr\u003e\nRangez-la dans un endroit évident pour vous, seulement vous…\u003c/div\u003e\n\n\u003cp\u003ePour créer une nouvelle clé USB de secours, il faudra :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-fdisk\"\u003einitialiser\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-disklabel\"\u003ecréer la table de partitionnement\u003c/a\u003e,\u003c/li\u003e\n\u003cli\u003eet copier la sauvegarde comme si c\u0026rsquo;était une \u003ca href=\"/fr/sys/openbsd/bioctl-fde/#clé-usb-restauration\"\u003erestauration\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentations-tierces\"\u003eDocumentations tierces\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/Master_boot_record\" title=\"Article Wikipédia : Master_boot_record\"\u003eMaster_boot_record \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://fr.wikipedia.org/wiki/GUID_Partition_Table\" title=\"Article Wikipédia : GUID_Partition_Table\"\u003eGUID_Partition_Table \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Mise en place d'un chiffrement intégral de disque dur lors de l'installation d'OpenBSD, avec gestion de passphrase ou mieux d'une clé USB de déverouillage.",
            "tags": ["OpenBSD", "FDE", "bioctl"],
            "date_published": "2019-12-22T12:59:26+01:00",
            "date_modified": "2020-01-08T18:55:00+01:00"
        },{
            "id": "urn:uuid:f843c77f-46a8-5d43-ebe3-923ff0704ece",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-menu-nav/",
            "title": "Hugo : Menu de navigation (simple ou dropdown)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Le but de cet article est de montrer comment créer un menu de navigation pour le SSG qu\u0026rsquo;est Hugo.\nNous verrons deux manières différentes pour créer :\nun menu simple un menu de type dropdown InfoHugo ne sait pas générer dynamiquement les menus. En conséquence, il faut tout remplir à la main, et bien faire attention à ce qui est rempli ! Documentation La documentation officielle en anglais :\nHugo Documentation : Getting started \u0026gt; Configuration Hugo Documentation : Variables \u0026gt; Menus , Hugo Documentation : Content management \u0026gt; Menus , Hugo Documentation : Templates \u0026gt; Menu templates , Hugo Documentation : Content management \u0026gt; Organization Hugo Documentation : Content management \u0026gt; Front matter Configuration Les différentes entrées du menu sont écrites dans le fichier de configuration config.toml. Pour information, il existe deux autres formats, JSON et YAML. Nous partirons, du prédicat, d\u0026rsquo;un site n\u0026rsquo;ayant qu\u0026rsquo;une seule langue. Si la conception d\u0026rsquo;un menu multilangue est subtilement différente, le fonctionnement reste exactement le même.\nUn site monolangue se configure par le biais de l\u0026rsquo;entrée : menu Là, où un site multilangue se configure par l\u0026rsquo;entrée : languages Par défaut, Hugo génére un site pour la langue anglaise ; pour le paramètrer dans votre langue native, il faut modifier au moins la variable defaultContentLanguage, par exemple pour la langue française : defaultContentLanguage = \u0026quot;fr\u0026quot;, qui peut agrémentée de la variable languageCode = \u0026quot;fr-FR\u0026quot;.\nGénéralement, le fichier HTML sera crée dans le répertoire layouts/partials/, et quelque soit son nom, pour l\u0026rsquo;exemple, nous l\u0026rsquo;appelerons nav.html par soucis de simplicité, il sera appelé depuis le fichier layouts/_default/baseof.html.\n{{ partial \u0026quot;nav.html\u0026quot; . }}\nMenu simple C\u0026rsquo;est typiquement le genre de menu qui renvoie vers des éléments au sein de la page, mais il est possible de renvoyer vers une page nommée.\nPour exemple : http://huc.fr.eu.org\nMonolangue [menu] [[menu.main]] identifier = \u0026#34;who\u0026#34; name = \u0026#34;Qui\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#whoiam\u0026#34; weight = 1 [[menu.main]] identifier = \u0026#34;act\u0026#34; name = \u0026#34;Quoi\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#projects\u0026#34; weight = 2 [[menu.main]] identifier = \u0026#34;contact\u0026#34; name = \u0026#34;Contact\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#contact\u0026#34; weight = 3 On remarque donc la présence de variables strictement nécessaires :\nidentifier : un identifiant, strictement nécessaire et unique à chaque entrée name : le nom url : le nom de l\u0026rsquo;ancre, ou de la page, à cibler. La présence du symbole # signifie que le lien ciblé est une ancre dans la page ; son absence cible un article précisément nommé. Ainsi que de certaines utiles :\nweight : c\u0026rsquo;est le poids du lien dans le menu, plus le poids est faible, plus le lien est \u0026ldquo;important\u0026rdquo;. pre : permet d\u0026rsquo;injecter du code avant le texte. post : permet d\u0026rsquo;injecter du code après le texte - n\u0026rsquo;est pas présentée ici Le reste, sachant qu\u0026rsquo;il existe d\u0026rsquo;autres variables, je vous renvoie à la documentation officielle.\nMultilangue [languages] [languages.en] homeText = \u0026#34;\u0026#34; languageName = \u0026#34;English\u0026#34; weight = 2 [[languages.en.menu.main]] identifier = \u0026#34;who\u0026#34; name = \u0026#34;Who I am\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#whoiam\u0026#34; weight = 1 [[languages.en.menu.main]] identifier = \u0026#34;act\u0026#34; name = \u0026#34;Projects\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#projects\u0026#34; weight = 2 [[languages.en.menu.main]] identifier = \u0026#34;contact\u0026#34; name = \u0026#34;Contact\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#contact\u0026#34; weight = 3 [languages.fr] homeText = \u0026#34;\u0026#34; languageName = \u0026#34;Français\u0026#34; weight = 1 [[languages.fr.menu.main]] identifier = \u0026#34;who\u0026#34; name = \u0026#34;Qui\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#whoiam\u0026#34; weight = 1 [[languages.fr.menu.main]] identifier = \u0026#34;act\u0026#34; name = \u0026#34;Quoi\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#projects\u0026#34; weight = 2 [[languages.fr.menu.main]] identifier = \u0026#34;contact\u0026#34; name = \u0026#34;Contact\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;#contact\u0026#34; weight = 3 Bien-sûr, allez lire la documentation officielle !\nStructure AttentionCette structure de répertoire n\u0026rsquo;est pas du tout nécessaire si vous ne faites qu\u0026rsquo;un site monopage, telle juste une page d\u0026rsquo;accueil, et des liens vers des ancres ! Admettons que vous voulez diriger vers des pages, et non pas des ancres… il vous faudra donc créer dans le répertoire content les articles correspondants portant les noms servant de valeur à la variable url.\nExemple :\ncontent/ contact.md projects.md whoiam.md Bien sûr, il est possible de mixer liens vers des pages et des ancres. À vous de modifier en conséquence…\nHTML \u0026lt;div id=\u0026#34;nav-border\u0026#34; class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;nav id=\u0026#34;nav\u0026#34; class=\u0026#34;nav justify-content-center\u0026#34;\u0026gt; {{ range .Site.Menus.main }} {{ $text := print .Name | safeHTML }} \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;{{ .URL }}\u0026#34;\u0026gt;{{ $text }}\u0026lt;/a\u0026gt; {{ end }} \u0026lt;/nav\u0026gt; \u0026lt;/div\u0026gt; On parcourt tout simplement l\u0026rsquo;ensemble de la variable .Site.Menus.main pour restituer le code correspondant.\nMaintenant si dans le fichier de configuration, vous ajoutez et remplissez la variable pre, il vous faudra modifier le fichier HTML ainsi, par exemple :\n{{ $icon := printf \u0026#34;\u0026lt;i class=\\\u0026#34;%s\\\u0026#34;\u0026gt;\u0026lt;/i\u0026gt;\u0026#34; .Pre }} {{ $text := print $icon \u0026#34; \u0026#34; .Name | safeHTML }} Cet exemple nous permet d\u0026rsquo;injecter du code HTML afin d\u0026rsquo;ajouter une icône avant le texte, ce qui est utile dans le contexte de la bibliothèque Font Awesome ou de toute autre semblable.\nMenu dropdown InfoHugo n\u0026rsquo;est pour l\u0026rsquo;instant capable de gérer qu\u0026rsquo;un sous-niveau de menu ! Pour obtenir un menu dropdown, tel que vous voyez en haut de page sur ce site, le plus simple est d\u0026rsquo;utiliser le framework Bootstrap.\nEn tenant compte du fait que vous savez intégrer la bibliothèque JS (JavaScript) et la feuille CSS (Cascade Style Sheet) …\nStructure Dans le répertoire content, il est nécessaire :\nde créer un ou plusieurs sous-répertoires, qui correspondront aux sections de créer un ou plusieurs répertoires enfants, dans ces premiers sous-répertoires, qui correspondront aux sous-sections Voici un exemple de structure de répertoires :\ncontent/ dev/ _index.md javascript/ _index.md article.md python/ _index.md article.md shell/ _index.md article1.md article2.md article3.md On remarque la présence de fichier _index.md dans chaque répertoire. Le nom des fichiers article*.md n\u0026rsquo;a pas d\u0026rsquo;importance.\nDe même le nom des répertoires importe peu en soit, par contre veillez bien à la correspondance avec la variable url dans le fichier de configuration.\nFichier _index.md Chaque répertoire a son propre fichier _index.md dont le but est simplement d\u0026rsquo;activer le répertoire qui doit comporter à minima le Front Matter, au format YAML (YAML Ain\u0026#39;t Markup Language) , qui suit :\n--- title: \u0026#34;Title\u0026#34; date: 2019-11-28T23:40:14+01:00 draft: false --- Si vous voulez qu\u0026rsquo;il ne soit pas indexé, rajouter la variable noindex: true. (ce qui est évidemment utile dans le contexte de génération de flux de syndication ).\nFichier config.toml La structure du fichier de configuration est sensiblement la même !\n[menu] [[menu.main]] identifier = \u0026#34;dev\u0026#34; name = \u0026#34;Développement\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;dev\u0026#34; weight = 1 [[menu.main]] identifier = \u0026#34;shell\u0026#34; name = \u0026#34;Shell\u0026#34; parent = \u0026#34;dev\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;shell\u0026#34; weight = 10 [[menu.main]] identifier = \u0026#34;js\u0026#34; name = \u0026#34;JavaScript\u0026#34; parent = \u0026#34;dev\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;javascript\u0026#34; weight = 11 [[menu.main]] identifier = \u0026#34;py\u0026#34; name = \u0026#34;Python\u0026#34; parent = \u0026#34;dev\u0026#34; pre = \u0026#34;\u0026#34; url = \u0026#34;python\u0026#34; weight = 12 On remarque tout particulièrement :\nla présence des variables parent qui permettent de définir que l\u0026rsquo;entrée de menu en question a pour parent celui qui porte l\u0026rsquo;identifiant nommé. Dans cet exemple, elles ont pour valeur dev et renvoie à l\u0026rsquo;entrée de menu qui a identifier = \u0026quot;dev\u0026quot;, qui est bien aussi leur répertoire parent, dans la structure de répertoires. Si vous avez un site multilangue, il faudra adapter l\u0026rsquo;exemple ci-dessus pour le faire correspondre…\nHTML \u0026lt;!-- Navbar --\u0026gt; \u0026lt;nav class=\u0026#34;navbar navbar-expand-lg navbar-transparent\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;container\u0026#34;\u0026gt; \u0026lt;div class=\u0026#34;navbar-translate\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;navbar-brand\u0026#34; href=\u0026#34;{{ relLangURL \u0026#34;/\u0026#34; }}\u0026#34; rel=\u0026#34;tooltip\u0026#34; title=\u0026#34;{{.Site.Title}}\u0026#34; data-placement=\u0026#34;bottom\u0026#34;\u0026gt; {{.Site.Title}} \u0026lt;/a\u0026gt; \u0026lt;button class=\u0026#34;navbar-toggler navbar-toggler\u0026#34; type=\u0026#34;button\u0026#34; data-toggle=\u0026#34;collapse\u0026#34; data-target=\u0026#34;#navigation\u0026#34; aria-controls=\u0026#34;navigation-index\u0026#34; aria-expanded=\u0026#34;false\u0026#34; aria-label=\u0026#34;Toggle navigation\u0026#34;\u0026gt; \u0026lt;span class=\u0026#34;navbar-toggler-bar bar1\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;navbar-toggler-bar bar2\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;navbar-toggler-bar bar3\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;/button\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;collapse navbar-collapse justify-content-end\u0026#34; id=\u0026#34;navigation\u0026#34;\u0026gt; \u0026lt;ul class=\u0026#34;navbar-nav ml-auto\u0026#34;\u0026gt; {{ range .Site.Menus.main }} {{ if .HasChildren }} {{ $id := print \u0026#34;navbarDropdownMenuLink\u0026#34; .Identifier }} \u0026lt;li class=\u0026#34;nav-item dropdown\u0026#34;\u0026gt; \u0026lt;a href=\u0026#34;#\u0026#34; class=\u0026#34;nav-link dropdown-toggle\u0026#34; id=\u0026#34;{{ $id }}\u0026#34; data-toggle=\u0026#34;dropdown\u0026#34;\u0026gt; {{ .Pre }} \u0026lt;span\u0026gt;{{ .Name }}\u0026lt;/span\u0026gt; \u0026lt;span class=\u0026#34;caret\u0026#34;\u0026gt;\u0026lt;/span\u0026gt; \u0026lt;/a\u0026gt; \u0026lt;div class=\u0026#34;dropdown-menu dropdown-menu-right\u0026#34; aria-labelledby=\u0026#34;{{ $id }}\u0026#34;\u0026gt; {{ range .Children }} \u0026lt;a class=\u0026#34;dropdown-item\u0026#34; href=\u0026#34;{{ .URL | relLangURL }}\u0026#34;{{ if $.IsHome }} data-target=\u0026#34;{{ .URL }}\u0026#34;{{ end }}\u0026gt;{{ .Name }}\u0026lt;/a\u0026gt; {{end}} \u0026lt;/div\u0026gt; \u0026lt;/li\u0026gt; {{ else }} \u0026lt;li class=\u0026#34;nav-item\u0026#34;\u0026gt; \u0026lt;a class=\u0026#34;nav-link\u0026#34; href=\u0026#34;{{ .URL | relLangURL }}\u0026#34;{{ if $.IsHome }} data-target=\u0026#34;{{ .URL }}\u0026#34;{{ end }}\u0026gt;{{ .Name }}\u0026lt;/a\u0026gt; \u0026lt;/li\u0026gt; {{ end }} {{ end }} \u0026lt;/ul\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;/nav\u0026gt; \u0026lt;!-- End Navbar --\u0026gt; Clap de Fin \u0026ldquo;Voilà, c\u0026rsquo;est fini !\u0026rdquo;\nNous avons ainsi vu comment créer un menu simple ou un menu dropdown pour Hugo.\nN\u0026rsquo;oubliez pas de vous amuser, puis de publier vos articles, et si besoin de vous faire aider par la communauté anglaise de Hugo.\nEnjoy-ID! Enjoy-IT!\n",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe but de cet article est de montrer comment créer un menu de navigation pour\nle \u003cabbr title=\"Static Site Generator\"\u003eSSG\u003c/abbr\u003e\n qu\u0026rsquo;est Hugo.\u003c/p\u003e\n\u003cp\u003eNous verrons deux manières différentes pour créer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eun \u003ca href=\"/fr/web/hugo/hugo-menu-nav/#menu-simple\"\u003emenu simple\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eun menu de type \u003ca href=\"/fr/web/hugo/hugo-menu-nav/#menu-dropdown\"\u003edropdown\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eHugo ne sait pas générer dynamiquement les menus. En conséquence, il faut tout\nremplir à la main, et bien faire attention à ce qui est rempli !\u003c/div\u003e\n\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eLa documentation officielle en anglais :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/getting-started/configuration/\" title=\"Lien vers la page du site officiel Hugo : Getting started \u0026gt; Configuration\"\u003eHugo Documentation : Getting started \u0026gt; Configuration\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/variables/menus/\" title=\"Lien vers la page du site officiel Hugo : Variables \u0026gt; Menus\"\u003eHugo Documentation : Variables \u0026gt; Menus\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/content-management/menus/\" title=\"Lien vers la page du site officiel Hugo : Content management \u0026gt; Menus\"\u003eHugo Documentation : Content management \u0026gt; Menus\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/templates/menu-templates/\" title=\"Lien vers la page du site officiel Hugo : Templates \u0026gt; Menu templates\"\u003eHugo Documentation : Templates \u0026gt; Menu templates\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/content-management/organization/#index-pages--indexmd\" title=\"Lien vers la page du site officiel Hugo : Content management \u0026gt; Organization\"\u003eHugo Documentation : Content management \u0026gt; Organization\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/content-management/front-matter/\" title=\"Lien vers la page du site officiel Hugo : Content management \u0026gt; Front matter\"\u003eHugo Documentation : Content management \u0026gt; Front matter\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLes différentes entrées du menu sont écrites dans le fichier de configuration\n\u003ccode\u003econfig.toml\u003c/code\u003e. \u003cem\u003ePour information, il existe deux autres formats, JSON et YAML\u003c/em\u003e.\nNous partirons, du prédicat, d\u0026rsquo;un site n\u0026rsquo;ayant qu\u0026rsquo;une seule langue. Si la\nconception d\u0026rsquo;un menu multilangue est subtilement différente, le fonctionnement\nreste exactement le même.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eUn site \u003ca href=\"/fr/web/hugo/hugo-menu-nav/#monolangue\"\u003emonolangue\u003c/a\u003e se configure par le biais de l\u0026rsquo;entrée : \u003ccode\u003emenu\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLà, où un site \u003ca href=\"/fr/web/hugo/hugo-menu-nav/#multilangue\"\u003emultilangue\u003c/a\u003e se configure par l\u0026rsquo;entrée : \u003ccode\u003elanguages\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePar défaut, Hugo génére un site pour la langue anglaise ; pour le paramètrer\ndans votre langue native, il faut modifier au moins la variable\n\u003ccode\u003edefaultContentLanguage\u003c/code\u003e, par exemple pour la langue française : \u003cbr\u003e\n\u003ccode\u003edefaultContentLanguage = \u0026quot;fr\u0026quot;\u003c/code\u003e, qui peut agrémentée de la variable\n\u003ccode\u003elanguageCode = \u0026quot;fr-FR\u0026quot;\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eGénéralement, le fichier \u003cabbr title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n sera\ncrée dans le répertoire \u003ccode\u003elayouts/partials/\u003c/code\u003e, et quelque soit son nom,\n\u003cem\u003epour l\u0026rsquo;exemple, nous l\u0026rsquo;appelerons \u003ccode\u003enav.html\u003c/code\u003e par soucis de simplicité\u003c/em\u003e, il\nsera appelé depuis le fichier \u003ccode\u003elayouts/_default/baseof.html\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e{{ partial \u0026quot;nav.html\u0026quot; . }}\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"menu-simple\"\u003eMenu simple\u003c/h3\u003e\n\u003cp\u003eC\u0026rsquo;est typiquement le genre de menu qui renvoie vers des éléments au sein de la\npage, mais il est possible de renvoyer vers une page nommée.\u003c/p\u003e\n\u003cp\u003ePour exemple : \u003ca href=\"http://huc.fr.eu.org\" rel=\"external\"\u003ehttp://huc.fr.eu.org\u003c/a\u003e\u003c/p\u003e\n\u003ch4 id=\"monolangue\"\u003eMonolangue\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;who\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Qui\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#whoiam\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;act\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Quoi\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#projects\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn remarque donc la présence de variables strictement nécessaires :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eidentifier\u003c/code\u003e : un identifiant, strictement nécessaire et unique à chaque entrée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ename\u003c/code\u003e : le nom\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eurl\u003c/code\u003e : le nom de l\u0026rsquo;ancre, ou de la page, à cibler. La présence du symbole \u003ccode\u003e#\u003c/code\u003e\nsignifie que le lien ciblé est une ancre dans la page ; son absence cible\nun article précisément nommé.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAinsi que de certaines utiles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eweight\u003c/code\u003e : c\u0026rsquo;est le poids du lien dans le menu, plus le poids est faible,\nplus le lien est \u0026ldquo;important\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epre\u003c/code\u003e : permet d\u0026rsquo;injecter du code avant le texte.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epost\u003c/code\u003e : permet d\u0026rsquo;injecter du code après le texte - \u003cem\u003en\u0026rsquo;est pas présentée ici\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLe reste, sachant qu\u0026rsquo;il existe d\u0026rsquo;autres variables, je vous renvoie à la\ndocumentation officielle.\u003c/p\u003e\n\u003ch4 id=\"multilangue\"\u003eMultilangue\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003een\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ehomeText\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003elanguageName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;English\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e = \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003een\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;who\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Who I am\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#whoiam\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003een\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;act\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Projects\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#projects\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003een\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efr\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ehomeText\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003elanguageName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Français\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e = \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efr\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;who\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Qui\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#whoiam\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efr\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;act\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Quoi\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#projects\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003elanguages\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003efr\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;#contact\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr, allez lire la documentation officielle !\u003c/p\u003e\n\u003ch4 id=\"structure\"\u003eStructure\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eCette structure de répertoire n\u0026rsquo;est pas du tout nécessaire si vous ne faites\nqu\u0026rsquo;un site monopage, telle juste une page d\u0026rsquo;accueil, et des liens vers des ancres !\u003c/div\u003e\n\n\u003cp\u003eAdmettons que vous voulez diriger vers des pages, et non pas des ancres… il vous\nfaudra donc créer dans le répertoire \u003ccode\u003econtent\u003c/code\u003e les articles correspondants portant\nles noms servant de valeur à la variable \u003ccode\u003eurl\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econtent/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    contact.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    projects.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    whoiam.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien sûr, il est possible de mixer liens vers des pages et des ancres. À vous\nde modifier en conséquence…\u003c/p\u003e\n\u003ch4 id=\"html\"\u003eHTML\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav-border\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003enav\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav justify-content-center\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ range .Site.Menus.main }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ $text := print .Name | safeHTML }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav-link\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .URL }}\u0026#34;\u003c/span\u003e\u0026gt;{{ $text }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003enav\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn parcourt tout simplement l\u0026rsquo;ensemble de la variable \u003ccode\u003e.Site.Menus.main\u003c/code\u003e pour\nrestituer le code correspondant.\u003c/p\u003e\n\u003cp\u003eMaintenant si dans le fichier de configuration, vous ajoutez et remplissez la\nvariable \u003ccode\u003epre\u003c/code\u003e, il vous faudra modifier le fichier HTML ainsi, par exemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $icon := printf \u0026#34;\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ei\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\\\u0026#34;%s\\\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ei\u003c/span\u003e\u0026gt;\u0026#34; .Pre }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $text := print $icon \u0026#34; \u0026#34; .Name | safeHTML }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet exemple nous permet d\u0026rsquo;injecter du code HTML afin d\u0026rsquo;ajouter une icône avant\nle texte, ce qui est utile dans le contexte de la bibliothèque \u003cstrong\u003eFont Awesome\u003c/strong\u003e\nou de toute autre semblable.\u003c/p\u003e\n\u003ch3 id=\"menu-dropdown\"\u003eMenu dropdown\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eHugo n\u0026rsquo;est pour l\u0026rsquo;instant capable de gérer qu\u0026rsquo;un sous-niveau de menu !\u003c/div\u003e\n\n\u003cp\u003ePour obtenir un menu dropdown, tel que vous voyez\n\u003ca href=\"/fr/web/hugo/hugo-menu-nav/#page-top\"\u003een haut de page sur ce site\u003c/a\u003e, le plus simple est d\u0026rsquo;utiliser le\nframework \u003ca href=\"https://getbootstrap.com/\" rel=\"external\"\u003eBootstrap\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eEn tenant compte du fait que vous savez intégrer la bibliothèque\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eJS \u003cem\u003e(JavaScript)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et la feuille \n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eCSS \u003cem\u003e(Cascade Style Sheet)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n…\u003c/p\u003e\n\u003ch4 id=\"structure-1\"\u003eStructure\u003c/h4\u003e\n\u003cp\u003eDans le répertoire \u003ccode\u003econtent\u003c/code\u003e, il est nécessaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ede créer un ou plusieurs sous-répertoires, qui correspondront aux \u003ccode\u003esections\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ede créer un ou plusieurs répertoires enfants, dans ces premiers sous-répertoires,\nqui correspondront aux \u003ccode\u003esous-sections\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eVoici un exemple de structure de répertoires :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003econtent/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    dev/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        _index.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        javascript/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            _index.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            article.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        python/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            _index.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            article.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        shell/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            _index.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            article1.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            article2.md\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            article3.md\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn remarque la présence de fichier \u003ccode\u003e_index.md\u003c/code\u003e dans chaque répertoire. Le nom\ndes fichiers \u003ccode\u003earticle*.md\u003c/code\u003e n\u0026rsquo;a pas d\u0026rsquo;importance.\u003c/p\u003e\n\u003cp\u003eDe même le nom des répertoires importe peu en soit, par contre veillez bien à\nla correspondance avec la variable \u003ccode\u003eurl\u003c/code\u003e dans le fichier de configuration.\u003c/p\u003e\n\u003ch4 id=\"fichier-_indexmd\"\u003eFichier \u003ccode\u003e_index.md\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003eChaque répertoire a son propre fichier \u003ccode\u003e_index.md\u003c/code\u003e dont le but est simplement\nd\u0026rsquo;activer le répertoire qui doit comporter à minima le\n\u003cspan lang=\"en\"\u003eFront Matter\u003c/span\u003e, au format \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eYAML \u003cem\u003e(YAML Ain\u0026#39;t Markup Language)\u003c/em\u003e\u003c/span\u003e\n, qui suit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#fec418\"\u003e---\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003etitle\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003edate\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e2019-11-28T23:40:14\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e+01\u003c/span\u003e:\u003cspan style=\"color:#f99b15\"\u003e00\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003edraft\u003c/span\u003e: \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#fec418\"\u003e---\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi vous voulez qu\u0026rsquo;il ne soit pas indexé, rajouter la variable \u003ccode\u003enoindex: true\u003c/code\u003e.\n\u003cem\u003e(ce qui est évidemment utile dans le contexte de génération de\n\u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-feed/\" title=\"Lien interne vers l\u0026#39;article : 'Hugo : Feed Atom, JSON, RSS'\"\u003eflux de syndication\u003c/a\u003e\n)\u003c/em\u003e.\u003c/p\u003e\n\u003ch4 id=\"fichier-configtoml\"\u003eFichier \u003ccode\u003econfig.toml\u003c/code\u003e\u003c/h4\u003e\n\u003cp\u003eLa structure du fichier de configuration est sensiblement la même !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;dev\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Développement\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;dev\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;shell\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Shell\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eparent\u003c/span\u003e      = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;dev\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;shell\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;js\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;JavaScript\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eparent\u003c/span\u003e      = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;dev\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;javascript\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e11\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [[\u003cspan style=\"color:#06b6ef\"\u003emenu\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003emain\u003c/span\u003e]]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eidentifier\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;py\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Python\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eparent\u003c/span\u003e      = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;dev\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003epre\u003c/span\u003e        = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e         = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;python\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eweight\u003c/span\u003e     = \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eOn remarque tout particulièrement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela présence des variables \u003ccode\u003eparent\u003c/code\u003e qui permettent de définir que l\u0026rsquo;entrée de\nmenu en question a pour parent celui qui porte l\u0026rsquo;identifiant nommé. \u003cbr\u003e\nDans cet exemple, elles ont pour valeur \u003ccode\u003edev\u003c/code\u003e et renvoie à l\u0026rsquo;entrée de menu\nqui a \u003ccode\u003eidentifier = \u0026quot;dev\u0026quot;\u003c/code\u003e, \u003cem\u003equi est bien aussi leur répertoire parent,\ndans la \u003ca href=\"/fr/web/hugo/hugo-menu-nav/#structure\"\u003estructure de répertoires\u003c/a\u003e\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi vous avez un site \u003ca href=\"/fr/web/hugo/hugo-menu-nav/#multilangue\"\u003emultilangue\u003c/a\u003e, il faudra adapter l\u0026rsquo;exemple\nci-dessus pour le faire correspondre…\u003c/p\u003e\n\u003ch4 id=\"html-1\"\u003eHTML\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e\u0026lt;!-- Navbar --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003enav\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar navbar-expand-lg navbar-transparent\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;container\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar-translate\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar-brand\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ relLangURL \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;tooltip\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{.Site.Title}}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata-placement\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;bottom\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    {{.Site.Title}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ebutton\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar-toggler navbar-toggler\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;button\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata-toggle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;collapse\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata-target\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#navigation\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-controls\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navigation-index\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-expanded\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-label\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;Toggle navigation\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar-toggler-bar bar1\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar-toggler-bar bar2\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar-toggler-bar bar3\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ebutton\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;collapse navbar-collapse justify-content-end\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navigation\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e              \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eul\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;navbar-nav ml-auto\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      {{ range .Site.Menus.main }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ if .HasChildren }} {{ $id := print \u0026#34;navbarDropdownMenuLink\u0026#34; .Identifier }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eli\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav-item dropdown\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav-link dropdown-toggle\u0026#34;\u003c/span\u003e  \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $id }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata-toggle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;dropdown\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {{ .Pre }} \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;{{ .Name }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;caret\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;dropdown-menu dropdown-menu-right\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-labelledby\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $id }}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {{ range .Children }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;dropdown-item\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .URL | relLangURL }}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eIsHome\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata-target\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .URL }}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e\u0026gt;{{ .Name }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eli\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ else }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eli\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav-item\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e          \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nav-link\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .URL | relLangURL }}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eIsHome\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edata-target\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .URL }}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e\u0026gt;{{ .Name }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eli\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eul\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003enav\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e\u0026lt;!-- End Navbar --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"clap-de-fin\"\u003eClap de Fin\u003c/h2\u003e\n\u003cp\u003e\u0026ldquo;Voilà, c\u0026rsquo;est fini !\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eNous avons ainsi vu comment créer un menu simple ou un menu dropdown pour Hugo.\u003c/p\u003e\n\u003cp\u003eN\u0026rsquo;oubliez pas de vous amuser, puis de publier vos articles, et si besoin de vous\nfaire aider par la \u003ca href=\"https://discourse.gohugo.io/\" rel=\"external\"\u003ecommunauté anglaise de Hugo\u003c/a\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-ID! \u003cbr\u003e\nEnjoy-IT!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment créer un menu de navigation simple, ou plus complexe, de type dropdown pour Hugo",
            "tags": ["Hugo", "Menu", "nav", "dropdown"],
            "date_published": "2019-12-18T11:38:00+01:00",
            "date_modified": "2025-11-13T14:12:52+01:00"
        },{
            "id": "urn:uuid:0ffabda9-ad32-4abd-b230-a6f87a35ca33",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-feed/",
            "title": "Hugo : Feed Atom, JSON, RSS",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Parmi les flux de données, Hugo est capable de créer plusieurs flux dont RSS (Really Simple Syndication) (actuellement, à la norme 2.0).\nHugo est donc capable de générer un flux RSS, ou de type JSON, mais pas ATOM - pour ce dernier, nous verrons comment faire dans le chapitre ad hoc.\nDocumentation Un petit tour sur la documentation officielle Hugo :\nHugo Documentation : Templates \u0026gt; Rss Hugo Documentation : Templates \u0026gt; Output formats Hugo Documentation : Variables \u0026gt; Site Hugo Documentation : Variables \u0026gt; Hugo Hugo Documentation : Functions \u0026gt; Sha Hugo Documentation : Functions \u0026gt; Range Détails Techniques Commençons par les détails techniques suivants à-propos de la gestion de différents éléments ; chaque format de flux a ses propres spécificités, certaines sont communes ou peuvent se ressembler. Merci de lire les [RFC](#documentations tierces) adéquates.\nauthor Les trois formats de flux gérent un élément author dans les différentes entrées générées. Quant à l\u0026rsquo;auteur du site, là où ATOM et JSON (JavaScript Object Notation) ont leur élément author avec leurs spécificités, RSS a son propre élément managingEditor, voire webMaster.\nIl faut configurer le bloc author dans le fichier de configuration, de telle manière :\n[params] [params.author] email = \u0026#34;courriel@domaine.tld\u0026#34; name = \u0026#34;Nom Prénom\u0026#34; category Là où ATOM et RSS sont capables de générer un élément catégory, JSON utilise l\u0026rsquo;élément tag.\nDans tous les cas, j\u0026rsquo;ai utilisé la taxonomie des tags pour les créer.\nIl faut configurer la taxonomie dans le fichier de configuration, de telle manière :\n[taxonomies] tag = \u0026#34;tags\u0026#34; copyright Là où RSS a son élément copyright,\nATOM peut annoncer par le biais d\u0026rsquo;un élément link qui permet de cibler un fichier de licence - telle une licence CC (Creatives Commons) - ainsi que son élément rights. JSON n\u0026rsquo;a rien de prévu. Il faut configurer la variable copyright dans le fichier de configuration.\ndescription Là où RSS et JSON ont leur élément description du flux, ATOM n\u0026rsquo;en a pas, mais il est possible d\u0026rsquo;utiliser l\u0026rsquo;élément subtitle.\nConcernant l\u0026rsquo;usage de l\u0026rsquo;élément description, j\u0026rsquo;utilise personnellement la variable site.Params.description.\nIl faut configurer la variable description dans le fichier de configuration.\ngenerator Seul ATOM et RSS sont capables de générer un élément generator, bien qu\u0026rsquo;ATOM le fasse plus finement.\nOn peut utiliser les variables spécifiques à Hugo.\nid Pour RSS , l\u0026rsquo;identifiant d\u0026rsquo;une entrée est l\u0026rsquo;élément guid. ATOM et JSON ont un élément id. ATOM a aussi son identifiant de site.\nIl est important de veiller à ce que cet identifiant soit unique ; il y a plusieurs manières de les générer :\nSoit tout simplement par le biais de l\u0026rsquo; URL (Uniform Resource Locator) du site, ou de l\u0026rsquo;article correspondant à l\u0026rsquo;entrée : \u0026lt;id\u0026gt;{{ .Permalink }}\u0026lt;/id\u0026gt;\nSoit en utilisant le schéma de notation tag, définie par la JSON 4151, de type tag:identifiant,DATE:alphanumerique et où tag:identifiant,DATE ne doit pas changer sur l\u0026rsquo;ensemble du site, seule la partie alphanumerique sera l\u0026rsquo;objet de l\u0026rsquo;unicité de l\u0026rsquo;article ou de l\u0026rsquo;identifiant du site :\noù l\u0026rsquo;identifiant peut être soit une adresse mail, soit le nom de domaine ; ce dernier semble être la préférence.\noù DATE doit correspondre à la norme ISO (International Organization for Standardization) 8601, à minima l\u0026rsquo;année, codée sur 4 chiffres, telle que 2019 ; la préférence peut être donnée à la forme YYYY-MM-DD où l\u0026rsquo;année, le mois et le jour sont séparés par un tiret -, telle que 2019-10-07 qui peut correspondre à la date de création de votre domaine, par exemple.\noù alphanumerique est un ensemble de lettres et de chiffres.\nPour exemple :\nPour l\u0026rsquo;identifiant du site : {{ $url := urls.Parse .Permalink }}{{ $id := print \u0026quot;tag:\u0026quot; $url.Host \u0026quot;,2019-10-07:\u0026quot; }}\u0026lt;id\u0026gt;{{ $id }}website\u0026lt;/id\u0026gt;\nPour l\u0026rsquo;identifiant d\u0026rsquo;entrée : \u0026lt;id\u0026gt;{{ $id }}{{ anchorize .RelPermalink }}\u0026lt;/id\u0026gt;\nPour RSS , remplacez la balise \u0026lt;id\u0026gt; par \u0026lt;guid\u0026gt;. De même, si vous utilisez la notation par tag ou par UURI, il vous faudra ajouter l\u0026rsquo;attribut isPermalink, tel que : isPermaLink=\u0026quot;false\u0026quot;\nSoit en utilisant le schéma de notation UURI définie par la RFC (Requests for comments) 4122 - qui est humainement incompréhensible ; l\u0026rsquo;avantage avec Hugo est qu\u0026rsquo;on peut la générer dynamiquement en utilisant la fonction sha, tout particulièrement sha1 conforme à la version 5 de ladite numérotation, telle que :\n{{ $uuid := sha1 .Permalink }}\u0026lt;id\u0026gt;urn:uuid:{{substr $uuid 0 8}}-{{substr $uuid 10 4}}-{{substr $uuid 15 4}}-{{substr $uuid 20 4}}-{{substr $uuid 25 12}}\u0026lt;/id\u0026gt; image Là où RSS gère l\u0026rsquo;élément image pour afficher le logo,\nATOM et JSON gèrent deux éléments différents, icon pour l\u0026rsquo;image de favicon, et logo pour votre… logo !\nJSON est capable, en plus, de gérer un avatar pour l\u0026rsquo;auteur.\nLimite AttentionIl semble nécessaire d\u0026rsquo;utiliser au moins Hugo v0.55.x Le code Hugo suivant, que j\u0026rsquo;utilise dans chacun des modèles, permet de limiter le nombre d\u0026rsquo;entrées selon :\nLa limite du service RSS ,\nSi les pages ont le paramètre disable_feed sur true, elles ne sont pas incluses.\nOn capture le nombre de pages,\nPuis on utilise la fonction Hugo range pour générer dynamiquement le nombre d\u0026rsquo;entrées - l\u0026rsquo;usage de la fonction dans le modèle pour JSON différe légérement de celui pour les modèles ATOM et RSS - :\n{{- $limit := (cond (le site.Config.Services.RSS.Limit 0) 65536 site.Config.Services.RSS.Limit) -}} {{- $pages := where site.RegularPages \u0026#34;.Params.disable_feed\u0026#34; \u0026#34;!=\u0026#34; true -}} {{- if ge $limit 1 -}}{{- $pages = $pages | first $limit -}}{{- end -}} Configuration Le fichier de configuration principal : config.toml RSS InfoIl est possible de spécifier dans le fichier de configuration le format de sortie\nRSS\npour home, section et les deux taxonomy, taxonomyTerm.\nPersonnellement, je renomme le nom du flux RSS en modifiant dans le fichier de configuration, la variable baseName à rss parce que je ne pense pas que celui-ci doit porter le nom index.\nEn effet, le nom rss.xml est plus parlant !\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;RSS\u0026#34;] [outputFormats.RSS] baseName = \u0026#34;rss\u0026#34; InfoSachez qu\u0026rsquo;il est possible de surcharger la génération native du flux\nRSS\n, en créant un modèle dans _default.\nRSS:Template AttentionIl n\u0026rsquo;est pas nécessaire de créer ce modèle du fait que Hugo génére correctement, mais pour de l\u0026rsquo;anglais, le fichier\nRSS\n, nommé index.xml.\nJ\u0026rsquo;ai créé mon propre modèle, tenant compte du fait d\u0026rsquo;être multilangue.\n{{ printf `\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; standalone=\u0026#34;yes\u0026#34; ?\u0026gt;` | safeHTML }} \u0026lt;rss version=\u0026#34;2.0\u0026#34; xmlns:atom=\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u0026gt; \u0026lt;channel\u0026gt; \u0026lt;title\u0026gt;{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{.}}{{ T \u0026#34;on\u0026#34; }}{{ end }}\u0026#39;{{ site.Title }}\u0026#39;{{ end }}\u0026lt;/title\u0026gt; \u0026lt;link\u0026gt;{{ .Permalink }}\u0026lt;/link\u0026gt; {{ with site.Params.description -}}\u0026lt;description\u0026gt;{{ . }}\u0026lt;/description\u0026gt;{{- end }} \u0026lt;docs\u0026gt;http://blogs.law.harvard.edu/tech/rss\u0026lt;/docs\u0026gt; \u0026lt;generator\u0026gt;Hugo {{ Hugo.Version }}\u0026lt;/generator\u0026gt; \u0026lt;image\u0026gt; \u0026lt;description\u0026gt;Logo\u0026lt;/description\u0026gt; \u0026lt;height\u0026gt;128\u0026lt;/height\u0026gt; \u0026lt;link\u0026gt;{{ .Permalink }}\u0026lt;/link\u0026gt; \u0026lt;title\u0026gt;{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{.}}{{ T \u0026#34;on\u0026#34; }}{{ end }}\u0026#39;{{ site.Title }}\u0026#39;{{ end }}\u0026lt;/title\u0026gt; \u0026lt;url\u0026gt;{{ site.BaseURL }}img/Logo.png\u0026lt;/url\u0026gt; \u0026lt;width\u0026gt;128\u0026lt;/width\u0026gt; \u0026lt;/image\u0026gt; {{ with site.LanguageCode }}\u0026lt;language\u0026gt;{{.}}\u0026lt;/language\u0026gt;{{end}} {{ with site.Params.author.email }}\u0026lt;managingEditor\u0026gt;{{.}}{{ with site.Params.author.name }} ({{.}}){{end}}\u0026lt;/managingEditor\u0026gt; \u0026lt;webMaster\u0026gt;{{.}}{{ with site.Author.name }} ({{.}}){{end}}\u0026lt;/webMaster\u0026gt;{{end}} {{ with site.Copyright }}\u0026lt;copyright\u0026gt;© {{ $.Date.Format \u0026#34;2006\u0026#34; | safeHTML }} {{ site.Author.name }}; {{.}}\u0026lt;/copyright\u0026gt;{{end}} {{ if not .Date.IsZero }}\u0026lt;lastBuildDate\u0026gt;{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u0026lt;/lastBuildDate\u0026gt;{{ end }} {{ with .OutputFormats.Get \u0026#34;RSS\u0026#34; }}{{ printf `\u0026lt;atom:link href=%q rel=\u0026#34;self\u0026#34; type=%q /\u0026gt;` .Permalink .MediaType | safeHTML }}{{ end }} {{- $limit := (cond (le site.Config.Services.RSS.Limit 0) 65536 site.Config.Services.RSS.Limit) -}} {{- $pages := where site.Pages \u0026#34;.Params.disable_feed\u0026#34; \u0026#34;!=\u0026#34; true -}} {{- if ge $limit 1 -}}{{- $pages = $pages | first $limit -}}{{- end -}} {{- range first $limit $pages }} \u0026lt;item\u0026gt; \u0026lt;title\u0026gt;{{ .Title }}\u0026lt;/title\u0026gt; \u0026lt;link\u0026gt;{{ .Permalink }}\u0026lt;/link\u0026gt; {{ with .Summary }}\u0026lt;description\u0026gt;{{ . | html }}\u0026lt;/description\u0026gt;{{end}} {{ with site.Params.author.email }}\u0026lt;author\u0026gt;{{.}}{{ with site.Params.author.name }} ({{.}}){{end}}\u0026lt;/author\u0026gt;{{end}}{{ $url := printf \u0026#34;%s\u0026#34; \u0026#34;/tags/\u0026#34; | absLangURL }} {{ with .Params.tags }}{{ range . }}\u0026lt;category domain=\u0026#34;{{ $url }}{{urlize .}}/\u0026#34;\u0026gt;{{.}}\u0026lt;/category\u0026gt;{{end}}{{end}} \u0026lt;guid\u0026gt;{{ .Permalink }}\u0026lt;/guid\u0026gt; \u0026lt;pubDate\u0026gt;{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u0026lt;/pubDate\u0026gt; \u0026lt;/item\u0026gt; {{ end }} \u0026lt;/channel\u0026gt; \u0026lt;/rss\u0026gt; Atom Nativement Hugo ne génére pas de flux Atom. Il faut tout créer ; ce n\u0026rsquo;est pas bien difficile !\nIl est nécessaire de modifier le fichier de configuration pour :\ncréer un nouveau type de média créer un nouveau format de sortie créer le modèle pour le flux Atom Atom::MediaType Hugo \u0026gt;= 0.20 Depuis Hugo 0.20, il faut ajouter :\n[mediaTypes] [mediaTypes.\u0026#34;application/atom+xml\u0026#34;] suffix = \u0026#34;xml\u0026#34; Là, nous avons donc implémenté un nouveau type de format ayant pour mime type : application/atom+xml, et pour nom d\u0026rsquo;extension : xml.\nHugo \u0026gt;= 0.44 Depuis Hugo 0.44, pour que cela fonctionne correctement il faut ajouter :\n[mediaTypes] [mediaTypes.\u0026#34;application/atom+xml\u0026#34;] suffixes = [\u0026#34;xml\u0026#34;] AstuceSi votre ancienne configuration précédait la 0.44, il faut adapter/transformer la variable suffix en suffixes = ['xml'] ! Atom::OuputFormat La déclaration du format de sortie, à ajouter :\n[outputFormats.Atom] baseName = \u0026#34;atom\u0026#34; isPlainText = false mediaType = \u0026#34;application/atom+xml\u0026#34; Puis, il faut ajouter \u0026quot;ATOM\u0026quot; à votre variable home, tel que :\n[outputs] home = [\u0026#34;HTML\u0026#34;, \u0026#34;ATOM\u0026#34;, \u0026#34;RSS\u0026#34;] Atom::Template Le modèle peut simplement être créé dans le répertoire layouts/ et se nommer index.atom.xml, ou être dans son sous-répertoire _default/ et se nommer, par exemple : home.atom.xml.\nSi le site est multilangue, les liens alternatifs vers la version de langue correspondante à l\u0026rsquo;entrée du site, aux flux atom, RSS , voire JSON sont générés. {{ printf `\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; standalone=\u0026#34;yes\u0026#34; ?\u0026gt;` | safeHTML }} \u0026lt;feed xmlns=\u0026#34;http://www.w3.org/2005/Atom\u0026#34; xml:lang=\u0026#34;{{ with site.Language.Lang }}{{.}}{{end}}\u0026#34;\u0026gt; \u0026lt;id\u0026gt;{{ .Permalink }}\u0026lt;/id\u0026gt; \u0026lt;title\u0026gt;{{ if eq .Title site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{.}}{{ T \u0026#34;on\u0026#34; }}{{ end }}\u0026#39;{{ site.Title }}\u0026#39;{{ end }}\u0026lt;/title\u0026gt; {{ with site.Params.description -}}\u0026lt;subtitle\u0026gt;{{ . }}\u0026lt;/subtitle\u0026gt;{{- end }} {{ with .OutputFormats.Get \u0026#34;ATOM\u0026#34; }}{{ printf `\u0026lt;link href=%q rel=\u0026#34;self\u0026#34; type=%q /\u0026gt;` .Permalink .MediaType | safeHTML }}{{end}} {{ range .AlternativeOutputFormats -}} \u0026lt;link href=\u0026#34;{{ if eq .Name \u0026#34;HTML\u0026#34; }}{{ $.Permalink }}{{ else }}{{ printf `%s%s.%s` $.Permalink (.Name | lower) (index .MediaType.Suffixes 0) }}{{end}}\u0026#34; rel=\u0026#34;alternate\u0026#34; {{ printf \u0026#34;type=%q\u0026#34; .MediaType.Type | safeHTMLAttr }} /\u0026gt; {{end}}{{ if hugo.IsMultilingual }}{{ range site.Languages }}{{ if ne .Lang site.Language.Lang }}{{ $lang := .Lang }} {{ with $.OutputFormats.Get \u0026#34;ATOM\u0026#34; }}{{ printf `\u0026lt;link href=%q hreflang=%q rel=\u0026#34;alternate\u0026#34; type=%q /\u0026gt;` (print $lang \u0026#34;/\u0026#34; .Name \u0026#34;.\u0026#34; (index .MediaType.Suffixes 0) |absURL) $lang .MediaType | safeHTML }}{{end}} {{ range $.AlternativeOutputFormats -}} \u0026lt;link href=\u0026#34;{{ if eq .Name \u0026#34;HTML\u0026#34; }}{{ printf `%s/` $lang | absURL }}{{ else }}{{ printf `%s/%s.%s` $lang (.Name | lower) (index .MediaType.Suffixes 0) | absURL }}{{end}}\u0026#34; hreflang=\u0026#34;{{ $lang }}\u0026#34; rel=\u0026#34;alternate\u0026#34; {{ printf \u0026#34;type=%q\u0026#34; .MediaType.Type | safeHTMLAttr }} /\u0026gt; {{end}}{{end}}{{end}}{{end}}{{ with site.Copyright }}{{ $lang := site.Language.Lang }} \u0026lt;link href=\u0026#34;http://creativecommons.org/publicdomain/zero/1.0/legalcode.{{ $lang }}\u0026#34; hreflang=\u0026#34;{{ $lang }}\u0026#34; rel=\u0026#34;license\u0026#34; /\u0026gt; \u0026lt;link href=\u0026#34;http://creativecommons.org/publicdomain/zero/1.0/deed.{{ $lang }}\u0026#34; hreflang=\u0026#34;{{ $lang }}\u0026#34; rel=\u0026#34;license\u0026#34; /\u0026gt; \u0026lt;rights\u0026gt;© {{ $.Date.Format \u0026#34;2006\u0026#34; | safeHTML }} {{ site.Params.author.name }}\u0026lt;/rights\u0026gt;{{end}} \u0026lt;icon\u0026gt;/img/favicon.ico\u0026lt;/icon\u0026gt; {{ with site.Params.logo }}\u0026lt;logo\u0026gt;{{.}}\u0026lt;/logo\u0026gt;{{end}} {{ if not .Date.IsZero }}\u0026lt;updated\u0026gt;{{ .Date.Format \u0026#34;2006-01-02T15:04:05-07:00\u0026#34; | safeHTML }}\u0026lt;/updated\u0026gt;{{ end }} {{ with site.Params.author.name }} \u0026lt;author\u0026gt; \u0026lt;name\u0026gt;{{.}}\u0026lt;/name\u0026gt; {{ with site.Params.author.email }}\u0026lt;email\u0026gt;{{.}}\u0026lt;/email\u0026gt;{{end}} \u0026lt;uri\u0026gt;{{ $.Permalink }}\u0026lt;/uri\u0026gt; \u0026lt;/author\u0026gt;{{end}} \u0026lt;generator uri=\u0026#34;https://gohugo.io\u0026#34; version=\u0026#34;{{ Hugo.Version }}\u0026#34;\u0026gt;Hugo\u0026lt;/generator\u0026gt; {{- $limit := (cond (le site.Config.Services.RSS.Limit 0) 65536 site.Config.Services.RSS.Limit) -}} {{- $pages := where site.RegularPages \u0026#34;.Params.disable_feed\u0026#34; \u0026#34;!=\u0026#34; true -}} {{- if ge $limit 1 -}}{{- $pages = $pages | first $limit -}}{{- end -}} {{- range first $limit $pages }} \u0026lt;entry\u0026gt; \u0026lt;id\u0026gt;{{ .Permalink }}\u0026lt;/id\u0026gt; \u0026lt;link href=\u0026#34;{{ .Permalink }}\u0026#34; rel=\u0026#34;alternate\u0026#34; type=\u0026#34;text/html\u0026#34; /\u0026gt; \u0026lt;title\u0026gt;{{ .Title }}\u0026lt;/title\u0026gt;{{ with site.Params.author }} \u0026lt;author\u0026gt; \u0026lt;name\u0026gt;{{.}}\u0026lt;/name\u0026gt; \u0026lt;/author\u0026gt;{{end}}{{ $url := printf \u0026#34;%s\u0026#34; \u0026#34;/tags/\u0026#34; | absLangURL }}{{ with .Params.tags }}{{ range . }} \u0026lt;category term=\u0026#34;{{.}}\u0026#34; scheme=\u0026#34;{{ print $url (urlize .) | absLangURL }}/\u0026#34; /\u0026gt;{{end}} {{end}} {{ with .Content }}\u0026lt;content type=\u0026#34;html\u0026#34;\u0026gt;{{ `\u0026lt;![CDATA[` | safeHTML }}{{.}}]]\u0026gt;\u0026lt;/content\u0026gt;{{end}} {{ with .Summary }}\u0026lt;summary type=\u0026#34;html\u0026#34;\u0026gt;{{ `\u0026lt;![CDATA[` | safeHTML }}{{.}}]]\u0026gt;\u0026lt;/summary\u0026gt;{{end}} \u0026lt;published\u0026gt;{{ .Date.Format \u0026#34;2006-01-02T15:04:05-07:00\u0026#34; | safeHTML }}\u0026lt;/published\u0026gt; {{ if gt .Lastmod .Date }}\u0026lt;updated\u0026gt;{{ .Lastmod.Format \u0026#34;2006-01-02T15:04:05-07:00\u0026#34; | safeHTML }}\u0026lt;/updated\u0026gt;{{end}} \u0026lt;/entry\u0026gt; {{ end }} \u0026lt;/feed\u0026gt; JSON Pour générer le flux JSON , nous nous conformerons à la norme JSON Feed v1.\nJSON::OutputFormat La déclaration de sortie de format à ajouter :\n[outputFormats.JSON] mediaType = \u0026#34;application/json\u0026#34; baseName = \u0026#34;feed\u0026#34; suffix = \u0026#34;json\u0026#34; IsHTML = false IsPlainText = true noUgly = false rel = \u0026#34;alternate\u0026#34; Puis, il faut ajouter la déclaration JSON à votre variable home, tel que :\n[outputs] `home = [\u0026#34;HTML\u0026#34;, \u0026#34;ATOM\u0026#34;, \u0026#34;JSON\u0026#34;, \u0026#34;RSS\u0026#34;] JSON::Template JSON: Détails En plus de la limite mentionnée plus haut, nous récupèrons le nombre de page, pour boucler correctement car le dernier item ne doit pas être suivi du symbole \u0026lsquo;,\u0026rsquo; :\n{{- $length := (len $pages) -}} Et en fin de boucle range, nous ajoutons :\n{{ if ne (add $index 1) $length }},{{ end }} Ainsi tant qu\u0026rsquo;il y a un élément suivant, il est précédé du symbole \u0026lsquo;,\u0026rsquo; jusqu\u0026rsquo;au dernier.\n{{- $limit := (cond (le site.Config.Services.RSS.Limit 0) 65536 site.Config.Services.RSS.Limit) -}} {{- $pages := where site.RegularPages \u0026#34;.Params.disable_feed\u0026#34; \u0026#34;!=\u0026#34; true -}} {{- if ge $limit 1 -}}{{- $pages = $pages | first $limit -}}{{- end -}} {{- $length := (len $pages) -}} { \u0026#34;version\u0026#34;: \u0026#34;https://jsonfeed.org/version/1\u0026#34;, \u0026#34;title\u0026#34;: \u0026#34;{{ site.Title }}\u0026#34;, \u0026#34;home_page_url\u0026#34;: \u0026#34;{{ site.BaseURL }}\u0026#34;, {{ with .OutputFormats.Get \u0026#34;JSON\u0026#34; -}}\u0026#34;feed_url\u0026#34;: \u0026#34;{{.Permalink}}\u0026#34;,{{- end }} {{ with site.Params.description -}}\u0026#34;description\u0026#34;: \u0026#34;{{ . }}\u0026#34;,{{- end }} {{ with site.Params.author.name }} \u0026#34;author\u0026#34;: { \u0026#34;avatar\u0026#34;: \u0026#34;{{ with site.Params.logo }}{{ . }}{{ end}}\u0026#34;, \u0026#34;name\u0026#34;: \u0026#34;{{ . }}\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;http://huc.fr.eu.org\u0026#34; }, {{- end }} {{ with site.Params.logo }}\u0026#34;icon\u0026#34;: \u0026#34;{{ . }}\u0026#34;,{{- end }} \u0026#34;favicon\u0026#34;: \u0026#34;/img/favicon.ico\u0026#34;, \u0026#34;items\u0026#34;: [ {{- range $index, $elements := $pages -}} { \u0026#34;id\u0026#34;: \u0026#34;{{ .Permalink }}\u0026#34;, \u0026#34;url\u0026#34;: \u0026#34;{{ .Permalink }}\u0026#34;, \u0026#34;title\u0026#34;: \u0026#34;{{ .Title | plainify }}\u0026#34;, {{ with site.Params.Author }}\u0026#34;author\u0026#34;: { \u0026#34;name\u0026#34;: \u0026#34;{{ . }}\u0026#34; }{{ end }}{{ with .Content }}, \u0026#34;content_text\u0026#34;: {{ . | plainify | jsonify }}, \u0026#34;content_html\u0026#34;: {{ . | safeHTML | jsonify }}{{ end }}{{ with .Summary }}, \u0026#34;summary\u0026#34;: {{ . | plainify | jsonify }}{{ end }}{{ with .Params.tags }}, \u0026#34;tags\u0026#34;: [{{ range $tindex, $tag := . }}{{ if $tindex }}, {{ end }}\u0026#34;{{ $tag| htmlEscape }}\u0026#34;{{ end }}]{{ end }}{{ if .PublishDate }}, \u0026#34;date_published\u0026#34;: \u0026#34;{{ .PublishDate.Format \u0026#34;2006-01-02T15:04:05-01:00\u0026#34; | safeHTML }}\u0026#34;{{ end }}{{ if gt .Lastmod .Date }}, \u0026#34;date_modified\u0026#34;: \u0026#34;{{ .Lastmod.Format \u0026#34;2006-01-02T15:04:05-01:00\u0026#34; | safeHTML }}\u0026#34;{{ end }} }{{ if ne (add $index 1) $length }},{{ end }}{{- end }} ] } Documentations tierces RFC 3339 : https://tools.ietf.org/html/rfc3339 RFC 4122 : https://tools.ietf.org/html/rfc4122 RFC 4151 : https://tools.ietf.org/html/rfc4151 RFC 4287 : https://tools.ietf.org/html/rfc4287 RFC 5988 : https://tools.ietf.org/html/rfc5988 RFC 8288 : https://tools.ietf.org/html/rfc8288 Norme ISO 8601 : https://www.w3.org/TR/1998/NOTE-datetime-19980827 L\u0026rsquo;article d\u0026rsquo;OpenWeb : Comment construire un flux Atom ? Plus d\u0026rsquo;informations sur la norme d\u0026rsquo;identification tag sur le site Tag URI Plus d\u0026rsquo;informations sur les UUID : Universal_Unique_Identifier WP La spécification JSON Feed 1 : https://jsonfeed.org/version/1 La spécification RSS 2.0 : https://cyber.harvard.edu/rss/index.html Le sujet Atom and JSON feeds sur le forum de la communauté Hugo - qui m\u0026rsquo;a bien aidé. ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eParmi les flux de données, \u003ca class=\"tag\" href=\"/fr/tags/hugo\"\u003eHugo\u003c/a\u003e\n est capable de créer plusieurs\nflux dont \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eRSS \u003cem\u003e(Really Simple Syndication)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \u003cem\u003e(actuellement, à la norme 2.0)\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHugo\u003c/strong\u003e est donc capable de générer un flux \u003ca href=\"/fr/web/hugo/hugo-feed/#rss\"\u003eRSS\u003c/a\u003e, ou de type \u003ca href=\"/fr/web/hugo/hugo-feed/#json\"\u003eJSON\u003c/a\u003e,\nmais pas \u003ca href=\"/fr/web/hugo/hugo-feed/#atom\"\u003eATOM\u003c/a\u003e - \u003cem\u003epour ce dernier, nous verrons comment faire dans le\nchapitre ad hoc\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eUn petit tour sur la documentation officielle Hugo :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/templates/rss/\" title=\"Lien vers la page du site officiel Hugo : Templates \u0026gt; Rss\"\u003eHugo Documentation : Templates \u0026gt; Rss\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/templates/output-formats/\" title=\"Lien vers la page du site officiel Hugo : Templates \u0026gt; Output formats\"\u003eHugo Documentation : Templates \u0026gt; Output formats\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/variables/site/#site-variables-list\" title=\"Lien vers la page du site officiel Hugo : Variables \u0026gt; Site\"\u003eHugo Documentation : Variables \u0026gt; Site\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/variables/hugo/\" title=\"Lien vers la page du site officiel Hugo : Variables \u0026gt; Hugo\"\u003eHugo Documentation : Variables \u0026gt; Hugo\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/functions/sha/\" title=\"Lien vers la page du site officiel Hugo : Functions \u0026gt; Sha\"\u003eHugo Documentation : Functions \u0026gt; Sha\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/functions/range/\" title=\"Lien vers la page du site officiel Hugo : Functions \u0026gt; Range\"\u003eHugo Documentation : Functions \u0026gt; Range\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"détails-techniques\"\u003eDétails Techniques\u003c/h2\u003e\n\u003cp\u003eCommençons par les détails techniques suivants à-propos de la gestion de\ndifférents éléments ; chaque format de flux a ses propres spécificités,\ncertaines sont communes ou peuvent se ressembler. \u003cbr\u003e\nMerci de lire les [RFC](#documentations tierces) adéquates.\u003c/p\u003e\n\u003ch3 id=\"author\"\u003eauthor\u003c/h3\u003e\n\u003cp\u003eLes trois formats de flux gérent un élément \u003ccode\u003eauthor\u003c/code\u003e dans les différentes\nentrées générées. Quant à l\u0026rsquo;auteur du site, là où ATOM et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eJSON \u003cem\u003e(JavaScript Object Notation)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nont leur élément \u003ccode\u003eauthor\u003c/code\u003e avec leurs spécificités, \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a son\npropre élément \u003ccode\u003emanagingEditor\u003c/code\u003e, voire \u003ccode\u003ewebMaster\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl faut configurer le bloc \u003ccode\u003eauthor\u003c/code\u003e dans le fichier de configuration,\nde telle manière :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eparams\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003eparams\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eauthor\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eemail\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;courriel@domaine.tld\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e  = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;Nom Prénom\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"category\"\u003ecategory\u003c/h3\u003e\n\u003cp\u003eLà où ATOM et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sont capables de générer un élément \u003ccode\u003ecatégory\u003c/code\u003e,\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n utilise l\u0026rsquo;élément \u003ccode\u003etag\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDans tous les cas, j\u0026rsquo;ai utilisé la taxonomie des tags pour les créer.\u003c/p\u003e\n\u003cp\u003eIl faut configurer la taxonomie dans le fichier de configuration, de\ntelle manière :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003etaxonomies\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003etag\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"copyright\"\u003ecopyright\u003c/h3\u003e\n\u003cp\u003eLà où \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a son élément \u003ccode\u003ecopyright\u003c/code\u003e,\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eATOM peut annoncer par le biais d\u0026rsquo;un élément \u003ccode\u003elink\u003c/code\u003e qui permet de\ncibler un fichier de licence - \u003cem\u003etelle une licence \n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eCC \u003cem\u003e(Creatives Commons)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/em\u003e -\nainsi que son élément \u003ccode\u003erights\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n n\u0026rsquo;a rien de prévu.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl faut configurer la variable \u003ccode\u003ecopyright\u003c/code\u003e dans le fichier de configuration.\u003c/p\u003e\n\u003ch3 id=\"description-1\"\u003edescription\u003c/h3\u003e\n\u003cp\u003eLà où \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ont leur élément \u003ccode\u003edescription\u003c/code\u003e du\nflux, ATOM n\u0026rsquo;en a pas, mais il est possible d\u0026rsquo;utiliser l\u0026rsquo;élément \u003ccode\u003esubtitle\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eConcernant l\u0026rsquo;usage de l\u0026rsquo;élément \u003ccode\u003edescription\u003c/code\u003e, j\u0026rsquo;utilise personnellement\nla variable \u003ccode\u003esite.Params.description\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl faut configurer la variable \u003ccode\u003edescription\u003c/code\u003e dans le fichier de configuration.\u003c/p\u003e\n\u003ch3 id=\"generator\"\u003egenerator\u003c/h3\u003e\n\u003cp\u003eSeul ATOM et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sont capables de générer un élément \u003ccode\u003egenerator\u003c/code\u003e,\nbien qu\u0026rsquo;ATOM le fasse plus finement.\u003c/p\u003e\n\u003cp\u003eOn peut utiliser les variables spécifiques à Hugo.\u003c/p\u003e\n\u003ch3 id=\"id\"\u003eid\u003c/h3\u003e\n\u003cp\u003ePour \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, l\u0026rsquo;identifiant d\u0026rsquo;une entrée est l\u0026rsquo;élément \u003ccode\u003eguid\u003c/code\u003e. \u003cbr\u003e\nATOM et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ont un élément \u003ccode\u003eid\u003c/code\u003e. ATOM a aussi son identifiant de\nsite.\u003c/p\u003e\n\u003cp\u003eIl est important de veiller à ce que cet identifiant soit unique ; il y\na plusieurs manières de les générer :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSoit tout simplement par le biais de l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eURL \u003cem\u003e(Uniform Resource Locator)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n du site, ou de\nl\u0026rsquo;article correspondant à l\u0026rsquo;entrée : \u003cbr\u003e\n\u003ccode\u003e\u0026lt;id\u0026gt;{{ .Permalink }}\u0026lt;/id\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSoit en utilisant le schéma de notation \u003ccode\u003etag\u003c/code\u003e, définie par la \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n4151, de type \u003ccode\u003etag:identifiant,DATE:alphanumerique\u003c/code\u003e et où \u003ccode\u003etag:identifiant,DATE\u003c/code\u003e\nne doit pas changer sur l\u0026rsquo;ensemble du site, seule la partie \u003ccode\u003ealphanumerique\u003c/code\u003e\nsera l\u0026rsquo;objet de l\u0026rsquo;unicité de l\u0026rsquo;article ou de l\u0026rsquo;identifiant du site :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eoù l\u0026rsquo;identifiant peut être soit une adresse mail, soit le nom de\ndomaine ; ce dernier semble être la préférence.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eoù DATE doit correspondre à la norme \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eISO \u003cem\u003e(International Organization for Standardization)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n 8601, à minima\nl\u0026rsquo;année, codée sur 4 chiffres, telle que \u003ccode\u003e2019\u003c/code\u003e ; la préférence peut\nêtre donnée à la forme \u003ccode\u003eYYYY-MM-DD\u003c/code\u003e où l\u0026rsquo;année, le mois et le jour\nsont séparés par un tiret \u003ccode\u003e-\u003c/code\u003e, telle que \u003ccode\u003e2019-10-07\u003c/code\u003e qui peut\ncorrespondre à la date de création de votre domaine, par exemple.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eoù \u003ccode\u003ealphanumerique\u003c/code\u003e est un ensemble de lettres et de chiffres.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePour exemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ePour l\u0026rsquo;identifiant du site :\n\u003ccode\u003e{{ $url := urls.Parse .Permalink }}{{ $id := print \u0026quot;tag:\u0026quot; $url.Host \u0026quot;,2019-10-07:\u0026quot; }}\u0026lt;id\u0026gt;{{ $id }}website\u0026lt;/id\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePour l\u0026rsquo;identifiant d\u0026rsquo;entrée :\n\u003ccode\u003e\u0026lt;id\u0026gt;{{ $id }}{{ anchorize .RelPermalink }}\u0026lt;/id\u0026gt;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePour \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, remplacez la balise \u003ccode\u003e\u0026lt;id\u0026gt;\u003c/code\u003e par \u003ccode\u003e\u0026lt;guid\u0026gt;\u003c/code\u003e.\nDe même, si vous utilisez la notation par tag ou par UURI,\nil vous faudra ajouter l\u0026rsquo;attribut \u003ccode\u003eisPermalink\u003c/code\u003e, tel que :\n\u003ccode\u003eisPermaLink=\u0026quot;false\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSoit en utilisant le schéma de notation \u003ccode\u003eUURI\u003c/code\u003e définie par la \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eRFC \u003cem\u003e(Requests for comments)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n4122 - \u003cem\u003equi est humainement incompréhensible\u003c/em\u003e ; l\u0026rsquo;avantage avec Hugo est\nqu\u0026rsquo;on peut la générer dynamiquement en utilisant la fonction \u003ccode\u003esha\u003c/code\u003e, tout\nparticulièrement \u003ccode\u003esha1\u003c/code\u003e conforme à la version 5 de ladite numérotation,\ntelle que :\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{ $uuid := sha1 .Permalink }}\u0026lt;id\u0026gt;urn:uuid:{{substr $uuid 0 8}}-{{substr $uuid 10 4}}-{{substr $uuid 15 4}}-{{substr $uuid 20 4}}-{{substr $uuid 25 12}}\u0026lt;/id\u0026gt;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"image\"\u003eimage\u003c/h3\u003e\n\u003cp\u003eLà où \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n gère l\u0026rsquo;élément \u003ccode\u003eimage\u003c/code\u003e pour afficher le logo,\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eATOM et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n gèrent deux éléments différents, \u003ccode\u003eicon\u003c/code\u003e pour\nl\u0026rsquo;image de favicon, et \u003ccode\u003elogo\u003c/code\u003e pour votre… logo !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est capable, en plus, de gérer un avatar pour l\u0026rsquo;auteur.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"limite\"\u003eLimite\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eIl semble nécessaire d\u0026rsquo;utiliser au moins Hugo v0.55.x\u003c/div\u003e\n\n\u003cp\u003eLe code Hugo suivant, \u003cem\u003eque j\u0026rsquo;utilise dans chacun des modèles\u003c/em\u003e, permet de\nlimiter le nombre d\u0026rsquo;entrées selon :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLa limite du service \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi les pages ont le paramètre \u003ccode\u003edisable_feed\u003c/code\u003e sur \u003ccode\u003etrue\u003c/code\u003e, elles ne sont\npas incluses.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOn capture le nombre de pages,\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003ePuis on utilise la fonction Hugo \u003ccode\u003erange\u003c/code\u003e pour générer dynamiquement le\nnombre d\u0026rsquo;entrées - \u003cem\u003el\u0026rsquo;usage de la fonction dans le modèle pour \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ndiffére légérement de celui pour les modèles ATOM et \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/em\u003e - :\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $limit := (cond (le site.Config.Services.RSS.Limit 0) 65536 site.Config.Services.RSS.Limit) -}}\n{{- $pages := where site.RegularPages \u0026#34;.Params.disable_feed\u0026#34; \u0026#34;!=\u0026#34; true -}}\n{{- if ge $limit 1 -}}{{- $pages = $pages | first $limit -}}{{- end -}}\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe fichier de configuration principal : \u003ccode\u003econfig.toml\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rss\"\u003eRSS\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eIl est possible de spécifier dans le fichier de configuration le format de\nsortie\u003c/p\u003e\n\u003cp\u003e\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\u003c/p\u003e\n\u003cp\u003epour \u003ccode\u003ehome\u003c/code\u003e, \u003ccode\u003esection\u003c/code\u003e et les deux \u003ccode\u003etaxonomy\u003c/code\u003e,\n\u003ccode\u003etaxonomyTerm\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003ePersonnellement, je renomme le nom du flux \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n en modifiant dans\nle fichier de configuration, la variable \u003ccode\u003ebaseName\u003c/code\u003e à \u003ccode\u003erss\u003c/code\u003e parce que je ne\npense pas que celui-ci doit porter le nom \u003ccode\u003eindex\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEn effet, le nom \u003ccode\u003erss.xml\u003c/code\u003e est plus parlant !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;RSS\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eRSS\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebaseName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;rss\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eSachez qu\u0026rsquo;il est possible de surcharger la génération native du flux\u003c/p\u003e\n\u003cp\u003e\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\u003c/p\u003e\n\u003cp\u003e, en créant un modèle dans \u003ccode\u003e_default\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003ch4 id=\"rsstemplate\"\u003eRSS:Template\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eIl n\u0026rsquo;est pas nécessaire de créer ce modèle du fait que Hugo génére correctement,\nmais pour de l\u0026rsquo;anglais, le fichier\u003c/p\u003e\n\u003cp\u003e\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\u003c/p\u003e\n\u003cp\u003e, nommé \u003ccode\u003eindex.xml\u003c/code\u003e.\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eJ\u0026rsquo;ai créé mon propre modèle, tenant compte du fait d\u0026rsquo;être multilangue.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ printf `\u003cspan style=\"color:#776e71\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; standalone=\u0026#34;yes\u0026#34; ?\u0026gt;\u003c/span\u003e` | safeHTML }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;rss\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eversion=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;2.0\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003exmlns:atom=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e{{ if eq .Title  site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{.}}{{ T \u0026#34;on\u0026#34; }}{{ end }}\u0026#39;{{ site.Title }}\u0026#39;{{ end }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003e{{ .Permalink }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with site.Params.description -}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003e{{ . }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e{{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;docs\u0026gt;\u003c/span\u003ehttp://blogs.law.harvard.edu/tech/rss\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/docs\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;generator\u0026gt;\u003c/span\u003eHugo {{ Hugo.Version }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/generator\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;image\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003eLogo\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;height\u0026gt;\u003c/span\u003e128\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/height\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003e{{ .Permalink }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e{{ if eq  .Title  site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{.}}{{ T \u0026#34;on\u0026#34; }}{{ end }}\u0026#39;{{ site.Title }}\u0026#39;{{ end }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;url\u0026gt;\u003c/span\u003e{{ site.BaseURL }}img/Logo.png\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/url\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;width\u0026gt;\u003c/span\u003e128\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/width\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/image\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with site.LanguageCode }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;language\u0026gt;\u003c/span\u003e{{.}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/language\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with site.Params.author.email }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;managingEditor\u0026gt;\u003c/span\u003e{{.}}{{ with site.Params.author.name }} ({{.}}){{end}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/managingEditor\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;webMaster\u0026gt;\u003c/span\u003e{{.}}{{ with site.Author.name }} ({{.}}){{end}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/webMaster\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with site.Copyright }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;copyright\u0026gt;\u003c/span\u003e© {{ $.Date.Format \u0026#34;2006\u0026#34; | safeHTML }} {{ site.Author.name }}; {{.}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/copyright\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ if not .Date.IsZero }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;lastBuildDate\u0026gt;\u003c/span\u003e{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/lastBuildDate\u0026gt;\u003c/span\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with .OutputFormats.Get \u0026#34;RSS\u0026#34; }}{{ printf `\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;atom:link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e` .Permalink .MediaType | safeHTML }}{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- $limit := (cond (le site.Config.Services.RSS.Limit 0) 65536 site.Config.Services.RSS.Limit) -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- $pages := where site.Pages \u0026#34;.Params.disable_feed\u0026#34; \u0026#34;!=\u0026#34; true -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- if ge $limit 1 -}}{{- $pages = $pages | first $limit -}}{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- range first $limit $pages }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e{{ .Title }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u0026gt;\u003c/span\u003e{{ .Permalink }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/link\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ with .Summary }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;description\u0026gt;\u003c/span\u003e{{ . | html }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/description\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ with site.Params.author.email }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;author\u0026gt;\u003c/span\u003e{{.}}{{ with site.Params.author.name }} ({{.}}){{end}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/author\u0026gt;\u003c/span\u003e{{end}}{{ $url := printf \u0026#34;%s\u0026#34; \u0026#34;/tags/\u0026#34; | absLangURL }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ with .Params.tags }}{{ range . }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;category\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003edomain=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $url }}{{urlize .}}/\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e{{.}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/category\u0026gt;\u003c/span\u003e{{end}}{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;guid\u0026gt;\u003c/span\u003e{{ .Permalink }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/guid\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;pubDate\u0026gt;\u003c/span\u003e{{ .Date.Format \u0026#34;Mon, 02 Jan 2006 15:04:05 -0700\u0026#34; | safeHTML }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/pubDate\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/item\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/channel\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/rss\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"atom\"\u003eAtom\u003c/h3\u003e\n\u003cp\u003eNativement Hugo ne génére pas de flux Atom. Il faut tout créer ; ce n\u0026rsquo;est pas\nbien difficile !\u003c/p\u003e\n\u003cp\u003eIl est nécessaire de modifier le fichier de configuration pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecréer un nouveau \u003ca href=\"/fr/web/hugo/hugo-feed/#atommediatype\"\u003etype de média\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ecréer un nouveau \u003ca href=\"/fr/web/hugo/hugo-feed/#atomouputformat\"\u003eformat de sortie\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ecréer le \u003ca href=\"/fr/web/hugo/hugo-feed/#atomtemplate\"\u003emodèle\u003c/a\u003e pour le flux Atom\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"atommediatype\"\u003eAtom::MediaType\u003c/h4\u003e\n\u003ch5 id=\"hugo--020\"\u003eHugo \u0026gt;= 0.20\u003c/h5\u003e\n\u003cp\u003eDepuis Hugo 0.20, il faut ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esuffix\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLà, nous avons donc implémenté un nouveau type de format ayant pour mime\ntype : \u003ccode\u003eapplication/atom+xml\u003c/code\u003e, et pour nom d\u0026rsquo;extension : \u003ccode\u003exml\u003c/code\u003e.\u003c/p\u003e\n\u003ch5 id=\"hugo--044\"\u003eHugo \u0026gt;= 0.44\u003c/h5\u003e\n\u003cp\u003eDepuis Hugo 0.44, pour que cela fonctionne correctement il faut ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    [\u003cspan style=\"color:#06b6ef\"\u003emediaTypes\u003c/span\u003e.\u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esuffixes\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;xml\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eSi votre ancienne configuration précédait la 0.44, il faut adapter/transformer\nla variable \u003ccode\u003esuffix\u003c/code\u003e en \u003ccode\u003esuffixes = ['xml']\u003c/code\u003e !\u003c/div\u003e\n\n\u003ch4 id=\"atomouputformat\"\u003eAtom::OuputFormat\u003c/h4\u003e\n\u003cp\u003eLa déclaration du format de sortie, à ajouter  :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eAtom\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebaseName\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;atom\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eisPlainText\u003c/span\u003e = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediaType\u003c/span\u003e = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/atom+xml\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, il faut ajouter \u003ccode\u003e\u0026quot;ATOM\u0026quot;\u003c/code\u003e à votre variable \u003ccode\u003ehome\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ATOM\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;RSS\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"atomtemplate\"\u003eAtom::Template\u003c/h4\u003e\n\u003cp\u003eLe modèle peut simplement être créé dans le répertoire \u003ccode\u003elayouts/\u003c/code\u003e et se\nnommer \u003ccode\u003eindex.atom.xml\u003c/code\u003e, ou être dans son sous-répertoire \u003ccode\u003e_default/\u003c/code\u003e et\nse nommer, par exemple : \u003ccode\u003ehome.atom.xml\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi le site est multilangue, les liens alternatifs vers la version de\nlangue correspondante à l\u0026rsquo;entrée du site, aux flux atom, \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Really Simple Syndication\"\u003eRSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\nvoire \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sont générés.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-xml\" data-lang=\"xml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ printf `\u003cspan style=\"color:#776e71\"\u003e\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; standalone=\u0026#34;yes\u0026#34; ?\u0026gt;\u003c/span\u003e` | safeHTML }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;feed\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003exmlns=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://www.w3.org/2005/Atom\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003exml:lang=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ with site.Language.Lang }}{{.}}{{end}}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003e{{ .Permalink }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e{{ if eq .Title  site.Title }}{{ site.Title }}{{ else }}{{ with .Title }}{{.}}{{ T \u0026#34;on\u0026#34; }}{{ end }}\u0026#39;{{ site.Title }}\u0026#39;{{ end }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with site.Params.description -}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;subtitle\u0026gt;\u003c/span\u003e{{ . }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/subtitle\u0026gt;\u003c/span\u003e{{- end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with .OutputFormats.Get \u0026#34;ATOM\u0026#34; }}{{ printf `\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;self\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e` .Permalink .MediaType | safeHTML }}{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ range .AlternativeOutputFormats -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ if eq .Name \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eHTML\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$.Permalink\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eelse\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eprintf\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e`%s%s.%s`\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$.Permalink\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(.Name\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003elower)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(index\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.MediaType.Suffixes\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e0)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{end}}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eprintf\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.MediaType.Type\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esafeHTMLAttr\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{end}}{{ if hugo.IsMultilingual }}{{ range site.Languages }}{{ if ne .Lang site.Language.Lang }}{{ $lang := .Lang }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with $.OutputFormats.Get \u0026#34;ATOM\u0026#34; }}{{ printf `\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehreflang=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e` (print $lang \u0026#34;/\u0026#34; .Name \u0026#34;.\u0026#34; (index .MediaType.Suffixes 0) |absURL) $lang .MediaType | safeHTML }}{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ range $.AlternativeOutputFormats -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ if eq .Name \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eHTML\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eprintf\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e`%s/`\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$lang\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eabsURL\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eelse\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eprintf\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e`%s/%s.%s`\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$lang\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(.Name\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003elower)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(index\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.MediaType.Suffixes\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e0)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eabsURL\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{end}}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehreflang=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $lang }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eprintf\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.MediaType.Type\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esafeHTMLAttr\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{end}}{{end}}{{end}}{{end}}{{ with site.Copyright }}{{ $lang := site.Language.Lang }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://creativecommons.org/publicdomain/zero/1.0/legalcode.{{ $lang }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehreflang=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $lang }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;license\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://creativecommons.org/publicdomain/zero/1.0/deed.{{ $lang }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehreflang=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $lang }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;license\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;rights\u0026gt;\u003c/span\u003e© {{ $.Date.Format \u0026#34;2006\u0026#34; | safeHTML }} {{ site.Params.author.name }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/rights\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;icon\u0026gt;\u003c/span\u003e/img/favicon.ico\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/icon\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with site.Params.logo }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;logo\u0026gt;\u003c/span\u003e{{.}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/logo\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ if not .Date.IsZero }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e{{ .Date.Format \u0026#34;2006-01-02T15:04:05-07:00\u0026#34; | safeHTML }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ with site.Params.author.name }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;author\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;name\u0026gt;\u003c/span\u003e{{.}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/name\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ with site.Params.author.email }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;email\u0026gt;\u003c/span\u003e{{.}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/email\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;uri\u0026gt;\u003c/span\u003e{{ $.Permalink }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/uri\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/author\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;generator\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003euri=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;https://gohugo.io\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eversion=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ Hugo.Version }}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003eHugo\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/generator\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- $limit := (cond (le site.Config.Services.RSS.Limit 0) 65536 site.Config.Services.RSS.Limit) -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- $pages := where site.RegularPages \u0026#34;.Params.disable_feed\u0026#34; \u0026#34;!=\u0026#34; true -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- if ge $limit 1 -}}{{- $pages = $pages | first $limit -}}{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- range first $limit $pages }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;id\u0026gt;\u003c/span\u003e{{ .Permalink }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/id\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;link\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erel=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;title\u0026gt;\u003c/span\u003e{{ .Title }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/title\u0026gt;\u003c/span\u003e{{ with site.Params.author }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;author\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;name\u0026gt;\u003c/span\u003e{{.}}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/name\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/author\u0026gt;\u003c/span\u003e{{end}}{{ $url := printf \u0026#34;%s\u0026#34; \u0026#34;/tags/\u0026#34; | absLangURL }}{{ with .Params.tags }}{{ range . }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;category\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eterm=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{.}}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003escheme=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ print $url (urlize .) | absLangURL }}/\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e/\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ with .Content }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;content\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e{{ `\u003cspan style=\"color:#776e71\"\u003e\u0026lt;![CDATA[` | safeHTML }}{{.}}]]\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/content\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ with .Summary }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;summary\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;html\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e{{ `\u003cspan style=\"color:#776e71\"\u003e\u0026lt;![CDATA[` | safeHTML }}{{.}}]]\u0026gt;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/summary\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;published\u0026gt;\u003c/span\u003e{{ .Date.Format \u0026#34;2006-01-02T15:04:05-07:00\u0026#34; | safeHTML }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/published\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{ if gt .Lastmod .Date }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;updated\u0026gt;\u003c/span\u003e{{ .Lastmod.Format \u0026#34;2006-01-02T15:04:05-07:00\u0026#34; | safeHTML }}\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/updated\u0026gt;\u003c/span\u003e{{end}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/entry\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;/feed\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"json\"\u003eJSON\u003c/h3\u003e\n\u003cp\u003ePour générer le flux \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n , nous nous conformerons à la norme\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"JavaScript Object Notation\"\u003eJSON\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n Feed v1.\u003c/p\u003e\n\u003ch4 id=\"jsonoutputformat\"\u003eJSON::OutputFormat\u003c/h4\u003e\n\u003cp\u003eLa déclaration de sortie de format à ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputFormats\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eJSON\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003emediaType\u003c/span\u003e             = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;application/json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003ebaseName\u003c/span\u003e              = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;feed\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003esuffix\u003c/span\u003e                = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eIsHTML\u003c/span\u003e                = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eIsPlainText\u003c/span\u003e           = \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003enoUgly\u003c/span\u003e                = \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003erel\u003c/span\u003e                   = \u003cspan style=\"color:#48b685\"\u003e\u0026#34;alternate\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis, il faut ajouter la déclaration \u003ccode\u003eJSON\u003c/code\u003e à votre variable \u003ccode\u003ehome\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-toml\" data-lang=\"toml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#06b6ef\"\u003eoutputs\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e`\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ehome\u003c/span\u003e = [\u003cspan style=\"color:#48b685\"\u003e\u0026#34;HTML\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ATOM\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;JSON\u0026#34;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#34;RSS\u0026#34;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"jsontemplate\"\u003eJSON::Template\u003c/h4\u003e\n\u003ch5 id=\"json-détails\"\u003eJSON: Détails\u003c/h5\u003e\n\u003cp\u003eEn plus de la \u003ca href=\"/fr/web/hugo/hugo-feed/#limite\"\u003elimite\u003c/a\u003e mentionnée plus haut, nous récupèrons le nombre\nde page, pour boucler correctement car le dernier \u003ccode\u003eitem\u003c/code\u003e ne doit pas être suivi\ndu symbole \u0026lsquo;,\u0026rsquo; :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{- $length := (len $pages) -}}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt en fin de boucle \u003ccode\u003erange\u003c/code\u003e, nous ajoutons :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-hugo\" data-lang=\"hugo\"\u003e{{ if ne (add $index 1) $length }},{{ end }}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eAinsi tant qu\u0026rsquo;il y a un élément suivant, il est précédé du symbole \u0026lsquo;,\u0026rsquo;\njusqu\u0026rsquo;au dernier.\u003c/p\u003e\n\u003chr\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$limit\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(cond\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(le\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esite.Config.Services.RSS.Limit\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e0)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e65536\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esite.Config.Services.RSS.Limit)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pages\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewhere\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esite.RegularPages\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;.Params.disable_feed\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;!=\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003etrue\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ege\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$limit\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pages\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pages\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003efirst\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$limit\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$length\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(len\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pages)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;https://jsonfeed.org/version/1\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ site.Title }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;home_page_url\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ site.BaseURL }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e  \u003cspan style=\"color:#ef6155\"\u003e.OutputFormats.Get\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;JSON\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;feed_url\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{.Permalink}}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e,\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esite.Params.description\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;description\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e,\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esite.Params.author.name\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;avatar\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ with site.Params.logo }}{{ . }}{{ end}}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;http://huc.fr.eu.org\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\u003cspan style=\"color:#ef6155\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esite.Params.logo\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;icon\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e,\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;favicon\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/img/favicon.ico\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#48b685\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e [ {\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003erange\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$index,\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$elements\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$pages\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e-\u003c/span\u003e}\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .Permalink }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .Title | plainify }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esite.Params.Author\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;author\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e { \u003cspan style=\"color:#5bc4bf\"\u003e\u0026#34;name\u0026#34;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ . }}\u0026#34;\u003c/span\u003e }{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.Content\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;content_text\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e {\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eplainify\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ejsonify\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;content_html\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e {\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003esafeHTML\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ejsonify\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.Summary\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;summary\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e {\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eplainify\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ejsonify\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.Params.tags\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;tags\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e [{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003erange\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$tindex,\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$tag\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e:=\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$tindex\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e, {\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $tag| htmlEscape }}\u0026#34;\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e]{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.PublishDate\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;date_published\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .PublishDate.Format \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2006-01-02\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e04\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e05-01\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e00\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; | safeHTML }}\u0026#34;\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003egt\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.Lastmod\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.Date\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#34;date_modified\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .Lastmod.Format \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e2006-01-02\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eT\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e04\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e05-01\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e00\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; | safeHTML }}\u0026#34;\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003ene\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e(add\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$index\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e1)\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$length\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e,{\u003cspan style=\"color:#ef6155\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e{\u003cspan style=\"color:#ef6155\"\u003e{-\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eend\u003c/span\u003e }\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentations-tierces\"\u003eDocumentations tierces\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eRFC 3339 : \u003ca href=\"https://tools.ietf.org/html/rfc3339\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc3339\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRFC 4122 : \u003ca href=\"https://tools.ietf.org/html/rfc4122\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc4122\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRFC 4151 : \u003ca href=\"https://tools.ietf.org/html/rfc4151\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc4151\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRFC 4287 : \u003ca href=\"https://tools.ietf.org/html/rfc4287\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc4287\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRFC 5988 : \u003ca href=\"https://tools.ietf.org/html/rfc5988\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc5988\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eRFC 8288 : \u003ca href=\"https://tools.ietf.org/html/rfc8288\" rel=\"external\"\u003ehttps://tools.ietf.org/html/rfc8288\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eNorme ISO 8601 : \u003ca href=\"https://www.w3.org/TR/1998/NOTE-datetime-19980827\" rel=\"external\"\u003ehttps://www.w3.org/TR/1998/NOTE-datetime-19980827\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;article d\u0026rsquo;OpenWeb : \u003ca href=\"https://openweb.eu.org/articles/comment-construire-un-flux-atom\" rel=\"external\"\u003eComment construire un flux Atom ?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePlus d\u0026rsquo;informations sur la norme d\u0026rsquo;identification \u003ccode\u003etag\u003c/code\u003e sur le site \u003ca href=\"http://www.taguri.org/\" rel=\"external\"\u003eTag URI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003ePlus d\u0026rsquo;informations sur les UUID : \u003ca href=\"https://fr.wikipedia.org/wiki/Universal_Unique_Identifier\" title=\"Article Wikipédia : Universal_Unique_Identifier\"\u003eUniversal_Unique_Identifier \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eLa spécification JSON Feed 1 : \u003ca href=\"https://jsonfeed.org/version/1\" rel=\"external\"\u003ehttps://jsonfeed.org/version/1\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLa spécification RSS 2.0 : \u003ca href=\"https://cyber.harvard.edu/rss/index.html\" rel=\"external\"\u003ehttps://cyber.harvard.edu/rss/index.html\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLe sujet \u003ca href=\"https://discourse.gohugo.io/t/atom-and-json-feeds/13572\" rel=\"external\"\u003eAtom and JSON feeds\u003c/a\u003e sur le forum de la communauté Hugo - \u003cem\u003equi m\u0026rsquo;a bien aidé\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment mettre en place un flux de données RSS, ET Atom, voire JSON !",
            "tags": ["Hugo", "Feed", "RSS", "Atom", "JSON"],
            "date_published": "2019-12-11T18:35:25+01:00",
            "date_modified": "2019-12-12T20:17:25+01:00"
        },{
            "id": "urn:uuid:9baf8cd1-80e9-193d-a8aa-eab3e22793b0",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-search-jqueryui-autocomplete/",
            "title": "Hugo Search : un moteur de recherche interne (JQueryUI Autocomplete)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Intégrer une fonction de recherche au sein du site généré par Hugo peut se faire de différentes manières.\nOn va implémenter une manière très simple avec JQuery+UI, et cela nous prendra vraiment très peu de temps.\nÉtant donné qu\u0026rsquo;on peut parcourir l\u0026rsquo;ensemble des pages du site grâce à la variable globale site.Pages, on va se servir du mécanisme de la méthode autocomplete() fournie par la bibliothèque JQueryUI, pour restituer les différents résultats selon le texte écrit.\nBien sûr, j\u0026rsquo;assume le fait que vous savez intégrer les appels de scripts JQuery et JQueryUI au sein de votre propre site.\nCodes JQueryUI Pour la partie JQuery, nous utilisons la gestion des événements de la méthode autocomplete(), à la différence près est que la variable projects va être implémentée par le biais de la fonction Hugo range.\nLe code JQuery :\n\u0026lt;script\u0026gt; $(function() { var projects = [ {{- range site.Pages -}} {{- $url := .RelPermalink -}} {{- $title := .LinkTitle -}} { value: \u0026#34;{{ $title }}\u0026#34;, label: \u0026#34;{{- if eq $url $baseURL }}{{ site.Params.description }}{{ else if in $url \u0026#34;tags\u0026#34; }}{{- T \u0026#34;pageListTitle\u0026#34; }}{{ $title }}{{ else }}{{- safeHTML .Params.description -}}{{ end -}}\u0026#34;, url:\u0026#34;{{ $url }}\u0026#34; }, {{- end -}} ]; $(\u0026#34;#search\u0026#34;).autocomplete({ minLength: 0, source: projects, focus: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); return false; }, select: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); $(\u0026#34;#replyer\u0026#34;).val( ui.item.value ); return false; } }) .data(\u0026#39;ui-autocomplete\u0026#39;)._renderItem = function(ul, item) { return $(\u0026#39;\u0026lt;li\u0026gt;\u0026#39;) .append(\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39; + item.url + \u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;+ item.label + \u0026#39;\u0026#34;\u0026gt;\u0026#39; + item.value + \u0026#39;\u0026lt;/a\u0026gt;\u0026#39; ) .appendTo(ul); }; }); \u0026lt;/script\u0026gt; HTML Quant à la partie HTML, elle est très simple ; il faut à minima les deux éléments input suivants :\n\u0026lt;input class=\u0026#34;form-control\u0026#34; id=\u0026#34;search\u0026#34; placeholder=\u0026#34;{{ T \u0026#34;searchHolderTitle\u0026#34; }}\u0026#34;\u0026gt; \u0026lt;input aria-hidden=\u0026#34;true\u0026#34; id=\u0026#34;replyer\u0026#34; class=\u0026#34;hidden\u0026#34;\u0026gt; Le premier élément input est celui qui \u0026ldquo;capte\u0026rdquo; le texte recherché le second va permettre de retourner les informations trouvées. La déclaration Hugo {{ i18n \u0026quot;searchHolderTitle\u0026quot; }} est juste pour le contexte multilangue de ce site ; à remplacer par du texte selon votre goût… Que vous faites suivre du code Hugo puis du code JQuery\nTL;DR L\u0026rsquo;ensemble du code :\n\u0026lt;div id=\u0026#34;search\u0026#34;\u0026gt; \u0026lt;input class=\u0026#34;form-control\u0026#34; id=\u0026#34;search\u0026#34; placeholder=\u0026#34;{{ T \u0026#34;searchHolderTitle\u0026#34; }}\u0026#34;\u0026gt; \u0026lt;input aria-hidden=\u0026#34;true\u0026#34; id=\u0026#34;replyer\u0026#34; class=\u0026#34;hidden\u0026#34;\u0026gt; {{- $baseURL := site.BaseURL | absLangURL -}} \u0026lt;!-- Javascript --\u0026gt; \u0026lt;script\u0026gt; $(function() { var projects = [ {{- range site.Pages -}} {{- $url := .RelPermalink -}} {{- $title := .LinkTitle -}} { value: \u0026#34;{{ $title }}\u0026#34;, label: \u0026#34;{{- if eq $url $baseURL }}{{ site.Params.description }}{{ else if in $url \u0026#34;tags\u0026#34; }}{{- T \u0026#34;pageListTitle\u0026#34; }}{{ $title }}{{ else }}{{- safeHTML .Params.description -}}{{ end -}}\u0026#34;, url:\u0026#34;{{ $url }}\u0026#34; }, {{- end -}} ]; $(\u0026#34;#search\u0026#34;).autocomplete({ minLength: 0, source: projects, focus: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); return false; }, select: function( event, ui ) { $(\u0026#34;#search\u0026#34;).val( ui.item.label ); $(\u0026#34;#replyer\u0026#34;).val( ui.item.value ); return false; } }) .data(\u0026#39;ui-autocomplete\u0026#39;)._renderItem = function(ul, item) { return $(\u0026#39;\u0026lt;li\u0026gt;\u0026#39;) .append(\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39; + item.url + \u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;+ item.label + \u0026#39;\u0026#34;\u0026gt;\u0026#39; + item.value + \u0026#39;\u0026lt;/a\u0026gt;\u0026#39; ) .appendTo(ul); }; }); \u0026lt;/script\u0026gt; \u0026lt;/div\u0026gt; Et, voilà ! En quelques minutes, un \u0026ldquo;moteur de recherche\u0026rdquo; interne intégré à votre site Hugo.\nDémonstration Pour ce qui est de la démonstration, c\u0026rsquo;est ce qu\u0026rsquo;il y a dans le menu, en haut à droite de chacune des pages du site.\nDocumentations La documentation officielle : Hugo Documentation : Tools \u0026gt; Search - lien en anglais La fonction Hugo range : Hugo Documentation : Functions \u0026gt; Range - lien en anglais Inspiré par le thème Dot - (cf : banner.html) La méthode JQuery UI autocomplete() : https://jqueryui.com/autocomplete - lien en anglais De plus amples explications sur la méthode Autocomplete() de JQueryUI : lire la documentation - lien en anglais Une autre méthode de moteur de recherche interne, cette fois-ci avec les bibliothèques VueJS + Axios ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eIntégrer une fonction de recherche au sein du site généré par Hugo peut\nse faire de différentes manières.\u003c/p\u003e\n\u003cp\u003eOn va implémenter une manière très simple avec JQuery+UI, et cela nous\nprendra vraiment très peu de temps.\u003c/p\u003e\n\u003cp\u003eÉtant donné  qu\u0026rsquo;on peut parcourir l\u0026rsquo;ensemble des pages du site grâce à\nla variable globale \u003ccode\u003esite.Pages\u003c/code\u003e, on va se servir du mécanisme de la\nméthode \u003ccode\u003eautocomplete()\u003c/code\u003e fournie par la bibliothèque JQueryUI, pour\nrestituer les différents résultats selon le texte écrit.\u003c/p\u003e\n\u003cp\u003eBien sûr, j\u0026rsquo;assume le fait que vous savez intégrer les appels de scripts\nJQuery et JQueryUI au sein de votre propre site.\u003c/p\u003e\n\u003ch2 id=\"codes\"\u003eCodes\u003c/h2\u003e\n\u003ch3 id=\"jqueryui\"\u003eJQueryUI\u003c/h3\u003e\n\u003cp\u003ePour la partie JQuery, nous utilisons la gestion des événements de la\nméthode \u003ccode\u003eautocomplete()\u003c/code\u003e, à la différence près est que la variable\n\u003ccode\u003eprojects\u003c/code\u003e va être implémentée par le biais de la fonction Hugo \u003ccode\u003erange\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLe code JQuery :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-js\" data-lang=\"js\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003escript\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erange\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esite\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ePages\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$url\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e:=\u003c/span\u003e .\u003cspan style=\"color:#06b6ef\"\u003eRelPermalink\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$title\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e:=\u003c/span\u003e .\u003cspan style=\"color:#06b6ef\"\u003eLinkTitle\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $title }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{- if eq $url $baseURL }}{{ site.Params.description }}{{ else if in $url \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etags\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; }}{{- T \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003epageListTitle\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; }}{{ $title }}{{ else }}{{- safeHTML .Params.description -}}{{ end -}}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $url }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eautocomplete\u003c/span\u003e({\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eminLength\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003esource\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003efocus\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eselect\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#replyer\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    .\u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ui-autocomplete\u0026#39;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003e_renderItem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;li\u0026gt;\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappend\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;\u0026gt;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/a\u0026gt;\u0026#39;\u003c/span\u003e )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappendTo\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e/script\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"html\"\u003eHTML\u003c/h3\u003e\n\u003cp\u003eQuant à la partie HTML, elle est très simple ; il faut à minima les deux\néléments \u003ccode\u003einput\u003c/code\u003e suivants :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;form-control\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ T \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003esearchHolderTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-hidden\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;replyer\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;hidden\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003eLe premier élément \u003ccode\u003einput\u003c/code\u003e est celui qui \u0026ldquo;capte\u0026rdquo; le texte recherché\u003c/li\u003e\n\u003cli\u003ele second va permettre de retourner les informations trouvées.\u003c/li\u003e\n\u003cli\u003eLa déclaration Hugo \u003ccode\u003e{{ i18n \u0026quot;searchHolderTitle\u0026quot; }}\u003c/code\u003e est juste pour le\ncontexte multilangue de ce site ; à remplacer par du texte selon votre goût…\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eQue vous faites suivre du code Hugo puis du code JQuery\u003c/p\u003e\n\u003ch3 id=\"tldr\"\u003eTL;DR\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;ensemble du code :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;form-control\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;search\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplaceholder\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ T \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003esearchHolderTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003einput\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-hidden\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;replyer\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;hidden\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- $baseURL := site.BaseURL | absLangURL -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e\u0026lt;!-- Javascript --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e() {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003evar\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erange\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esite\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003ePages\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$url\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e:=\u003c/span\u003e .\u003cspan style=\"color:#06b6ef\"\u003eRelPermalink\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$title\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e:=\u003c/span\u003e .\u003cspan style=\"color:#06b6ef\"\u003eLinkTitle\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $title }}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{- if eq $url $baseURL }}{{ site.Params.description }}{{ else if in $url \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etags\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; }}{{- T \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003epageListTitle\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34; }}{{ $title }}{{ else }}{{- safeHTML .Params.description -}}{{ end -}}\u0026#34;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $url }}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{\u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ];\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eautocomplete\u003c/span\u003e({\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eminLength\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003esource\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprojects\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003efocus\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        },\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eselect\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e:\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eevent\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e ) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#search\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#34;#replyer\u0026#34;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003eval\u003c/span\u003e( \u003cspan style=\"color:#06b6ef\"\u003eui\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e );\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efalse\u003c/span\u003e;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    })\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    .\u003cspan style=\"color:#06b6ef\"\u003edata\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;ui-autocomplete\u0026#39;\u003c/span\u003e).\u003cspan style=\"color:#06b6ef\"\u003e_renderItem\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efunction\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e, \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e) {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e$\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;li\u0026gt;\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappend\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;a href=\u0026#34;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003eurl\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34; alt=\u0026#34;\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003elabel\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;\u0026gt;\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eitem\u003c/span\u003e.\u003cspan style=\"color:#06b6ef\"\u003evalue\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;/a\u0026gt;\u0026#39;\u003c/span\u003e )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        .\u003cspan style=\"color:#06b6ef\"\u003eappendTo\u003c/span\u003e(\u003cspan style=\"color:#06b6ef\"\u003eul\u003c/span\u003e);\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    };\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e});\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003escript\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, voilà ! \u003cbr\u003e\nEn quelques minutes, un \u0026ldquo;moteur de recherche\u0026rdquo; interne intégré à votre site Hugo.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"démonstration\"\u003eDémonstration\u003c/h2\u003e\n\u003cp\u003ePour ce qui est de la démonstration, c\u0026rsquo;est ce qu\u0026rsquo;il y a dans le menu,\nen haut à droite de chacune des pages du site.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa documentation officielle : \u003ca href=\"https://gohugo.io/tools/search/\" title=\"Lien vers la page du site officiel Hugo : Tools \u0026gt; Search\"\u003eHugo Documentation : Tools \u0026gt; Search\u003c/a\u003e\n - \u003cem\u003elien en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eLa fonction Hugo \u003ccode\u003erange\u003c/code\u003e : \u003ca href=\"https://gohugo.io/functions/range/\" title=\"Lien vers la page du site officiel Hugo : Functions \u0026gt; Range\"\u003eHugo Documentation : Functions \u0026gt; Range\u003c/a\u003e\n - \u003cem\u003elien en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eInspiré par le \u003ca href=\"https://themes.gohugo.io/theme/dot-hugo-documentation-theme/\" rel=\"external\"\u003ethème Dot\u003c/a\u003e - \u003cem\u003e(cf : \u003ca href=\"https://github.com/themefisher/dot/blob/master/layouts/partials/banner.html\" rel=\"external\"\u003ebanner.html\u003c/a\u003e)\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eLa méthode JQuery UI \u003ccode\u003eautocomplete()\u003c/code\u003e : \u003ca href=\"https://jqueryui.com/autocomplete\" rel=\"external\"\u003ehttps://jqueryui.com/autocomplete\u003c/a\u003e - \u003cem\u003elien en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eDe plus amples explications sur la méthode \u003ccode\u003eAutocomplete()\u003c/code\u003e de JQueryUI : lire la \u003ca href=\"https://www.tutorialspoint.com/jqueryui/jqueryui_autocomplete.htm\" rel=\"external\"\u003edocumentation\u003c/a\u003e  - \u003cem\u003elien en anglais\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003eUne autre méthode de \u003ca href=\"https://fr.jeffprod.com/blog/2018/un-moteur-de-recherche-interne-pour-votre-site-hugo/\" rel=\"external\"\u003emoteur de recherche interne\u003c/a\u003e, cette fois-ci avec les bibliothèques VueJS + Axios\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Comment intégrer un moteur de recherche dans Hugo, avec JQuery UI autocomplete()",
            "tags": ["Hugo", "search", "JQuery"],
            "date_published": "2019-12-06T01:21:00+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:e6f2de57-7366-c750-2fe6-8415b07f5a9c",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-shortcodes/",
            "title": "Hugo Shortcodes",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Un shortcode Hugo est un fichier contenant un type précis d\u0026rsquo;éléments HTML (HyperText Markup Language) pour pouvoir augmenter les possibilités d\u0026rsquo;Hugo.\nLors d\u0026rsquo;un appel de ce shortcode depuis un fichier MD (MarkDown) , un traitement est fait afin de remplacer l\u0026rsquo;appel du shorcode par le traitement restitué par le shortcode lui-même.\nIl est ainsi possible par ce biais d\u0026rsquo;appeler des iframes, des figures, etc… voire un fichier MD lui-même.\nLes shortcodes s\u0026rsquo;enregistrent dans le répertoire layout/shortcodes/.\nDocumentation l\u0026rsquo;officielle, en anglais : Hugo Documentation : Content management \u0026gt; Shortcodes Mes shortcodes Mes usages pour l\u0026rsquo;instant sont très basiques ; en soit ce que je fais au-travers de plusieurs pourraient être directement écrit dans le fichier MD au format HTML , et zou, basta…\nNéanmoins, il faut avouer que pour l\u0026rsquo;inclusion d\u0026rsquo;exemples de code, surtout dans un site multilangue est franchement utile.\nabbreviations Ce shortcode a deux versions légérement différentes. J\u0026rsquo;ai commencé historiquement avec la version v1 puis au cours d\u0026rsquo;une refonte en novembre 2025, j\u0026rsquo;ai écrit une v2 qui a pour avantage lors du premier appel concernant un sigle/une abbréviation d\u0026rsquo;écrire la définition à côté de celui-ci, puis pour les appels suivants s\u0026rsquo;ils existent dans la page en cours, de les afficher sous forme d\u0026rsquo;abbréviations HTML .\nabbr-v1 Gestion des abbréviations, élément HTML abbr : Source brute vers le shortcode : abbr\nLe shortcode :\n\u0026lt;abbr {{ .Get 1 | printf `title=%q` | safeHTMLAttr }}\u0026gt;{{ .Get 0 | safeHTML }}\u0026lt;/abbr\u0026gt; L\u0026rsquo;appel du shortcode est simple : Code :\u0026nbsp;shortcode\n{{\u0026lt; abbr accronym \u0026#34;Meaning of Acronym\u0026#34; \u0026gt;}} accronym est l\u0026rsquo;acronyme ou l\u0026rsquo;abbréviation Meaning of Acronym est la signification de l\u0026rsquo;acronyme Exemple : HTML est écrit ainsi : Code :\u0026nbsp;shortcode\n{{\u0026lt; abbr HTML \u0026#34;HyperText Markup Language\u0026#34; \u0026gt;}} abbr-v2 Tout commence par l\u0026rsquo;ajout du fichier tiers dans le répertoire data, nommé terms.yaml.\nChaque terme a au minimum deux entrées :\nla première nommée abbr qui prend le nom du sigle la seconde nommée term qui est la définition du sigle Ainsi par exemple, le fichier data/terms.yaml comprendra pour la définition du terme CSS, l\u0026rsquo;entrée suivante :\n- abbr: CSS term: Cascade Style Sheet Ensuite le shortcode appelé est - un poil plus compliqué que la v1 - : Source brute vers le shortcode : abbr2\nLe shortcode :\n{{/* variables based on shortcode argument */}} {{- $entry := ( .Get 0 | safeHTML ) -}} {{- $count_id := print $entry \u0026#34;_count\u0026#34; -}} {{/* range over data file */}} {{- range site.Data.terms }} {{/* Find matches */}} {{- if eq ( .abbr ) $entry }} {{- if gt ( $.Page.Scratch.Get ( $count_id )) 0 }} \u0026lt;abbr title=\u0026#34;{{- .term -}}\u0026#34;\u0026gt;{{- .abbr -}}\u0026lt;/abbr\u0026gt; {{- else -}} \u0026lt;span\u0026gt;{{- .abbr }} \u0026lt;em\u0026gt;({{ .term -}})\u0026lt;/em\u0026gt;\u0026lt;/span\u0026gt; {{- $.Page.Scratch.Set ( $count_id ) 1 -}} {{- end -}} {{- end -}} {{- end -}} Exemple : HTML est écrit ainsi : Code :\u0026nbsp;shortcode\n{{\u0026lt; abbr2 HTML \u0026gt;}} C\u0026rsquo;est ce qui se passe sur cette page en cours, pour exemple remarquez dès le début de page ce qu\u0026rsquo;il en est de l\u0026rsquo;accronyme HTML , puis les récurrences suivantes.\nanchor La gestion des ancres dans une même page est un peu plus délicate : Source brute vers le shortcode : anchor\n{{ $txt := .Get 0 | safeHTML }}{{ $name := .Get 1 | lower | safeHTML }}{{ $anchor := anchorize $name }} \u0026lt;a href=\u0026#34;{{ printf \u0026#34;%s\u0026#34; .Page.RelPermalink }}#{{ $anchor }}\u0026#34; title=\u0026#34;{{ i18n \u0026#34;shortcodeAnchorTitle\u0026#34; }}{{ $name }}\u0026#34;\u0026gt;{{ $txt }}\u0026lt;/a\u0026gt; L\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; anchor \u0026#34;Texte\u0026#34; \u0026#34;Cible\u0026#34; \u0026gt;}} Exemple : Ce lien renvoie au chapitre Description, et est écrit ainsi : Code :\u0026nbsp;shortcode\n{{\u0026lt; anchor \u0026#34;lien\u0026#34; \u0026#34;description\u0026#34; \u0026gt;}} blockquote Ahhh, la gestion des citations, autrement dit des éléments blockquote m\u0026rsquo;en a fait baver. :p\nEn même temps, j\u0026rsquo;ai voulu pour des histoires d\u0026rsquo;esthétiques CSS (Cascade Style Sheet) les \u0026ldquo;améliorer\u0026rdquo;.\nBasiquement, il suffit :\n\u0026lt;blockquote\u0026gt; {{ $file := .Get 0 | readFile | htmlUnescape | safeHTML }}{{ $file }} \u0026lt;/blockquote\u0026gt; Mon shortcode est un poil plus évolué, car le site étant multilangue, il appele le shortcode interne dédiée à la gestion multilange, le reste n\u0026rsquo;étant que de la mise en forme CSS : Source brute vers le shortcode : blockquote\n\u0026lt;div class=\u0026#34;info-quote\u0026#34;\u0026gt; \u0026lt;p class=\u0026#34;text-white-50\u0026#34;\u0026gt; {{ T \u0026#34;quoteTitle\u0026#34; }}{{ if .Get 1 }} \u0026lt;em\u0026gt;{{ .Get 1 | safeHTML }}\u0026lt;/em\u0026gt;{{ end }} \u0026lt;/p\u0026gt; \u0026lt;/div\u0026gt; \u0026lt;div class=\u0026#34;quote\u0026#34;\u0026gt; \u0026lt;blockquote\u0026gt; {{ $name := .Get 0 }}{{ $file := urlize (print \u0026#34;/content/inc/\u0026#34; $name) | readFile | htmlUnescape | safeHTML }}{{ $file }} \u0026lt;/blockquote\u0026gt; \u0026lt;/div\u0026gt; L\u0026rsquo;appel du shortcode est : Code :\u0026nbsp;shortcode\n{{\u0026lt; blockquote \u0026#34;blockquote-filename\u0026#34; lang \u0026gt;}} blockquote-filename est le nom du fichier à appeler contenant la citation à montrer. lang est le nom de la langue cible, tel en, fr, etc… Pour ne préciser aucun langage en soit, utilisez \u0026quot;\u0026quot; deux fois les double quotes -. Exemple : Code :\u0026nbsp;shortcode\n{{\u0026lt; blockquote \u0026#34;web-hugo-shortcode-example-blockquote\u0026#34; fr \u0026gt;}} Restitue : Citation : fr\nCode L\u0026rsquo;inclusion de code !\nPour pouvoir utiliser cette fonction, j\u0026rsquo;ai créé à la racine du répertoire content/ un sous répertoire nommé inc - vous pouvez très bien l\u0026rsquo;appeler autrement, à vous d\u0026rsquo;adapter lors de l\u0026rsquo;appel du shortcode - ; puis je créé mes fichiers à inclure dans ce répertoire.\nEncore une fois, de manière basique, il suffit de : Code :\u0026nbsp;html\n{{ $file := .Get 0 | readFile }}{{ $lang := .Get 1 }}{{ $opt := \u0026#34;\u0026#34; }}\u0026lt;div class=\u0026#34;code\u0026#34;\u0026gt;{{ highlight $file $lang $opt }}\u0026lt;/div\u0026gt; Mon shortcode, un poil plus évolué , du fait d\u0026rsquo;être multilangue : Source brute vers le shortcode : code\n{{ $name := .Get 0 }}{{ $file := urlize (print \u0026#34;/content/inc/\u0026#34; $name) | readFile }}{{ $lang := .Get 1 }}{{ $opt := \u0026#34;\u0026#34; }} \u0026lt;div class=\u0026#34;info-code\u0026#34;\u0026gt;\u0026lt;p class=\u0026#34;text-white-50\u0026#34;\u0026gt;{{ i18n \u0026#34;codeTitle\u0026#34; }}\u0026amp;nbsp;\u0026lt;em\u0026gt;{{ $lang }}\u0026lt;/em\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;div class=\u0026#34;code\u0026#34;\u0026gt;{{ highlight $file $lang $opt }}\u0026lt;/div\u0026gt; L\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; code \u0026#34;code-filename\u0026#34; language \u0026gt;}} code-filename est le nom du fichier à appeler contenant le code à montrer. language est le nom du langage cible, tel sh, PHP, python, etc… Pour ne préciser aucun langage en soit, utilisez \u0026quot;\u0026quot; deux fois les double quotes -. Exemple : Regardez bien, vous en avez un, juste au-dessus… lors de l\u0026rsquo;appel du premier shortcode concernant ce shortcode !\nColor Un tout petit shortcode pour gérer un bout de texte en couleur… Néanmoins, pour cela, j\u0026rsquo;ai défini dans ma feuille de style, des types de couleurs nommées.\nSource brute vers le shortcode : color\nLe shortcode :\n\u0026lt;span {{ .Get 0 | printf `class=%q` | safeHTMLAttr }}\u0026gt;{{ .Inner }}\u0026lt;/span\u0026gt; L\u0026rsquo;appel du shortcode est simple : Code :\u0026nbsp;shortcode\n{{\u0026lt; color \u0026#34;css-name\u0026#34; \u0026gt;}}text{{\u0026lt; /color \u0026gt;}} css-name est le nom de la déclaration CSS text est le texte à coloriser Exemple : Ceci est un texte vert , celui qui suit est orangé , cet autre est rouge , etc…\nFile L\u0026rsquo;inclusion d\u0026rsquo;un exemple de fichier est un dérivé du shortcode code, mais au lieu de produire un bloc de code précédé d\u0026rsquo;un entête présentant le code, j\u0026rsquo;appelle un entête qui restitue le nom de fichier tel que désiré.\nDonc, basiquement c\u0026rsquo;est le même shortcode que pour code.\nDe manière plus évolué, cela donne ainsi : Source brute vers le shortcode : file\n{{ $name := .Get 0 | safeHTML }}{{ $file := urlize (print \u0026#34;/content/inc/\u0026#34; $name) | readFile }}{{ $lang := .Get 1}}{{ $filename := .Get 2 }}{{ $opt := \u0026#34;linenos=table\u0026#34; }} \u0026lt;div class=\u0026#34;info-file\u0026#34;\u0026gt;\u0026lt;p class=\u0026#34;text-white-50\u0026#34;\u0026gt;{{ i18n \u0026#34;fileTitle\u0026#34; }}\u0026lt;em\u0026gt;{{ $filename }}\u0026lt;/em\u0026gt;\u0026lt;/p\u0026gt;\u0026lt;/div\u0026gt;\u0026lt;div class=\u0026#34;code\u0026#34;\u0026gt;{{ highlight $file $lang $opt }}\u0026lt;/div\u0026gt; L\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; file \u0026#34;example-file\u0026#34; language \u0026#34;filename\u0026#34; \u0026gt;}} /example-file est le nom du fichier à appeler contenant le contenu d\u0026rsquo;un fichier à montrer. language est le nom du langage cible, tel sh, PHP, python, etc… Pour ne préciser aucun langage en soit, utilisez \u0026quot;\u0026quot; deux fois les double quotes -. filename est le nom du fichier - celui qui est affiché. Exemple : y\u0026rsquo;a-t-il vraiment besoin encore de le prouver ? Regardez bien juste au-dessus ;)\nImage Il est vrai que MD a un code prévu pour l\u0026rsquo;inclusion d\u0026rsquo;image, mais j\u0026rsquo;ai crée ce shortcode pour pouvoir spécifier une taille d\u0026rsquo;image et renvoyé vers l\u0026rsquo;image source par le biais d\u0026rsquo;un élément HTML a appliqué sur l\u0026rsquo;élément HTML img.\nPNG/JPG/Tiff Prenons en considération que les images sont fournies en tant qu\u0026rsquo;assets :\nSource brute vers le shortcode : img\n1{{/* runner for assets/image */}} 2{{- $src := resources.Get (printf \u0026#34;%s%s\u0026#34; \u0026#34;/images/\u0026#34; (.Get \u0026#34;s\u0026#34;)) -}}{{- $alt := .Get \u0026#34;a\u0026#34; | safeHTML -}}{{- $width := printf \u0026#34;%s\u0026#34; (.Get \u0026#34;w\u0026#34;) -}} 3{{- $img := $src -}} 4{{- with $width -}}{{- $img = $src.Resize (printf \u0026#34;%sx\u0026#34; $width) -}}{{- end -}} 5{{- with $img -}} 6\u0026lt;figure\u0026gt; 7 \u0026lt;a href=\u0026#34;{{ $src.RelPermalink }}\u0026#34; title=\u0026#34;{{ $alt }}\u0026#34;\u0026gt; 8 \u0026lt;picture\u0026gt; 9 \u0026lt;!-- \u0026lt;source srcset=\u0026#34;/img/.avif\u0026#34; type=\u0026#34;image/avif\u0026#34;\u0026gt; --\u0026gt; 10 {{- with .Resize (printf \u0026#34;%dx%d webp\u0026#34; .Width .Height) }} 11 \u0026lt;source srcset=\u0026#34;{{ .RelPermalink }}\u0026#34; type=\u0026#34;image/webp\u0026#34;\u0026gt; 12 {{ end }} 13 \u0026lt;img alt=\u0026#34;{{ $alt }}\u0026#34; loading=\u0026#34;lazy\u0026#34; src=\u0026#34;{{ .RelPermalink }}\u0026#34; type=\u0026#34;{{ .MediaType }}\u0026#34; height=\u0026#34;{{ .Height }}\u0026#34; width=\u0026#34;{{ .Width }}\u0026#34;\u0026gt; 14 \u0026lt;/picture\u0026gt; 15 \u0026lt;/a\u0026gt; 16 \u0026lt;figcaption\u0026gt;{{ $alt }}\u0026lt;/figcaption\u0026gt; 17\u0026lt;/figure\u0026gt; 18{{- end -}} L\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; img a=\u0026#34;alt\u0026#34; s=\u0026#34;src\u0026#34; w=\u0026#34;width\u0026#34; \u0026gt;}} Les paramètres nommés sont :\na : l\u0026rsquo;équivalent de l\u0026rsquo;attribut alt s : l\u0026rsquo;équivalent de l\u0026rsquo;attribut src w : l\u0026rsquo;équivalent de l\u0026rsquo;attribut width Exemple :\nMon Logo Cette image représentant mon logo, ayant pour titre \u0026ldquo;Mon Logo\u0026rdquo;, a une taille de 192 px (pixels) , redimensionnée à la taille de 124 pixels, et est au format PNG (Portable Network Graphics) .\nSVG Concernant les images au format SVG (Scalable Vector Graphics) , je les gère différemment du précédent shortcode :\nSource brute vers le shortcode : figure-svg\n1{{/* runner for assets/svg */}} 2{{- $class := .Get \u0026#34;class\u0026#34; -}}{{- $src := resources.Get (printf \u0026#34;%s%s\u0026#34; \u0026#34;/svg/\u0026#34; (.Get \u0026#34;src\u0026#34;)) -}}{{ $title := .Get \u0026#34;title\u0026#34; }} 3{{ with $src }} 4\u0026lt;figure class=\u0026#34;{{ if $class }}{{ $class }}{{ end }}\u0026#34;\u0026gt; 5 \u0026lt;a href=\u0026#34;{{ .RelPermalink }}\u0026#34; title=\u0026#34;{{ $title }}\u0026#34;\u0026gt; 6 {{ .Content | safeHTML }} 7 \u0026lt;/a\u0026gt; 8 {{ if $title }}\u0026lt;figcaption aria-hidden=\u0026#34;true\u0026#34; class=\u0026#34;hidden\u0026#34; hidden\u0026gt;{{ $title }}\u0026lt;/figcaption\u0026gt;{{ end }} 9\u0026lt;/figure\u0026gt; 10{{ end }} L\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; figure-svg class=\u0026#34;class-name\u0026#34; src=\u0026#34;image.svg\u0026#34; title=\u0026#34;the title\u0026#34; \u0026gt;}} Exemple : \u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e Logo Emblème Stéphane HUC Logo Emblème Stéphane HUC Mon Logo kbd Ce shortcode est utilisé pour la gestion de l\u0026rsquo;élément HTML kbd.\nSource brute vers le shortcode : kbd\nLe shortcode :\n{{ $k := .Get 0 | safeHTML }}\u0026lt;kbd\u0026gt;{{ $k }}\u0026lt;/kbd\u0026gt; L\u0026rsquo;appel du shorcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; kbd key \u0026gt;}} key est le nom de la touche clavier ! Exemple : voici le rendu de la touche A !\nLien interne Ce shortcode a deux versions légérement différentes. J\u0026rsquo;ai commencé avec la première, puis un jour, je me suis demandé comment faire pour \u0026ldquo;injecter\u0026rdquo; aussi le nom d\u0026rsquo;une ancre ; la v2 est née !\nInside v1 Pour gérer les liens internes entre les pages de ce site, je me suis évertué à mettre en place le shortcode suivant :\nSource brute vers le shortcode : inside\n1{{ $link := .Get 0 }}{{ $link := replace $link \u0026#34;:\u0026#34; \u0026#34;/\u0026#34; }}{{ $url := (print ( relLangURL $link ) \u0026#34;/\u0026#34;) }} 2{{ if .Get 1 }}{{ $txt := .Get 1 }} 3\u0026lt;a class=\u0026#34;inside\u0026#34; href=\u0026#34;{{ $url }}\u0026#34; title=\u0026#34;{{ i18n \u0026#34;lnkInsideTitle\u0026#34; }}{{ with .Site.GetPage $link }}{{ .Title }}{{ end }}\u0026#34;\u0026gt;{{ $txt }}\u0026lt;/a\u0026gt; 4{{ else }} 5{{ with .Site.GetPage $link }}{{ $title := .Title }}\u0026lt;a class=\u0026#34;inside\u0026#34; href=\u0026#34;{{ $url }}\u0026#34; title=\u0026#34;{{ i18n \u0026#34;lnkInsideTitle\u0026#34; }}{{ $title }}\u0026#34;\u0026gt;{{ $title }}\u0026lt;/a\u0026gt;{{ end }} 6{{ end }} De même, j\u0026rsquo;ai créé une définition CSS , nommée inside, qui me permet de modifier légérement le rendu pour les liens internes.\nL\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; inside \u0026#34;section:subsection:pagename\u0026#34; \u0026#34;Title\u0026#34; \u0026gt;}} les noms de sections et pages sont séparés par un : Le titre peut être omis, dans ce cas-là sera affiché celui de la page appelée. Exemples :\nLà, j\u0026rsquo;appelle la page Hugo : Déploiement SFTP et c\u0026rsquo;est son titre qui est fourni, ainsi que l\u0026rsquo; URL (Uniform Resource Locator) adéquate Dans cet exemple, je force le titre dans l\u0026rsquo;appel de ma page Déploiement d\u0026#39;un site statique par Hugo Inside v2 Cette version est subtilement différente :\nSource brute vers le shortcode : inside2\n1{{ $link := .Get \u0026#34;l\u0026#34; }}{{ $link := replace $link \u0026#34;:\u0026#34; \u0026#34;/\u0026#34; }}{{ $url := (print ( relLangURL $link ) \u0026#34;/\u0026#34;) }}{{ $anchor := .Get \u0026#34;a\u0026#34; }} 2{{ if .Get \u0026#34;t\u0026#34; }}{{ $txt := .Get \u0026#34;t\u0026#34; }}\u0026lt;a class=\u0026#34;inside\u0026#34; href=\u0026#34;{{ $url }}{{ if $anchor }}#{{ $anchor }}{{ end }}\u0026#34; title=\u0026#34;{{ i18n \u0026#34;lnkInsideTitle\u0026#34; }}\u0026#39;{{ with .Site.GetPage $link }}{{ .Title }}{{ end }}\u0026#39;\u0026#34;\u0026gt;{{ $txt }}\u0026lt;/a\u0026gt; 3{{ else }} 4{{ with .Site.GetPage $link }}{{ $title := .Title }}\u0026lt;a class=\u0026#34;inside\u0026#34; href=\u0026#34;{{ $url }}{{ if $anchor }}#{{ $anchor }}{{ end }}\u0026#34; title=\u0026#34;{{ i18n \u0026#34;lnkInsideTitle\u0026#34; }}\u0026#39;{{ $title }}\u0026#39;\u0026#34;\u0026gt;{{ $title }}\u0026lt;/a\u0026gt;{{ end }} 5{{ end }} L\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; inside2 l=\u0026#34;section:subsection:pagename\u0026#34; t=\u0026#34;title\u0026#34; a=\u0026#34;anchor-name\u0026#34; \u0026gt;}} Les paramètres nommés sont :\na : cible une ancre dans le document appelé ; bien-sûr, cette ancre doit exister… dans le document en question. Peut-être omise ! l : nom du lien interne ; les noms de sections et pages sont séparés par le symbole : t : le titre. Peut être omis, dans ce cas-là sera affiché celui de la page appelée. Exemple :\nLà, j\u0026rsquo;appelle la page Hugo : Déploiement SFTP ; c\u0026rsquo;est son titre qui est fourni, ainsi que l\u0026rsquo; URL adéquate, mais elle pointe vers le chapitre rsync, ciblée par l\u0026rsquo;ancre correspondante. Dans cet exemple, je force le titre dans l\u0026rsquo;appel de ma page Déploiement d'un site statique par Hugo mais je ne cible pas d\u0026rsquo;ancre. Note Les blocs d\u0026rsquo;alertes ou de notes sont des blocs de code HTML présentant un texte et mis en valeur selon un identifiant, qui est traduit selon la langue utilisée.\nLa valeur de cet identifiant peut être :\ndanger pour afficher une alerte de type \u0026lsquo;danger\u0026rsquo; qui aura une teinte rougée info pour afficher un message de type \u0026lsquo;information\u0026rsquo; qui aura une teinte bleutée success pour afficher un message de type \u0026lsquo;succès\u0026rsquo; qui aura une teinte verte tip pour afficher un message de type \u0026lsquo;astuce\u0026rsquo; qui aura une teinte jaune. warning pour afficher un message de type \u0026lsquo;attention\u0026rsquo; qui aura une teinte orangée, jaunâtre. Bien-sûr, ces teintes dépendent des déclarations CSS .\nLe shortcode en lui-même :\nSource brute vers le shortcode : note\n{{ $class := .Get 0 }}{{ $wrd := T (printf \u0026#34;alert-%s\u0026#34; $class) }} \u0026lt;div class=\u0026#34;info-tab {{ $class }}-icon\u0026#34;\u0026gt;{{ $wrd }}\u0026lt;/div\u0026gt;\u0026lt;div class=\u0026#34;alert alert-{{ $class }}\u0026#34; role=\u0026#34;alert\u0026#34;\u0026gt;{{ .Inner | .Page.RenderString }}\u0026lt;/div\u0026gt; L\u0026rsquo;appel du shortcode est : Code :\u0026nbsp;shortcode\n{{\u0026lt; note id \u0026gt;}} Ceci est un message {{\u0026lt; /note \u0026gt;}} Exemples :\nDangerATTENTION : Ceci est un message d\u0026rsquo;avertissement pour présenter un danger ! Cet exemple embarque le code MD pour mettre en gras le mot \u0026lsquo;ATTENTION\u0026rsquo;.\nInfoCeci est une note d\u0026rsquo;information. Merci d\u0026rsquo;en tenir compte ! :D SuccèsVous avez réussi le test ! Soyez heureux… AstuceCe message est une astuce à mettre en valeur. Retenez-la, elle peut vous être pratique ! AttentionVeuillez prêter attention à ce message ; il semble qu\u0026rsquo;un dysfonctionnement se prépare. Veuillez faire les tests adéquats. Tag Ce shortcode n\u0026rsquo;existe pas pour gérer les tags générés par Hugo, mais pour gérer l\u0026rsquo;URL d\u0026rsquo;un tag au sein d\u0026rsquo;une page MD . Le shortcode va générer un élément HTML a adéquat. Il tient compte de la gestion multilangue du site.\nAu sein de la page Markdown, j\u0026rsquo;intégre un mot qui se veut être un renvoi vers la page tag ad hoc.\nCôté CSS , j\u0026rsquo;ai défini l\u0026rsquo;attribut ::after sur la définition .tag pour ajouter l\u0026rsquo;information (tag) précédé du terme en question. Ce qui permet visuellement de le différencier des autres liens.\nSource brute vers le shortcode : tag\nLe shortcode :\n{{ $txt := .Get 0 }}{{ $href := \u0026#34;/\u0026#34; | relLangURL}}{{ $href := (printf \u0026#34;%s%s%s\u0026#34; $href \u0026#34;/tags/\u0026#34; $txt) | urlize }}\u0026lt;a class=\u0026#34;tag\u0026#34; href=\u0026#34;{{ $href }}\u0026#34;\u0026gt;{{ $txt }}\u0026lt;/a\u0026gt; L\u0026rsquo;appel du shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; tag tag-name \u0026gt;}} Exemple : le mot Hugo est un lien vers l\u0026rsquo; URL des articles contenant le tag \u0026ldquo;Hugo\u0026rdquo;.\nAutres shortcodes GoHugo Pour faire un lien vers la documentation officielle d\u0026rsquo;Hugo, je me suis amusé à écrire ce shortcode : Code :\u0026nbsp;shortcode\n{{\u0026lt; gohugo n=\u0026#34;pagename\u0026#34; s=\u0026#34;section\u0026#34; a=\u0026#34;anchor-name\u0026#34; \u0026gt;}} n est le nom de la page dans la documentation du site Gohugo.io s est le nom de la section dans la documentation du site Gohugo.io a est le nom de l\u0026rsquo;ancre à cibler dans la page Source brute vers le shortcode : gohugo\nLe shortcode est :\n{{ $section := .Get \u0026#34;s\u0026#34; }}{{ $name := .Get \u0026#34;n\u0026#34; }}{{ $anchor := .Get \u0026#34;a\u0026#34; }}\u0026lt;a href=\u0026#34;https://gohugo.io/{{ $section }}/{{ $name }}/{{ if $anchor }}#{{ $anchor}}{{ end }}\u0026#34; title=\u0026#34;{{ i18n \u0026#34;shortcodeGoHugoTitle\u0026#34; }}{{ humanize $section }} \u0026amp;gt; {{ humanize $name }}\u0026#34;\u0026gt;{{ i18n \u0026#34;shortcodeGoHugoDocTitle\u0026#34; }}{{ humanize $section }} \u0026amp;gt; {{ humanize $name }}\u0026lt;/a\u0026gt; Exemple: Le lien vers la page Hugo Documentation : Content management \u0026gt; Shortcodes Hugo.\nVoici le shortcode correspondant : Code :\u0026nbsp;shortcode\n{{\u0026lt; gohugo n=\u0026#34;shortcodes\u0026#34; s=\u0026#34;content-management\u0026#34; \u0026gt;}} Manpage Utilisant souvent des renvois vers les manpages officiels d\u0026rsquo;OpenBSD, je me suis crée le shortcode suivant : Code :\u0026nbsp;shortcode\n{{\u0026lt; man title digit anchor \u0026gt;}} Si un chiffre (digit) est fourni, le shortcode le restituera à la fois, dans l\u0026rsquo; URL reconstituée, que dans le texte affiché. Dans l\u0026rsquo; URL , ce sera de type txt.digit ; le texte affiché aura le chiffre entouré des parenthèses, tel que txt(digit).\nSi une ancre (anchor) est fournie, le shortcode la restituera à la fois, dans l\u0026rsquo; URL reconstituée, que dans le texte affiché, tel que txt(digit)#anchor.\nSource brute vers le shortcode : man\nLe shortcode est :\n{{ $txt := .Get 0 }}{{ $nb := .Get 1}} \u0026lt;a class=\u0026#34;man\u0026#34; href=\u0026#34;https://man.openbsd.org/{{ $txt }}{{ if $nb }}{{ print \u0026#34;.\u0026#34; $nb }}{{ end }}\u0026#34; title=\u0026#34;{{ i18n \u0026#34;manpageTitle\u0026#34; }}{{ $txt }}\u0026#34;\u0026gt;{{ $txt }}{{ if $nb }}{{ print \u0026#34;(\u0026#34; $nb \u0026#34;)\u0026#34; }}{{ end }}\u0026lt;/a\u0026gt; Exemples :\nLien vers le manpage Packet Filter : pf(4) Autre lien celui vers : httpd(8) Un dernier pour la route vers : man Wikipedia De même pour l\u0026rsquo;encyclopédie Wikipédia, le shortcode créé est le suivant : Code :\u0026nbsp;shortcode\n{{\u0026lt; wp \u0026#34;url-article\u0026#34; \u0026gt;}} Source brute vers le shortcode : wp\nLe shortcode est :\n{{ $txt := .Get 0 }}{{ $title := print (i18n \u0026#34;wpTitleArticle\u0026#34;) $txt }}\u0026lt;a href=\u0026#34;https://{{ .Site.Language.Lang }}.wikipedia.org/wiki/{{ $txt }}\u0026#34; title=\u0026#34;{{ $title }}\u0026#34;\u0026gt;Wikipedia :: {{ $txt }}\u0026lt;/a\u0026gt; Exemples :\nVoici un article de promotion sur OpenBSD WP En voici un autre pour Debian WP Et, un troisième un peu plus compliqué : Pare-feu_(informatique) WP Ailleurs Pour finir, n\u0026rsquo;hésitez pas à vous amuser avec les shortcodes, faites-vous aider sur le forum de la communauté, malheureusement pour nous francoph(on|il)es, en anglais.\nhttps://after-dark.habd.as/shortcode/ ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eUn shortcode Hugo est un fichier contenant un type précis d\u0026rsquo;éléments\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eHTML \u003cem\u003e(HyperText Markup Language)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n pour pouvoir augmenter les possibilités d\u0026rsquo;Hugo.\u003c/p\u003e\n\u003cp\u003eLors d\u0026rsquo;un appel de ce shortcode depuis un fichier \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eMD \u003cem\u003e(MarkDown)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\nun traitement est fait afin de remplacer l\u0026rsquo;appel du shorcode par le\ntraitement restitué par le shortcode lui-même.\u003c/p\u003e\n\u003cp\u003eIl est ainsi possible par ce biais d\u0026rsquo;appeler des iframes, des figures,\netc… voire un fichier \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"MarkDown\"\u003eMD\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n lui-même.\u003c/p\u003e\n\u003cp\u003eLes shortcodes s\u0026rsquo;enregistrent dans le répertoire \u003ccode\u003elayout/shortcodes/\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003el\u0026rsquo;officielle, en anglais : \u003ca href=\"https://gohugo.io/content-management/shortcodes/\" title=\"Lien vers la page du site officiel Hugo : Content management \u0026gt; Shortcodes\"\u003eHugo Documentation : Content management \u0026gt; Shortcodes\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"mes-shortcodes\"\u003eMes shortcodes\u003c/h2\u003e\n\u003cp\u003eMes usages pour l\u0026rsquo;instant sont très basiques ; en soit ce que je fais\nau-travers de plusieurs pourraient être directement écrit dans le fichier\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"MarkDown\"\u003eMD\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n au format \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, et zou, basta…\u003c/p\u003e\n\u003cp\u003eNéanmoins, il faut avouer que pour l\u0026rsquo;inclusion d\u0026rsquo;exemples de code,\nsurtout dans un site multilangue est franchement utile.\u003c/p\u003e\n\u003ch3 id=\"abbreviations\"\u003eabbreviations\u003c/h3\u003e\n\u003cp\u003eCe shortcode a deux versions légérement différentes. \u003cbr\u003e\nJ\u0026rsquo;ai commencé historiquement avec la version \u003ca href=\"/fr/web/hugo/hugo-shortcodes/#abbr-v1\"\u003ev1\u003c/a\u003e puis au cours d\u0026rsquo;une\nrefonte en novembre 2025, j\u0026rsquo;ai écrit une \u003ca href=\"/fr/web/hugo/hugo-shortcodes/#abbr-v2\"\u003ev2\u003c/a\u003e qui a pour avantage lors\ndu premier appel concernant un sigle/une abbréviation d\u0026rsquo;écrire la définition à\ncôté de celui-ci, puis pour les appels suivants s\u0026rsquo;ils existent dans la page\nen cours, de les afficher sous forme d\u0026rsquo;abbréviations \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003ch4 id=\"abbr-v1\"\u003eabbr-v1\u003c/h4\u003e\n\u003cp\u003eGestion des abbréviations, élément \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \u003ccode\u003eabbr\u003c/code\u003e :\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/abbr.html\" title=\"\"\u003eabbr\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eabbr\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGet\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprintf\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e`\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q`\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esafeHTMLAttr\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e\u0026gt;{{ .Get 0 | safeHTML }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eabbr\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode est simple :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; abbr accronym \u0026#34;Meaning of Acronym\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eaccronym\u003c/code\u003e est l\u0026rsquo;acronyme ou l\u0026rsquo;abbréviation\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eMeaning of Acronym\u003c/code\u003e est la signification de l\u0026rsquo;acronyme\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple : \u003cabbr title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n est écrit ainsi :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; abbr HTML \u0026#34;HyperText Markup Language\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003ch4 id=\"abbr-v2\"\u003eabbr-v2\u003c/h4\u003e\n\u003cp\u003eTout commence par l\u0026rsquo;ajout du fichier tiers dans le répertoire \u003ccode\u003edata\u003c/code\u003e, nommé\n\u003ccode\u003eterms.yaml\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eChaque terme a au minimum deux entrées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela première nommée \u003ccode\u003eabbr\u003c/code\u003e qui prend le nom du sigle\u003c/li\u003e\n\u003cli\u003ela seconde nommée \u003ccode\u003eterm\u003c/code\u003e qui est la définition du sigle\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAinsi par exemple, le fichier \u003ccode\u003edata/terms.yaml\u003c/code\u003e comprendra pour la définition\ndu terme CSS, l\u0026rsquo;entrée suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e- \u003cspan style=\"color:#5bc4bf\"\u003eabbr\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003eCSS\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#5bc4bf\"\u003eterm\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003eCascade Style Sheet\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eEnsuite le shortcode appelé est \u003cem\u003e- un poil plus compliqué que la v1 -\u003c/em\u003e :\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/abbr2.html\" title=\"\"\u003eabbr2\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{/* variables based on shortcode argument */}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{- $entry := ( .Get 0 | safeHTML ) -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{- $count_id := print $entry \u0026#34;_count\u0026#34; -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{/* range over data file */}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{- range site.Data.terms }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{/* Find matches */}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- if eq ( .abbr ) $entry }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{- if gt ( $.Page.Scratch.Get ( $count_id )) 0 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eabbr\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{- .term -}}\u0026#34;\u003c/span\u003e\u0026gt;{{- .abbr -}}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eabbr\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{- else -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;{{- .abbr }} \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;({{ .term -}})\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{- $.Page.Scratch.Set ( $count_id ) 1 -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        {{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eExemple : \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n est écrit ainsi :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; abbr2 HTML \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est ce qui se passe sur cette page en cours, pour exemple remarquez dès le\ndébut de page ce qu\u0026rsquo;il en est de l\u0026rsquo;accronyme \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, puis les\nrécurrences suivantes.\u003c/p\u003e\n\u003ch3 id=\"anchor\"\u003eanchor\u003c/h3\u003e\n\u003cp\u003eLa gestion des ancres dans une même page est un peu plus délicate :\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/anchor.html\" title=\"\"\u003eanchor\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $txt := .Get 0 | safeHTML }}{{ $name := .Get 1 | lower | safeHTML }}{{ $anchor := anchorize $name }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ printf \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e%\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003es\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ePage\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eRelPermalink\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}#{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eanchor\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ i18n \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eshortcodeAnchorTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;{{ $txt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; anchor \u0026#34;Texte\u0026#34; \u0026#34;Cible\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eExemple : Ce \u003ca href=\"/fr/web/hugo/hugo-shortcodes/#description\" title=\"Se diriger vers l\u0026#39;ancre : description\"\u003elien\u003c/a\u003e\n renvoie au chapitre\n\u003cstrong\u003eDescription\u003c/strong\u003e, et est écrit ainsi :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; anchor \u0026#34;lien\u0026#34; \u0026#34;description\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003ch3 id=\"blockquote\"\u003eblockquote\u003c/h3\u003e\n\u003cp\u003eAhhh, la gestion des citations, autrement dit des éléments \u003ccode\u003eblockquote\u003c/code\u003e\nm\u0026rsquo;en a fait baver. :p\u003c/p\u003e\n\u003cp\u003eEn même temps, j\u0026rsquo;ai voulu pour des histoires d\u0026rsquo;esthétiques \n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eCSS \u003cem\u003e(Cascade Style Sheet)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nles \u0026ldquo;améliorer\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eBasiquement, il suffit :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eblockquote\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ $file := .Get 0 | readFile | htmlUnescape | safeHTML }}{{ $file }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eblockquote\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMon shortcode est un poil plus évolué, car le site étant multilangue, il\nappele le shortcode interne dédiée à la gestion multilange, le reste\nn\u0026rsquo;étant que de la mise en forme \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n :\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/blockquote.html\" title=\"\"\u003eblockquote\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;info-quote\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ep\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;text-white-50\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ T \u0026#34;quoteTitle\u0026#34; }}{{ if .Get 1 }} \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;{{ .Get 1 | safeHTML }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ep\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;quote\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eblockquote\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    {{ $name := .Get 0 }}{{ $file := urlize (print \u0026#34;/content/inc/\u0026#34; $name) | readFile | htmlUnescape | safeHTML }}{{ $file }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eblockquote\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode est :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; blockquote \u0026#34;blockquote-filename\u0026#34; lang \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eblockquote-filename\u003c/code\u003e est le nom du fichier à appeler contenant la\ncitation à montrer.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elang\u003c/code\u003e est le nom de la langue cible, tel \u003ccode\u003een\u003c/code\u003e, \u003ccode\u003efr\u003c/code\u003e, etc…\n\u003cul\u003e\n\u003cli\u003ePour ne préciser aucun langage en soit, utilisez \u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003edeux fois les double quotes\u003c/em\u003e -.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; blockquote \u0026#34;web-hugo-shortcode-example-blockquote\u0026#34; fr \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cp\u003eRestitue :\n\u003cdiv class=\"info-quote\"\u003e\n    \u003cp\u003eCitation : \u003cem\u003efr\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"quote\"\u003e\n    \u003cfigure\u003e\n        \u003cblockquote lang=\"fr\"\u003e\u003c/blockquote\u003e\n    \u003c/figure\u003e\n\u003c/div\u003e\n\u003c/p\u003e\n\u003ch3 id=\"code\"\u003eCode\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;inclusion de code !\u003c/p\u003e\n\u003cp\u003ePour pouvoir utiliser cette fonction, j\u0026rsquo;ai créé à la racine du répertoire\n\u003ccode\u003econtent/\u003c/code\u003e un sous répertoire nommé \u003ccode\u003einc\u003c/code\u003e - \u003cem\u003evous pouvez très bien\nl\u0026rsquo;appeler autrement, à vous d\u0026rsquo;adapter lors de l\u0026rsquo;appel du shortcode\u003c/em\u003e - ;\npuis je créé mes fichiers à inclure dans ce répertoire.\u003c/p\u003e\n\u003cp\u003eEncore une fois, de manière basique, il suffit de :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003ehtml\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $file := .Get 0 | readFile }}{{ $lang := .Get 1 }}{{ $opt := \u0026#34;\u0026#34; }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e\u0026gt;{{ highlight $file $lang $opt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cp\u003eMon shortcode, un poil plus évolué , du fait d\u0026rsquo;être multilangue :\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/code.html\" title=\"\"\u003ecode\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $name := .Get 0 }}{{ $file := urlize (print \u0026#34;/content/inc/\u0026#34; $name) | readFile }}{{ $lang := .Get 1 }}{{ $opt := \u0026#34;\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;info-code\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ep\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;text-white-50\u0026#34;\u003c/span\u003e\u0026gt;{{ i18n \u0026#34;codeTitle\u0026#34; }}\u0026amp;nbsp;\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;{{ $lang }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ep\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e\u0026gt;{{ highlight $file $lang $opt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; code \u0026#34;code-filename\u0026#34; language \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecode-filename\u003c/code\u003e est le nom du fichier à appeler contenant le code à\nmontrer.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elanguage\u003c/code\u003e est le nom du langage cible, tel \u003ccode\u003esh\u003c/code\u003e, \u003ccode\u003ePHP\u003c/code\u003e, \u003ccode\u003epython\u003c/code\u003e, etc…\n\u003cul\u003e\n\u003cli\u003ePour ne préciser aucun langage en soit, utilisez \u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003edeux fois les double quotes\u003c/em\u003e -.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple : Regardez bien, vous en avez un, juste au-dessus… lors de\nl\u0026rsquo;appel du premier shortcode concernant ce shortcode !\u003c/p\u003e\n\u003ch3 id=\"color\"\u003eColor\u003c/h3\u003e\n\u003cp\u003eUn tout petit shortcode pour gérer un bout de texte en couleur… \u003cbr\u003e\nNéanmoins, pour cela, j\u0026rsquo;ai défini dans ma feuille de style, des types de\ncouleurs nommées.\u003c/p\u003e\n\u003cp\u003e\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/color.html\" title=\"\"\u003ecolor\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGet\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eprintf\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e`\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e%q`\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e|\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esafeHTMLAttr\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e\u0026gt;{{ .Inner }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003espan\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode est simple :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; color \u0026#34;css-name\u0026#34; \u0026gt;}}text{{\u0026lt; /color \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecss-name\u003c/code\u003e est le nom de la déclaration CSS\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etext\u003c/code\u003e est le texte à coloriser\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple : Ceci est un \u003cspan class=\"dark-green\"\u003etexte vert\u003c/span\u003e\n,\ncelui qui suit est \u003cspan class=\"orange\"\u003eorangé\u003c/span\u003e\n, cet autre\nest \u003cspan class=\"red\"\u003erouge\u003c/span\u003e\n, etc…\u003c/p\u003e\n\u003ch3 id=\"file\"\u003eFile\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;inclusion d\u0026rsquo;un exemple de fichier est un dérivé du shortcode \u003ca href=\"/fr/web/hugo/hugo-shortcodes/#code\"\u003ecode\u003c/a\u003e,\nmais au lieu de produire un bloc de code précédé d\u0026rsquo;un entête présentant le code,\nj\u0026rsquo;appelle un entête qui restitue le nom de fichier tel que désiré.\u003c/p\u003e\n\u003cp\u003eDonc, basiquement c\u0026rsquo;est le même shortcode que pour code.\u003c/p\u003e\n\u003cp\u003eDe manière plus évolué, cela donne ainsi :\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/file.html\" title=\"\"\u003efile\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $name := .Get 0 | safeHTML }}{{ $file := urlize (print \u0026#34;/content/inc/\u0026#34; $name) | readFile }}{{ $lang := .Get 1}}{{ $filename := .Get 2 }}{{  $opt := \u0026#34;linenos=table\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;info-file\u0026#34;\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ep\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;text-white-50\u0026#34;\u003c/span\u003e\u0026gt;{{ i18n \u0026#34;fileTitle\u0026#34; }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;{{ $filename }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003eem\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ep\u003c/span\u003e\u0026gt;\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;code\u0026#34;\u003c/span\u003e\u0026gt;{{ highlight $file $lang $opt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; file \u0026#34;example-file\u0026#34; language \u0026#34;filename\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e/example-file\u003c/code\u003e est le nom du fichier à appeler contenant le contenu\nd\u0026rsquo;un fichier à montrer.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elanguage\u003c/code\u003e est le nom du langage cible, tel \u003ccode\u003esh\u003c/code\u003e, \u003ccode\u003ePHP\u003c/code\u003e, \u003ccode\u003epython\u003c/code\u003e, etc…\n\u003cul\u003e\n\u003cli\u003ePour ne préciser aucun langage en soit, utilisez \u003ccode\u003e\u0026quot;\u0026quot;\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003cem\u003edeux fois les double quotes\u003c/em\u003e -.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efilename\u003c/code\u003e est le nom du fichier - celui qui est affiché.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple : y\u0026rsquo;a-t-il vraiment besoin encore de le prouver ? Regardez bien\njuste au-dessus ;)\u003c/p\u003e\n\u003ch3 id=\"image\"\u003eImage\u003c/h3\u003e\n\u003cp\u003eIl est vrai que \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"MarkDown\"\u003eMD\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n a un code prévu pour l\u0026rsquo;inclusion d\u0026rsquo;image, mais\nj\u0026rsquo;ai crée ce shortcode pour pouvoir spécifier une taille d\u0026rsquo;image et\nrenvoyé vers l\u0026rsquo;image source par le biais d\u0026rsquo;un élément \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \u003ccode\u003ea\u003c/code\u003e\nappliqué sur l\u0026rsquo;élément \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  \u003ccode\u003eimg\u003c/code\u003e.\u003c/p\u003e\n\u003chr\u003e\n\u003ch4 id=\"pngjpgtiff\"\u003ePNG/JPG/Tiff\u003c/h4\u003e\n\u003cp\u003ePrenons en considération que les images sont fournies en tant qu\u0026rsquo;assets :\u003c/p\u003e\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/img.html\" title=\"\"\u003eimg\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 1\u003c/span\u003e\u003cspan\u003e{{/* runner for assets/image */}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 2\u003c/span\u003e\u003cspan\u003e{{- $src := resources.Get (printf \u0026#34;%s%s\u0026#34; \u0026#34;/images/\u0026#34; (.Get \u0026#34;s\u0026#34;)) -}}{{- $alt := .Get \u0026#34;a\u0026#34; | safeHTML -}}{{- $width := printf \u0026#34;%s\u0026#34; (.Get \u0026#34;w\u0026#34;) -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 3\u003c/span\u003e\u003cspan\u003e{{- $img := $src -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 4\u003c/span\u003e\u003cspan\u003e{{- with $width -}}{{- $img = $src.Resize (printf \u0026#34;%sx\u0026#34; $width) -}}{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 5\u003c/span\u003e\u003cspan\u003e{{- with $img -}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 6\u003c/span\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003efigure\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 7\u003c/span\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $src.RelPermalink }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 8\u003c/span\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003epicture\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 9\u003c/span\u003e\u003cspan\u003e        \u003cspan style=\"color:#776e71\"\u003e\u0026lt;!-- \u0026lt;source srcset=\u0026#34;/img/.avif\u0026#34; type=\u0026#34;image/avif\u0026#34;\u0026gt; --\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e10\u003c/span\u003e\u003cspan\u003e        {{- with .Resize (printf \u0026#34;%dx%d webp\u0026#34; .Width .Height) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e11\u003c/span\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003esource\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esrcset\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .RelPermalink }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;image/webp\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e12\u003c/span\u003e\u003cspan\u003e        {{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e13\u003c/span\u003e\u003cspan\u003e        \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003eimg\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ealt\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $alt }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eloading\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;lazy\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003esrc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .RelPermalink }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etype\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .MediaType }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eheight\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .Height }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ewidth\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .Width }}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e14\u003c/span\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003epicture\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e15\u003c/span\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e16\u003c/span\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003efigcaption\u003c/span\u003e\u0026gt;{{ $alt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003efigcaption\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e17\u003c/span\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003efigure\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e18\u003c/span\u003e\u003cspan\u003e{{- end -}}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; img a=\u0026#34;alt\u0026#34; s=\u0026#34;src\u0026#34; w=\u0026#34;width\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cp\u003eLes paramètres nommés sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ea\u003c/code\u003e : l\u0026rsquo;équivalent de l\u0026rsquo;attribut \u003ccode\u003ealt\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003es\u003c/code\u003e : l\u0026rsquo;équivalent de l\u0026rsquo;attribut \u003ccode\u003esrc\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ew\u003c/code\u003e : l\u0026rsquo;équivalent de l\u0026rsquo;attribut \u003ccode\u003ewidth\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cfigure\u003e\n    \u003ca href=\"/images/Logo_full_192px.png\" title=\"Mon Logo\"\u003e\n    \u003cpicture\u003e\n        \n        \u003csource srcset=\"/images/Logo_full_192px_hu_b05553d0fc9bac22.webp\" type=\"image/webp\"\u003e\n        \n        \u003cimg alt=\"Mon Logo\" height=\"124\" loading=\"lazy\" src=\"/images/Logo_full_192px_hu_d793f2650db82c05.png\" type=\"image/png\" width=\"124\"\u003e\n    \u003c/picture\u003e\n    \u003c/a\u003e\n    \u003cfigcaption\u003eMon Logo\u003c/figcaption\u003e\n\u003c/figure\u003e\n\u003cp\u003eCette image représentant mon logo, ayant pour titre \u0026ldquo;Mon Logo\u0026rdquo;, a une\ntaille de 192 \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003epx \u003cem\u003e(pixels)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, redimensionnée à la taille de 124 pixels, et\nest au format \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePNG \u003cem\u003e(Portable Network Graphics)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003ch4 id=\"svg\"\u003eSVG\u003c/h4\u003e\n\u003cp\u003eConcernant les images au format \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSVG \u003cem\u003e(Scalable Vector Graphics)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, je les gère différemment du\nprécédent shortcode :\u003c/p\u003e\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/figure-svg.html\" title=\"\"\u003efigure-svg\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 1\u003c/span\u003e\u003cspan\u003e{{/* runner for assets/svg */}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 2\u003c/span\u003e\u003cspan\u003e{{- $class := .Get \u0026#34;class\u0026#34; -}}{{- $src := resources.Get (printf \u0026#34;%s%s\u0026#34; \u0026#34;/svg/\u0026#34; (.Get \u0026#34;src\u0026#34;)) -}}{{ $title := .Get \u0026#34;title\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 3\u003c/span\u003e\u003cspan\u003e{{ with $src }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 4\u003c/span\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003efigure\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ if $class }}{{ $class }}{{ end }}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 5\u003c/span\u003e\u003cspan\u003e    \u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ .RelPermalink }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $title }}\u0026#34;\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 6\u003c/span\u003e\u003cspan\u003e    {{ .Content | safeHTML }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 7\u003c/span\u003e\u003cspan\u003e    \u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 8\u003c/span\u003e\u003cspan\u003e    {{ if $title }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003efigcaption\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003earia-hidden\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;hidden\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehidden\u003c/span\u003e\u0026gt;{{ $title }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003efigcaption\u003c/span\u003e\u0026gt;{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e 9\u003c/span\u003e\u003cspan\u003e\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003efigure\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e10\u003c/span\u003e\u003cspan\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; figure-svg class=\u0026#34;class-name\u0026#34; src=\u0026#34;image.svg\u0026#34; title=\u0026#34;the title\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eExemple :\n\n\n\u003cfigure class=\"pure-img\"\u003e\n    \u003ca href=\"/svg/Logo_final.svg\" title=\"Mon Logo\"\u003e\n    \u003c?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?\u003e\n\u003csvg\n   id=\"svg3108\"\n   version=\"1.1\"\n   inkscape:version=\"1.2.2 (b0a8486541, 2022-12-01)\"\n   sodipodi:docname=\"Logo_final.svg\"\n   width=\"64\"\n   height=\"64\"\n   xmlns:inkscape=\"http://www.inkscape.org/namespaces/inkscape\"\n   xmlns:sodipodi=\"http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd\"\n   xmlns=\"http://www.w3.org/2000/svg\"\n   xmlns:svg=\"http://www.w3.org/2000/svg\"\n   xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n   xmlns:cc=\"http://creativecommons.org/ns#\"\n   xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\u003e\n  \u003csodipodi:namedview\n     id=\"namedview30\"\n     pagecolor=\"#ffffff\"\n     bordercolor=\"#000000\"\n     borderopacity=\"0.25\"\n     inkscape:showpageshadow=\"2\"\n     inkscape:pageopacity=\"0.0\"\n     inkscape:pagecheckerboard=\"0\"\n     inkscape:deskcolor=\"#d1d1d1\"\n     showgrid=\"false\"\n     inkscape:zoom=\"3.0570583\"\n     inkscape:cx=\"30.421402\"\n     inkscape:cy=\"58.225909\"\n     inkscape:window-width=\"1920\"\n     inkscape:window-height=\"1031\"\n     inkscape:window-x=\"0\"\n     inkscape:window-y=\"25\"\n     inkscape:window-maximized=\"1\"\n     inkscape:current-layer=\"layer1\" /\u003e\n  \u003ctitle\n     id=\"title853\"\u003eLogo Emblème Stéphane HUC\u003c/title\u003e\n  \u003cdefs\n     id=\"defs3110\" /\u003e\n  \u003cmetadata\n     id=\"metadata3113\"\u003e\n    \u003crdf:RDF\u003e\n      \u003ccc:Work\n         rdf:about=\"\"\u003e\n        \u003cdc:title\u003eLogo Emblème Stéphane HUC\u003c/dc:title\u003e\n      \u003c/cc:Work\u003e\n    \u003c/rdf:RDF\u003e\n  \u003c/metadata\u003e\n  \u003cg\n     inkscape:label=\"Calque 1\"\n     inkscape:groupmode=\"layer\"\n     id=\"layer1\"\n     transform=\"translate(0.00367771,-0.00353708)\"\u003e\n    \u003cg\n       transform=\"matrix(0.02413578,0,0,0.02334611,-0.05137015,-0.00127009)\"\n       style=\"display:inline\"\n       id=\"g4250\"\n       inkscape:export-filename=\"/home/zou/Documents/Projets_sur_images/Stephane-huc.net/Logo_original.png\"\n       inkscape:export-xdpi=\"300\"\n       inkscape:export-ydpi=\"300\"\u003e\n      \u003cg\n         id=\"g3893\"\n         style=\"display:inline;fill:#4d4d4d\"\n         transform=\"matrix(0.06444778,0,0,0.06450434,865.42675,1541.6735)\"\u003e\n        \u003cpath\n           inkscape:connector-curvature=\"0\"\n           sodipodi:nodetypes=\"ccccccccccccccccccccccccccccccccccccsssc\"\n           id=\"path2385-6-1-2\"\n           d=\"m 23774.425,-13094.781 c -407.725,2.746 -749.397,40.026 -972.445,28.012 -4599.937,59.837 -9024.559,3454.6637 -10088.773,4551.7613 -1032.632,1431.3562 -1902.759,4120.4375 -3414.3254,6116.3965 C 7040.4567,1715.9353 4369.202,5321.9681 986.55523,8407.9766 -4389.5849,12448.032 -8602.0428,12402.637 -12768.187,12194.347 c -252.964,17.663 -415.823,306.287 -501.736,508.146 274.498,360.798 549.024,468.121 823.522,457.374 l 2991.3542,-94.976 c 3456.504,-296.023 6332.5254,-987.067 8247.1738,-2331.958 -1416.3389,1353.905 -8714.7449,3661.386 -9866.29,3397.271 -283.94,94.386 -9.166,418.668 -14.627,627.634 443.726,168.12 891.426,312.023 1382.8762,197.395 3340.0325,-1065.466 6699.0628,-1956.661 9899.08747,-4312.462 L -6089.161,17754.195 c -98.5516,407.272 -100.4203,652.783 -4.8749,736.614 l 355.0258,94.104 c 229.6322,33.856 492.0244,-81.828 782.3016,-323.448 L 2012.6316,9672.4329 C 2658.8638,14594.17 7818.5983,15351.227 11738.861,12799.22 l 127.65,-1168.167 C 7834.5326,14914.263 2650.1202,12909.869 3004.5788,9106.5143 L 5888.675,5359.9752 C 6887.5627,4011.8679 8068.294,2775.8085 9455.3418,1667.2698 h 8.8646 C 10742.256,691.78922 12091.181,-25.504325 13349.115,-1036.7181 c 1520.143,-1055.4722 4302.351,-1145.0617 5286.398,-2327.1449 1177.704,-1664.9321 2145.664,-3667.8767 2974.957,-5435.546 1020.536,-2296.596 2897.375,-2743.981 6123.216,-278.3644 -109.42,-1287.3486 -1023.595,-2502.5416 -1546.427,-3009.9256 -1021.529,-829.12 -1603.165,-855.9 -2412.834,-1007.082 z m -34848.588,27224.985 c 1.234,-0.42 2.29,-0.913 3.545,-1.315 h -9.309 c 1.838,0.451 3.895,0.882 5.764,1.315 z m 36292.522,-26286.618 c 206.696,0 374.086,206.617 374.086,461.752 0,255.135 -167.39,462.19 -374.086,462.19 -206.695,0 -374.529,-207.055 -374.529,-462.19 0,-255.135 167.834,-461.752 374.529,-461.752 z\"\n           style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:21.9289px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" /\u003e\n        \u003cg\n           transform=\"matrix(14.180303,0.29145382,-0.29145382,14.180303,39070.285,-17179.84)\"\n           id=\"g3323-6-2\"\n           style=\"fill:#999999;fill-opacity:1;stroke:#990000;stroke-opacity:1\"\u003e\n          \u003cpath\n             inkscape:connector-curvature=\"0\"\n             style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:1.55587px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n             d=\"m -1938.7905,1344.2995 15.3955,-1.283 7.0562,-10.2637 -3.8488,-8.9807 3.8488,-8.9808 c 26.901,-8.9122 44.2829,-1.9591 55.8088,14.754 -0.1027,10.6945 -8.3234,15.9763 -18.6029,19.8859 -6.7082,-0.016 -14.6164,2.0346 -17.3412,-4.8053 v 0 c -16.1045,-1.7244 -11.7855,6.9433 -12.7007,9.072 3.8166,4.6142 10.3634,8.3754 23.8137,9.979 -7.6533,3.5761 -11.6619,14.8063 -24.7209,7.0307 -5.8792,-4.5108 -13.9229,-4.3322 -16.5562,-15.8758 -13.5829,-3.7285 -14.572,5.856 -14.515,11.1131 -0.352,5.6108 2.6918,10.0899 5.8967,14.5151 18.6918,9.7777 28.4118,11.6393 36.968,12.4739 11.2194,0.8225 24.7349,-15.9588 37.6483,-28.123 11.7646,0.4051 16.4086,-11.0571 23.1335,-19.0511 6.177,-27.5232 -20.7198,-44.6944 -30.8445,-51.7098 -19.6553,-8.2012 -39.8866,-7.5233 -50.5759,-3.6288 -9.4566,6.292 -15.9533,13.324 -23.1334,20.1851 -3.7507,11.7151 -4.9786,23.178 3.27,33.6932 z\"\n             id=\"path3190-2-0-4\"\n             sodipodi:nodetypes=\"cccccccccccccccccccccc\" /\u003e\n          \u003cpath\n             inkscape:connector-curvature=\"0\"\n             style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:1.55587px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n             d=\"m -1766.1814,1226.0731 15.3955,-1.283 7.0562,-10.2637 -3.8488,-8.9807 3.8488,-8.9808 c 26.901,-8.9122 44.2829,-1.9591 55.8088,14.754 -0.1027,10.6945 -8.3234,15.9763 -18.6029,19.8859 -6.7082,-0.016 -14.6164,2.0346 -17.3412,-4.8053 v 0 c -16.1045,-1.7244 -11.7855,6.9433 -12.7007,9.072 3.8166,4.6142 10.3634,8.3754 23.8137,9.979 -7.6533,3.5761 -11.6619,14.8063 -24.7209,7.0307 -5.8792,-4.5108 -13.9229,-4.3322 -16.5562,-15.8758 -13.5829,-3.7285 -14.572,5.856 -14.515,11.1131 -0.352,5.6108 2.6918,10.0899 5.8967,14.5151 18.6918,9.7777 28.4118,11.6393 36.968,12.4739 11.2194,0.8225 24.7349,-15.9588 37.6483,-28.123 11.7646,0.4051 16.4086,-11.0571 23.1335,-19.0511 6.177,-27.5232 -20.7198,-44.6944 -30.8445,-51.7098 -19.6553,-8.2012 -39.8866,-7.5233 -50.5759,-3.6288 -9.4566,6.292 -15.9533,13.324 -23.1334,20.1851 -3.7507,11.7151 -4.9786,23.178 3.27,33.6932 z\"\n             id=\"path3190-0-8-2-9\"\n             sodipodi:nodetypes=\"cccccccccccccccccccccc\" /\u003e\n        \u003c/g\u003e\n        \u003cg\n           id=\"g3607-7\"\n           style=\"fill:#999999;fill-opacity:1;stroke:#990000;stroke-opacity:1\"\n           transform=\"matrix(10.256384,0,0,10.256384,27740.017,-9419.2772)\"\u003e\n          \u003cpath\n             inkscape:connector-curvature=\"0\"\n             sodipodi:nodetypes=\"ccccccccccccsccccccccccccccccccccccc\"\n             id=\"path2853-1-2-3\"\n             d=\"m -3334.7852,-1248.287 c 51.9752,263.91148 364.552,597.09982 649.489,723.58561 186.8994,102.74774 436.9783,80.34473 628.0009,153.0754 176.754,59.99791 336.6065,134.19234 455.7429,223.77162 v 0 c 95.6093,72.55212 166.8615,174.225196 178.8187,313.54167 -21.1645,58.71298 -67.8029,109.93553 -112.5308,161.38138 -108.9474,42.30362 -193.7664,43.94287 -273.1033,40.38991 v 0 c -289.559,-41.98012 -408.6126,-122.75609 -537.4682,-237.26062 -138.9061,-154.600767 -217.6672,-263.90172 -373.9094,-355.18101 -178.3851,-112.57744 -359.9805,-46.07103 -531.5855,-101.08503 -15.4761,-3.45827 -6.3053,-53.81809 36.6639,-43.63616 64.7876,15.3519 174.3223,-1.04389 174.3223,-1.04389 l -79.9048,-49.14253 v 0 l 36.7606,-7.32283 v 0 l 89.4837,49.88512 v 0 l 180.7667,8.58049 v 0 l -95.19,-169.30622 v 0 0 l -44.2175,-2.75208 v 0 l 1.9939,-18.56317 31.584,1.9656 c -91.0217,-150.25746 -222.4184,-249.74105 -339.9897,-366.61111 l 33.2464,-1.66844 v 0 l 33.3433,34.64483 v 0 c -87.3435,-107.03536 -156.5494,-220.39644 -185.2023,-347.90084 5.407,-25.6798 28.4059,-33.5554 42.8852,-9.3477 z\"\n             style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:3.14969px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" /\u003e\n          \u003cpath\n             inkscape:connector-curvature=\"0\"\n             sodipodi:nodetypes=\"ccccccccccccsccccccccccccccccccccccc\"\n             id=\"path2853-1-8-2-7\"\n             d=\"m -3964.5819,579.94648 c 232.1778,142.02444 696.5351,140.75989 988.106,18.70266 205.9526,-66.5673 362.6995,-264.70185 549.2022,-354.76022 167.1463,-88.31108 333.1245,-154.57977 482.3054,-180.583195 v 0 c 120.2135,-20.415854 245.1813,-3.15744 357.0123,83.134705 28.9606,55.52615 34.6919,124.56859 41.9136,192.36665 -44.1007,108.51739 -101.6932,171.65364 -159.3434,227.23914 v 0 c -231.9712,183.0827 -374.5522,215.03066 -548.9965,231.13768 -211.2129,-3.89591 -347.056,-20.86741 -523.2284,31.10727 -207.3545,53.63654 -283.8394,231.78243 -443.7115,319.72853 -13.3008,8.9568 -44.3697,-32.1019 -7.0087,-56.5744 56.3312,-36.899 120.0937,-128.17265 120.0937,-128.17265 l -91.9262,24.90186 v 0 l 20.0462,-31.87375 v 0 l 99.1198,-31.39936 v 0 l 131.7153,-126.31933 v 0 l -191.8305,-45.89202 v 0 0 l -32.7044,30.45368 v 0 l -12.4139,-14.12077 23.3603,-21.75279 c -174.7833,-35.94516 -339.8259,-7.73356 -508.2045,-1.49116 l 21.8121,-25.44723 v 0 l 48.8674,-0.74684 v 0 c -140.1103,-9.1506 -272.3455,-35.87817 -386.9742,-101.90494 -15.3362,-21.4712 -5.2426,-43.65993 22.7879,-37.73352 z\"\n             style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:3.1754px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" /\u003e\n        \u003c/g\u003e\n      \u003c/g\u003e\n      \u003cpath\n         style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:1.41389px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n         d=\"m 2394.9999,689.06305 c -26.2769,0.17713 -48.2969,2.58185 -62.6719,1.8069 -296.4557,3.85975 -581.6127,222.84081 -650.199,293.60838 -66.5508,92.32867 -122.6286,265.78617 -220.0457,394.53417 -145.5504,265.4061 -317.7069,498.0109 -535.71096,697.0718 -346.48036,260.6012 -617.96395,257.673 -886.462661,244.2374 -16.303005,1.1393 -26.798914,19.7568 -32.3357924,32.7776 17.6907774,23.2731 35.3833394,30.1959 53.0741824,29.5026 l 192.786151,-6.1263 c 222.76402,-19.0948 408.11723,-63.6701 531.51204,-150.4215 -91.27986,87.3328 -561.64597,236.1754 -635.8605,219.1388 -18.29929,6.0883 -0.59073,27.0059 -0.94272,40.4851 28.59717,10.8445 57.45048,20.1269 89.12335,12.7328 215.25769,-68.7271 431.73976,-126.2131 637.97425,-278.1725 L 470.3581,2678.956 c -6.35143,26.2709 -6.47187,42.1074 -0.31418,47.5149 l 22.88063,6.0701 c 14.79923,2.1838 31.70983,-5.2783 50.41755,-20.8638 l 449.15854,-554.0299 c 41.64826,317.4734 374.18176,366.3069 626.83396,201.6913 l 8.2267,-75.3518 c -259.852,211.7813 -593.9759,82.4892 -571.1318,-162.8437 l 185.8736,-241.6681 c 64.3761,-86.9587 140.4715,-166.6899 229.8637,-238.1955 h 0.5713 c 82.3675,-62.9228 169.3027,-109.1913 250.3737,-174.419 97.9699,-68.0825 277.277,-73.8615 340.6967,-150.111 75.9004,-107.3953 138.2833,-236.5939 191.7294,-350.61629 65.7712,-148.14043 186.7294,-176.9987 394.6277,-17.95572 -7.0519,-83.03958 -65.9685,-161.4248 -99.6638,-194.15328 -65.8353,-53.48184 -103.3205,-55.20926 -155.5019,-64.96116 z M 149.08576,2445.1929 c 0.0795,-0.027 0.14754,-0.059 0.22845,-0.085 h -0.59993 c 0.11845,0.029 0.25098,0.057 0.37148,0.085 z M 2488.0583,749.5918 c 13.3211,0 24.109,13.32769 24.109,29.78501 0,16.45732 -10.7879,29.81326 -24.109,29.81326 -13.321,0 -24.1375,-13.35594 -24.1375,-29.81326 0,-16.45732 10.8165,-29.78501 24.1375,-29.78501 z\"\n         id=\"path2385-6-1-2-3\"\n         sodipodi:nodetypes=\"ccccccccccccccccccccccccccccccccccccsssc\"\n         inkscape:connector-curvature=\"0\" /\u003e\n      \u003cg\n         style=\"display:inline;fill:#999999;fill-opacity:1;stroke:#990000;stroke-opacity:1\"\n         id=\"g3323-6-2-4\"\n         transform=\"matrix(0.91388911,0.01880004,-0.01878355,0.91469117,3380.7843,425.559)\"\u003e\n        \u003cpath\n           sodipodi:nodetypes=\"cccccccccccccccccccccc\"\n           id=\"path3190-2-0-4-2\"\n           d=\"m -1938.7905,1344.2995 15.3955,-1.283 7.0562,-10.2637 -3.8488,-8.9807 3.8488,-8.9808 c 26.901,-8.9122 44.2829,-1.9591 55.8088,14.754 -0.1027,10.6945 -8.3234,15.9763 -18.6029,19.8859 -6.7082,-0.016 -14.6164,2.0346 -17.3412,-4.8053 v 0 c -16.1045,-1.7244 -11.7855,6.9433 -12.7007,9.072 3.8166,4.6142 10.3634,8.3754 23.8137,9.979 -7.6533,3.5761 -11.6619,14.8063 -24.7209,7.0307 -5.8792,-4.5108 -13.9229,-4.3322 -16.5562,-15.8758 -13.5829,-3.7285 -14.572,5.856 -14.515,11.1131 -0.352,5.6108 2.6918,10.0899 5.8967,14.5151 18.6918,9.7777 28.4118,11.6393 36.968,12.4739 11.2194,0.8225 24.7349,-15.9588 37.6483,-28.123 11.7646,0.4051 16.4086,-11.0571 23.1335,-19.0511 6.177,-27.5232 -20.7198,-44.6944 -30.8445,-51.7098 -19.6553,-8.2012 -39.8866,-7.5233 -50.5759,-3.6288 -9.4566,6.292 -15.9533,13.324 -23.1334,20.1851 -3.7507,11.7151 -4.9786,23.178 3.27,33.6932 z\"\n           style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:1.55587px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n           inkscape:connector-curvature=\"0\" /\u003e\n        \u003cpath\n           sodipodi:nodetypes=\"cccccccccccccccccccccc\"\n           id=\"path3190-0-8-2-9-5\"\n           d=\"m -1766.1814,1226.0731 15.3955,-1.283 7.0562,-10.2637 -3.8488,-8.9807 3.8488,-8.9808 c 26.901,-8.9122 44.2829,-1.9591 55.8088,14.754 -0.1027,10.6945 -8.3234,15.9763 -18.6029,19.8859 -6.7082,-0.016 -14.6164,2.0346 -17.3412,-4.8053 v 0 c -16.1045,-1.7244 -11.7855,6.9433 -12.7007,9.072 3.8166,4.6142 10.3634,8.3754 23.8137,9.979 -7.6533,3.5761 -11.6619,14.8063 -24.7209,7.0307 -5.8792,-4.5108 -13.9229,-4.3322 -16.5562,-15.8758 -13.5829,-3.7285 -14.572,5.856 -14.515,11.1131 -0.352,5.6108 2.6918,10.0899 5.8967,14.5151 18.6918,9.7777 28.4118,11.6393 36.968,12.4739 11.2194,0.8225 24.7349,-15.9588 37.6483,-28.123 11.7646,0.4051 16.4086,-11.0571 23.1335,-19.0511 6.177,-27.5232 -20.7198,-44.6944 -30.8445,-51.7098 -19.6553,-8.2012 -39.8866,-7.5233 -50.5759,-3.6288 -9.4566,6.292 -15.9533,13.324 -23.1334,20.1851 -3.7507,11.7151 -4.9786,23.178 3.27,33.6932 z\"\n           style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:1.55587px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n           inkscape:connector-curvature=\"0\" /\u003e\n      \u003c/g\u003e\n      \u003cpath\n         inkscape:connector-curvature=\"0\"\n         sodipodi:nodetypes=\"ccccccccccccsccccccccccccccccccccccc\"\n         id=\"path2853-1-2-3-9\"\n         d=\"m 1071.448,12.565243 c -15.3369,146.179207 73.828,372.947977 180.7482,487.459287 67.2709,85.4026 180.411,116.49879 253.836,186.99056 68.9967,61.4286 128.5121,127.35333 167.9088,194.3213 v 0 c 31.5208,54.088 48.125,119.16171 33.2259,193.68211 -17.7944,26.9261 -45.6999,45.6007 -72.7982,64.718 -53.9976,3.3831 -91.5092,-10.2639 -125.8605,-25.6749 v 0 C 1387.3321,1042.7224 1346.6981,980.34835 1306.6359,898.75209 1267.9574,794.5785 1249.1568,724.2529 1193.6994,650.05735 1131.5923,560.99655 1042.1677,564.5514 974.71289,506.59578 c -6.30086,-4.44472 5.01449,-29.07557 22.42474,-16.43307 26.25067,19.06189 76.75837,29.25724 76.75837,29.25724 l -28.0058,-39.22499 v 0 l 17.2141,2.47464 v 0 l 32.108,41.24885 v 0 l 78.1981,35.36579 v 0 l -17.3399,-104.35052 v 0 0 l -19.0336,-8.99068 v 0 l 3.5616,-9.31623 13.5954,6.42185 c -18.2636,-93.72824 -61.6156,-167.94463 -96.3766,-248.84241 l 14.8517,4.81539 v 0 l 9.6413,23.72335 v 0 c -22.9001,-70.61432 -36.914,-141.418612 -31.0608,-212.64819 6.091,-12.4349571 17.3374,-12.6004057 20.1985,2.468443 z\"\n         style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:1.58535px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" /\u003e\n      \u003cpath\n         inkscape:connector-curvature=\"0\"\n         sodipodi:nodetypes=\"ccccccccccccsccccccccccccccccccccccc\"\n         id=\"path2853-1-8-2-7-4\"\n         d=\"m 346.99101,968.42886 c 122.89969,124.43284 416.59744,198.91414 621.36814,171.56464 141.34235,-7.3092 273.67225,-103.0072 406.66535,-127.8264 120.466,-26.88812 236.4935,-40.49317 335.1448,-32.21014 v 0 c 79.4054,7.00369 155.4909,37.80454 211.6845,108.67004 8.9823,38.6312 1.014,81.759 -5.8034,124.3677 -46.0902,59.1793 -93.0891,88.4349 -138.8571,113.0661 v 0 c -177.3468,74.3073 -272.8249,70.7271 -385.7821,52.3012 -132.8378,-36.6106 -215.845,-68.9985 -335.9157,-65.7821 -140.05758,-0.8213 -218.30441,95.6669 -334.11166,123.5108 -9.91006,3.3189 -22.65364,-26.8114 5.06783,-35.7143 41.79723,-13.4237 97.41938,-58.8771 97.41938,-58.8771 l -62.28015,0.3225 v 0 l 18.02055,-16.2327 v 0 l 67.9175,-3.1279 v 0 l 104.45336,-55.8609 v 0 l -113.53757,-59.1376 v 0 0 l -25.78236,13.3133 v 0 l -5.4754,-10.6425 18.41603,-9.5096 c -104.43314,-50.2954 -213.48017,-59.7993 -320.94769,-83.2716 l 18.0578,-12.0185 v 0 l 31.01082,7.463 v 0 c -87.0171,-28.2993 -166.10614,-66.0655 -227.47003,-124.99811 -6.08836,-15.60868 4.01601,-27.53473 20.7371,-19.36983 z\"\n         style=\"display:inline;fill:#999999;fill-opacity:1;fill-rule:evenodd;stroke:#990000;stroke-width:2.04192px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\" /\u003e\n      \u003cg\n         id=\"g2901\"\n         style=\"display:inline;fill:#990000;fill-opacity:1;stroke:#800000\"\n         inkscape:export-filename=\"/home/zou/Documents/Projets_sur_images/Stephane-huc.net/Logo_gris_999999_390px.png\"\n         inkscape:export-xdpi=\"90\"\n         inkscape:export-ydpi=\"90\"\n         transform=\"matrix(0.66100118,0,0,0.66158128,2645.7866,917.11829)\"\u003e\n        \u003cpath\n           style=\"display:inline;fill:#990000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:2.13807px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n           d=\"m -386.64618,-358.3625 c -39.7533,0.2677 -73.0664,3.9025 -94.8137,2.7311 -448.495,5.8342 -879.89672,336.83061 -983.65782,443.797906 -100.6819,139.557584 -185.5195,401.743684 -332.8976,596.350184 -220.197,401.16931 -480.645,752.75841 -810.4539,1053.64501 -524.175,393.9064 -934.8907,389.4804 -1341.0908,369.1721 -24.6641,1.7221 -40.5428,29.863 -48.9194,49.5443 26.7636,35.1779 53.53,45.6419 80.2936,44.5941 l 291.6578,-9.2602 c 337.01,-28.8623 617.4228,-96.2393 804.1015,-227.3665 -138.0934,132.0061 -849.6898,356.9861 -961.9657,331.2348 -27.6843,9.2027 -0.8937,40.8202 -1.4262,61.1945 43.2634,16.3917 86.9143,30.4223 134.8308,19.246 325.654,-103.8832 653.1603,-190.7749 965.1635,-420.4661 l -612.5292,693.3656 c -9.6088,39.7091 -9.791,63.6465 -0.4753,71.8201 l 34.6151,9.1751 c 22.3892,3.301 47.9725,-7.9782 76.2746,-31.5362 l 679.5124,-837.4328 c 63.0078,479.8706 566.0832,553.6838 948.3098,304.8625 l 12.4459,-113.8966 c -393.1189,320.1138 -898.6004,124.6849 -864.0406,-246.1431 l 281.2001,-365.2885 c 97.3918,-131.4408 212.5134,-251.9569 347.7509,-360.0397 h 0.8643 c 124.6102,-95.1096 256.1307,-165.0459 378.7796,-263.6395 148.2143,-102.9088 419.48022,-111.6438 515.42512,-226.8972 114.8264,-162.3313 209.2027,-357.6189 290.059,-529.967097 99.5025,-223.918703 282.4948,-267.538803 597.0151,-27.1406 -10.6685,-125.5168 -99.8008,-243.998403 -150.777,-293.468503 -99.5993,-80.8394 -156.309,-83.4505 -235.2519,-98.1907 z M -3784.3922,2296.0803 c 0.1203,-0.041 0.2232,-0.089 0.3456,-0.1282 h -0.9076 c 0.1792,0.044 0.3797,0.086 0.562,0.1282 z M -245.86228,-266.8715 c 20.1529,0 36.4735,20.1452 36.4735,45.0209 0,24.8757 -16.3206,45.0637 -36.4735,45.0637 -20.1528,0 -36.5167,-20.188 -36.5167,-45.0637 0,-24.8757 16.3639,-45.0209 36.5167,-45.0209 z\"\n           id=\"path2385-6-1\"\n           sodipodi:nodetypes=\"ccccccccccccccccccccccccccccccccccccsssc\"\n           inkscape:connector-curvature=\"0\" /\u003e\n        \u003cg\n           style=\"fill:#990000;fill-opacity:1;stroke:#800000\"\n           id=\"g3323-6\"\n           transform=\"matrix(1.3825831,0.02841682,-0.02841682,1.3825831,1104.704,-756.6568)\"\u003e\n          \u003cpath\n             sodipodi:nodetypes=\"cccccccccccccccccccccc\"\n             id=\"path3190-2-0\"\n             d=\"m -1938.7905,1344.2995 15.3955,-1.283 7.0562,-10.2637 -3.8488,-8.9807 3.8488,-8.9808 c 26.901,-8.9122 44.2829,-1.9591 55.8088,14.754 -0.1027,10.6945 -8.3234,15.9763 -18.6029,19.8859 -6.7082,-0.016 -14.6164,2.0346 -17.3412,-4.8053 v 0 c -16.1045,-1.7244 -11.7855,6.9433 -12.7007,9.072 3.8166,4.6142 10.3634,8.3754 23.8137,9.979 -7.6533,3.5761 -11.6619,14.8063 -24.7209,7.0307 -5.8792,-4.5108 -13.9229,-4.3322 -16.5562,-15.8758 -13.5829,-3.7285 -14.572,5.856 -14.515,11.1131 -0.352,5.6108 2.6918,10.0899 5.8967,14.5151 18.6918,9.7777 28.4118,11.6393 36.968,12.4739 11.2194,0.8225 24.7349,-15.9588 37.6483,-28.123 11.7646,0.4051 16.4086,-11.0571 23.1335,-19.0511 6.177,-27.5232 -20.7198,-44.6944 -30.8445,-51.7098 -19.6553,-8.2012 -39.8866,-7.5233 -50.5759,-3.6288 -9.4566,6.292 -15.9533,13.324 -23.1334,20.1851 -3.7507,11.7151 -4.9786,23.178 3.27,33.6932 z\"\n             style=\"display:inline;fill:#990000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:1.55587px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n             inkscape:connector-curvature=\"0\" /\u003e\n          \u003cpath\n             sodipodi:nodetypes=\"cccccccccccccccccccccc\"\n             id=\"path3190-0-8-2\"\n             d=\"m -1766.1814,1226.0731 15.3955,-1.283 7.0562,-10.2637 -3.8488,-8.9807 3.8488,-8.9808 c 26.901,-8.9122 44.2829,-1.9591 55.8088,14.754 -0.1027,10.6945 -8.3234,15.9763 -18.6029,19.8859 -6.7082,-0.016 -14.6164,2.0346 -17.3412,-4.8053 v 0 c -16.1045,-1.7244 -11.7855,6.9433 -12.7007,9.072 3.8166,4.6142 10.3634,8.3754 23.8137,9.979 -7.6533,3.5761 -11.6619,14.8063 -24.7209,7.0307 -5.8792,-4.5108 -13.9229,-4.3322 -16.5562,-15.8758 -13.5829,-3.7285 -14.572,5.856 -14.515,11.1131 -0.352,5.6108 2.6918,10.0899 5.8967,14.5151 18.6918,9.7777 28.4118,11.6393 36.968,12.4739 11.2194,0.8225 24.7349,-15.9588 37.6483,-28.123 11.7646,0.4051 16.4086,-11.0571 23.1335,-19.0511 6.177,-27.5232 -20.7198,-44.6944 -30.8445,-51.7098 -19.6553,-8.2012 -39.8866,-7.5233 -50.5759,-3.6288 -9.4566,6.292 -15.9533,13.324 -23.1334,20.1851 -3.7507,11.7151 -4.9786,23.178 3.27,33.6932 z\"\n             style=\"display:inline;fill:#990000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:1.55587px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n             inkscape:connector-curvature=\"0\" /\u003e\n        \u003c/g\u003e\n        \u003cg\n           style=\"fill:#990000;fill-opacity:1;stroke:#800000\"\n           id=\"g3607\"\u003e\n          \u003cpath\n             style=\"display:inline;fill:#990000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:3.14969px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n             d=\"m -3334.7852,-1248.287 c 51.9752,263.91148 364.552,597.09982 649.489,723.58561 186.8994,102.74774 436.9783,80.34473 628.0009,153.0754 176.754,59.99791 336.6065,134.19234 455.7429,223.77162 v 0 c 95.6093,72.55212 166.8615,174.225196 178.8187,313.54167 -21.1645,58.71298 -67.8029,109.93553 -112.5308,161.38138 -108.9474,42.30362 -193.7664,43.94287 -273.1033,40.38991 v 0 c -289.559,-41.98012 -408.6126,-122.75609 -537.4682,-237.26062 -138.9061,-154.600767 -217.6672,-263.90172 -373.9094,-355.18101 -178.3851,-112.57744 -359.9805,-46.07103 -531.5855,-101.08503 -15.4761,-3.45827 -6.3053,-53.81809 36.6639,-43.63616 64.7876,15.3519 174.3223,-1.04389 174.3223,-1.04389 l -79.9048,-49.14253 v 0 l 36.7606,-7.32283 v 0 l 89.4837,49.88512 v 0 l 180.7667,8.58049 v 0 l -95.19,-169.30622 v 0 0 l -44.2175,-2.75208 v 0 l 1.9939,-18.56317 31.584,1.9656 c -91.0217,-150.25746 -222.4184,-249.74105 -339.9897,-366.61111 l 33.2464,-1.66844 v 0 l 33.3433,34.64483 v 0 c -87.3435,-107.03536 -156.5494,-220.39644 -185.2023,-347.90084 5.407,-25.6798 28.4059,-33.5554 42.8852,-9.3477 z\"\n             id=\"path2853-1-2\"\n             sodipodi:nodetypes=\"ccccccccccccsccccccccccccccccccccccc\"\n             inkscape:connector-curvature=\"0\" /\u003e\n          \u003cpath\n             style=\"display:inline;fill:#990000;fill-opacity:1;fill-rule:evenodd;stroke:#800000;stroke-width:3.1754px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1\"\n             d=\"m -3964.5819,579.94648 c 232.1778,142.02444 696.5351,140.75989 988.106,18.70266 205.9526,-66.5673 362.6995,-264.70185 549.2022,-354.76022 167.1463,-88.31108 333.1245,-154.57977 482.3054,-180.583195 v 0 c 120.2135,-20.415854 245.1813,-3.15744 357.0123,83.134705 28.9606,55.52615 34.6919,124.56859 41.9136,192.36665 -44.1007,108.51739 -101.6932,171.65364 -159.3434,227.23914 v 0 c -231.9712,183.0827 -374.5522,215.03066 -548.9965,231.13768 -211.2129,-3.89591 -347.056,-20.86741 -523.2284,31.10727 -207.3545,53.63654 -283.8394,231.78243 -443.7115,319.72853 -13.3008,8.9568 -44.3697,-32.1019 -7.0087,-56.5744 56.3312,-36.899 120.0937,-128.17265 120.0937,-128.17265 l -91.9262,24.90186 v 0 l 20.0462,-31.87375 v 0 l 99.1198,-31.39936 v 0 l 131.7153,-126.31933 v 0 l -191.8305,-45.89202 v 0 0 l -32.7044,30.45368 v 0 l -12.4139,-14.12077 23.3603,-21.75279 c -174.7833,-35.94516 -339.8259,-7.73356 -508.2045,-1.49116 l 21.8121,-25.44723 v 0 l 48.8674,-0.74684 v 0 c -140.1103,-9.1506 -272.3455,-35.87817 -386.9742,-101.90494 -15.3362,-21.4712 -5.2426,-43.65993 22.7879,-37.73352 z\"\n             id=\"path2853-1-8-2\"\n             sodipodi:nodetypes=\"ccccccccccccsccccccccccccccccccccccc\"\n             inkscape:connector-curvature=\"0\" /\u003e\n        \u003c/g\u003e\n      \u003c/g\u003e\n    \u003c/g\u003e\n  \u003c/g\u003e\n\u003c/svg\u003e\n\n    \u003c/a\u003e\n    \u003cfigcaption aria-hidden=\"true\" class=\"hidden\" hidden\u003eMon Logo\u003c/figcaption\u003e\n\u003c/figure\u003e\n\n\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"kbd\"\u003ekbd\u003c/h3\u003e\n\u003cp\u003eCe shortcode est utilisé pour la gestion de l\u0026rsquo;élément \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \u003ccode\u003ekbd\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/kbd.html\" title=\"\"\u003ekbd\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $k := .Get 0 | safeHTML }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ekbd\u003c/span\u003e\u0026gt;{{ $k }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ekbd\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shorcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; kbd key \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ekey\u003c/code\u003e est le nom de la touche clavier !\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple : voici le rendu de la touche \u003ckbd\u003eA\u003c/kbd\u003e\n !\u003c/p\u003e\n\u003ch3 id=\"lien-interne\"\u003eLien interne\u003c/h3\u003e\n\u003cp\u003eCe shortcode a deux versions légérement différentes. J\u0026rsquo;ai commencé avec\n\u003ca href=\"/fr/web/hugo/hugo-shortcodes/#inside-v1\"\u003ela première\u003c/a\u003e, puis un jour, je me suis demandé comment faire pour\n\u0026ldquo;injecter\u0026rdquo; aussi le nom d\u0026rsquo;une ancre ; \u003ca href=\"/fr/web/hugo/hugo-shortcodes/#inside-v2\"\u003ela v2\u003c/a\u003e est née !\u003c/p\u003e\n\u003ch4 id=\"inside-v1\"\u003eInside v1\u003c/h4\u003e\n\u003cp\u003ePour gérer les liens internes entre les pages de ce site, je me suis\névertué à mettre en place le shortcode suivant :\u003c/p\u003e\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/inside.html\" title=\"\"\u003einside\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e{{ $link := .Get 0 }}{{ $link := replace $link \u0026#34;:\u0026#34; \u0026#34;/\u0026#34; }}{{ $url := (print ( relLangURL $link ) \u0026#34;/\u0026#34;) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003e{{ if .Get 1 }}{{ $txt := .Get 1 }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;inside\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $url }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ i18n \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003elnkInsideTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eSite\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGetPage\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003elink\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eTitle\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;{{ $txt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e4\u003c/span\u003e\u003cspan\u003e{{ else }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e5\u003c/span\u003e\u003cspan\u003e{{ with .Site.GetPage $link }}{{ $title := .Title }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;inside\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $url }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ i18n \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003elnkInsideTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;{{ $title }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e6\u003c/span\u003e\u003cspan\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDe même, j\u0026rsquo;ai créé une définition \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, nommée \u003ccode\u003einside\u003c/code\u003e, qui me\npermet de modifier légérement le rendu pour les liens internes.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; inside \u0026#34;section:subsection:pagename\u0026#34; \u0026#34;Title\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles noms de sections et pages sont séparés par un \u003ccode\u003e:\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eLe titre peut être omis, dans ce cas-là sera affiché celui de la page\nappelée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLà, j\u0026rsquo;appelle la page \n\u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-deploy/\" title=\"Lien interne vers l\u0026#39;article : 'Hugo : Déploiement SFTP'\"\u003eHugo : Déploiement SFTP\u003c/a\u003e\n\n et c\u0026rsquo;est\nson titre qui est fourni, ainsi que l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eURL \u003cem\u003e(Uniform Resource Locator)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n adéquate\u003c/li\u003e\n\u003cli\u003eDans cet exemple, je force le titre dans l\u0026rsquo;appel de ma page\n\n    \u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-deploy/\" title=\"Lien interne vers l\u0026#39;article : 'Hugo : Déploiement SFTP'\"\u003eDéploiement d\u0026#39;un site statique par Hugo\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"inside-v2\"\u003eInside v2\u003c/h4\u003e\n\u003cp\u003eCette version est subtilement différente :\u003c/p\u003e\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/inside2.html\" title=\"\"\u003einside2\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e1\u003c/span\u003e\u003cspan\u003e{{ $link := .Get \u0026#34;l\u0026#34; }}{{ $link := replace $link \u0026#34;:\u0026#34; \u0026#34;/\u0026#34; }}{{ $url := (print ( relLangURL $link ) \u0026#34;/\u0026#34;) }}{{ $anchor := .Get \u0026#34;a\u0026#34; }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e2\u003c/span\u003e\u003cspan\u003e{{ if .Get \u0026#34;t\u0026#34; }}{{ $txt := .Get \u0026#34;t\u0026#34; }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;inside\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $url }}{{ if $anchor }}#{{ $anchor }}{{ end }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ i18n \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003elnkInsideTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#39;{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ewith\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eSite\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eGetPage\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003elink\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e.\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eTitle\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#39;\u0026#34;\u003c/span\u003e\u0026gt;{{ $txt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e3\u003c/span\u003e\u003cspan\u003e{{ else }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e4\u003c/span\u003e\u003cspan\u003e{{ with .Site.GetPage $link }}{{ $title := .Title }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;inside\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $url }}{{ if $anchor }}#{{ $anchor }}{{ end }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ i18n \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003elnkInsideTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#39;{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#39;\u0026#34;\u003c/span\u003e\u0026gt;{{ $title }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan style=\"white-space:pre;-webkit-user-select:none;user-select:none;margin-right:0.4em;padding:0 0.4em 0 0.4em;color:#7f7f7f\"\u003e5\u003c/span\u003e\u003cspan\u003e{{ end }}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; inside2 l=\u0026#34;section:subsection:pagename\u0026#34; t=\u0026#34;title\u0026#34; a=\u0026#34;anchor-name\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cp\u003eLes paramètres nommés sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ea\u003c/code\u003e : cible une ancre dans le document appelé ; bien-sûr, cette ancre\ndoit exister… dans le document en question. Peut-être omise !\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003el\u003c/code\u003e : nom du lien interne ; les noms de sections et pages sont séparés\npar le symbole \u003ccode\u003e:\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003et\u003c/code\u003e : le titre. Peut être omis, dans ce cas-là sera affiché celui de\nla page appelée.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLà, j\u0026rsquo;appelle la page \u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-deploy/#rsync\" title=\"Lien interne vers l\u0026#39;article : 'Hugo : Déploiement SFTP'\"\u003eHugo : Déploiement SFTP\u003c/a\u003e\n; c\u0026rsquo;est son titre qui est fourni, ainsi que l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n adéquate,\nmais elle pointe vers le chapitre \u003cstrong\u003ersync\u003c/strong\u003e, ciblée par l\u0026rsquo;ancre correspondante.\u003c/li\u003e\n\u003cli\u003eDans cet exemple, je force le titre dans l\u0026rsquo;appel de ma page\n\u003ca class=\"inside\" href=\"/fr/web/hugo/hugo-deploy/\" title=\"Lien interne vers l\u0026#39;article : 'Hugo : Déploiement SFTP'\"\u003eDéploiement d'un site statique par Hugo\u003c/a\u003e\n\nmais je ne cible pas d\u0026rsquo;ancre.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"note\"\u003eNote\u003c/h3\u003e\n\u003cp\u003eLes blocs d\u0026rsquo;alertes ou de notes sont des blocs de code \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nprésentant un texte et mis en valeur selon un identifiant, qui est traduit\nselon la langue utilisée.\u003c/p\u003e\n\u003cp\u003eLa valeur de cet identifiant peut être :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edanger\u003c/code\u003e pour afficher une alerte de type \u0026lsquo;danger\u0026rsquo; qui aura une teinte\nrougée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003einfo\u003c/code\u003e pour afficher un message de type \u0026lsquo;information\u0026rsquo; qui aura une\nteinte bleutée\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esuccess\u003c/code\u003e pour afficher un message de type \u0026lsquo;succès\u0026rsquo; qui aura une\nteinte verte\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etip\u003c/code\u003e pour afficher un message de type \u0026lsquo;astuce\u0026rsquo; qui aura une teinte\njaune.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ewarning\u003c/code\u003e pour afficher un message de type \u0026lsquo;attention\u0026rsquo; qui aura une\nteinte orangée, jaunâtre.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBien-sûr, ces teintes dépendent des déclarations \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003eLe shortcode en lui-même :\u003c/p\u003e\n\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/note.html\" title=\"\"\u003enote\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $class := .Get 0 }}{{ $wrd := T (printf \u0026#34;alert-%s\u0026#34; $class) }}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;info-tab {{ $class }}-icon\u0026#34;\u003c/span\u003e\u0026gt;{{ $wrd }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;alert alert-{{ $class }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erole\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;alert\u0026#34;\u003c/span\u003e\u0026gt;{{ .Inner | .Page.RenderString }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ediv\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode est :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; note id \u0026gt;}}\nCeci est un message\n{{\u0026lt; /note \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eExemples :\u003c/p\u003e\n\u003cp\u003e\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Ceci est un message d\u0026rsquo;avertissement pour présenter un danger !\u003c/div\u003e\n\n\u003cem\u003eCet exemple embarque le code MD pour mettre en gras le mot \u0026lsquo;ATTENTION\u0026rsquo;.\u003c/em\u003e\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCeci est une \u003cstrong\u003enote d\u0026rsquo;information\u003c/strong\u003e. Merci d\u0026rsquo;en tenir compte ! :D\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-success\"\u003eSuccès\u003c/div\u003e\u003cdiv class=\"alert alert-success\" role=\"alert\"\u003eVous avez réussi le test ! Soyez heureux…\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eCe message est une astuce à mettre en valeur. Retenez-la, elle peut vous\nêtre pratique !\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eVeuillez prêter attention à ce message ; il semble qu\u0026rsquo;un dysfonctionnement\nse prépare. Veuillez faire les tests adéquats.\u003c/div\u003e\n\n\u003ch3 id=\"tag\"\u003eTag\u003c/h3\u003e\n\u003cp\u003eCe shortcode n\u0026rsquo;existe pas pour gérer les tags générés par Hugo, mais pour\ngérer l\u0026rsquo;URL d\u0026rsquo;un tag au sein d\u0026rsquo;une page \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"MarkDown\"\u003eMD\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. Le shortcode va\ngénérer un élément \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"HyperText Markup Language\"\u003eHTML\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \u003ccode\u003ea\u003c/code\u003e adéquat. Il tient compte de la\ngestion multilangue du site.\u003c/p\u003e\n\u003cp\u003eAu sein de la page Markdown, j\u0026rsquo;intégre un mot qui se veut être un renvoi\nvers la page tag ad hoc.\u003c/p\u003e\n\u003cp\u003eCôté \n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Cascade Style Sheet\"\u003eCSS\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, j\u0026rsquo;ai défini l\u0026rsquo;attribut \u003ccode\u003e::after\u003c/code\u003e sur la définition\n\u003ccode\u003e.tag\u003c/code\u003e pour ajouter l\u0026rsquo;information \u003ccode\u003e(tag)\u003c/code\u003e précédé du terme en question.\nCe qui permet visuellement de le différencier des autres liens.\u003c/p\u003e\n\u003cp\u003e\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/tag.html\" title=\"\"\u003etag\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $txt := .Get 0 }}{{ $href := \u0026#34;/\u0026#34; | relLangURL}}{{ $href := (printf \u0026#34;%s%s%s\u0026#34; $href \u0026#34;/tags/\u0026#34; $txt) | urlize }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;tag\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $href }}\u0026#34;\u003c/span\u003e\u0026gt;{{ $txt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eL\u0026rsquo;appel du shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; tag tag-name \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eExemple : le mot \u003ca class=\"tag\" href=\"/fr/tags/hugo\"\u003eHugo\u003c/a\u003e\n est un  lien vers l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n des\narticles contenant le tag \u0026ldquo;Hugo\u0026rdquo;.\u003c/p\u003e\n\u003ch2 id=\"autres-shortcodes\"\u003eAutres shortcodes\u003c/h2\u003e\n\u003ch3 id=\"gohugo\"\u003eGoHugo\u003c/h3\u003e\n\u003cp\u003ePour faire un lien vers la documentation officielle d\u0026rsquo;Hugo, je me suis\namusé à écrire ce shortcode :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; gohugo n=\u0026#34;pagename\u0026#34; s=\u0026#34;section\u0026#34; a=\u0026#34;anchor-name\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003en\u003c/code\u003e est le nom de la page dans la documentation du site Gohugo.io\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003es\u003c/code\u003e est le nom de la section dans la documentation du site Gohugo.io\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ea\u003c/code\u003e est le nom de l\u0026rsquo;ancre à cibler dans la page\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/gohugo.html\" title=\"\"\u003egohugo\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode est :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $section := .Get \u0026#34;s\u0026#34; }}{{ $name := .Get \u0026#34;n\u0026#34; }}{{ $anchor := .Get \u0026#34;a\u0026#34; }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;https://gohugo.io/{{ $section }}/{{ $name }}/{{ if $anchor }}#{{ $anchor}}{{ end }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ i18n \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003eshortcodeGoHugoTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehumanize\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003esection\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e\u0026amp;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003egt\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehumanize\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003ename\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;{{ i18n \u0026#34;shortcodeGoHugoDocTitle\u0026#34; }}{{ humanize $section }} \u0026amp;gt; {{ humanize $name }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eExemple: Le lien vers la page \u003ca href=\"https://gohugo.io/content-management/shortcodes/\" title=\"Lien vers la page du site officiel Hugo : Content management \u0026gt; Shortcodes\"\u003eHugo Documentation : Content management \u0026gt; Shortcodes\u003c/a\u003e\n Hugo.\u003c/p\u003e\n\u003cp\u003eVoici le shortcode correspondant :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; gohugo n=\u0026#34;shortcodes\u0026#34; s=\u0026#34;content-management\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003ch3 id=\"manpage\"\u003eManpage\u003c/h3\u003e\n\u003cp\u003eUtilisant souvent des renvois vers les manpages officiels d\u0026rsquo;OpenBSD, je\nme suis crée le shortcode suivant :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; man title digit anchor \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSi un chiffre \u003cem\u003e(\u003ccode\u003edigit\u003c/code\u003e)\u003c/em\u003e est fourni, le shortcode le restituera à la fois,\ndans l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n reconstituée, que dans le texte affiché. \u003cbr\u003e\nDans l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n, ce sera de type \u003ccode\u003etxt.digit\u003c/code\u003e ; le texte affiché\naura le chiffre entouré des parenthèses, tel que \u003ccode\u003etxt(digit)\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi une ancre \u003cem\u003e(\u003ccode\u003eanchor\u003c/code\u003e)\u003c/em\u003e est fournie, le shortcode la restituera à la fois,\ndans l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Uniform Resource Locator\"\u003eURL\u003c/abbr\u003e\n\n\n\n\n\n\n\n reconstituée, que dans le texte affiché, tel que\n\u003ccode\u003etxt(digit)#anchor\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/man.html\" title=\"\"\u003eman\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode est :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $txt := .Get 0 }}{{ $nb := .Get 1}}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eclass\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;man\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;https://man.openbsd.org/{{ $txt }}{{ if $nb }}{{ print \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e.\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003enb\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eend\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ i18n \u0026#34;\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003emanpageTitle\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}{{\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e$\u003c/span\u003e\u003cspan style=\"color:#06b6ef\"\u003etxt\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003e}}\u0026#34;\u003c/span\u003e\u0026gt;{{ $txt }}{{ if $nb }}{{ print \u0026#34;(\u0026#34; $nb \u0026#34;)\u0026#34; }}{{ end }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eExemples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLien vers le manpage \u003cstrong\u003ePacket Filter\u003c/strong\u003e : \n\u003ca class=\"man\" href=\"https://man.openbsd.org/pf.4\" title=\"Page du Manuel OpenBSD pour : pf\"\u003epf(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eAutre lien celui vers : \n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.8\" title=\"Page du Manuel OpenBSD pour : httpd\"\u003ehttpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eUn dernier pour la route vers : \n\u003ca class=\"man\" href=\"https://man.openbsd.org/man\" title=\"Page du Manuel OpenBSD pour : man\"\u003eman\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"wikipedia\"\u003eWikipedia\u003c/h3\u003e\n\u003cp\u003eDe même pour l\u0026rsquo;encyclopédie Wikipédia, le shortcode créé est le suivant :\n\u003cdiv class=\"info-code\"\u003e\n    \u003cp\u003eCode :\u0026nbsp;\u003cem\u003eshortcode\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"code\"\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-shortcode\" data-lang=\"shortcode\"\u003e\n{{\u0026lt; wp \u0026#34;url-article\u0026#34; \u0026gt;}}\n\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cdiv class=\"is-right\"\u003e\n    \u003cp class=\"is-italic is-white-50\"\u003eSource brute vers le shortcode : \u003ca class=\"raw-src\" href=\"https://framagit.org/sh-web/hugo/doc.huc.fr.eu.org/-/tree/master/layouts/shortcodes/wp.html\" title=\"\"\u003ewp\u003c/a\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nLe shortcode est :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-html\" data-lang=\"html\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e{{ $txt := .Get 0 }}{{ $title := print (i18n \u0026#34;wpTitleArticle\u0026#34;) $txt }}\u0026lt;\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ehref\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;https://{{ .Site.Language.Lang }}.wikipedia.org/wiki/{{ $txt }}\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003etitle\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{{ $title }}\u0026#34;\u003c/span\u003e\u0026gt;Wikipedia :: {{ $txt }}\u0026lt;/\u003cspan style=\"color:#5bc4bf\"\u003ea\u003c/span\u003e\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eExemples :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVoici un article de promotion sur \u003ca href=\"https://fr.wikipedia.org/wiki/OpenBSD\" title=\"Article Wikipédia : OpenBSD\"\u003eOpenBSD \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eEn voici un autre pour \u003ca href=\"https://fr.wikipedia.org/wiki/Debian\" title=\"Article Wikipédia : Debian\"\u003eDebian \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eEt, un troisième un peu plus compliqué : \u003ca href=\"https://fr.wikipedia.org/wiki/Pare-feu_%28informatique%29\" title=\"Article Wikipédia : Pare-feu_(informatique)\"\u003ePare-feu_(informatique) \u003csup\u003e\u003cabbr class=\"is-italic\" title=\"Wikipedia\"\u003eWP\u003c/abbr\u003e\u003c/sup\u003e\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"ailleurs\"\u003eAilleurs\u003c/h2\u003e\n\u003cp\u003ePour finir, n\u0026rsquo;hésitez pas à vous amuser avec les shortcodes, faites-vous\naider sur le \u003ca href=\"https://discourse.gohugo.io/\" rel=\"external\"\u003eforum de la communauté\u003c/a\u003e,\n\u003cem\u003emalheureusement pour nous francoph(on|il)es\u003c/em\u003e, en anglais.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://after-dark.habd.as/shortcode/\" rel=\"external\"\u003ehttps://after-dark.habd.as/shortcode/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Présentation des différents shortcodes Hugo utilisés sur ce site, fabriqués par mes soins",
            "tags": ["Hugo", "Shortcode"],
            "date_published": "2019-11-29T15:29:59+01:00",
            "date_modified": "2025-11-13T14:12:52+01:00"
        },{
            "id": "urn:uuid:e27f9a31-a6e3-be71-296f-e2f13e56aa77",
            "url": "http://doc.huc.fr.eu.org/fr/web/hugo/hugo-deploy/",
            "title": "Hugo : Déploiement SFTP",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Pour déployer un site fait avec le générateur de site statique Hugo, il existe plusieurs solutions :\nla plus simple est l\u0026rsquo;usage de l\u0026rsquo;outil rsync.\nIl existe des \u0026ldquo;solutions\u0026rdquo; de déploiement selon le type de services que vous utilisez.\nje vais vous en présenter une troisième solution tenant compte du fait que votre utilisateur SSH soit soumis au chroot SSH (Secure SHell) .\nDans le contexte de déploiement \u0026ldquo;simple\u0026rdquo;, il suffit de créer le script de déploiement nommé deploy à la racine du projet Hugo !\nUtilisation rsync Déployer un site avec rsync est très simple. rsync est l\u0026rsquo;outil pour de la synchronisation de données ; il le fait, et il le fait bien.\nAprès avoir installé l\u0026rsquo;outil :\nsous Debian/*Buntu : :# apt install rsync sous OpenBSD : :# pkg_add rsync - pour information, depuis OpenBSD v6.5, il existe nativement dans le système de base, l\u0026rsquo;outil openrsync ; reproduisant le comportement de rsync, il est asujetti au même problème décrit ci-dessous - En assumant le fait que vous avez une authentification SSH sur le serveur où vous désirez vous synchroniser, et mieux une authentification par clé SSH .\n#!/bin/sh user=userid host=servername port=22 dir_dist=/remote_folder/ file_id=\u0026#34;$HOME/.ssh/id_ed25519\u0026#34; hugo \u0026amp;\u0026amp; rsync -avz --delete -e \u0026#34;ssh -i ${file_id} -p ${port}\u0026#34; public/ \u0026#34;${user}\u0026#34;@\u0026#34;${host}\u0026#34;:\u0026#34;${dir_dist}\u0026#34; userid est l\u0026rsquo;identifiant utilisateur SSH servername est le nom FQDN (Fully Qualified Domain Name) ou l\u0026rsquo;adresse IP (Internet Protocol) du serveur SSH vers lequel se connecter\nremote_folder est le nom réel du répertoire distant sur lequel se connecter.\nCet exemple montre le déploiement d\u0026rsquo;un site avec rsync utilisant une connexion SSH .\nInfoL\u0026rsquo;exécution de la commande hugo va regénérer chacune des pages. Résultat, rsync va téléverser à nouveau toutes les pages, et non pas juste celles modifiées, puisque toutes sont re-générées. AttentionLe problème est que si l\u0026rsquo;utilisateur SSH est soumis au chroot\nSSH\n, et donc ne peut se connecter qu\u0026rsquo;en\nSFTP (SSH File Transfer Protocol)\n, il est impossible d\u0026rsquo;utiliser rsync car il n\u0026rsquo;est pas fait pour communiquer ainsi ; tout simplement, il ne le peut pas !\nC\u0026rsquo;est là, qu\u0026rsquo;entre en jeu, soit :\nle fait de se connecter en premier avec SshFS ou d\u0026rsquo;utiliser le très léger client lftp. voire le puissant logiciel rclone. SshFS SshFS peut être installé par votre gestionnaire de paquets :\nsous Debian/*Buntu : # apt install sshfs sous OpenBSD : # pkg_add sshfs L\u0026rsquo;avantage de SshFS est que c\u0026rsquo;est un outil qui permet de se connecter que votre utilisateur SSH soit soumis ou non à un chroot SSH en montant le répertoire distant dans l\u0026rsquo;espace utilisateur local. Attention, cela ralentit l\u0026rsquo;accès réseau, rien de grave, mais à savoir…\nSous OpenBSD, c\u0026rsquo;est un peu plus délicat ; du fait de fonctionner principalement sur ce SE , j\u0026rsquo;expliquerais pour celui-ci. Au cas où, adaptez à votre cas. En effet, sous OpenBSD, il est nécessaire d\u0026rsquo;avoir des droits administrateur, et il est recommandé d\u0026rsquo;avoir paramétré doas .\nPour monter localement le système de fichier : :$ doas sshfs -C -p $port -o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER) ${id}@${host}:${dir_dist} \u0026quot;${dir_mount}\u0026quot;\nUne fois connecté, le répertoire distant est monté localement là où vous le désirez.\nC\u0026rsquo;est le moment d\u0026rsquo;utiliser rsync mais au lieu de chercher à se connecter - puisque c\u0026rsquo;est déjà fait -, l\u0026rsquo;outil va permettre de synchroniser d\u0026rsquo;un répertoire source local vers le répertoire source distant, monté localement.\nrsync s\u0026rsquo;utilise donc ainsi : cd \u0026quot;${dir_local}\u0026quot; \u0026amp;\u0026amp; rsync -av --delete --human-readable --progress --stats \u0026quot;.\u0026quot; \u0026quot;${dir_mount}\u0026quot;\nPour le démonter proprement, ce sera : :$ doas umount \u0026quot;${dir_mount}\u0026quot;\nCeci étant dit, voici à quoi peut ressemble le fichier de déploiement dans ce contexte SshFS + rsync :\n#!/bin/sh #set -x [ -n \u0026#34;$TERM\u0026#34; ] \u0026amp;\u0026amp; clear ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34; id=userid host=servername port=22 ### the directory where your web site files should go ## dir_dist: relative to chroot SSH dir_dist=\u0026#34;/www/\u0026#34; dir_local=\u0026#34;$ROOT/public/\u0026#34; dir_mount=\u0026#34;$HOME/servers/${id}/\u0026#34; file_id=\u0026#34;$HOME/.ssh/id_ed25519\u0026#34; rsync_opts=\u0026#34;--human-readable --progress --stats \u0026#34; ################################################################################ ### ## # Fonctions ## ### ################################################################################ _mount() { [ ! -d \u0026#34;${dir_mount}\u0026#34; ] \u0026amp;\u0026amp; mkdir -p \u0026#34;${dir_mount}\u0026#34; # for Debian [ -d \u0026#34;${dir_mount}\u0026#34; ] \u0026amp;\u0026amp; sshfs -C -p $port -o uid=$(id -u $USER) -o gid=$(id -g $USER) -o IdentityFile=\u0026#34;${file_id}\u0026#34; ${id}@${host}:${dir_dist} \u0026#34;${dir_mount}\u0026#34; # for OpenBSD [ -d \u0026#34;${dir_mount}\u0026#34; ] \u0026amp;\u0026amp; doas sshfs -C -p \u0026#34;${port}\u0026#34; -o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER) -o IdentityFile=\u0026#34;${file_id}\u0026#34; \u0026#34;${id}\u0026#34;@\u0026#34;${host}\u0026#34;:\u0026#34;${dir_dist}\u0026#34; \u0026#34;${dir_mount}\u0026#34; } _rsync() { cd \u0026#34;${dir_local}\u0026#34; || exit rsync -av --delete $rsync_opts \u0026#34;.\u0026#34; \u0026#34;${dir_mount}\u0026#34; } _umount() { fusermount -u \u0026#34;${dir_mount}\u0026#34; # pour Debian doas umount \u0026#34;${dir_mount}\u0026#34; # pour OpenBSD } ################################################################################ ### ## # Execution ## ### ################################################################################ hugo status=\u0026#34;$?\u0026#34; if [ \u0026#34;${status}\u0026#34; -eq 0 ]; then if _mount; then _rsync _umount fi fi userid est l\u0026rsquo;identifiant utilisateur SSH servername est le nom FQDN ou l\u0026rsquo;adresse IP du serveur SSH vers lequel se connecter\ndir_mount est le nom du répertoire local vers lequel le répertoire distant va être monté.\nAttentionATTENTION à ne pas utiliser directement ce script, sans mettre en commentaire les lignes ne correspondant pas à votre OS ! lftp lftp est un couteau suisse de la connexion réseau. Il fait du FTP (File Transfer Protocol) , FTPS (File Transfer Protocol Secure) , de la synchronistation de document, sur IPv4 (Internet Protocol v4) , IPv6 (Internet Protocol v6) , au-travers des protocoles HTTP(S) ; il fait même du trafic bittorent, voire partiellement du WebDAV… et il est capable de se connecter en SFTP !\nVoilà le \u0026ldquo;miracle\u0026rdquo; : un client réseau sachant faire du mirroring de données en SFTP !!!\nDonc, installez avec votre gestionnaire de paquets le binaire :\nsous Debian/*Buntu : :# apt install lftp sous OpenBSD : :# pkg_add lftp #!/bin/sh #set -x [ -n \u0026#34;$TERM\u0026#34; ] \u0026amp;\u0026amp; clear ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34; id=userid host=servername port=22 ### the directory where your web site files should go ## dir_dist: relative to chroot SSH dir_dist=\u0026#34;/www/\u0026#34; dir_local=\u0026#34;$ROOT/public/\u0026#34; file_id=\u0026#34;$HOME/.ssh/id_ed25519\u0026#34; hugo lftp -e \u0026#34;set ftp:ssl-allow no; set sftp:connect-program ssh -a -x -i ${file_id}; mirror -e -R ${dir_local} ${dir_dist}; quit;\u0026#34; -p \u0026#34;${port}\u0026#34; sftp://\u0026#34;${id}\u0026#34;:\u0026#34;${passwd}\u0026#34;@\u0026#34;${host}\u0026#34; userid est l\u0026rsquo;identifiant utilisateur SSH servername est le nom FQDN ou l\u0026rsquo;adresse IP du serveur SSH vers lequel se connecter\nrclone rclone est un puissant outil en ligne de commande pour gérer le stockage de fichiers à-travers de nombreuses solutions de type nuage informatique, systèmes de fichers divers et variés, mais aussi basiquement par le biais du protocol SFTP .\nInstallez avec votre gestionnaire de paquets le binaire :\nsous Debian/*Buntu : :# apt install rclone sous OpenBSD : :# pkg_add rclone La configuration par l\u0026rsquo;usage de l\u0026rsquo;option config tel que : :$ rclone config\nNommez votre accès remote, tel que vous désirez. Ce nom sera à utiliser en tant que nom de connexion. Choisissez absolument la connexion SFTP, en écrivant sftp lorsque l\u0026rsquo;invite vous pose la question. L\u0026rsquo;invite de commande de rclone est en anglais, mais elle est aisée à utiliser. Je vous renvoie à la page de la documentation SFTP , dont la référence est dans la section Documentation ; allez-y absolument faire un tour de lecture !\nLe fichier de configuration se trouvera être écrit dans votre répertoire personnel ~/.config/rclone/rclone.conf, par défaut.\nIl sera de ce type :\n[nom_remote] type = sftp host = adresse_ip ou FQDN user = id_ssh port = 22 key_file = ~/.ssh/id_ed25519 key_use_agent = true pubkey_file = ~/.ssh/id_ed25519.pub use_insecure_cipher = false md5sum_command = none sha1sum_command = none Il ne reste plus qu\u0026rsquo;à utiliser rclone dans votre script de déploiement d\u0026rsquo;Hugo :\n#!/bin/sh #set -x [ -n \u0026#34;$TERM\u0026#34; ] \u0026amp;\u0026amp; clear ROOT=\u0026#34;$(dirname \u0026#34;$(readlink -f -- \u0026#34;$0\u0026#34;)\u0026#34;)\u0026#34; id=userid host=servername port=22 ### the directory where your web site files should go ## dir_dist: relative to chroot SSH dir_dist=\u0026#34;/www/\u0026#34; dir_local=\u0026#34;$ROOT/public/\u0026#34; file_id=\u0026#34;$HOME/.ssh/id_ed25519\u0026#34; rclone_remote=\u0026#34;nom_remote\u0026#34; hugo rclone sync -i \u0026#34;${dir_local}\u0026#34; \u0026#34;${rclone_remote}\u0026#34;:\u0026#34;${dir_dist}\u0026#34; FIN Voilà, c\u0026rsquo;est fini.\nMaintenant, vous savez déployer votre site statique Hugo, que avec rsync/ssh, sshfs+rsync, lftp, voire par rclone.\nDocumentation La documentation officielle :\nHugo Documentation : Hosting and deployment \u0026gt; Deployment with rsync Le site web de lftp La documentation de rclone:sftp ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003ePour déployer un site fait avec le générateur de site statique \u003cstrong\u003eHugo\u003c/strong\u003e,\nil existe plusieurs solutions :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003ela plus simple est l\u0026rsquo;usage de l\u0026rsquo;outil \u003ca href=\"/fr/web/hugo/hugo-deploy/#rsync\"\u003ersync\u003c/a\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIl existe des \u0026ldquo;solutions\u0026rdquo; de déploiement selon le type de services que\nvous utilisez.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eje vais vous en présenter une troisième solution tenant compte du fait\nque votre utilisateur SSH soit soumis au chroot \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSSH \u003cem\u003e(Secure SHell)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDans le contexte de déploiement \u0026ldquo;simple\u0026rdquo;, il suffit de créer le script de\ndéploiement nommé \u003ccode\u003edeploy\u003c/code\u003e à la racine du projet Hugo !\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003ch3 id=\"rsync\"\u003ersync\u003c/h3\u003e\n\u003cp\u003eDéployer un site avec \u003ccode\u003ersync\u003c/code\u003e est très simple. \u003cstrong\u003ersync\u003c/strong\u003e est l\u0026rsquo;outil pour\nde la synchronisation de données ; il le fait, et il le fait bien.\u003c/p\u003e\n\u003cp\u003eAprès avoir installé l\u0026rsquo;outil :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esous Debian/*Buntu : \u003ccode\u003e:# apt install rsync\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esous OpenBSD : \u003ccode\u003e:# pkg_add rsync\u003c/code\u003e - \u003cem\u003epour information, depuis OpenBSD v6.5,\nil existe nativement dans le système de base, l\u0026rsquo;outil \u003ccode\u003eopenrsync\u003c/code\u003e ;\nreproduisant le comportement de \u003cstrong\u003ersync\u003c/strong\u003e, il est asujetti au même problème\ndécrit ci-dessous\u003c/em\u003e -\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEn assumant le fait que vous avez une authentification \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n sur le\nserveur où vous désirez vous synchroniser, et mieux une authentification par\nclé \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003euser\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003euserid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eservername\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e/remote_folder/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.ssh/id_ed25519\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rsync -avz --delete -e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;ssh -i \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e -p \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e public/ \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003euser\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e@\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003euserid\u003c/code\u003e est l\u0026rsquo;identifiant utilisateur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eservername\u003c/code\u003e est le nom \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eFQDN \u003cem\u003e(Fully Qualified Domain Name)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ou l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIP \u003cem\u003e(Internet Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du\nserveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n vers lequel se connecter\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eremote_folder\u003c/code\u003e est le nom réel du répertoire distant sur lequel se connecter.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCet exemple montre le déploiement d\u0026rsquo;un site avec rsync utilisant une connexion\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eL\u0026rsquo;exécution de la commande \u003ccode\u003ehugo\u003c/code\u003e va regénérer chacune des pages. Résultat,\n\u003ccode\u003ersync\u003c/code\u003e va téléverser à nouveau toutes les pages, et non pas juste celles\nmodifiées, puisque toutes sont re-générées.\u003c/div\u003e\n\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003eLe problème est que si l\u0026rsquo;utilisateur SSH est soumis au chroot\u003c/p\u003e\n\u003cp\u003e\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\u003c/p\u003e\n\u003cp\u003e,\net donc ne peut se connecter qu\u0026rsquo;en\u003c/p\u003e\n\u003cp\u003e\u003cspan lang=\"en\"\u003eSFTP \u003cem\u003e(SSH File Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003e, il est impossible\nd\u0026rsquo;utiliser \u003cstrong\u003ersync\u003c/strong\u003e car il n\u0026rsquo;est pas fait pour communiquer ainsi ;\ntout simplement, il ne le peut pas !\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est là, qu\u0026rsquo;entre en jeu, soit :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ele fait de se connecter en premier avec \u003ca href=\"/fr/web/hugo/hugo-deploy/#sshfs\"\u003eSshFS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eou d\u0026rsquo;utiliser le très léger client \u003ca href=\"/fr/web/hugo/hugo-deploy/#lftp\"\u003elftp\u003c/a\u003e.\u003c/li\u003e\n\u003cli\u003evoire le puissant logiciel \u003ca href=\"/fr/web/hugo/hugo-deploy/#rclone\"\u003erclone\u003c/a\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/div\u003e\n\n\u003ch3 id=\"sshfs\"\u003eSshFS\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003eSshFS\u003c/strong\u003e peut être installé par votre gestionnaire de paquets :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esous Debian/*Buntu : \u003ccode\u003e# apt install sshfs\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esous OpenBSD : \u003ccode\u003e# pkg_add sshfs\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eL\u0026rsquo;avantage de \u003cem\u003eSshFS\u003c/em\u003e est que c\u0026rsquo;est un outil qui permet de se connecter\nque votre utilisateur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n soit soumis ou non à un chroot\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n en montant le répertoire distant dans l\u0026rsquo;espace utilisateur\nlocal. \u003cbr\u003e\n\u003cem\u003eAttention, cela ralentit l\u0026rsquo;accès réseau, rien de grave, mais à savoir…\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSous OpenBSD, c\u0026rsquo;est un peu plus délicat ; du fait de fonctionner principalement\nsur ce \u003cabbr title=\"Système d'Exploitation\"\u003eSE\u003c/abbr\u003e\n, j\u0026rsquo;expliquerais\npour celui-ci. Au cas où, adaptez à votre cas.\nEn effet, sous OpenBSD, il est nécessaire d\u0026rsquo;avoir des droits administrateur,\net il est recommandé d\u0026rsquo;avoir paramétré \n\u003ca class=\"man\" href=\"https://man.openbsd.org/doas\" title=\"Page du Manuel OpenBSD pour : doas\"\u003edoas\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003ePour monter localement le système de fichier : \u003cbr\u003e\n\u003ccode\u003e:$ doas sshfs -C -p $port -o allow_other -o uid=$(id -u $USER) -o gid=$(id -g $USER) ${id}@${host}:${dir_dist} \u0026quot;${dir_mount}\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eUne fois connecté, le répertoire distant est monté localement là où vous\nle désirez.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est le moment d\u0026rsquo;utiliser \u003ccode\u003ersync\u003c/code\u003e mais au lieu de chercher à se\nconnecter - \u003cem\u003epuisque c\u0026rsquo;est déjà fait\u003c/em\u003e -, l\u0026rsquo;outil va permettre de synchroniser\nd\u0026rsquo;un répertoire source local vers le répertoire source distant, monté localement.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ersync\u003c/strong\u003e s\u0026rsquo;utilise donc ainsi : \u003cbr\u003e\n\u003ccode\u003ecd \u0026quot;${dir_local}\u0026quot; \u0026amp;\u0026amp; rsync -av --delete --human-readable --progress --stats  \u0026quot;.\u0026quot; \u0026quot;${dir_mount}\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003ePour le démonter proprement, ce sera : \u003cbr\u003e\n\u003ccode\u003e:$ doas umount \u0026quot;${dir_mount}\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eCeci étant dit, voici à quoi peut ressemble le fichier de déploiement\ndans ce contexte SshFS + rsync :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#set -x\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -n \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$TERM\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e clear\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edirname \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ereadlink -f -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003euserid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eservername\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### the directory where your web site files should go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## dir_dist: relative to chroot SSH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/www/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_local\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ROOT\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/public/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/servers/\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.ssh/id_ed25519\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ersync_opts\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;--human-readable --progress --stats \u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   Fonctions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_mount\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e ! -d \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e mkdir -p \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# for Debian\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -d \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e sshfs -C -p \u003cspan style=\"color:#ef6155\"\u003e$port\u003c/span\u003e -o \u003cspan style=\"color:#ef6155\"\u003euid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -u \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e -o \u003cspan style=\"color:#ef6155\"\u003egid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -g \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e -o \u003cspan style=\"color:#ef6155\"\u003eIdentityFile\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e@\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e:\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# for OpenBSD\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -d \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e doas sshfs -C -p \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -o allow_other -o \u003cspan style=\"color:#ef6155\"\u003euid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -u \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e -o \u003cspan style=\"color:#ef6155\"\u003egid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003eid -g \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e -o \u003cspan style=\"color:#ef6155\"\u003eIdentityFile\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e@\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_rsync\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    cd \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_local\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e||\u003c/span\u003e exit\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    rsync -av --delete \u003cspan style=\"color:#ef6155\"\u003e$rsync_opts\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_umount\u003cspan style=\"color:#5bc4bf\"\u003e()\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fusermount -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e    \u003cspan style=\"color:#776e71\"\u003e# pour Debian\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    doas umount \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_mount\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#776e71\"\u003e# pour OpenBSD\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#   Execution\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e##\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e###\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e################################################################################\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003estatus\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$?\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003estatus\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e -eq \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e _mount; \u003cspan style=\"color:#815ba4\"\u003ethen\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        _rsync\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        _umount\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003euserid\u003c/code\u003e est l\u0026rsquo;identifiant utilisateur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eservername\u003c/code\u003e est le nom \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Fully Qualified Domain Name\"\u003eFQDN\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ou l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du\nserveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n vers lequel se connecter\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003edir_mount\u003c/code\u003e est le nom du répertoire local vers lequel le répertoire\ndistant va être monté.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION à ne pas utiliser directement ce script, sans mettre en commentaire\nles lignes ne correspondant pas à votre OS !\u003c/div\u003e\n\n\u003ch3 id=\"lftp\"\u003elftp\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003elftp\u003c/strong\u003e est un couteau suisse de la connexion réseau. Il fait du \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eFTP \u003cem\u003e(File Transfer Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eFTPS \u003cem\u003e(File Transfer Protocol Secure)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, de la synchronistation de document, sur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPv4 \u003cem\u003e(Internet Protocol v4)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n,\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eIPv6 \u003cem\u003e(Internet Protocol v6)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, au-travers des protocoles HTTP(S) ; il fait même du trafic\nbittorent, voire partiellement du WebDAV… et il est capable de se connecter en\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"SSH File Transfer Protocol\"\u003eSFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n !\u003c/p\u003e\n\u003cp\u003eVoilà le \u0026ldquo;miracle\u0026rdquo; : un client réseau sachant faire du mirroring de données\nen \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"SSH File Transfer Protocol\"\u003eSFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n !!!\u003c/p\u003e\n\u003cp\u003eDonc, installez avec votre gestionnaire de paquets le binaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esous Debian/*Buntu : \u003ccode\u003e:# apt install lftp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esous OpenBSD : \u003ccode\u003e:# pkg_add lftp\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#set -x\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -n \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$TERM\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e clear\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edirname \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ereadlink -f -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003euserid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eservername\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### the directory where your web site files should go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## dir_dist: relative to chroot SSH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/www/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_local\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ROOT\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/public/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.ssh/id_ed25519\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elftp -e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;set ftp:ssl-allow no; set sftp:connect-program ssh -a -x -i \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e; mirror -e -R \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_local\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e; quit;\u0026#34;\u003c/span\u003e -p \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e sftp://\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003epasswd\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e@\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003euserid\u003c/code\u003e est l\u0026rsquo;identifiant utilisateur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eservername\u003c/code\u003e est le nom \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Fully Qualified Domain Name\"\u003eFQDN\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n ou l\u0026rsquo;adresse \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n du\nserveur \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Secure SHell\"\u003eSSH\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n vers lequel se connecter\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"rclone\"\u003erclone\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003erclone\u003c/strong\u003e est un puissant outil en ligne de commande pour gérer le stockage\nde fichiers à-travers de nombreuses solutions de type nuage informatique,\nsystèmes de fichers divers et variés, mais aussi basiquement par le biais\ndu protocol \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"SSH File Transfer Protocol\"\u003eSFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cp\u003eInstallez avec votre gestionnaire de paquets le binaire :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003esous Debian/*Buntu : \u003ccode\u003e:# apt install rclone\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003esous OpenBSD : \u003ccode\u003e:# pkg_add rclone\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLa configuration par l\u0026rsquo;usage de l\u0026rsquo;option \u003ccode\u003econfig\u003c/code\u003e tel que : \u003cbr\u003e\n\u003ccode\u003e:$ rclone config\u003c/code\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eNommez votre accès \u003cstrong\u003eremote\u003c/strong\u003e, tel que vous désirez. Ce nom sera à utiliser\nen tant que nom de connexion.\u003c/li\u003e\n\u003cli\u003eChoisissez absolument la connexion SFTP, en écrivant \u003ccode\u003esftp\u003c/code\u003e lorsque l\u0026rsquo;invite\nvous pose la question.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eL\u0026rsquo;invite de commande de rclone est en anglais, mais elle est aisée à utiliser.\n\u003cem\u003eJe vous renvoie à la page de la documentation \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"SSH File Transfer Protocol\"\u003eSFTP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, dont la\nréférence est dans la section \u003ca href=\"/fr/web/hugo/hugo-deploy/#Documentation\"\u003eDocumentation\u003c/a\u003e ; allez-y\nabsolument faire un tour de lecture !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eLe fichier de configuration se trouvera être écrit dans votre répertoire\npersonnel \u003ccode\u003e~/.config/rclone/rclone.conf\u003c/code\u003e, par défaut.\u003c/p\u003e\n\u003cp\u003eIl sera de ce type :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-conf\" data-lang=\"conf\"\u003e[nom_remote]\ntype = sftp\nhost = adresse_ip ou FQDN\nuser = id_ssh\nport = 22\nkey_file = ~/.ssh/id_ed25519\nkey_use_agent = true\npubkey_file = ~/.ssh/id_ed25519.pub\nuse_insecure_cipher = false\nmd5sum_command = none\nsha1sum_command = none\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl ne reste plus qu\u0026rsquo;à utiliser rclone dans votre script de déploiement d\u0026rsquo;Hugo :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#!/bin/sh\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#set -x\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e -n \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$TERM\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e clear\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eROOT\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edirname \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ereadlink -f -- \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$0\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eid\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003euserid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ehost\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eservername\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eport\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e22\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e### the directory where your web site files should go\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e## dir_dist: relative to chroot SSH\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/www/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edir_local\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$ROOT\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/public/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efile_id\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.ssh/id_ed25519\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003erclone_remote\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nom_remote\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehugo\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erclone sync -i \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_local\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003erclone_remote\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edir_dist\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"fin\"\u003eFIN\u003c/h2\u003e\n\u003cp\u003eVoilà, c\u0026rsquo;est fini.\u003c/p\u003e\n\u003cp\u003eMaintenant, vous savez déployer votre site statique Hugo, que avec \u003ccode\u003ersync/ssh\u003c/code\u003e,\n\u003ccode\u003esshfs+rsync\u003c/code\u003e, \u003ccode\u003elftp\u003c/code\u003e, voire par \u003ccode\u003erclone\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eLa documentation officielle :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://gohugo.io/hosting-and-deployment/deployment-with-rsync/#shell-script\" title=\"Lien vers la page du site officiel Hugo : Hosting and deployment \u0026gt; Deployment with rsync\"\u003eHugo Documentation : Hosting and deployment \u0026gt; Deployment with rsync\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eLe  site web de \u003ca href=\"https://lftp.yar.ru/\" rel=\"external\"\u003elftp\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLa documentation de \u003ca href=\"https://rclone.org/sftp/\" rel=\"external\"\u003erclone:sftp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Déploiement d'un site, fait avec le générateur Hugo, par rsync+ssh, SFTP avec rsync, le client lftp, voire rclone",
            "tags": ["Hugo", "deploy", "chroot", "lftp", "rclone", "rsync", "SSH", "SFTP"],
            "date_published": "2019-11-29T14:45:12+01:00",
            "date_modified": "2025-11-13T14:12:52+01:00"
        },{
            "id": "urn:uuid:57c2c0ee-4257-6c48-b034-6d5e6a89151b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/pysnmp/",
            "title": "Pysnmp: outil Python pour SNMP (authPriv v3)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description pysnmp est une librairie en Python, multiplateforme pour SNMP , capable d\u0026rsquo;agir en tant qu\u0026rsquo;agent, gestionnaire, proxy, sur les trois versions du protocole SNMP, de \u0026ldquo;discuter\u0026rdquo; sur les protocoles réseaux IPv(4|6).\nLe propos est de (dé) montrer l\u0026rsquo;utilisation de pysnmp avec l\u0026rsquo;authentification forte de la v3 de SNMP.\nDocumentation La documentation officielle de la librairie : http://snmplabs.com/pysnmp/ Installation OpenBSD 6.6 Version : 4.4.6 Sous OpenBSD, Installez le paquet py3-snmp\nMalheureusement, cette version ne semble pas (pleinement ?) fonctionnelle.\nDonc, installons-le par le biais de l\u0026rsquo;outil pip : # python3.7 -m pip install --upgrade --user pysnmp\nTravailler avec les MIB OpenBSD L\u0026rsquo;équipe OpenBSD a créé ses propres MIB - ce sont des arborescences de données, que l\u0026rsquo;on peut aussi appeler \u0026ldquo;base de données arborescente\u0026rdquo; -\npysnmp nativement n\u0026rsquo;est pas capable de les interroger. Mais heureusement, on peut lui \u0026ldquo;donner à manger\u0026rdquo;.\nAvec pysnmp est fourni un outil nommé mibdump.py - depuis la v4.3 ; avant il fallait utiliser build-pysnmp-mib.py -, et lui indiquer le chemin des MIB d\u0026rsquo;OpenBSD.\nCes MIB sont fournis dans le répertoire /usr/share/snmp/mibs/.\n$ for file in /usr/share/snmp/mibs/*; do mibdump.py $file; done Source MIB repositories: /usr/share/snmp/mibs, file:///usr/share/snmp/mibs, http://mibs.snmplabs.com/asn1/@mib@ Borrow missing/failed MIBs from: http://mibs.snmplabs.com/pysnmp/notexts/@mib@ Existing/compiled MIB locations: pysnmp.smi.mibs, pysnmp_mibs Compiled MIBs destination directory: /home/zou/.pysnmp/mibs MIBs excluded from code generation: INET-ADDRESS-MIB, PYSNMP-USM-MIB, RFC-1212, RFC-1215, RFC1065-SMI, RFC1155-SMI, RFC1158-MIB, RFC1213-MIB, SNMP-FRAMEWORK-MIB, SNMP-TARGET-MIB, SNMPv2-CONF, SNMPv2-SMI, SNMPv2-TC, SNMPv2-TM, TRANSPORT-ADDRESS-MIB MIBs to compile: OPENBSD-BASE-MIB Destination format: pysnmp Parser grammar cache directory: not used Also compile all relevant MIBs: yes Rebuild MIBs regardless of age: no Dry run mode: no Create/update MIBs: yes Byte-compile Python modules: yes (optimization level no) Ignore compilation errors: no Generate OID-\u0026gt;MIB index: no Generate texts in MIBs: no Keep original texts layout: no Try various file names while searching for MIB module: yes Created/updated MIBs: OPENBSD-BASE-MIB Pre-compiled MIBs borrowed: Up to date MIBs: OPENBSD-BASE-MIB, SNMPv2-CONF, SNMPv2-SMI, SNMPv2-TC Missing source MIBs: Ignored MIBs: Failed MIBs: (…) je n\u0026rsquo;ai volontairement recopié que la sortie écran du premier fichier\nLes lignes à vérifier sont :\nMIBs to compile qui nous montre quel fichier est compilé Created/updated MIBs qui nous restitue le nom du nouveau fichier compilé Ignored MIBs et Failed MIBs qui peut informer des informations MIB défectueuses ou ignorées Une fois le traitement terminé, les nouveaux fichiers compilés ont été créés dans : ~/.pysnmp/mibs/\nMais avant de (sa?)voir comment utiliser les fichiers MIB nouvellement créés, voyons comment utiliser pysnmp dans le contexte de SNMPv3. Je m\u0026rsquo;attarderais très particulièrement sur la manière de l\u0026rsquo;utiliser avec l\u0026rsquo;authentification forte.\nCoding Appelons l\u0026rsquo;outil :\nfrom pprint import PrettyPrinter from pysnmp.hlapi import * from pysnmp.smi.view import MibViewController pp = PrettyPrinter(indent=4) Puis paramétrons les variables nécessaires pour l\u0026rsquo;authentification forte, à savoir :\nhost = \u0026#34;localhost\u0026#34; user = \u0026#34;uenc\u0026#34; authkey = \u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34; privkey = \u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34; j\u0026rsquo;ai repris celles de l\u0026rsquo;exemple, dans l\u0026rsquo;article sur l\u0026rsquo;outil natif à OpenBSD, snmp , ni plus ni moins.\nSNMP Engine, MIB View Controller Une des premières choses à déclarer est le Contrôleur de Vue MIB, qui nécessite la création d\u0026rsquo;un moteur SNMP :\n# create SNMP Engine and MIB view Controller se = SnmpEngine() mvc = se.getUserContext(\u0026#39;mibViewController\u0026#39;) if not mvc: mvc = MibViewController(se.getMibBuilder()) Et, maintenant, nous allons voir comment appeler les MIB d\u0026rsquo;OpenBSD !\nOID + MIB # get Object Identity and Type oi = ObjectIdentity(\u0026#39;iso.org.dod.internet.private.enterprises.openBSD.memMIBObjects\u0026#39;) oi.addMibSource(\u0026#39;~/.pysnmp/mibs/\u0026#39;) oi.loadMibs(\u0026#39;OPENBSD-BASE-MIB\u0026#39;) oi.loadMibs(\u0026#39;OPENBSD-CARP-MIB\u0026#39;) oi.loadMibs(\u0026#39;OPENBSD-MEM-MIB\u0026#39;) oi.loadMibs(\u0026#39;OPENBSD-PF-MIB\u0026#39;) oi.loadMibs(\u0026#39;OPENBSD-RELAYD-MIB\u0026#39;) oi.loadMibs(\u0026#39;OPENBSD-SENSORS-MIB\u0026#39;) oi.loadMibs(\u0026#39;OPENBSD-SNMPD-CONF\u0026#39;) oi.resolveWithMib(mvc) ObjectIdenttity() : en premier, nous construisons un objet identifiant, selon un OID précis que nous recherchons - ici le nombre d\u0026rsquo;interfaces vues par la MIB PF d\u0026rsquo;OpenBSD addMibSource() : référence le chemin où ont été créé les fichiers MIB précédemment loadMibs() : pour appeler chacun des fichiers MIB créés précédemment pour info, selon l\u0026rsquo;OID recherché, il n\u0026rsquo;est pas forcément nécessaire de toutes les charger - resolvedWithMib() : nous permet d\u0026rsquo;appliquer le Contrôleur de Vue MIB sur l\u0026rsquo;objet Continuons avec la gestion des données utilisateurs nécessaires à l\u0026rsquo;identification :\nUSM User Data uud = UsmUserData(user, authKey=authkey, privKey=privkey, authProtocol=usmHMAC384SHA512AuthProtocol, privProtocol=usmAesCfb128Protocol) Pour information, les différentes valeurs du protocole de chiffrement d\u0026rsquo;authentification sont :\nusmNoAuthProtocol pour aucun protocol usmHMACMD5AuthProtocol pour le chiffrement MD5 usmHMACSHAAuthProtocol pour SHA usmHMAC128SHA224AuthProtocol pour SHA-224 usmHMAC192SHA256AuthProtocol pour SHA-256 usmHMAC256SHA384AuthProtocol pour SHA-384 usmHMAC384SHA512AuthProtocol pour SHA-512 Concernant le chiffrement du protocole de confidentialité, ces valeurs sont :\nusmNoPrivProtocol si aucun usmDESPrivProtocol pour DES usmAesCfb128Protocol pour AES (Pour information, il en existe d\u0026rsquo;autres, mais ce sont surtout des \u0026ldquo;drafts\u0026rdquo;, du moins pour l\u0026rsquo;instant !)\nGénérateur Nous avons besoin de construire le générateur de la commande get :\ngc = getCmd(se, uud, UdpTransportTarget((host, 161)), ContextData(), ObjectType(oi)) Retourner le résultat # return results errorIndication, errorStatus, errorIndex, varBinds = next(gc) # Display informations if errorIndication: print(str(errorIndication)) elif errorStatus: print(\u0026#39;%s at %s\u0026#39; % (str(errorStatus.prettyPrint()), errorIndex and varBinds[int(errorIndex) - 1][0] or \u0026#39;?\u0026#39;)) else: for varBind in varBinds: oid = varBind[0] value = varBind[1] print(oid) print(value) ne pas s\u0026rsquo;inquiéter du temps que mets la requête à s\u0026rsquo;afficher ; cela est dû au chiffrement des informations\nL\u0026rsquo;exécution nous retourne ceci :\n1.3.6.1.4.1.30155.5 Fin Pour finir, nous venons de voir que discuter avec l\u0026rsquo;outil pysnmp sur SNMPv3 avec authentification forte EST possible.\nLe plus délicat est de récupérer les informations dans les MIB. Trés vite, vous allez avoir à buter sur des erreurs incompréhensibles, et difficiles à résoudre. Et, ça, ça le don de m\u0026rsquo;énerver ! (enfin presque…)\nRemerciements J\u0026rsquo;ai beaucoup appris grâce à cet article, trouvé sur le site Makina Corpus. ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003epysnmp\u003c/strong\u003e est une librairie en Python, multiplateforme pour\n\u003cabbr title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n, capable d\u0026rsquo;agir en\ntant qu\u0026rsquo;agent, gestionnaire, proxy, sur les trois versions du protocole\nSNMP, de \u0026ldquo;discuter\u0026rdquo; sur les protocoles réseaux IPv(4|6).\u003c/p\u003e\n\u003cp\u003eLe propos est de \u003cem\u003e(dé)\u003c/em\u003e montrer l\u0026rsquo;utilisation de \u003cstrong\u003epysnmp\u003c/strong\u003e avec l\u0026rsquo;authentification\nforte de la v3 de SNMP.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa documentation officielle de la librairie : \u003ca href=\"http://snmplabs.com/pysnmp/\" rel=\"external\"\u003ehttp://snmplabs.com/pysnmp/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD 6.6\u003c/li\u003e\n\u003cli\u003eVersion : 4.4.6\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSous OpenBSD, \u003ca class=\"inside\" href=\"/fr/sys/openbsd/pkg/#installer\" title=\"Lien interne vers l\u0026#39;article : 'OpenBSD : Gestion des paquets (outils pkg_*)'\"\u003eInstallez\u003c/a\u003e\n\nle paquet \u003ccode\u003epy3-snmp\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMalheureusement, cette version ne semble pas \u003cem\u003e(pleinement ?)\u003c/em\u003e fonctionnelle.\u003c/p\u003e\n\u003cp\u003eDonc, installons-le par le biais de l\u0026rsquo;outil \u003ccode\u003epip\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003e# python3.7 -m pip install --upgrade --user pysnmp\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"travailler-avec-les-mib-openbsd\"\u003eTravailler avec les MIB OpenBSD\u003c/h3\u003e\n\u003cp\u003eL\u0026rsquo;équipe OpenBSD a créé ses propres \u003cabbr title=\"Management Information Base\"\u003eMIB\u003c/abbr\u003e\n -\n\u003cem\u003ece sont des arborescences de données, que l\u0026rsquo;on peut aussi appeler\n\u0026ldquo;base de données arborescente\u0026rdquo;\u003c/em\u003e -\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003epysnmp\u003c/strong\u003e nativement n\u0026rsquo;est pas capable de les interroger. Mais heureusement,\non peut lui \u0026ldquo;donner à manger\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eAvec \u003cstrong\u003epysnmp\u003c/strong\u003e est fourni un outil nommé \u003ccode\u003emibdump.py\u003c/code\u003e - \u003cem\u003edepuis la v4.3 ;\navant il fallait utiliser \u003ccode\u003ebuild-pysnmp-mib.py\u003c/code\u003e\u003c/em\u003e -, et lui indiquer le\nchemin des MIB d\u0026rsquo;OpenBSD.\u003c/p\u003e\n\u003cp\u003eCes MIB sont fournis dans le répertoire \u003ccode\u003e/usr/share/snmp/mibs/\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e file in /usr/share/snmp/mibs/*; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e mibdump.py \u003cspan style=\"color:#ef6155\"\u003e$file\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSource MIB repositories: /usr/share/snmp/mibs, file:///usr/share/snmp/mibs, http://mibs.snmplabs.com/asn1/@mib@\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBorrow missing/failed MIBs from: http://mibs.snmplabs.com/pysnmp/notexts/@mib@\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eExisting/compiled MIB locations: pysnmp.smi.mibs, pysnmp_mibs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCompiled MIBs destination directory: /home/zou/.pysnmp/mibs\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMIBs excluded from code generation: INET-ADDRESS-MIB, PYSNMP-USM-MIB, RFC-1212, RFC-1215, RFC1065-SMI, RFC1155-SMI, RFC1158-MIB, RFC1213-MIB, SNMP-FRAMEWORK-MIB, SNMP-TARGET-MIB, SNMPv2-CONF, SNMPv2-SMI, SNMPv2-TC, SNMPv2-TM, TRANSPORT-ADDRESS-MIB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMIBs to compile: OPENBSD-BASE-MIB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDestination format: pysnmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eParser grammar cache directory: not used\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAlso compile all relevant MIBs: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRebuild MIBs regardless of age: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDry run mode: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCreate/update MIBs: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eByte-compile Python modules: yes \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eoptimization level no\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIgnore compilation errors: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGenerate OID-\u0026gt;MIB index: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eGenerate texts in MIBs: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eKeep original texts layout: no\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTry various file names \u003cspan style=\"color:#815ba4\"\u003ewhile\u003c/span\u003e searching \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e MIB module: yes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCreated/updated MIBs: OPENBSD-BASE-MIB\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePre-compiled MIBs borrowed:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUp to date MIBs: OPENBSD-BASE-MIB, SNMPv2-CONF, SNMPv2-SMI, SNMPv2-TC\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMissing source MIBs:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIgnored MIBs:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFailed MIBs:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003eje n\u0026rsquo;ai volontairement recopié que la sortie écran du premier fichier\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eLes lignes à vérifier sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eMIBs to compile\u003c/code\u003e qui nous montre quel fichier est compilé\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eCreated/updated MIBs\u003c/code\u003e qui nous restitue le nom du nouveau fichier\ncompilé\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eIgnored MIBs\u003c/code\u003e et \u003ccode\u003eFailed MIBs\u003c/code\u003e qui peut informer des informations MIB\ndéfectueuses ou ignorées\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois le traitement terminé, les nouveaux fichiers compilés ont été\ncréés dans : \u003ccode\u003e~/.pysnmp/mibs/\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eMais avant de (sa?)voir comment utiliser les fichiers MIB nouvellement\ncréés, voyons comment utiliser \u003cstrong\u003epysnmp\u003c/strong\u003e dans le contexte de SNMPv3. \u003cbr\u003e\nJe m\u0026rsquo;attarderais très particulièrement sur la manière de l\u0026rsquo;utiliser avec\nl\u0026rsquo;authentification forte.\u003c/p\u003e\n\u003ch2 id=\"coding\"\u003eCoding\u003c/h2\u003e\n\u003cp\u003eAppelons l\u0026rsquo;outil :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003epprint\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e PrettyPrinter\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003epysnmp.hlapi\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003epysnmp.smi.view\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e MibViewController\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epp \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e PrettyPrinter(indent\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis paramétrons les variables nécessaires pour l\u0026rsquo;authentification forte, à savoir :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehost \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;localhost\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euser \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;uenc\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eauthkey \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprivkey \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003ej\u0026rsquo;ai repris celles de l\u0026rsquo;exemple, dans l\u0026rsquo;article sur l\u0026rsquo;outil natif à OpenBSD,\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/snmp/#authentification-forte\" title=\"Lien interne vers l\u0026#39;article : 'snmp : client SNMP sous OpenBSD'\"\u003esnmp\u003c/a\u003e\n,\nni plus ni moins.\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"snmp-engine-mib-view-controller\"\u003eSNMP Engine, MIB View Controller\u003c/h3\u003e\n\u003cp\u003eUne des premières choses à déclarer est le \u003cstrong\u003eContrôleur de Vue MIB\u003c/strong\u003e, qui\nnécessite la création d\u0026rsquo;un \u003cstrong\u003emoteur SNMP\u003c/strong\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# create SNMP Engine and MIB view Controller\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ese \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e SnmpEngine()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003emvc \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e se\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003egetUserContext(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;mibViewController\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003enot\u003c/span\u003e mvc:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   mvc \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e MibViewController(se\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003egetMibBuilder())\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEt, maintenant, nous allons voir comment appeler les MIB d\u0026rsquo;OpenBSD !\u003c/p\u003e\n\u003ch3 id=\"oid--mib\"\u003eOID + MIB\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# get Object Identity and Type\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ObjectIdentity(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;iso.org.dod.internet.private.enterprises.openBSD.memMIBObjects\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eaddMibSource(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;~/.pysnmp/mibs/\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eloadMibs(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OPENBSD-BASE-MIB\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eloadMibs(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OPENBSD-CARP-MIB\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eloadMibs(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OPENBSD-MEM-MIB\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eloadMibs(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OPENBSD-PF-MIB\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eloadMibs(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OPENBSD-RELAYD-MIB\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eloadMibs(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OPENBSD-SENSORS-MIB\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eloadMibs(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;OPENBSD-SNMPD-CONF\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eoi\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eresolveWithMib(mvc)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eObjectIdenttity()\u003c/code\u003e : en premier, nous construisons un objet identifiant,\nselon un OID précis que nous recherchons - \u003cem\u003eici le nombre d\u0026rsquo;interfaces\nvues par la MIB PF d\u0026rsquo;OpenBSD\u003c/em\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eaddMibSource()\u003c/code\u003e : référence le chemin où ont été créé les fichiers MIB\nprécédemment\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eloadMibs()\u003c/code\u003e : pour appeler chacun des fichiers MIB créés précédemment\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003epour info, selon l\u0026rsquo;OID recherché, il n\u0026rsquo;est pas forcément nécessaire\nde toutes les charger\u003c/em\u003e -\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eresolvedWithMib()\u003c/code\u003e : nous permet d\u0026rsquo;appliquer le Contrôleur de Vue MIB\nsur l\u0026rsquo;objet\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eContinuons avec la gestion des données utilisateurs  nécessaires à\nl\u0026rsquo;identification :\u003c/p\u003e\n\u003ch3 id=\"usm-user-data\"\u003eUSM User Data\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euud \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e UsmUserData(user, authKey\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eauthkey, privKey\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eprivkey,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            authProtocol\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eusmHMAC384SHA512AuthProtocol,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            privProtocol\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003eusmAesCfb128Protocol)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour information, les différentes valeurs du protocole de chiffrement\nd\u0026rsquo;authentification sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eusmNoAuthProtocol\u003c/code\u003e pour aucun protocol\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmHMACMD5AuthProtocol\u003c/code\u003e pour le chiffrement \u003ccode\u003eMD5\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmHMACSHAAuthProtocol\u003c/code\u003e pour \u003ccode\u003eSHA\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmHMAC128SHA224AuthProtocol\u003c/code\u003e pour \u003ccode\u003eSHA-224\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmHMAC192SHA256AuthProtocol\u003c/code\u003e pour \u003ccode\u003eSHA-256\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmHMAC256SHA384AuthProtocol\u003c/code\u003e pour \u003ccode\u003eSHA-384\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmHMAC384SHA512AuthProtocol\u003c/code\u003e pour \u003ccode\u003eSHA-512\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eConcernant le chiffrement du protocole de confidentialité, ces valeurs\nsont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eusmNoPrivProtocol\u003c/code\u003e si aucun\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmDESPrivProtocol\u003c/code\u003e pour \u003ccode\u003eDES\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eusmAesCfb128Protocol\u003c/code\u003e pour \u003ccode\u003eAES\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e(Pour information, il en existe d\u0026rsquo;autres, mais ce sont surtout des \u0026ldquo;drafts\u0026rdquo;,\ndu moins pour l\u0026rsquo;instant !)\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"générateur\"\u003eGénérateur\u003c/h3\u003e\n\u003cp\u003eNous avons besoin de construire le générateur de la commande \u003ccode\u003eget\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003egc \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e getCmd(se, uud, UdpTransportTarget((host, \u003cspan style=\"color:#f99b15\"\u003e161\u003c/span\u003e)), ContextData(),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ObjectType(oi))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"retourner-le-résultat\"\u003eRetourner le résultat\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# return results\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eerrorIndication, errorStatus, errorIndex, varBinds \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e next(gc)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# Display informations\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e errorIndication:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(str(errorIndication))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eelif\u003c/span\u003e errorStatus:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e at \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e%s\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e%\u003c/span\u003e (str(errorStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eprettyPrint()),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        errorIndex \u003cspan style=\"color:#5bc4bf\"\u003eand\u003c/span\u003e varBinds[int(errorIndex) \u003cspan style=\"color:#5bc4bf\"\u003e-\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e][\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e] \u003cspan style=\"color:#5bc4bf\"\u003eor\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;?\u0026#39;\u003c/span\u003e))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e varBind \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e varBinds:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        oid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e varBind[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        value \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e varBind[\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(oid)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        print(value)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cem\u003ene pas s\u0026rsquo;inquiéter du temps que mets la requête à s\u0026rsquo;afficher ; cela est\ndû au chiffrement des informations\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eL\u0026rsquo;exécution nous retourne ceci :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python3\" data-lang=\"python3\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e1.3.6.1.4.1.30155.5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"fin\"\u003eFin\u003c/h3\u003e\n\u003cp\u003ePour finir, nous venons de voir que discuter avec l\u0026rsquo;outil \u003cstrong\u003epysnmp\u003c/strong\u003e sur\nSNMPv3 avec authentification forte \u003cstrong\u003eEST\u003c/strong\u003e possible.\u003c/p\u003e\n\u003cp\u003eLe plus délicat est de récupérer les informations dans les MIB. Trés vite,\nvous allez avoir à buter sur des erreurs incompréhensibles, et difficiles\nà résoudre. \u003cbr\u003e\nEt, ça, ça le don de m\u0026rsquo;énerver ! \u003cem\u003e(enfin presque…)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eJ\u0026rsquo;ai beaucoup appris grâce à cet \u003ca href=\"https://makina-corpus.com/blog/metier/2016/initiation-a-snmp-avec-python-pysnmp-partie2\" rel=\"external\"\u003earticle\u003c/a\u003e, trouvé sur le site \u003cstrong\u003eMakina Corpus\u003c/strong\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "pysnmp : outil Python pour SNMP ; utilisation sous OpenBSD, principalement v3 avec authentification forte",
            "tags": ["OpenBSD", "Python", "Python3", "SNMP"],
            "date_published": "2019-11-27T22:50:53+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:caee0147-df0c-d52e-8dc0-8cb99155edcd",
            "url": "http://doc.huc.fr.eu.org/fr/web/nextcloud/occ/",
            "title": "Nextcloud : manpage occ",
            "author": { "name": "Stéphane HUC" },
            "content_text": "occ Usage: command [options] [arguments]\nOptions:\n-h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --no-warnings Skip global warnings, show command output only -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands:\ncheck check dependencies of the server environment help displays help for a command list Lists commands status show some status information upgrade run upgrade routines after installation of a new release. The release has to be installed before. Manage configuration config\nconfig:app:delete Delete an app config value config:app:get Get an app config value config:app:set Set an app config value config:import Import a list of configs config:list List all configs config:system:delete Delete a system config value config:system:get Get a system config value config:system:set Set a system config value Manage Database db\ndb:add-missing-indices Add missing indices to the database tables db:convert-filecache-bigint Convert the ID columns of the filecache to BigInt db:convert-mysql-charset Convert charset of MySQL/MariaDB to use utf8mb4 db:convert-type Convert the Nextcloud database to the newly configured one Encryption Management encryption\nencryption:change-key-storage-root Change key storage root encryption:decrypt-all Disable server-side encryption and decrypt all files encryption:disable Disable encryption encryption:enable Enable encryption encryption:encrypt-all Encrypt all files for all users encryption:list-modules List all available encryption modules encryption:set-default-module Set the encryption default module encryption:show-key-storage-root Show current key storage root encryption:status Lists the current status of encryption Federation Management federation\nfederation:sync-addressbooks Synchronizes addressbooks of all federated clouds Files Management files\nfiles:cleanup cleanup filecache files:recommendations:recommend files:scan rescan filesystem files:scan-app-data rescan the AppData folder files:transfer-ownership All files and folders are moved to another user - shares are moved as well. Groups Management group\ngroup:add Add a group group:adduser add a user to a group group:delete Remove a group group:list list configured groups group:removeuser remove a user from a group Integrity App, Core integrity\nintegrity:check-app Check integrity of an app using a signature. integrity:check-core Check integrity of core code using a signature. integrity:sign-app Signs an app using a private key. integrity:sign-core Sign core using a private key. Logs Management log\nlog:file manipulate logging backend log:manage manage logging configuration log:tail Tail the nextcloud logfile log:watch Watch the nextcloud logfile NC Background jobs background\nbackground:ajax Use ajax to run background jobs background:cron Use cron to run background jobs background:webcron Use webcron to run background jobs NC Maintenance maintenance\nmaintenance:data-fingerprint update the systems data-fingerprint after a backup is restored maintenance:mimetype:update-db Update database mimetypes and update filecache maintenance:mimetype:update-js Update mimetypelist.js maintenance:mode set maintenance mode maintenance:repair repair this installation maintenance:theme:update Apply custom theme changes maintenance:update:htaccess Updates the .htaccess file NC Migration migrations\nmigrations:execute Execute a single migration version manually. migrations:generate migrations:generate-from-schema migrations:migrate Execute a migration to a specified version or the latest available version. migrations:status View the status of a set of migrations. NC Security security\nsecurity:certificates list trusted certificates security:certificates:import import trusted certificate security:certificates:remove remove trusted certificate NC Update update\nupdate:check Check for server and app updates User management user\nuser:add adds a user user:delete deletes the specified user and all datas user user:disable disables the specified user user:enable enables the specified user user:info show user info user:lastseen shows when the user was logged in last time user:list list configured users user:report shows how many users have access user:resetpassword Resets the password of the named user user:setting Read and modify user settings notification\nnotification:generate Generate a notification for the given user versions\nversions:cleanup Delete versions: delete versions of the given user(s), if no user is given all versions will be deleted versions:expire Expires the users file versions: expire file versions of the given user(s), if no user is given file versions for all users will be expired. Manage applications app\napp:check-code check code to be compliant app:disable disable an app app:enable enable an app app:getpath Get an absolute path to the app directory app:install install an app app:list List all available apps app:remove remove an app app:update update an app or all apps Mail mail\nmail:account:create creates IMAP account mail:account:export Exports a user\u0026rsquo;s IMAP account(s) Circles circles\ncircles:clean remove all extra data from database circles:fixuniqueid fix Unique Id issue. Deck deck\ndeck:export Export a JSON dump of user data Talk talk\ntalk:command:add Add a new command talk:command:add-samples Adds some sample commands: /wiki, … talk:command:delete Remove an existing command talk:command:list List all available commands talk:command:update Add a new command talk:signaling:add Add an external signaling server. talk:signaling:delete Remove an existing signaling server. talk:signaling:list List external signaling servers. talk:stun:add Add a new STUN server. talk:stun:delete Remove an existing STUN server. talk:stun:list List STUN servers. talk:turn:add Add a TURN server. talk:turn:delete Remove an existing TURN server. talk:turn:list List TURN servers. 2FA: Two Factor Auth twofactorauth\ntwofactorauth:cleanup Clean up the two-factor user-provider association of an uninstalled/removed provider twofactorauth:disable Disable two-factor authentication for a user twofactorauth:enable Enable two-factor authentication for a user twofactorauth:enforce Enabled/disable enforced two-factor authentication twofactorauth:state Get the two-factor authentication (2FA) state of a user WebDAV dav\ndav:create-addressbook Create a dav addressbook dav:create-calendar Create a dav calendar dav:list-calendars List all calendars of a user dav:move-calendar Move a calendar from an user to another dav:remove-invalid-shares Remove invalid dav shares dav:send-event-reminders Sends event reminders dav:sync-birthday-calendar Synchronizes the birthday calendar dav:sync-system-addressbook Synchronizes users to the system addressbook ",
            "content_html": "\u003ch2 id=\"occ\"\u003eocc\u003c/h2\u003e\n\u003cp\u003eUsage:\n\u003ccode\u003ecommand [options] [arguments]\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eOptions:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-h\u003c/code\u003e, \u003ccode\u003e--help\u003c/code\u003e            Display this help message\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-q\u003c/code\u003e, \u003ccode\u003e--quiet\u003c/code\u003e           Do not output any message\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-V\u003c/code\u003e, \u003ccode\u003e--version\u003c/code\u003e         Display this application version\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--ansi\u003c/code\u003e              Force ANSI output\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e--no-ansi\u003c/code\u003e           Disable ANSI output\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-n\u003c/code\u003e, \u003ccode\u003e--no-interaction\u003c/code\u003e  Do not ask any interactive question\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e--no-warnings\u003c/code\u003e       Skip global warnings, show command output only\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-v\u003c/code\u003e|\u003ccode\u003evv\u003c/code\u003e|\u003ccode\u003evvv\u003c/code\u003e, \u003ccode\u003e--verbose\u003c/code\u003e  Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAvailable commands:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003echeck\u003c/code\u003e                   check dependencies of the server environment\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehelp\u003c/code\u003e                    displays help for a command\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elist\u003c/code\u003e                    Lists commands\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003estatus\u003c/code\u003e                  show some status information\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eupgrade\u003c/code\u003e                 run upgrade routines after installation of a new release. The release has to be installed before.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manage-configuration\"\u003eManage configuration\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003econfig\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003econfig:app:delete\u003c/code\u003e                   Delete an app config value\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig:app:get\u003c/code\u003e                      Get an app config value\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig:app:set\u003c/code\u003e                      Set an app config value\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig:import\u003c/code\u003e                       Import a list of configs\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig:list\u003c/code\u003e                         List all configs\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig:system:delete\u003c/code\u003e                Delete a system config value\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig:system:get\u003c/code\u003e                   Get a system config value\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econfig:system:set\u003c/code\u003e                   Set a system config value\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manage-database\"\u003eManage Database\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003edb\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edb:add-missing-indices\u003c/code\u003e              Add missing indices to the database tables\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edb:convert-filecache-bigint\u003c/code\u003e         Convert the ID columns of the filecache to BigInt\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edb:convert-mysql-charset\u003c/code\u003e            Convert charset of MySQL/MariaDB to use utf8mb4\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edb:convert-type\u003c/code\u003e                     Convert the Nextcloud database to the newly configured one\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"encryption-management\"\u003eEncryption Management\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eencryption\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eencryption:change-key-storage-root\u003c/code\u003e  Change key storage root\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:decrypt-all\u003c/code\u003e              Disable server-side encryption and decrypt all files\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:disable\u003c/code\u003e                  Disable encryption\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:enable\u003c/code\u003e                   Enable encryption\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:encrypt-all\u003c/code\u003e              Encrypt all files for all users\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:list-modules\u003c/code\u003e             List all available encryption modules\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:set-default-module\u003c/code\u003e       Set the encryption default module\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:show-key-storage-root\u003c/code\u003e    Show current key storage root\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eencryption:status\u003c/code\u003e                   Lists the current status of encryption\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"federation-management\"\u003eFederation Management\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003efederation\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003efederation:sync-addressbooks\u003c/code\u003e        Synchronizes addressbooks of all federated clouds\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"files-management\"\u003eFiles Management\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003efiles\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003efiles:cleanup\u003c/code\u003e                       cleanup filecache\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efiles:recommendations:recommend\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efiles:scan\u003c/code\u003e                         rescan filesystem\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efiles:scan-app-data\u003c/code\u003e                rescan the AppData folder\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003efiles:transfer-ownership\u003c/code\u003e           All files and folders are moved to another user - shares are moved as well.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"groups-management\"\u003eGroups Management\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003egroup\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003egroup:add\u003c/code\u003e                           Add a group\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egroup:adduser\u003c/code\u003e                       add a user to a group\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egroup:delete\u003c/code\u003e                        Remove a group\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egroup:list\u003c/code\u003e                          list configured groups\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003egroup:removeuser\u003c/code\u003e                    remove a user from a group\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"integrity-app-core\"\u003eIntegrity App, Core\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eintegrity\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eintegrity:check-app\u003c/code\u003e                 Check integrity of an app using a signature.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eintegrity:check-core\u003c/code\u003e                Check integrity of core code using a signature.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eintegrity:sign-app\u003c/code\u003e                  Signs an app using a private key.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eintegrity:sign-core\u003c/code\u003e                 Sign core using a private key.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"logs-management\"\u003eLogs Management\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003elog\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003elog:file\u003c/code\u003e                           manipulate logging backend\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elog:manage\u003c/code\u003e                          manage logging configuration\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elog:tail\u003c/code\u003e                            Tail the nextcloud logfile\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elog:watch\u003c/code\u003e                           Watch the nextcloud logfile\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nc-background-jobs\"\u003eNC Background jobs\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003ebackground\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ebackground:ajax\u003c/code\u003e                     Use ajax to run background jobs\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebackground:cron\u003c/code\u003e                     Use cron to run background jobs\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ebackground:webcron\u003c/code\u003e                  Use webcron to run background jobs\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nc-maintenance\"\u003eNC Maintenance\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003emaintenance\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emaintenance:data-fingerprint\u003c/code\u003e        update the systems data-fingerprint after a backup is restored\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emaintenance:mimetype:update-db\u003c/code\u003e      Update database mimetypes and update filecache\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emaintenance:mimetype:update-js\u003c/code\u003e      Update mimetypelist.js\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emaintenance:mode\u003c/code\u003e                    set maintenance mode\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emaintenance:repair\u003c/code\u003e                  repair this installation\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emaintenance:theme:update\u003c/code\u003e            Apply custom theme changes\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emaintenance:update:htaccess\u003c/code\u003e         Updates the .htaccess file\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nc-migration\"\u003eNC Migration\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003emigrations\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emigrations:execute\u003c/code\u003e                  Execute a single migration version manually.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emigrations:generate\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emigrations:generate-from-schema\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emigrations:migrate\u003c/code\u003e                  Execute a migration to a specified version or the latest available version.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emigrations:status\u003c/code\u003e                   View the status of a set of migrations.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nc-security\"\u003eNC Security\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003esecurity\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esecurity:certificates\u003c/code\u003e               list trusted certificates\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esecurity:certificates:import\u003c/code\u003e        import trusted certificate\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esecurity:certificates:remove\u003c/code\u003e        remove trusted certificate\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nc-update\"\u003eNC Update\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eupdate\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eupdate:check\u003c/code\u003e                        Check for server and app updates\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"user-management\"\u003eUser management\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003euser\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003euser:add\u003c/code\u003e                            adds a user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:delete\u003c/code\u003e                         deletes the specified user and all datas user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:disable\u003c/code\u003e                        disables the specified user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:enable\u003c/code\u003e                         enables the specified user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:info\u003c/code\u003e                           show user info\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:lastseen\u003c/code\u003e                       shows when the user was logged in last time\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:list\u003c/code\u003e                           list configured users\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:report\u003c/code\u003e                         shows how many users have access\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:resetpassword\u003c/code\u003e                  Resets the password of the named user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003euser:setting\u003c/code\u003e                        Read and modify user settings\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003enotification\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003enotification:generate\u003c/code\u003e               Generate a notification for the given user\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003ccode\u003eversions\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eversions:cleanup\u003c/code\u003e                    Delete versions: delete versions of the given user(s), if no user is given all versions will be deleted\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eversions:expire\u003c/code\u003e                     Expires the users file versions: expire file versions of the given user(s), if no user is given file versions for all users will be expired.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"manage-applications\"\u003eManage applications\u003c/h3\u003e\n\u003cp\u003e\u003ccode\u003eapp\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eapp:check-code\u003c/code\u003e                      check code to be compliant\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapp:disable\u003c/code\u003e                         disable an app\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapp:enable\u003c/code\u003e                          enable an app\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapp:getpath\u003c/code\u003e                         Get an absolute path to the app directory\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapp:install\u003c/code\u003e                         install an app\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapp:list\u003c/code\u003e                            List all available apps\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapp:remove\u003c/code\u003e                          remove an app\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eapp:update\u003c/code\u003e                          update an app or all apps\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"mail\"\u003eMail\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003email\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003email:account:create\u003c/code\u003e                 creates IMAP account\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003email:account:export\u003c/code\u003e                 Exports a user\u0026rsquo;s IMAP account(s)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"circles\"\u003eCircles\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003ecircles\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecircles:clean\u003c/code\u003e                       remove all extra data from database\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ecircles:fixuniqueid\u003c/code\u003e                 fix Unique Id issue.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"deck\"\u003eDeck\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003edeck\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edeck:export\u003c/code\u003e                         Export a JSON dump of user data\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"talk\"\u003eTalk\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003etalk\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etalk:command:add\u003c/code\u003e                    Add a new command\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:command:add-samples\u003c/code\u003e            Adds some sample commands: /wiki, …\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:command:delete\u003c/code\u003e                 Remove an existing command\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:command:list\u003c/code\u003e                   List all available commands\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:command:update\u003c/code\u003e                 Add a new command\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:signaling:add\u003c/code\u003e                  Add an external signaling server.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:signaling:delete\u003c/code\u003e               Remove an existing signaling server.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:signaling:list\u003c/code\u003e                 List external signaling servers.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:stun:add\u003c/code\u003e                       Add a new STUN server.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:stun:delete\u003c/code\u003e                    Remove an existing STUN server.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:stun:list\u003c/code\u003e                      List STUN servers.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:turn:add\u003c/code\u003e                       Add a TURN server.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:turn:delete\u003c/code\u003e                    Remove an existing TURN server.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etalk:turn:list\u003c/code\u003e                      List TURN servers.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"2fa-two-factor-auth\"\u003e2FA: Two Factor Auth\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003etwofactorauth\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etwofactorauth:cleanup\u003c/code\u003e               Clean up the two-factor user-provider association of an uninstalled/removed provider\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etwofactorauth:disable\u003c/code\u003e               Disable two-factor authentication for a user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etwofactorauth:enable\u003c/code\u003e                Enable two-factor authentication for a user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etwofactorauth:enforce\u003c/code\u003e               Enabled/disable enforced two-factor authentication\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003etwofactorauth:state\u003c/code\u003e                 Get the two-factor authentication (2FA) state of a user\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"webdav\"\u003eWebDAV\u003c/h4\u003e\n\u003cp\u003e\u003ccode\u003edav\u003c/code\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edav:create-addressbook\u003c/code\u003e              Create a dav addressbook\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edav:create-calendar\u003c/code\u003e                 Create a dav calendar\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edav:list-calendars\u003c/code\u003e                  List all calendars of a user\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edav:move-calendar\u003c/code\u003e                   Move a calendar from an user to another\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edav:remove-invalid-shares\u003c/code\u003e           Remove invalid dav shares\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edav:send-event-reminders\u003c/code\u003e            Sends event reminders\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edav:sync-birthday-calendar\u003c/code\u003e          Synchronizes the birthday calendar\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edav:sync-system-addressbook\u003c/code\u003e         Synchronizes users to the system addressbook\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Manpage of occ commander into Nextcloud",
            "tags": ["Nextcloud", "occ"],
            "date_published": "2019-11-23T21:59:23+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:694426c5-77f5-7e28-fa56-67ac0ec0cd87",
            "url": "http://doc.huc.fr.eu.org/fr/web/nextcloud/nextcloud-upgrade/",
            "title": "Nextcloud: Mise à jour manuelle sur OpenBSD (astuce)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Mettre à jour NC (Nextcloud) n\u0026rsquo;est pas compliqué en soit… Soit, vous le faites :\nPar le biais de l\u0026rsquo;interface web d\u0026rsquo;administration. Manuellement Par le gestionnaire de paquets, s\u0026rsquo;il y a lieu. Cet article a juste pour propos d\u0026rsquo;expliquer succinctement le processus manuel sous OpenBSD. L\u0026rsquo;instance que j\u0026rsquo;administre est donc sous OpenBSD, desservie par le serveur web Nginx, et le couple PHP+MySQL (en l\u0026rsquo;occurence actuellement PHP 7.3)\nProcessus de mise à jour C\u0026rsquo;est le processus que j\u0026rsquo;utilise depuis plusieurs années, depuis la version 15.*, qui en fait se veut simple, pratique et rapide.\nArrêt du service web La première chose que je fais est de désactiver le domaine au niveau de nginx :\n:# rm -f /etc/nginx/sites-enabled/mon-domaine.net :# nginx -t \u0026amp;\u0026amp; rcctl restart nginx Préparations Partons du principe que l\u0026rsquo;utilisateur web est www.\nLes actions qui suivent sont à faire avec ces droits : $ su -l www\nDirection vers le répertoire de nextcloud : cd www/nextcloud Il faut légérement modifier le fichier de config : sed -i -e 's#/htdocs#/var/www/htdocs#' config/config.php Activation du mode de maintenance: php-7.3 occ maintenance:mode --on Téléchargement Astuce d\u0026rsquo;informaticien :\nDirection le répertoire parent www\\ : Création d\u0026rsquo;une variable de version v qui sera bien utile. Téléchargement de l\u0026rsquo;archive actuelle correspondante à la version, ainsi que du fichier de sommes de contrôle sha256, fournis par le projet NC. Vérification de la somme de contrôle :$ cd ../ :$ v=\u0026#34;17.0.1\u0026#34; :$ for ext in bz2 bz2.sha256; do curl -O https://download.nextcloud.com/server/releases/nextcloud-$v.tar.$ext; done :$ sha256 -c nextcloud-$v.tar.bz2.sha256 Si par exemple, le résultat du SHA est (SHA256) nextcloud-$v.tar.bz2: OK, c\u0026rsquo;est tout bon.\nInstallation Passons à la phse d\u0026rsquo;installation :\ndéplace l\u0026rsquo;actuel répertoire nextcloud en le renommant suivi de la date de transformation et du numéro de l\u0026rsquo;ancienne version décompression de l\u0026rsquo;archive, suppression d\u0026rsquo;un fichier (on ne cherche pas à installer, ni à ré-installer NC). :$ oldvers=\u0026#34;16.0.6\u0026#34; :$ date=\u0026#34;$(date \u0026#39;+%Y%m%d%H%M%S\u0026#39;)\u0026#34; :$ oldnc=\u0026#34;nextcloud-${date}-${oldvers}\u0026#34; :$ mv nextcloud ${oldnc} :$ tar xjvf nextcloud-$v.tar.bz2 :$ rm -fP config/CAN_INSTALL Vérifications primaires Là, il faut être un peu plus attentif :\nCopie l\u0026rsquo;ancien fichier de configuration vers le nouveau répertoire de configuration : cp ${oldnc}/config/config.php nextcloud/config/ Maintenant, il faut parcourir l\u0026rsquo;ancien répertoire des applications pour copier celles qui ne sont pas natives vers le nouveau répertoire d\u0026rsquo;applications. Ne recopiez pas telle qu\u0026rsquo;elle la commande qui suit, c\u0026rsquo;est juste pour mémo : cp all ${oldnc}/apps diff to new nextcloud-app Pour finir, si besoin, il faut faire de même avec le répertoire des thèmes. Permissions Attribution des droits utilisateurs sur tous les nouveaux fichiers et répertoires dans le répertoire nextcloud/. Puis, attribution des droits nécessaires d\u0026rsquo;abord sur tous les répertoires enfants, ensuite ceux pour les fichiers enfants. :$ webuser=\u0026#34;www\u0026#34; :$ chown -R \u0026#34;${webuser}\u0026#34;:www nextcloud :$ find nextcloud/ -type d -exec chmod 750 {} \\; :$ find nextcloud/ -type f -exec chmod 640 {} \\; Mise à jour La mise à jour de NC en soit ; rien de particulier, pour autant qu\u0026rsquo;on soit dans le bon répertoire : cd nextcloud/ Ensuite, utilisation de l\u0026rsquo;outil occ : php-7.3 occ upgrade Si cela finit avec le message de succès, sortie du mode maintenance : php-7.3 occ maintenance:mode --off Pour finir, ré-édition du fichier de configuration pour supprimer /var/www : sed -i -e 's#/var/www/htdocs#/htdocs#' config/config.php\nRédemarrage Service Web Ré-active le domaine et redémarrage du service web : :# cd /etc/nginx/sites-available/ :# ln -s mon-domaine.net ../sites-enabled/ :# nginx -t \u0026amp;\u0026amp; rcctl restart nginx Puis connexion à l\u0026rsquo;interface web d\u0026rsquo;administration en tant qu\u0026rsquo;administrateur, et mise à jour des différentes applications Et, voilà !\nTL;DR Attention si vous ne faites que recopier tel quel ce TL;DR, vous allez au casse-pipe ! // stop web services # rm -f /etc/nginx/sites-enabled/mon-domaine.net # nginx -t \u0026amp;\u0026amp; rcctl restart nginx // connexion as user web # webuser=\u0026#34;www\u0026#34; # su -l $webuser $ cd /var/www/htdocs/mon-domaine.net/www/nextcloud/ $ sed -i -e \u0026#39;s#/htdocs#/var/www/htdocs#\u0026#39; config/config.php $ php-7.3 occ maintenance:mode --on // downlad archives, and checksum $ cd ../ $ v=\u0026#34;17.0.1\u0026#34; $ for ext in bz2 bz2.sha256; do curl -O https://download.nextcloud.com/server/releases/nextcloud-$v.tar.$ext; done $ sha256 -c nextcloud-$v.tar.bz2.sha256 // Untar $ oldvers=\u0026#34;16.0.6\u0026#34; $ date=\u0026#34;$(date \u0026#39;+%Y%m%d%H%M%S\u0026#39;)\u0026#34; $ oldnc=\u0026#34;nextcloud-${date}-${oldvers}\u0026#34; $ mv nextcloud ${oldnc} $ tar xjvf nextcloud-$v.tar.bz2 $ rm -fP config/CAN_INSTALL // cp config $ cp ${oldnc}/config/config.php nextcloud/config/ // cp only apps not native; dont recopy this command as-is: $ cp all ${oldnc}/apps diff to new nextcloud/apps // egual for themes, if need $ cp all ${oldnc}/themes to new nextcloud/themes $ chown -R \u0026#34;${webuser}\u0026#34;:www nextcloud $ find nextcloud/ -type d -exec chmod 750 {} \\; $ find nextcloud/ -type f -exec chmod 640 {} \\; // occ upgrage process $ cd nextcloud/ $ php-7.3 occ upgrade $ php-7.3 occ maintenance:mode --off $ sed -i -e \u0026#39;s#/var/www/htdocs#/htdocs#\u0026#39; config/config.php // exit // restart web services # cd /etc/nginx/sites-available/ # ln -s mon-domaine.net ../sites-enabled/ # nginx -t \u0026amp;\u0026amp; rcctl restart nginx Dépannages Si la mise à jour échoue, avec l\u0026rsquo;un de ces messages d\u0026rsquo;erreurs :\nErreur : Nextcloud is not installed Tel que :\n:$ php-7.3 occ help upgrade Nextcloud is not installed - only a limited number of commands are available Command \u0026#34;upgrade\u0026#34; is not defined. help [--format FORMAT] [--raw] [--] [\u0026lt;command_name\u0026gt;] Première chose à s\u0026rsquo;assurer est de vérifier que vous avez bien recopié l\u0026rsquo;ancien fichier de configuration vers le nouveau répertoire de configuration.\nSi oui, et que le problème perdure, essayez : php-7.3 occ maintenance:repair\nErreur: vous essayez de réinstaller votre Nextcloud Lorsque vous vous connectez à l\u0026rsquo;interface web, vous avez le message suivant :\nCitation :\nErreur\nOn dirait que vous essayez de réinstaller votre Nextcloud. Toutefois, le fichier CAN_INSTALL est absent de votre répertoire de configuration. Veuillez créer le fichier CAN_INSTALL dans votre dossier de configuration pour continuer\nAllez supprimer le fichier CAN_INSTALL qui se trouve dans le nouveau répertoire de configuration\nLes fichiers ne sont plus visibles Essayez : php-7.3 console.php files:scan --all\nCommandes OCC Pour rappel, les différentes commandes occ, bien utiles : php occ list\nRetrouvez une liste d\u0026rsquo;informations bien pratique sur la page occ .\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eMettre à jour \u003cabbr title=\"Nextcloud\"\u003eNC\u003c/abbr\u003e\n \u003cem\u003e(Nextcloud)\u003c/em\u003e n\u0026rsquo;est pas compliqué en soit…\nSoit, vous le faites :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePar le biais de l\u0026rsquo;interface web d\u0026rsquo;administration.\u003c/li\u003e\n\u003cli\u003eManuellement\u003c/li\u003e\n\u003cli\u003ePar le gestionnaire de paquets, s\u0026rsquo;il y a lieu.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCet article a juste pour propos d\u0026rsquo;expliquer succinctement le processus manuel\nsous OpenBSD. L\u0026rsquo;instance que j\u0026rsquo;administre est donc sous OpenBSD, desservie par\nle serveur web Nginx, et le couple PHP+MySQL \u003cem\u003e(en l\u0026rsquo;occurence actuellement PHP 7.3)\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"processus-de-mise-à-jour\"\u003eProcessus de mise à jour\u003c/h2\u003e\n\u003cp\u003eC\u0026rsquo;est le processus que j\u0026rsquo;utilise depuis plusieurs années, depuis la version 15.*,\nqui en fait se veut simple, pratique et rapide.\u003c/p\u003e\n\u003ch3 id=\"arrêt-du-service-web\"\u003eArrêt du service web\u003c/h3\u003e\n\u003cp\u003eLa première chose que je fais est de désactiver le domaine au niveau de nginx :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rm -f /etc/nginx/sites-enabled/mon-domaine.net\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# nginx -t \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rcctl restart nginx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"préparations\"\u003ePréparations\u003c/h3\u003e\n\u003cp\u003ePartons du principe que l\u0026rsquo;utilisateur web est \u003ccode\u003ewww\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eLes actions qui suivent sont à faire avec ces droits : \u003ccode\u003e$ su -l www\u003c/code\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDirection vers le répertoire de nextcloud : \u003cbr\u003e\n\u003ccode\u003ecd www/nextcloud\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eIl \u003ca class=\"inside\" href=\"/fr/web/nextcloud/nextcloud-php-chroot/\" title=\"Lien interne vers l\u0026#39;article : 'Nextcloud Php Chroot OpenBSD (astuce)'\"\u003efaut légérement modifier\u003c/a\u003e\n\nle fichier de config : \u003cbr\u003e\n\u003ccode\u003esed -i -e 's#/htdocs#/var/www/htdocs#' config/config.php\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eActivation du mode de maintenance: \u003cbr\u003e\n\u003ccode\u003ephp-7.3 occ maintenance:mode --on\u003c/code\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch4 id=\"téléchargement\"\u003eTéléchargement\u003c/h4\u003e\n\u003cp\u003eAstuce d\u0026rsquo;informaticien :\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eDirection le répertoire parent \u003ccode\u003ewww\\\u003c/code\u003e :\u003c/li\u003e\n\u003cli\u003eCréation d\u0026rsquo;une variable de version \u003ccode\u003ev\u003c/code\u003e qui sera bien utile.\u003c/li\u003e\n\u003cli\u003eTéléchargement de l\u0026rsquo;archive actuelle correspondante à la version, ainsi que\ndu fichier de sommes de contrôle sha256, fournis par le projet NC.\u003c/li\u003e\n\u003cli\u003eVérification de la somme de contrôle\u003c/li\u003e\n\u003c/ol\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ cd ../\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;17.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e ext in bz2 bz2.sha256; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e curl -O https://download.nextcloud.com/server/releases/nextcloud-\u003cspan style=\"color:#ef6155\"\u003e$v\u003c/span\u003e.tar.\u003cspan style=\"color:#ef6155\"\u003e$ext\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ sha256 -c nextcloud-\u003cspan style=\"color:#ef6155\"\u003e$v\u003c/span\u003e.tar.bz2.sha256\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi par exemple, le résultat du SHA est \u003ccode\u003e(SHA256) nextcloud-$v.tar.bz2: OK\u003c/code\u003e,\nc\u0026rsquo;est tout bon.\u003c/p\u003e\n\u003ch4 id=\"installation\"\u003eInstallation\u003c/h4\u003e\n\u003cp\u003ePassons à la phse d\u0026rsquo;installation :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003edéplace l\u0026rsquo;actuel répertoire \u003ccode\u003enextcloud\u003c/code\u003e en le renommant suivi de la date de\ntransformation et du numéro de l\u0026rsquo;ancienne version\u003c/li\u003e\n\u003cli\u003edécompression de l\u0026rsquo;archive,\u003c/li\u003e\n\u003cli\u003esuppression d\u0026rsquo;un fichier \u003cem\u003e(on ne cherche pas à installer, ni à ré-installer NC)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003eoldvers\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;16.0.6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003edate\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edate \u003cspan style=\"color:#48b685\"\u003e\u0026#39;+%Y%m%d%H%M%S\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003eoldnc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nextcloud-\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edate\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldvers\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ mv nextcloud \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldnc\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ tar xjvf nextcloud-\u003cspan style=\"color:#ef6155\"\u003e$v\u003c/span\u003e.tar.bz2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ rm -fP config/CAN_INSTALL\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"vérifications-primaires\"\u003eVérifications primaires\u003c/h4\u003e\n\u003cp\u003eLà, il faut être un peu plus attentif :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCopie l\u0026rsquo;ancien fichier de configuration vers le nouveau répertoire de\nconfiguration : \u003cbr\u003e\n\u003ccode\u003ecp ${oldnc}/config/config.php nextcloud/config/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eMaintenant, il faut parcourir l\u0026rsquo;ancien répertoire des applications pour copier\ncelles qui \u003cstrong\u003ene sont pas natives\u003c/strong\u003e vers le nouveau répertoire d\u0026rsquo;applications.\n\u003cstrong\u003eNe recopiez pas telle qu\u0026rsquo;elle la commande qui suit, c\u0026rsquo;est juste pour mémo\u003c/strong\u003e : \u003cbr\u003e\n\u003ccode\u003ecp all ${oldnc}/apps diff to new nextcloud-app\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour finir, si besoin, il faut faire de même avec le répertoire des thèmes.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"permissions\"\u003ePermissions\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eAttribution des droits utilisateurs sur tous les nouveaux fichiers et\nrépertoires dans le répertoire \u003ccode\u003enextcloud/\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003ePuis, attribution des droits nécessaires d\u0026rsquo;abord sur tous les répertoires\nenfants, ensuite ceux pour les fichiers enfants.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ \u003cspan style=\"color:#ef6155\"\u003ewebuser\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;www\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ chown -R \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ewebuser\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:www nextcloud\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ find nextcloud/ -type d -exec chmod \u003cspan style=\"color:#f99b15\"\u003e750\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{}\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ find nextcloud/ -type f -exec chmod \u003cspan style=\"color:#f99b15\"\u003e640\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{}\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"mise-à-jour\"\u003eMise à jour\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLa mise à jour de NC en soit ; rien de particulier, pour autant qu\u0026rsquo;on soit\ndans le bon répertoire : \u003cbr\u003e\n\u003ccode\u003ecd nextcloud/\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eEnsuite, utilisation de l\u0026rsquo;outil \u003ccode\u003eocc\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003ephp-7.3 occ upgrade\u003c/code\u003e\n\u003cul\u003e\n\u003cli\u003eSi cela finit avec le message de succès, sortie du mode maintenance : \u003cbr\u003e\n\u003ccode\u003ephp-7.3 occ maintenance:mode --off\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour finir, ré-édition du fichier de configuration pour supprimer \u003ccode\u003e/var/www\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003esed -i -e 's#/var/www/htdocs#/htdocs#' config/config.php\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"rédemarrage-service-web\"\u003eRédemarrage Service Web\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eRé-active le domaine et redémarrage du service web :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cd /etc/nginx/sites-available/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# ln -s mon-domaine.net ../sites-enabled/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# nginx -t \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rcctl restart nginx\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003ePuis connexion à l\u0026rsquo;interface web d\u0026rsquo;administration en tant qu\u0026rsquo;administrateur,\net mise à jour des différentes applications\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEt, voilà !\u003c/p\u003e\n\u003ch3 id=\"tldr\"\u003eTL;DR\u003c/h3\u003e\n\u003cspan class=\"error\"\u003e\nAttention si vous ne faites que recopier tel quel ce TL;DR, vous allez au casse-pipe !\n\u003c/span\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// stop web services\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# rm -f /etc/nginx/sites-enabled/mon-domaine.net\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# nginx -t \u0026amp;\u0026amp; rcctl restart nginx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// connexion as user web\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# webuser=\u0026#34;www\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# su -l $webuser\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd /var/www/htdocs/mon-domaine.net/www/nextcloud/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s#/htdocs#/var/www/htdocs#\u0026#39;\u003c/span\u003e config/config.php\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ php-7.3 occ maintenance:mode --on\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// downlad archives, and checksum\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd ../\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#ef6155\"\u003ev\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;17.0.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e ext in bz2 bz2.sha256; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e curl -O https://download.nextcloud.com/server/releases/nextcloud-\u003cspan style=\"color:#ef6155\"\u003e$v\u003c/span\u003e.tar.\u003cspan style=\"color:#ef6155\"\u003e$ext\u003c/span\u003e; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sha256 -c nextcloud-\u003cspan style=\"color:#ef6155\"\u003e$v\u003c/span\u003e.tar.bz2.sha256\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// Untar\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#ef6155\"\u003eoldvers\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;16.0.6\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#ef6155\"\u003edate\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003edate \u003cspan style=\"color:#48b685\"\u003e\u0026#39;+%Y%m%d%H%M%S\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ \u003cspan style=\"color:#ef6155\"\u003eoldnc\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;nextcloud-\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003edate\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e-\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldvers\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ mv nextcloud \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldnc\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ tar xjvf nextcloud-\u003cspan style=\"color:#ef6155\"\u003e$v\u003c/span\u003e.tar.bz2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ rm -fP config/CAN_INSTALL\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// cp config\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cp \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldnc\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e/config/config.php nextcloud/config/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// cp only apps not native; dont recopy this command as-is:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cp all \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldnc\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e/apps diff to new nextcloud/apps\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// egual \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e themes, \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e need\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cp all \u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003eoldnc\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e/themes to new nextcloud/themes\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ chown -R \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e${\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003ewebuser\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e:www nextcloud\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ find nextcloud/ -type d -exec chmod \u003cspan style=\"color:#f99b15\"\u003e750\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{}\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ find nextcloud/ -type f -exec chmod \u003cspan style=\"color:#f99b15\"\u003e640\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{}\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e\\;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// occ upgrage process\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ cd nextcloud/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ php-7.3 occ upgrade\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ php-7.3 occ maintenance:mode --off\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ sed -i -e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s#/var/www/htdocs#/htdocs#\u0026#39;\u003c/span\u003e config/config.php\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// exit\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e// restart web services\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# cd /etc/nginx/sites-available/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ln -s mon-domaine.net ../sites-enabled/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# nginx -t \u0026amp;\u0026amp; rcctl restart nginx\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"dépannages\"\u003eDépannages\u003c/h3\u003e\n\u003cp\u003eSi la mise à jour échoue, avec l\u0026rsquo;un de ces messages d\u0026rsquo;erreurs :\u003c/p\u003e\n\u003ch4 id=\"erreur--nextcloud-is-not-installed\"\u003eErreur : Nextcloud is not installed\u003c/h4\u003e\n\u003cp\u003eTel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ php-7.3 occ help upgrade\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNextcloud is not installed - only a limited number of commands are available\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Command \u003cspan style=\"color:#48b685\"\u003e\u0026#34;upgrade\u0026#34;\u003c/span\u003e is not defined.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ehelp \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e--format FORMAT\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e--raw\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e--\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u0026lt;command_name\u0026gt;\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePremière chose à s\u0026rsquo;assurer est de vérifier que vous avez bien recopié l\u0026rsquo;ancien\nfichier de configuration vers le nouveau répertoire de configuration.\u003c/p\u003e\n\u003cp\u003eSi oui, et que le problème perdure, essayez : \u003cbr\u003e\n\u003ccode\u003ephp-7.3 occ maintenance:repair\u003c/code\u003e\u003c/p\u003e\n\u003ch4 id=\"erreur-vous-essayez-de-réinstaller-votre-nextcloud\"\u003eErreur: vous essayez de réinstaller votre Nextcloud\u003c/h4\u003e\n\u003cp\u003eLorsque vous vous connectez à l\u0026rsquo;interface web, vous avez le message suivant :\u003c/p\u003e\n\u003cdiv class=\"info-quote\"\u003e\n    \u003cp class=\"is-white-50\"\u003eCitation :\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"quote\"\u003e\n    \u003cfigure\u003e\n        \u003cblockquote\u003e\n            \u003cp class=\"IMP text-dark\"\u003eErreur\u003c/p\u003e\n\u003cp\u003eOn dirait que vous essayez de réinstaller votre Nextcloud. Toutefois, le fichier CAN_INSTALL est absent de votre répertoire de configuration. Veuillez créer le fichier CAN_INSTALL dans votre dossier de configuration pour continuer\u003c/p\u003e\n        \u003c/blockquote\u003e\n    \u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cp\u003eAllez supprimer le fichier \u003ccode\u003eCAN_INSTALL\u003c/code\u003e qui se trouve dans le nouveau\nrépertoire de configuration\u003c/p\u003e\n\u003ch4 id=\"les-fichiers-ne-sont-plus-visibles\"\u003eLes fichiers ne sont plus visibles\u003c/h4\u003e\n\u003cp\u003eEssayez : \u003ccode\u003ephp-7.3 console.php files:scan --all\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"commandes-occ\"\u003eCommandes OCC\u003c/h2\u003e\n\u003cp\u003ePour rappel, les différentes commandes occ, bien utiles : \u003ccode\u003ephp occ list\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eRetrouvez une liste d\u0026rsquo;informations bien pratique sur la page\n\u003ca class=\"inside\" href=\"/fr/web/nextcloud/occ/\" title=\"Lien interne vers l\u0026#39;article : 'Nextcloud : manpage occ'\"\u003eocc\u003c/a\u003e\n.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment mettre à jour Nextcloud manuellement sous OpenBSD",
            "tags": ["Nextcloud", "OpenBSD", "upgrade", "astuce"],
            "date_published": "2019-11-23T20:45:23+01:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:2095748a-8df6-da26-79aa-0b929c374280",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/openbsd-munin-node/",
            "title": "Munin-node : Client pour monitorer OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Munin est un outil de surveillance des ordinateurs. Il présente ces informations par le biais d\u0026rsquo;une interface web, qui visualise des graphiques statiques, générés toutes les 5 minutes, par défaut. Un certain nombre de plugins de monitoring divers sont utilisables sans gros effort.\nMunin permet de monitorer facilement la performance de tout matériel informatique (ordinateurs, réseaux, applications, mesures diverses, etc.). Il permet de discerner les problèmes de performance des ressources.\nSite web : http://munin-monitoring.org/ Version : 2.0.49 OpenBSD : 6.6 Services : munin_node Documentation Il est toujours utile de lire les documentations pkg-readmes fournies ; celles disponibles sont dans /usr/local/share/doc/pkg-readmes/, à-propos de :\nmunin-node la documentation officielle : http://munin-monitoring.org/wiki/Documentation http://munin.readthedocs.org/ la FAQ officielle : http://munin-monitoring.org/wiki/faq Installation :# pkg_add munin-node Pour information, cela installe en dépendance quelques paquets de plus, dont p5-Net-CIDR. Ce paquet est utile pour la configuration de l\u0026rsquo;option cidr_allow dans le fichier de configuration du nœud de munin ; s\u0026rsquo;il n\u0026rsquo;est pas installé, faites-le !\nSi vous désirez le support des moniteurs SNMP (Simple Network Management Protocol) , il faut installer le paquet p5-Net-SNMP.\nConfiguration Le fichier de configuration est /etc/munin/munin-node.conf.\nUne fois configuré, il est nécessaire de démarrer le service de munin :\n:# rcctl enable munin_node :# rcctl start munin_node munin-node.conf Ce fichier de configuration du nœud, le client si vous préférez, est simple à paramétrer.\nVous pouvez changer principalement :\nglobal_timeout : le délai timeout pour toute transaction. Par défaut, c\u0026rsquo;est une période de 15 minutes ; à écrire en nombre de secondes.\ntimeout : c\u0026rsquo;est le timeout de connexion pour les plugins. Par défaut, de 60 secondes.\nhost_name : le nom de votre hôte\nallow : permettre la connexion\nhost : nom d\u0026rsquo;hôte ou adresse ip à surveiller - préférez à changer par 127.0.0.1 et/ou ::1.\nport : le numéro du port d\u0026rsquo;écoute, par défaut : 4949\nD\u0026rsquo;autres variables sont configurables ; à vous d\u0026rsquo;éditer le fichier et de vous renseigner pour savoir quoi paramétrer !\nPour finir, il est recommandé d\u0026rsquo;exécuter le script de configuration du nœud munin, à savoir :\n:# munin-node-configure --shell --suggest | sh newsyslog.conf Il est nécessaire de modifier le fichier de configuration du journal /etc/newsyslog.conf pour créer une rotation des journaux générés par munin.\nAjoutez-y :\n# munin-node /var/log/munin/munin-node.log root:wheel 644 7 250 * Z Les plugins Les plugins peuvent être gérés par la commande munin-node-configure --shell Pour connaître la configuration d\u0026rsquo;un plugin : munin-run nom-plugin config Pour tester le fonctionnement d\u0026rsquo;un plugin : munin-run nom-plugin Pour information, le répertoire est /usr/local/libexec/munin/plugins/ ; pour les activer, il suffit de faire un lien symbolique d\u0026rsquo;un plugin en particulier vers /etc/munin/plugins, puis de redémarrer les services de munin.\nCertains plugins nécessitent une configuration supplémentaire, inscrite dans les commentaires d\u0026rsquo;entêtes du script. Il est alors nécessaire de modifier le fichier /etc/munin/plugin-conf.d/openbsd-packages en ajoutant les informations nécessaires.\nC\u0026rsquo;est le cas des plugins suivants :\nplugin http_loadtime Options de configuration : requisites : n'activer cette option que sur du flux HTTP, et non HTTPS ! WebAdmin : cf, section network : HTTP loadtime of a page Permet de surveiller l\u0026rsquo;accès à un site web, soit la page d\u0026rsquo;acceuil, soit une page dédiée.\nExemple :\n[http_loadtime] env.target http://huc.fr.eu.org,http://huc.fr.eu.org/fr/sys/openbsd/munin-monitoring-openbsd/ #env.requisites true plugin intr WebAdmin : cf, section system : Interrupt activity Relatif aux différentes interruptions d\u0026rsquo;activités - spécifique à OpenBSD.\nplugins nginx_* WebAdmin : cf, section dédiée nginx Non seulement, il faut modifier le fichier openbsd-packages, tel que :\n[nginx*] env.url http://localhost/nginx_status Mais en plus, il faut rajouter une configuration serveur au serveur web nginx. Il n'est donc pas possible de le monitorer avec httpd. plugins pf_* Options de configuration :\nuser : root do_searches : false ou true pour permettre les interrogations adéquates. Certains plugins pf_ peuvent nécessiter l\u0026rsquo;ajout de la variable d\u0026rsquo;environnement WebAdmin : cf, section dédiée pf\n[pf_*] user root #env.do_searches yes plugin samba Options de configuration : user : root smbstatus : restituer le chemin vers le binaire ad hoc ignoreipcshare : false ou true pour ignorer ou non les partages IPC$ WebAdmin : cf, section dédiée samba [samba] user root env.smbstatus /usr/local/bin/smbstatus env.ignoreipcshare 1 plugins SNMP AttentionIl semble que Munin ne soit pas directement capable de converser avec SNMPv3 en authentification forte ! Options de configuration :\nplusieurs options d\u0026rsquo;environnement sont disponibles dont celles montrées dans le fichier d\u0026rsquo;exemple WebAdmin : cf, section dédiée snmp\nRecommandations :\nÀ moins d\u0026rsquo;utiliser SNMP v3 qui permet l\u0026rsquo;authentification, le chiffrement, donc la confidentialité du flux et des données, SNMP n\u0026rsquo;est pas sécurisé.\nIl est fortement recommandé de lire la documentation officielle de perl : perldoc Munin::Plugin::SNMP\nDans tous les cas, la variable d\u0026rsquo;environnement community ne devrait pas être paramétrée sur public.\nExemple :\n[snmp_*] env.warning 10 env.critical 5 # need for _print_* env.version 2 env.community private La partie serveur Une fois que cela est fait, il faut modifier le fichier de configuration du serveur pour lui ajouter votre nœud munin …\nPacket-Filter Concernant les règles pour PF (Packet Filter) , il faut ouvrir en entrée et sortie, vers et depuis le serveur munin :\npour Munin lui-même : 4949/tcp pour SNMP : 161, 162 en udp et tcp - cela dépend de votre configuration SNMP , bien sûr. ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMunin\u003c/strong\u003e est un outil de surveillance des ordinateurs. Il présente ces\ninformations par le biais d\u0026rsquo;une interface web, qui visualise des graphiques\nstatiques, générés toutes les 5 minutes, par défaut. Un certain nombre de\nplugins de monitoring divers sont utilisables sans gros effort.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMunin\u003c/strong\u003e permet de monitorer facilement la performance de tout matériel\ninformatique (ordinateurs, réseaux, applications, mesures diverses, etc.). \u003cbr\u003e\nIl permet de discerner les problèmes de performance des ressources.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"http://munin-monitoring.org/\" rel=\"external\"\u003ehttp://munin-monitoring.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion : 2.0.49\u003c/li\u003e\n\u003cli\u003eOpenBSD : 6.6\u003c/li\u003e\n\u003cli\u003eServices : munin_node\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eIl est toujours utile de lire les documentations \u003ccode\u003epkg-readmes\u003c/code\u003e fournies ;\ncelles disponibles sont dans \u003ccode\u003e/usr/local/share/doc/pkg-readmes/\u003c/code\u003e, à-propos de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emunin-node\u003c/li\u003e\n\u003cli\u003ela documentation officielle :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://munin-monitoring.org/wiki/Documentation\" rel=\"external\"\u003ehttp://munin-monitoring.org/wiki/Documentation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://munin.readthedocs.org/\" rel=\"external\"\u003ehttp://munin.readthedocs.org/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ela FAQ officielle : \u003ca href=\"http://munin-monitoring.org/wiki/faq\" rel=\"external\"\u003ehttp://munin-monitoring.org/wiki/faq\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# pkg_add munin-node\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour information, cela installe en dépendance quelques paquets de plus, dont\n\u003ccode\u003ep5-Net-CIDR\u003c/code\u003e. \u003cbr\u003e\n\u003cem\u003eCe paquet est utile pour la configuration de l\u0026rsquo;option \u003ccode\u003ecidr_allow\u003c/code\u003e dans le\n\u003ca href=\"/fr/monitor/openbsd-munin-node/#munin-nodeconf\"\u003efichier de configuration du nœud de munin\u003c/a\u003e ; s\u0026rsquo;il n\u0026rsquo;est pas\ninstallé, faites-le !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSi vous désirez le support des moniteurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSNMP \u003cem\u003e(Simple Network Management Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, il faut installer\nle paquet \u003ccode\u003ep5-Net-SNMP\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration est \u003ccode\u003e/etc/munin/munin-node.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eUne fois configuré, il est nécessaire de démarrer le service de munin :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl enable munin_node\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl start munin_node\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"munin-nodeconf\"\u003emunin-node.conf\u003c/h3\u003e\n\u003cp\u003eCe fichier de configuration du nœud, \u003cem\u003ele client si vous préférez\u003c/em\u003e, est simple à\nparamétrer.\u003c/p\u003e\n\u003cp\u003eVous pouvez changer principalement :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eglobal_timeout\u003c/code\u003e : le délai timeout pour toute transaction. \u003cbr\u003e\nPar défaut, c\u0026rsquo;est une période de 15 minutes ; à écrire en nombre de secondes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003etimeout\u003c/code\u003e : c\u0026rsquo;est le timeout de connexion pour les plugins. \u003cbr\u003e\nPar défaut, de 60 secondes.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehost_name\u003c/code\u003e : le nom de votre hôte\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eallow\u003c/code\u003e : permettre la connexion\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003ehost\u003c/code\u003e : nom d\u0026rsquo;hôte ou adresse ip à surveiller - préférez à changer par\n\u003ccode\u003e127.0.0.1\u003c/code\u003e et/ou \u003ccode\u003e::1\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eport\u003c/code\u003e : le numéro du port d\u0026rsquo;écoute, par défaut : \u003ccode\u003e4949\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eD\u0026rsquo;autres variables sont configurables ; à vous d\u0026rsquo;éditer le fichier et de vous\nrenseigner pour savoir quoi paramétrer !\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003ePour finir, il est recommandé d\u0026rsquo;exécuter le script de configuration du nœud munin, à savoir :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# munin-node-configure --shell --suggest | sh\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"newsyslogconf\"\u003enewsyslog.conf\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de modifier le fichier de configuration du journal\n\u003ccode\u003e/etc/newsyslog.conf\u003c/code\u003e pour créer une rotation des journaux générés par munin.\u003c/p\u003e\n\u003cp\u003eAjoutez-y :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# munin-node\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/log/munin/munin-node.log   root:wheel      644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"les-plugins\"\u003eLes plugins\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLes plugins peuvent être gérés par la commande \u003ccode\u003emunin-node-configure --shell\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour connaître la configuration d\u0026rsquo;un plugin : \u003ccode\u003emunin-run nom-plugin config\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour tester le fonctionnement d\u0026rsquo;un plugin : \u003ccode\u003emunin-run nom-plugin\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePour information, le répertoire est \u003ccode\u003e/usr/local/libexec/munin/plugins/\u003c/code\u003e ; pour\nles activer, il suffit de faire un lien symbolique d\u0026rsquo;un plugin en particulier\nvers \u003ccode\u003e/etc/munin/plugins\u003c/code\u003e, puis de redémarrer les services de munin.\u003c/p\u003e\n\u003cp\u003eCertains plugins nécessitent une configuration supplémentaire, inscrite dans\nles commentaires d\u0026rsquo;entêtes du script. \u003cbr\u003e\nIl est alors nécessaire de modifier le fichier \u003ccode\u003e/etc/munin/plugin-conf.d/openbsd-packages\u003c/code\u003e\nen ajoutant les informations nécessaires.\u003c/p\u003e\n\u003cp\u003eC\u0026rsquo;est le cas des plugins suivants :\u003c/p\u003e\n\u003ch4 id=\"plugin-http_loadtime\"\u003eplugin http_loadtime\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eOptions de configuration :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003erequisites\u003c/code\u003e : \u003cstrong\u003e\u003cspan class=\"red\"\u003en'activer cette option que sur du flux\n    HTTP, et non HTTPS !\u003c/span\u003e\n\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eWebAdmin : cf, section \u003ccode\u003enetwork\u003c/code\u003e : \u003ccode\u003eHTTP loadtime of a page\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003ePermet de surveiller l\u0026rsquo;accès à un site web, soit la page d\u0026rsquo;acceuil, soit une\npage dédiée.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[http_loadtime]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#06b6ef\"\u003eenv.target http://huc.fr.eu.org,http://huc.fr.eu.org/fr/sys/openbsd/munin-monitoring-openbsd/\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   \u003cspan style=\"color:#776e71\"\u003e#env.requisites true\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"plugin-intr\"\u003eplugin intr\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWebAdmin : cf, section \u003ccode\u003esystem\u003c/code\u003e : \u003ccode\u003eInterrupt activity\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRelatif aux différentes interruptions d\u0026rsquo;activités - spécifique à OpenBSD.\u003c/p\u003e\n\u003ch4 id=\"plugins-nginx_\"\u003eplugins nginx_*\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eWebAdmin : cf, section dédiée \u003ccode\u003enginx\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eNon seulement, il faut modifier le fichier \u003ccode\u003eopenbsd-packages\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[nginx*]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eenv.url http://localhost/nginx_status\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMais en plus, il faut rajouter une configuration serveur au serveur web nginx. \u003cbr\u003e\n\u003cspan class=\"red\"\u003eIl n'est donc pas possible de le monitorer avec httpd.\u003c/span\u003e\n\u003c/p\u003e\n\u003ch4 id=\"plugins-pf_\"\u003eplugins pf_*\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOptions de configuration :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003euser\u003c/code\u003e : \u003ccode\u003eroot\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edo_searches\u003c/code\u003e : \u003ccode\u003efalse\u003c/code\u003e ou \u003ccode\u003etrue\u003c/code\u003e pour permettre les interrogations\nadéquates. Certains plugins \u003cstrong\u003epf_\u003c/strong\u003e peuvent nécessiter l\u0026rsquo;ajout de la\nvariable d\u0026rsquo;environnement\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWebAdmin : cf, section dédiée \u003ccode\u003epf\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[pf_*]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003euser root\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#776e71\"\u003e#env.do_searches yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"plugin-samba\"\u003eplugin samba\u003c/h4\u003e\n\u003cul\u003e\n\u003cli\u003eOptions de configuration :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003euser\u003c/code\u003e : \u003ccode\u003eroot\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esmbstatus\u003c/code\u003e : restituer le chemin vers le binaire ad hoc\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eignoreipcshare\u003c/code\u003e : \u003ccode\u003efalse\u003c/code\u003e ou \u003ccode\u003etrue\u003c/code\u003e pour ignorer ou non les partages IPC$\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eWebAdmin : cf, section dédiée \u003ccode\u003esamba\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[samba]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003euser root\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eenv.smbstatus /usr/local/bin/smbstatus\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  \u003cspan style=\"color:#06b6ef\"\u003eenv.ignoreipcshare 1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"plugins-snmp\"\u003eplugins SNMP\u003c/h4\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eIl semble que Munin ne soit pas directement capable de converser avec SNMPv3 en\nauthentification forte !\u003c/div\u003e\n\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOptions de configuration :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eplusieurs options d\u0026rsquo;environnement sont disponibles dont celles montrées\ndans le fichier d\u0026rsquo;exemple\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWebAdmin : cf, section dédiée \u003ccode\u003esnmp\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cspan class=\"IMP red\"\u003eRecommandations :\u003c/span\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eÀ moins d\u0026rsquo;utiliser SNMP v3 qui permet l\u0026rsquo;authentification, le chiffrement,\ndonc la confidentialité du flux et des données, SNMP n\u0026rsquo;est pas sécurisé.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIl est fortement recommandé de lire la documentation officielle de perl : \u003ccode\u003eperldoc Munin::Plugin::SNMP\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDans tous les cas, la variable d\u0026rsquo;environnement \u003ccode\u003ecommunity\u003c/code\u003e ne devrait pas\nêtre paramétrée sur \u003ccode\u003epublic\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[snmp_*]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eenv.warning 10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eenv.critical 5  # need for _print_*\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eenv.version 2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eenv.community private\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"la-partie-serveur\"\u003eLa partie serveur\u003c/h3\u003e\n\u003cp\u003eUne fois que cela est fait, il faut modifier le\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/munin-server/#munin-conf\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003efichier de configuration du serveur\u003c/a\u003e\n pour lui\n\u003ca class=\"inside\" href=\"/fr/sys/openbsd/munin-server/#ajouter-un-nc593ud\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003eajouter votre nœud munin\u003c/a\u003e\n…\u003c/p\u003e\n\u003ch3 id=\"packet-filter\"\u003ePacket-Filter\u003c/h3\u003e\n\u003cp\u003eConcernant les règles pour \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePF \u003cem\u003e(Packet Filter)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, il faut ouvrir en entrée et sortie,\nvers et depuis le serveur munin :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour Munin lui-même : \u003ccode\u003e4949/tcp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour SNMP : \u003ccode\u003e161\u003c/code\u003e, \u003ccode\u003e162\u003c/code\u003e en \u003ccode\u003eudp\u003c/code\u003e et \u003ccode\u003etcp\u003c/code\u003e - cela dépend de votre configuration\n\u003ca class=\"tag\" href=\"/fr/tags/snmp\"\u003eSNMP\u003c/a\u003e\n, bien sûr.\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Mettre en place un nœud Munin, un client, pour monitorer sa station OpenBSD",
            "tags": ["Munin", "OpenBSD", "client", "supervision"],
            "date_published": "2019-11-22T20:05:30+01:00",
            "date_modified": "2025-11-11T15:44:28+01:00"
        },{
            "id": "urn:uuid:97da452e-d8ba-272a-0aad-9729f5058aa0",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/snmp/",
            "title": "snmp : client SNMP sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description snmp est le client SNMP (Simple Network Management Protocol) par défaut sous OpenBSD, intégré dans le système de base depuis 6.6 !\nIl est bien sûr nécessaire qu\u0026rsquo;un agent soit installé, configuré sur la machine à interroger. Sous OpenBSD, c\u0026rsquo;est le service natif snmpd .\nDocumentation La documentation se fait au-travers du manpage, tels que :\nsnmp Utilisation Premier aspect qui \u0026ldquo;saute aux yeux\u0026rdquo; est que snmp est fourni avec un ensemble de sous-commandes, qui ont leurs propres options.\nPour information : les OID (Object Identifier) sont des identifiants d\u0026rsquo;objets.\nDescription des sous commandes snmp get pour récupèrer le varbind OID depuis un agent SNMP . Il est possible de spécifier plusieurs OID . snmp getnext pour récupèrer le varbind qui suit l\u0026rsquo; OID requis. Il est aussi possible d\u0026rsquo;en spécifier plusieurs. snmp walk récupère toutes les branches d\u0026rsquo;un OID . snmp bulkget récupère les 10 prochains varbind suivant chaque OID . snmp bulkwalk récupère tous les varbind qui sont des branches de l\u0026rsquo; OID . snmp set permet de définir un ou plusieurs varoid, ainsi que son format de type de données. snmp trap envoie un message de capture à un agent. snmp mibtree permet de faire un dump (une sauvegarde) de l\u0026rsquo;arborescence des objets compilés au format MIB. Les deux sous commandes bulk*, ainsi que trap ne sont fonctionnelles qu\u0026rsquo;à partir de SNMP v2.\nPour info, la sous commande get est aussi utile pour récupèrer les messages d\u0026rsquo;erreurs.\nSNMP v1 Oui, c\u0026rsquo;est possible ; mais du fait que c\u0026rsquo;est une version \u0026ldquo;historique\u0026rdquo;, qu\u0026rsquo;il n\u0026rsquo;est plus recommandé de l\u0026rsquo;utiliser, passons à la suite…\nSNMP v2 Il n\u0026rsquo;y a pas de réelle sécurité avec SNMPv2. Elle se base principalement sur l\u0026rsquo;option community et les deux options read-*.\nExemple :\n:$ snmp walk -v 2c -c public $(hostname) sysDescr Cet exemple nous montre l\u0026rsquo;interrogation d\u0026rsquo;un agent sur le protocole v2c faisant partie de la communauté public.\nUn petit mot sur l\u0026rsquo;option community, ne cherchez pas à la faire fonctionner avec SNMP v3, elle a été supprimée du protocole.\nSNMP v3 Les options principales sont :\n-A spécifie le mot de passe utilisateur de l\u0026rsquo;agent à interroger. -a spécifie le protocole de chiffrement lié à l\u0026rsquo;option -A. Par défaut, l\u0026rsquo;option -a est paramétrée sur MD5. Attention, l\u0026rsquo;option équivalente pour le service snmpd hmac est, elle, basée sur hmac-sha1. Donc, dans le cas d\u0026rsquo;un agent SNMPd fonctionant sous OpenBSD configuré par défaut à interroger, il faudra veiller à spécifier SHA1. -l spécifie le niveau de sécurité. Par défaut, la valeur est noAuthNoPriv. authNoPriv est requise par l\u0026rsquo;une des deux options -A ou -k. authPriv est requise par l\u0026rsquo;une des deux options -K ou -X. -u spécifie le nom de l\u0026rsquo;utilisateur -v spécifie la version du protocole SNMP utilisé -X spécifie le mot de passe de confidentialité de l\u0026rsquo;utilisateur -x spécifie le protocole de chiffrement de confidentialité. Les options sont des ou aes. Ces options sont utiles voire nécessaires pour faire de l\u0026rsquo;authentification dite forte.\nIl y a bien sûr d\u0026rsquo;autres options possibles :\ncertaines ne sont pas nécessaires d\u0026rsquo;être généralement spécifiées, c\u0026rsquo;est le cas de -E, -e, -n, -Z. les options -K, -k (ces deux dernières options sont l\u0026rsquo;équivalent des options -A et -X mais encodées sous forme hexadécimale). certaines sont spécifiques à l\u0026rsquo;usage des sous commandes bulk*, walk. pour finir, il est possible de cibler les protocoles réseaux que sont udp, tcp, (et leur équivalent IPv6 : upd6 et tcp6) ou unix. Les adresses IPv6 doivent être mises entre crochets { }. Lire le manpage snmp pour en savoir plus sur l\u0026rsquo;utilité des ces options.\nCi-dessous, retrouvez quelques exemples d\u0026rsquo;utilisation avec le protocole SNMPv3. Il est bien entendu que nous n\u0026rsquo;abordons pas la partie de la configuration de l\u0026rsquo;agent interrogé. Sous OpenBSD , la configuration d\u0026rsquo;un agent SNMP se fait par le biais du service SNMPd .\nDans chaque cas, les paramètres utilisés sont liés à ceux configurés dans le service SNMPd.\nSans authentification Exemple :\n:$ snmp walk -u \u0026#34;test\u0026#34; -v 3 $(hostname) sysDescr Dans cet exemple, nous interrogeons l\u0026rsquo;agent avec un nom d\u0026rsquo;utilisateur nommé test, sans aucun niveau de sécurité.\nAuthentification simple Exemple :\n:$ snmp walk -A \u0026#34;secret007\u0026#34; -a SHA -l authNoPriv -u \u0026#34;uauth\u0026#34; -v 3 192.168.1.3 sysdescr Ici, nous interrogeons l\u0026rsquo;agent ayant pour adresse 192.168.1.3 avec un nom utilisateur uauth , une clé d\u0026rsquo;authentification secret007 et un niveau de sécurité spécifié à authNoPriv.\nAuthentification forte Quelques mots sur l\u0026rsquo;authentification forte : elle est à favoriser IMPÉRATIVEMENT !\nExemple :\n:$ snmp walk -A \u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34; -a SHA-512 -l authPriv -u \u0026#34;uenc\u0026#34; -v 3 -X \u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34; -x aes $(hostname) sysdescr Dans cet exemple, nous interrogeons localement l\u0026rsquo;agent,\navec un utilisateur nommé uenc, une clé d\u0026rsquo;authentification \u0026ldquo;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026rdquo; basée sur le protocole de chiffrement SHA-512, un niveau de sécurité sur authPriv, le mot de passe de l\u0026rsquo;utilisateur \u0026ldquo;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026rdquo; basé sur le protocole de chiffrement aes. Dépannage Erreur : usmStatsDecryptionErrors.0 Le protocole de chiffrement que vous utilisez n\u0026rsquo;est pas celui attendu par l\u0026rsquo;agent interrogé. Corrigez la valeur de votre option -x.\nErreur : usmStatsUnsupportedSecLevels.0 Le niveau de sécurité que vous cherchez à utiliser n\u0026rsquo;est pas celui attendu par l\u0026rsquo;agent interrogé. Corrigez la valeur de votre option -l.\nErreur : usmStatsWrongDigests.0 Le protocole de chiffrement que vous utilisez n\u0026rsquo;est pas celui attendu par l\u0026rsquo;agent interrogé. Corrigez la valeur de votre option -a.\nMessage : *** = No Such Object available on this agent at this OID Vous essayez de parcourir un arbre avec la sous commande get, n\u0026rsquo;est-ce pas !? Alors, soit vous recommencez en :\nutilisant la sous commande walk précisant un OID particulier Message : Received report: Vous venez de parcourir un arbre avec la sous commande walk, et vous avez pour retour juste ce message Received report: sans rien de plus.\nUtilisez la sous commande get à la place, cela vous permettra d\u0026rsquo;obtenir le message d\u0026rsquo;erreur adéquat.\nMessage : snmp: Invalid privacy protocol specified after -3x flag: Le niveau du protocole de sécurité que vous avez spécifié est incorrect. Corrigez la valeur de votre option -l.\nMessage : snmp: ***: Unknown object identifier Vous avez spécifié un OID inconnu. Vérifiez et corrigez l\u0026rsquo; OID recherché.\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003esnmp\u003c/strong\u003e est le client \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSNMP \u003cem\u003e(Simple Network Management Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n par défaut sous OpenBSD, intégré dans\nle système de base depuis 6.6 !\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl est bien sûr nécessaire qu\u0026rsquo;un agent soit installé, configuré sur la\nmachine à interroger. Sous OpenBSD, c\u0026rsquo;est le service natif \u003ca class=\"tag\" href=\"/fr/tags/snmpd\"\u003esnmpd\u003c/a\u003e\n.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eLa documentation se fait au-travers du manpage, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/snmp\" title=\"Page du Manuel OpenBSD pour : snmp\"\u003esnmp\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cp\u003ePremier aspect qui \u0026ldquo;saute aux yeux\u0026rdquo; est que \u003cstrong\u003esnmp\u003c/strong\u003e est fourni avec un\nensemble de sous-commandes, qui ont leurs propres options.\u003c/p\u003e\n\u003cp\u003ePour information : les \u003cstrong\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eOID \u003cem\u003e(Object Identifier)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/strong\u003e sont des identifiants d\u0026rsquo;objets.\u003c/p\u003e\n\u003ch3 id=\"description-des-sous-commandes\"\u003eDescription des sous commandes\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003esnmp get\u003c/code\u003e pour récupèrer le varbind \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n depuis un agent \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n. \u003cbr\u003e\nIl est possible de spécifier plusieurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnmp getnext\u003c/code\u003e pour récupèrer le varbind qui suit l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n requis. \u003cbr\u003e\nIl est aussi possible d\u0026rsquo;en spécifier plusieurs.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnmp walk\u003c/code\u003e récupère toutes les branches d\u0026rsquo;un \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnmp bulkget\u003c/code\u003e récupère les 10 prochains varbind suivant chaque \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnmp bulkwalk\u003c/code\u003e récupère tous les varbind qui sont des branches de l\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnmp set\u003c/code\u003e permet de définir un ou plusieurs varoid, ainsi que son format de\ntype de données.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnmp trap\u003c/code\u003e envoie un message de capture à un agent.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esnmp mibtree\u003c/code\u003e permet de faire un dump \u003cem\u003e(une sauvegarde)\u003c/em\u003e de l\u0026rsquo;arborescence\ndes objets compilés au format MIB.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes deux sous commandes \u003ccode\u003ebulk*\u003c/code\u003e, ainsi que \u003ccode\u003etrap\u003c/code\u003e ne sont fonctionnelles\nqu\u0026rsquo;à partir de \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nv2.\u003c/p\u003e\n\u003cp\u003ePour info, la sous commande \u003ccode\u003eget\u003c/code\u003e est aussi utile pour récupèrer les\nmessages d\u0026rsquo;erreurs.\u003c/p\u003e\n\u003ch3 id=\"snmp-v1\"\u003eSNMP v1\u003c/h3\u003e\n\u003cp\u003eOui, c\u0026rsquo;est possible ; mais du fait que c\u0026rsquo;est une version \u0026ldquo;historique\u0026rdquo;,\nqu\u0026rsquo;il n\u0026rsquo;est plus recommandé de l\u0026rsquo;utiliser, passons à la suite…\u003c/p\u003e\n\u003ch3 id=\"snmp-v2\"\u003eSNMP v2\u003c/h3\u003e\n\u003cp\u003eIl n\u0026rsquo;y a pas de réelle sécurité avec SNMPv2. Elle se base principalement\nsur l\u0026rsquo;option \u003ccode\u003ecommunity\u003c/code\u003e et les deux options \u003ccode\u003eread-*\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -v 2c -c public \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e sysDescr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet exemple nous montre l\u0026rsquo;interrogation d\u0026rsquo;un agent sur le protocole \u003ccode\u003ev2c\u003c/code\u003e\nfaisant partie de la communauté \u003ccode\u003epublic\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eUn petit mot sur l\u0026rsquo;option \u003ccode\u003ecommunity\u003c/code\u003e, ne cherchez pas à la faire fonctionner\navec \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nv3, elle a été supprimée du protocole.\u003c/p\u003e\n\u003ch3 id=\"snmp-v3\"\u003eSNMP v3\u003c/h3\u003e\n\u003cp\u003eLes options principales sont :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e-A\u003c/code\u003e spécifie le mot de passe utilisateur de l\u0026rsquo;agent à interroger.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-a\u003c/code\u003e spécifie le protocole de chiffrement lié à l\u0026rsquo;option \u003ccode\u003e-A\u003c/code\u003e.\n\u003cul\u003e\n\u003cli\u003ePar défaut, l\u0026rsquo;option \u003ccode\u003e-a\u003c/code\u003e est paramétrée sur \u003ccode\u003eMD5\u003c/code\u003e. \u003cbr\u003e\n\u003cem\u003eAttention, l\u0026rsquo;option équivalente pour le service snmpd \u003ccode\u003ehmac\u003c/code\u003e est,\nelle, basée sur \u003ccode\u003ehmac-sha1\u003c/code\u003e. Donc, dans le cas d\u0026rsquo;un agent SNMPd\nfonctionant sous OpenBSD configuré par défaut à interroger, il faudra\nveiller à spécifier \u003ccode\u003eSHA1\u003c/code\u003e\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-l\u003c/code\u003e spécifie le niveau de sécurité. Par défaut, la valeur est \u003ccode\u003enoAuthNoPriv\u003c/code\u003e.\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eauthNoPriv\u003c/code\u003e est requise par l\u0026rsquo;une des deux options \u003ccode\u003e-A\u003c/code\u003e ou \u003ccode\u003e-k\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eauthPriv\u003c/code\u003e est requise par l\u0026rsquo;une des deux options \u003ccode\u003e-K\u003c/code\u003e ou \u003ccode\u003e-X\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-u\u003c/code\u003e spécifie le nom de l\u0026rsquo;utilisateur\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-v\u003c/code\u003e spécifie la version du protocole SNMP utilisé\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-X\u003c/code\u003e spécifie le mot de passe de confidentialité de l\u0026rsquo;utilisateur\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003e-x\u003c/code\u003e spécifie le protocole de chiffrement de confidentialité. Les options\nsont \u003ccode\u003edes\u003c/code\u003e ou \u003ccode\u003eaes\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eCes options sont utiles voire nécessaires pour faire de\nl\u0026rsquo;\u003ca href=\"/fr/sys/openbsd/snmp/#authentification-forte\"\u003eauthentification dite forte\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIl y a bien sûr d\u0026rsquo;autres options possibles :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ecertaines ne sont pas nécessaires d\u0026rsquo;être généralement spécifiées,\nc\u0026rsquo;est le cas de \u003ccode\u003e-E\u003c/code\u003e, \u003ccode\u003e-e\u003c/code\u003e,  \u003ccode\u003e-n\u003c/code\u003e, \u003ccode\u003e-Z\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eles options \u003ccode\u003e-K\u003c/code\u003e, \u003ccode\u003e-k\u003c/code\u003e \u003cem\u003e(ces deux dernières options sont l\u0026rsquo;équivalent\ndes options \u003ccode\u003e-A\u003c/code\u003e et \u003ccode\u003e-X\u003c/code\u003e mais encodées sous forme hexadécimale)\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003ecertaines sont spécifiques à l\u0026rsquo;usage des sous commandes \u003ccode\u003ebulk*\u003c/code\u003e, \u003ccode\u003ewalk\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003epour finir, il est possible de cibler les protocoles réseaux que sont\n\u003ccode\u003eudp\u003c/code\u003e, \u003ccode\u003etcp\u003c/code\u003e, (et leur équivalent IPv6 : \u003ccode\u003eupd6\u003c/code\u003e et \u003ccode\u003etcp6\u003c/code\u003e) ou \u003ccode\u003eunix\u003c/code\u003e.\nLes adresses IPv6 doivent être mises entre crochets \u003ccode\u003e{ }\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLire le manpage \n\u003ca class=\"man\" href=\"https://man.openbsd.org/snmp\" title=\"Page du Manuel OpenBSD pour : snmp\"\u003esnmp\u003c/a\u003e\n pour en savoir plus sur l\u0026rsquo;utilité des\nces options.\u003c/p\u003e\n\u003cp\u003eCi-dessous, retrouvez quelques exemples d\u0026rsquo;utilisation avec le protocole\nSNMPv3. Il est bien entendu que nous n\u0026rsquo;abordons pas la partie de la\nconfiguration de l\u0026rsquo;agent interrogé. Sous \u003ca class=\"tag\" href=\"/fr/tags/openbsd\"\u003eOpenBSD\u003c/a\u003e\n, la\nconfiguration d\u0026rsquo;un agent \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n se fait par le biais du service\n\u003ca class=\"tag\" href=\"/fr/tags/snmpd\"\u003eSNMPd\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eDans chaque cas, les paramètres utilisés sont liés à ceux configurés dans\nle service SNMPd.\u003c/p\u003e\n\u003ch3 id=\"sans-authentification\"\u003eSans authentification\u003c/h3\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;test\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e sysDescr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans cet exemple, nous interrogeons l\u0026rsquo;agent avec un nom d\u0026rsquo;utilisateur\nnommé \u003ccode\u003etest\u003c/code\u003e, sans aucun niveau de sécurité.\u003c/p\u003e\n\u003ch3 id=\"authentification-simple\"\u003eAuthentification simple\u003c/h3\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -A \u003cspan style=\"color:#48b685\"\u003e\u0026#34;secret007\u0026#34;\u003c/span\u003e -a SHA -l authNoPriv -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;uauth\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 192.168.1.3 sysdescr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIci, nous interrogeons l\u0026rsquo;agent ayant pour adresse \u003ccode\u003e192.168.1.3\u003c/code\u003e avec un\nnom utilisateur \u003ccode\u003euauth\u003c/code\u003e , une clé d\u0026rsquo;authentification \u003ccode\u003esecret007\u003c/code\u003e et un\nniveau de sécurité spécifié à \u003ccode\u003eauthNoPriv\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"authentification-forte\"\u003eAuthentification forte\u003c/h3\u003e\n\u003cp\u003eQuelques mots sur l\u0026rsquo;authentification forte : elle est à favoriser\nIMPÉRATIVEMENT !\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -A \u003cspan style=\"color:#48b685\"\u003e\u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34;\u003c/span\u003e -a SHA-512 -l authPriv -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;uenc\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e -X \u003cspan style=\"color:#48b685\"\u003e\u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34;\u003c/span\u003e -x aes \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e sysdescr\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans cet exemple, nous interrogeons localement l\u0026rsquo;agent,\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eavec un utilisateur nommé \u003ccode\u003euenc\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eune clé d\u0026rsquo;authentification \u0026ldquo;\u003ccode\u003ezx4pyrfyeu5x5c3kxqirhtsxksbmawju\u003c/code\u003e\u0026rdquo; basée\nsur le protocole de chiffrement \u003ccode\u003eSHA-512\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eun niveau de sécurité sur \u003ccode\u003eauthPriv\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003ele mot de passe de l\u0026rsquo;utilisateur \u0026ldquo;\u003ccode\u003eXHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u003c/code\u003e\u0026rdquo;\nbasé sur le protocole de chiffrement \u003ccode\u003eaes\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"erreur--usmstatsdecryptionerrors0\"\u003eErreur : \u003ccode\u003eusmStatsDecryptionErrors.0\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eLe protocole de chiffrement que vous utilisez n\u0026rsquo;est pas celui attendu\npar l\u0026rsquo;agent interrogé. Corrigez la valeur de votre option \u003ccode\u003e-x\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"erreur--usmstatsunsupportedseclevels0\"\u003eErreur : \u003ccode\u003eusmStatsUnsupportedSecLevels.0\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eLe niveau de sécurité que vous cherchez à utiliser n\u0026rsquo;est pas celui attendu\npar l\u0026rsquo;agent interrogé. Corrigez la valeur de votre option \u003ccode\u003e-l\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"erreur--usmstatswrongdigests0\"\u003eErreur : \u003ccode\u003eusmStatsWrongDigests.0\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eLe protocole de chiffrement que vous utilisez n\u0026rsquo;est pas celui attendu\npar l\u0026rsquo;agent interrogé. Corrigez la valeur de votre option \u003ccode\u003e-a\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"message----no-such-object-available-on-this-agent-at-this-oid\"\u003eMessage : \u003ccode\u003e*** = No Such Object available on this agent at this OID\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eVous essayez de parcourir un arbre avec la sous commande \u003ccode\u003eget\u003c/code\u003e,\nn\u0026rsquo;est-ce pas !? \u003cbr\u003e\nAlors, soit vous recommencez en :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eutilisant la sous commande \u003ccode\u003ewalk\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eprécisant un \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n particulier\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"message--received-report\"\u003eMessage : \u003ccode\u003eReceived report:\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eVous venez de parcourir un arbre avec la sous commande \u003ccode\u003ewalk\u003c/code\u003e, et vous\navez pour retour juste ce message \u003ccode\u003eReceived report:\u003c/code\u003e sans rien de plus.\u003c/p\u003e\n\u003cp\u003eUtilisez la sous commande \u003ccode\u003eget\u003c/code\u003e à la place, cela vous permettra d\u0026rsquo;obtenir\nle message d\u0026rsquo;erreur adéquat.\u003c/p\u003e\n\u003ch3 id=\"message--snmp-invalid-privacy-protocol-specified-after--3x-flag\"\u003eMessage : \u003ccode\u003esnmp: Invalid privacy protocol specified after -3x flag:\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eLe niveau du protocole de sécurité que vous avez spécifié est incorrect.\nCorrigez la valeur de votre option \u003ccode\u003e-l\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"message--snmp--unknown-object-identifier\"\u003eMessage : \u003ccode\u003esnmp: ***: Unknown object identifier\u003c/code\u003e\u003c/h3\u003e\n\u003cp\u003eVous avez spécifié un \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n inconnu. Vérifiez et corrigez\nl\u0026rsquo;\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Object Identifier\"\u003eOID\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n recherché.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment activer et configurer le client SNMP sous OpenBSD, et si possible le faire de façon sécurisé",
            "tags": ["OpenBSD", "snmp"],
            "date_published": "2019-11-21T16:03:44+01:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:91303d95-cb1a-7999-0ab5-ee5bef625431",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/openbsd-snmpd/",
            "title": "Snmpd : Monitorer OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description OpenBSD intègre par défaut dans le système de base snmpd qui est le démon du service SNMP (Simple Network Management Protocol) .\nOpenBSD : 6.6 Service : snmpd Documentation La documentation se fait au-travers des différents manpages, tels que :\nsnmpd(8) snmpd.conf(5) Configuration La configuration du serveur snmpd se fait, à minima, au-travers d\u0026rsquo;un seul fichier de configuration, à créer : /etc/snmpd.conf.\nIl existe trois versions du protocol :\nla v1 est l\u0026rsquo;historique à ne plus utiliser ; la v2 apporte des prémices de sécurité ; la v3 est la plus sécurisante, néanmoins, il faut utiliser les niveaux de sécurité et de chiffrement les plus forts. (Pour info, dans certaines conditions, la v3 est aussi faillible et sujette à vulnérabilités). Après avoir écrit le fichier de configuration, il faut donner les droits d\u0026rsquo;exécution adéquates et utilisateur au fichier de configuration :\n:# chown root:_snmpd /etc/snmpd.conf :# chmod 0600 /etc/snmpd.conf Configuration Globale Plusieurs options peuvent être paramétrées :\nfilter-routes (yes|no): permet au noyau de filter les messages de mise à jour des routes dans le socket.\nlisten on address [tcp|udp]: spécifie l\u0026rsquo;adresse locale qui doit écouter les messages SNMP entrants. Il est possible de la spécifier plusieurs fois. Les deux protocoles TCP (Transfer Control Protocol) et UDP (User Datagram Protocol) sont gérés.\nread-only : spécifie la communauté autorisée en lecture seule. Par défaut, la valeur est public\nread-write (community string | disabled) : Soit spécifie la communauté autorisée en lecture et écriture, soit désactive l\u0026rsquo;écrite définitivement. Par défaut, la valeur est private\nseclevel : spécifie le niveau le plus bas de sécurité que snmpd(8) accepte. Par défault, la valeur est none. Si l\u0026rsquo;une des deux autres options auth ou enc est choisie, snmpd(8) n\u0026rsquo;acceptera que les requêtes SNMPv3. enc oblige à ce que les messages soient chiffrés et une authentification valide, autrement ils seront supprimés.\nIl existe aussi l\u0026rsquo;option socket, les différentes options system et celles relatives à trap. Je renvoie au manpage ;)\nLes deux options read_* ne servent QUE pour une configuration SNMP v2.\nMacros Des macros peuvent être définies. Considérez-les comme des variables. On ne peut utiliser des mots clés réservés. Elles commencent forcément par une lettre, un chiffre ou le symbole \u0026lsquo;_ \u0026rsquo; suivi de tout autre caractère.\nConfiguration des utilisateurs Avec SNMP v3, Il est possible de définir plusieurs utilisateurs par le biais de l\u0026rsquo;option user, tel que :\nuser name authkey key auth hmac enckey key enc cipher\nauthkey est requis pour authentifier les messages en spécifiant une clé. Si la clé est omise, pas d\u0026rsquo;authentification.\nauth hmac permet de cibler l\u0026rsquo;algorithme HMAC à utiliser. Par défaut, la valeur est hmac-sha1. La valeur la plus forte est hmac-sha512.\nenckey key est la clé de chiffrement utilisé pour chiffrer et déchiffrer les messages dans un soucis de confidentialité. Sans, le compte utilisateur n\u0026rsquo;acceptera jamais l\u0026rsquo;entrée des messages ou ne chiffrera pas les messages sortants.\nenc cipher est l\u0026rsquo;algorithme utilisé. Par défaut, sa valeur est des. Sa valeur la plus forte est aes.\nIl faut bien comprendre que le nom de l\u0026rsquo;utilisateur, les caractères donnant la valeur des clés key sont des choix purement arbitraires. À vous de les spécifier…\nConfiguration des OID Les OID sont les identifiants des objets. Je renvoie au manpage, si besoin de les gérer.\nUtilisation Le service se nomme logiquement : snmpd L\u0026rsquo;option de test de configuration : -n Ainsi la commande snmpd -n permettra de s\u0026rsquo;assurer de la validité de l\u0026rsquo;ensemble de la configuration, à tout moment.\nÀ chaque modification du fichier de configuration, il faudra relancer le service ad hoc.\nSNMP v2 Pour débuter, commençons par :\nlisten on 192.168.1.3 udp read-only community macompub read-write community macompriv À minima, nous n\u0026rsquo;avons besoin de rien de plus. C\u0026rsquo;est très basique et permet de tester/s\u0026rsquo;assurer du bon fonctionnement, de la bonne compréhension.\nTestons la réponse :\n:$ snmp walk -v 2c -c macompub $(hostname) sysDescr sysDescr.0 = STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64 :$ snmp walk -v 2c -c macompub $(hostname) ifName ifName.1 = STRING: em0 ifName.2 = STRING: enc0 ifName.3 = STRING: lo0 ifName.4 = STRING: pflog0 Ce sont des exemples d\u0026rsquo;interrogation et réponses.\nSNMP v3 Sans sécurité Commençons avec un exemple sans sécurité :\nseclevel none user \u0026#34;test\u0026#34; Après le rédémarrage du service :\n:$ snmp walk -u \u0026#34;test\u0026#34; -v 3 $(hostname) sysDescr sysDescr.0 = STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64 :$ snmp walk -u \u0026#34;test\u0026#34; -v 3 $(hostname) ifName ifName.1 = STRING: em0 ifName.2 = STRING: enc0 ifName.3 = STRING: lo0 ifName.4 = STRING: pflog0 Utilisateur authentifié seclevel auth user \u0026#34;uauth\u0026#34; authkey \u0026#34;secret007\u0026#34; Après le rédémarrage du service :\n:$ snmp walk -A \u0026#34;secret007\u0026#34; -a SHA -l authNoPriv -u \u0026#34;uauth\u0026#34; -v 3 192.168.47.3 sysdescr sysDescr.0 = STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64 Authentification forte Configurons le serveur par un exemple fort :\nlisten on 192.168.1.3 tcp seclevel enc user \u0026#34;uenc\u0026#34; authkey \u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34; auth hmac-sha512 enckey \u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34; enc aes Après le redémarrage du service :\n:$ snmp walk -A \u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34; -a SHA-512 -l authPriv -u \u0026#34;uenc\u0026#34; -v 3 -X \u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34; -x aes $(hostname) sysdescr sysDescr.0 = STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64 :$ snmp walk -A \u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34; -a SHA-512 -l authPriv -u \u0026#34;uenc\u0026#34; -v 3 -X \u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34; -x aes $(hostname) ifname ifName.1 = STRING: em0 ifName.2 = STRING: enc0 ifName.3 = STRING: lo0 ifName.4 = STRING: pflog0 Gestion du service activation : rcctl enable snmpd démarrage : rcctl start snmpd Après avoir activé et démarré le service, il est possible de vérifier le fonctionnement du service, tel que :\n:$ ps aux | grep snmpd _snmpd 41593 0.0 0.1 772 3124 ?? SU 10:32PM 0:00.07 snmpd: snmpe (snmpd) root 55283 0.0 0.0 820 1492 ?? Ip 10:32PM 0:00.01 /usr/sbin/snmpd _snmpd 42220 0.0 0.1 752 2756 ?? Ip 10:32PM 0:00.02 snmpd: traphandler (snmpd) root 80301 0.0 0.0 332 1256 p0 S+p 10:33PM 0:00.01 grep snmpd :$ netstat -ant | grep snmp 0xfffffd8105572100 stream 0 0 0xfffffd810e7e70e8 0x0 0x0 0x0 /var/run/snmpd.sock Voilà, pour la partie serveur !\nEt les clients ?\nLes clients Depuis OpenBSD 6.6, le client natif est snmp Pour information, il y a sur chaque système OpenBSD, dans le répertoire /usr/share/snmp/mibs/ l\u0026rsquo;ensemble de fichiers MIB qui renferment toutes informations utiles :\n:$ ls -al /usr/share/snmp/mibs/ total 184 drwxr-xr-x 2 root wheel 512 Oct 12 18:34 ./ drwxr-xr-x 3 root wheel 512 Oct 12 18:34 ../ -r--r--r-- 1 root wheel 2331 Oct 12 18:34 OPENBSD-BASE-MIB.txt -r--r--r-- 1 root wheel 8805 Oct 12 18:34 OPENBSD-CARP-MIB.txt -r--r--r-- 1 root wheel 3283 Oct 12 18:34 OPENBSD-MEM-MIB.txt -r--r--r-- 1 root wheel 39486 Oct 12 18:34 OPENBSD-PF-MIB.txt -r--r--r-- 1 root wheel 18559 Oct 12 18:34 OPENBSD-RELAYD-MIB.txt -r--r--r-- 1 root wheel 4635 Oct 12 18:34 OPENBSD-SENSORS-MIB.txt -r--r--r-- 1 root wheel 2547 Oct 12 18:34 OPENBSD-SNMPD-CONF.txt Il peut être utile de les \u0026ldquo;donner à manger\u0026rdquo; aux différents clients des autres systèmes de surveillance/métrologie/monitoring, tel Nagios , Munin , etc…\n",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenBSD\u003c/strong\u003e intègre par défaut dans le système de base \u003cstrong\u003esnmpd\u003c/strong\u003e qui est le\ndémon du service \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSNMP \u003cem\u003e(Simple Network Management Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD : 6.6\u003c/li\u003e\n\u003cli\u003eService : snmpd\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eLa documentation se fait au-travers des différents manpages, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/snmpd.8\" title=\"Page du Manuel OpenBSD pour : snmpd\"\u003esnmpd(8)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/snmpd.conf.5\" title=\"Page du Manuel OpenBSD pour : snmpd.conf\"\u003esnmpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLa configuration du serveur \u003cstrong\u003esnmpd\u003c/strong\u003e se fait, \u003cem\u003eà minima\u003c/em\u003e, au-travers d\u0026rsquo;un seul\nfichier de configuration, à créer : \u003ccode\u003e/etc/snmpd.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl existe trois versions du protocol :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ela v1 est l\u0026rsquo;historique à ne plus utiliser ;\u003c/li\u003e\n\u003cli\u003ela v2 apporte des prémices de sécurité ;\u003c/li\u003e\n\u003cli\u003ela v3 est la plus sécurisante, néanmoins, il faut utiliser les niveaux de\nsécurité et de chiffrement les plus forts. \u003cbr\u003e\n\u003cem\u003e(Pour info, dans certaines conditions, la v3 est aussi faillible et\nsujette à vulnérabilités)\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAprès avoir écrit le fichier de configuration, il faut donner les droits\nd\u0026rsquo;exécution adéquates et utilisateur au fichier de configuration :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown root:_snmpd /etc/snmpd.conf\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chmod \u003cspan style=\"color:#f99b15\"\u003e0600\u003c/span\u003e /etc/snmpd.conf\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"configuration-globale\"\u003eConfiguration Globale\u003c/h3\u003e\n\u003cp\u003ePlusieurs options peuvent être paramétrées :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003efilter-routes\u003c/code\u003e (\u003cstrong\u003eyes\u003c/strong\u003e|\u003cstrong\u003eno\u003c/strong\u003e): permet au noyau de filter les messages de\nmise à jour des routes dans le socket.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003elisten on\u003c/code\u003e \u003cem\u003eaddress\u003c/em\u003e [\u003cstrong\u003etcp\u003c/strong\u003e|\u003cstrong\u003eudp\u003c/strong\u003e]: spécifie l\u0026rsquo;adresse locale qui doit\nécouter les messages \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n entrants. \u003cbr\u003e\n\u003cem\u003eIl est possible de la spécifier plusieurs fois\u003c/em\u003e. Les deux protocoles\n\u003cstrong\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eTCP \u003cem\u003e(Transfer Control Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003c/strong\u003e et \u003cstrong\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eUDP \u003cem\u003e(User Datagram Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\u003c/strong\u003e sont gérés.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eread-only\u003c/code\u003e : spécifie la communauté autorisée en lecture seule. \u003cbr\u003e\nPar défaut, la valeur est \u003ccode\u003epublic\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eread-write\u003c/code\u003e (\u003cstrong\u003ecommunity\u003c/strong\u003e \u003cem\u003estring\u003c/em\u003e | \u003cstrong\u003edisabled\u003c/strong\u003e) : Soit spécifie la\ncommunauté autorisée en lecture et écriture, soit désactive l\u0026rsquo;écrite\ndéfinitivement. \u003cbr\u003e\nPar défaut, la valeur est \u003ccode\u003eprivate\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eseclevel\u003c/code\u003e : spécifie le niveau le plus bas de sécurité que snmpd(8) accepte. \u003cbr\u003e\nPar défault, la valeur est \u003ccode\u003enone\u003c/code\u003e. Si l\u0026rsquo;une des deux autres options \u003ccode\u003eauth\u003c/code\u003e\nou \u003ccode\u003eenc\u003c/code\u003e est choisie, snmpd(8) n\u0026rsquo;acceptera que les requêtes SNMPv3. \u003ccode\u003eenc\u003c/code\u003e\noblige à ce que les messages soient chiffrés et une authentification valide,\nautrement ils seront supprimés.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIl existe aussi l\u0026rsquo;option \u003ccode\u003esocket\u003c/code\u003e, les différentes options \u003ccode\u003esystem\u003c/code\u003e et celles\nrelatives à \u003ccode\u003etrap\u003c/code\u003e. Je renvoie au manpage ;)\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes deux options \u003ccode\u003eread_*\u003c/code\u003e ne servent QUE pour une configuration \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n v2.\u003c/p\u003e\n\u003ch3 id=\"macros\"\u003eMacros\u003c/h3\u003e\n\u003cp\u003eDes macros peuvent être définies. Considérez-les comme des variables. On ne\npeut utiliser des mots clés réservés. Elles commencent forcément par une lettre,\nun chiffre ou le symbole \u0026lsquo;\u003ccode\u003e_\u003c/code\u003e \u0026rsquo; suivi de tout autre caractère.\u003c/p\u003e\n\u003ch3 id=\"configuration-des-utilisateurs\"\u003eConfiguration des utilisateurs\u003c/h3\u003e\n\u003cp\u003eAvec \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cabbr lang=\"en\" title=\"Simple Network Management Protocol\"\u003eSNMP\u003c/abbr\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nv3, Il est possible de définir plusieurs utilisateurs\npar le biais de\nl\u0026rsquo;option \u003ccode\u003euser\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003euser\u003c/code\u003e \u003cem\u003ename\u003c/em\u003e \u003cstrong\u003eauthkey\u003c/strong\u003e \u003cem\u003ekey\u003c/em\u003e \u003cstrong\u003eauth\u003c/strong\u003e \u003cem\u003ehmac\u003c/em\u003e \u003cstrong\u003eenckey\u003c/strong\u003e \u003cem\u003ekey\u003c/em\u003e \u003cstrong\u003eenc\u003c/strong\u003e \u003cem\u003ecipher\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eauthkey\u003c/code\u003e est requis pour authentifier les messages en spécifiant une clé.\nSi la clé est omise, pas d\u0026rsquo;authentification.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eauth\u003c/code\u003e \u003cem\u003ehmac\u003c/em\u003e permet de cibler l\u0026rsquo;algorithme HMAC à utiliser. \u003cbr\u003e\nPar défaut, la valeur est \u003ccode\u003ehmac-sha1\u003c/code\u003e. La valeur la plus forte est\n\u003ccode\u003ehmac-sha512\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eenckey\u003c/code\u003e \u003cem\u003ekey\u003c/em\u003e est la clé de chiffrement utilisé pour chiffrer et\ndéchiffrer les messages dans un soucis de confidentialité. Sans,\nle compte utilisateur n\u0026rsquo;acceptera jamais l\u0026rsquo;entrée des messages ou ne\nchiffrera pas les messages sortants.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003ccode\u003eenc\u003c/code\u003e \u003cem\u003ecipher\u003c/em\u003e est l\u0026rsquo;algorithme utilisé. \u003cbr\u003e\nPar défaut, sa valeur est \u003ccode\u003edes\u003c/code\u003e. Sa valeur la plus forte est \u003ccode\u003eaes\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIl faut bien comprendre que le nom de l\u0026rsquo;utilisateur, les caractères donnant la\nvaleur des clés \u003ccode\u003ekey\u003c/code\u003e sont des choix purement arbitraires. À vous de les\nspécifier…\u003c/p\u003e\n\u003ch3 id=\"configuration-des-oid\"\u003eConfiguration des OID\u003c/h3\u003e\n\u003cp\u003eLes \u003cstrong\u003eOID\u003c/strong\u003e sont les identifiants des objets. Je renvoie au manpage, si besoin\nde les gérer.\u003c/p\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe service se nomme logiquement : \u003ccode\u003esnmpd\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;option de test de configuration : \u003ccode\u003e-n\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAinsi la commande \u003ccode\u003esnmpd -n\u003c/code\u003e permettra de s\u0026rsquo;assurer de la validité de l\u0026rsquo;ensemble\nde la configuration, à tout moment.\u003c/p\u003e\n\u003cp\u003eÀ chaque modification du \u003ca href=\"/fr/monitor/openbsd-snmpd/#configuration\"\u003efichier de configuration\u003c/a\u003e, il faudra\nrelancer le service ad hoc.\u003c/p\u003e\n\u003ch3 id=\"snmp-v2\"\u003eSNMP v2\u003c/h3\u003e\n\u003cp\u003ePour débuter, commençons par :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elisten on 192.168.1.3 udp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eread-only community macompub\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eread-write community macompriv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eÀ minima, nous n\u0026rsquo;avons besoin de rien de plus. C\u0026rsquo;est très basique et permet de\ntester/s\u0026rsquo;assurer du bon fonctionnement, de la bonne compréhension.\u003c/p\u003e\n\u003cp\u003eTestons la réponse :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -v 2c -c macompub \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e sysDescr\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esysDescr.0 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -v 2c -c macompub \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e ifName\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: em0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: enc0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.3 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: lo0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.4 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: pflog0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe sont des exemples d\u0026rsquo;interrogation et réponses.\u003c/p\u003e\n\u003ch3 id=\"snmp-v3\"\u003eSNMP v3\u003c/h3\u003e\n\u003ch4 id=\"sans-sécurité\"\u003eSans sécurité\u003c/h4\u003e\n\u003cp\u003eCommençons avec un exemple sans sécurité :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eseclevel none\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003euser \u0026#34;test\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAprès le rédémarrage du service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;test\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e sysDescr\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esysDescr.0 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;test\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e ifName\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: em0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: enc0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.3 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: lo0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.4 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: pflog0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"utilisateur-authentifié\"\u003eUtilisateur authentifié\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eseclevel auth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003euser \u0026#34;uauth\u0026#34; authkey \u0026#34;secret007\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAprès le rédémarrage du service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -A \u003cspan style=\"color:#48b685\"\u003e\u0026#34;secret007\u0026#34;\u003c/span\u003e -a SHA -l authNoPriv -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;uauth\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 192.168.47.3 sysdescr\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esysDescr.0 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"authentification-forte\"\u003eAuthentification forte\u003c/h4\u003e\n\u003cp\u003eConfigurons le serveur par un exemple fort :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elisten on 192.168.1.3 tcp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eseclevel enc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003euser \u0026#34;uenc\u0026#34; authkey \u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34; auth hmac-sha512 enckey \u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34; enc aes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAprès le redémarrage du service :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -A \u003cspan style=\"color:#48b685\"\u003e\u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34;\u003c/span\u003e -a SHA-512 -l authPriv -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;uenc\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e -X \u003cspan style=\"color:#48b685\"\u003e\u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34;\u003c/span\u003e -x aes \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e sysdescr\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003esysDescr.0 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: OpenBSD omv.huc.fr.eu.org 6.6 GENERIC.MP#2 amd64\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ snmp walk -A \u003cspan style=\"color:#48b685\"\u003e\u0026#34;zx4pyrfyeu5x5c3kxqirhtsxksbmawju\u0026#34;\u003c/span\u003e -a SHA-512 -l authPriv -u \u003cspan style=\"color:#48b685\"\u003e\u0026#34;uenc\u0026#34;\u003c/span\u003e -v \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e -X \u003cspan style=\"color:#48b685\"\u003e\u0026#34;XHVBzYUpP8dKns75BaSwq6t7SUgF6oMz\u0026#34;\u003c/span\u003e -x aes  \u003cspan style=\"color:#815ba4\"\u003e$(\u003c/span\u003ehostname\u003cspan style=\"color:#815ba4\"\u003e)\u003c/span\u003e  ifname\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.1 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: em0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.2 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: enc0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.3 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: lo0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eifName.4 \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e STRING: pflog0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"gestion-du-service\"\u003eGestion du service\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eactivation : \u003ccode\u003ercctl enable snmpd\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003edémarrage : \u003ccode\u003ercctl start snmpd\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAprès avoir activé et démarré le service, il est possible de vérifier le\nfonctionnement du service, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ps aux | grep snmpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_snmpd   \u003cspan style=\"color:#f99b15\"\u003e41593\u003c/span\u003e  0.0  0.1   \u003cspan style=\"color:#f99b15\"\u003e772\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e3124\u003c/span\u003e ??  SU     10:32PM    0:00.07 snmpd: snmpe \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esnmpd\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot     \u003cspan style=\"color:#f99b15\"\u003e55283\u003c/span\u003e  0.0  0.0   \u003cspan style=\"color:#f99b15\"\u003e820\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e1492\u003c/span\u003e ??  Ip     10:32PM    0:00.01 /usr/sbin/snmpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e_snmpd   \u003cspan style=\"color:#f99b15\"\u003e42220\u003c/span\u003e  0.0  0.1   \u003cspan style=\"color:#f99b15\"\u003e752\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e2756\u003c/span\u003e ??  Ip     10:32PM    0:00.02 snmpd: traphandler \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003esnmpd\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eroot     \u003cspan style=\"color:#f99b15\"\u003e80301\u003c/span\u003e  0.0  0.0   \u003cspan style=\"color:#f99b15\"\u003e332\u003c/span\u003e  \u003cspan style=\"color:#f99b15\"\u003e1256\u003c/span\u003e p0  S+p    10:33PM    0:00.01 grep snmpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ netstat -ant | grep snmp\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e0xfffffd8105572100 stream      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e      \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e 0xfffffd810e7e70e8                0x0                0x0                0x0 /var/run/snmpd.sock\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVoilà, pour la partie serveur !\u003c/p\u003e\n\u003cp\u003eEt les clients ?\u003c/p\u003e\n\u003ch3 id=\"les-clients\"\u003eLes clients\u003c/h3\u003e\n\u003cp\u003eDepuis OpenBSD 6.6, le client natif est \n\u003ca class=\"man\" href=\"https://man.openbsd.org/snmp\" title=\"Page du Manuel OpenBSD pour : snmp\"\u003esnmp\u003c/a\u003e\n\u003c/p\u003e\n\u003cp\u003ePour information, il y a sur chaque système OpenBSD, dans le répertoire\n\u003ccode\u003e/usr/share/snmp/mibs/\u003c/code\u003e l\u0026rsquo;ensemble de fichiers MIB qui renferment toutes\ninformations utiles :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ls -al /usr/share/snmp/mibs/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etotal \u003cspan style=\"color:#f99b15\"\u003e184\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e root  wheel    \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 ./\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e root  wheel    \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 ../\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-r--r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel   \u003cspan style=\"color:#f99b15\"\u003e2331\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 OPENBSD-BASE-MIB.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-r--r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel   \u003cspan style=\"color:#f99b15\"\u003e8805\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 OPENBSD-CARP-MIB.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-r--r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel   \u003cspan style=\"color:#f99b15\"\u003e3283\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 OPENBSD-MEM-MIB.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-r--r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel  \u003cspan style=\"color:#f99b15\"\u003e39486\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 OPENBSD-PF-MIB.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-r--r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel  \u003cspan style=\"color:#f99b15\"\u003e18559\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 OPENBSD-RELAYD-MIB.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-r--r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel   \u003cspan style=\"color:#f99b15\"\u003e4635\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 OPENBSD-SENSORS-MIB.txt\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-r--r--r--  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e root  wheel   \u003cspan style=\"color:#f99b15\"\u003e2547\u003c/span\u003e Oct \u003cspan style=\"color:#f99b15\"\u003e12\u003c/span\u003e 18:34 OPENBSD-SNMPD-CONF.txt\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIl peut être utile de les \u0026ldquo;donner à manger\u0026rdquo; aux différents clients des autres\nsystèmes de surveillance/métrologie/monitoring, tel \u003ca class=\"tag\" href=\"/fr/tags/nagios\"\u003eNagios\u003c/a\u003e\n,\n\u003ca class=\"tag\" href=\"/fr/tags/munin\"\u003eMunin\u003c/a\u003e\n, etc…\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment mettre en place le service de monitoring SNMPd sous OpenBSD",
            "tags": ["OpenBSD", "snmpd", "snmp", "serveur", "supervision"],
            "date_published": "2019-11-20T22:43:39+01:00",
            "date_modified": "2019-11-21T16:00:00+01:00"
        },{
            "id": "urn:uuid:5ad46ece-de32-b042-237c-99eae21ada94",
            "url": "http://doc.huc.fr.eu.org/fr/web/httpd/httpd/",
            "title": "httpd : présentation du serveur HTTP d'OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OpenBSD intègre par défaut dans le système de base un serveur web, nommé httpd, depuis 5.7.\nC\u0026rsquo;est un serveur qui se veut sécurisé, tant par le fonctionnement chrooté que par la séparation des privilèges, l\u0026rsquo;usage de chiffrements forts, de courbes elliptiques, et autres paramétres forts pour TLS , par défaut.\nhttpd est un serveur HTTP de fichiers statiques, qui supporte les appels directs ou asynchrones FastCGI (soit par socket Unix - c\u0026rsquo;est mieux -, soit par TCP /IP ). Il est bien sûr possible de gérer les connexions TLS, via la bibliothèque LibreSSL, et fonctionne sur la double couche de protocole IPv4 et IPv6.\nUne configuration flexible d\u0026rsquo;hôtes virtuels est possible, soit par nom d\u0026rsquo;hôte, soit par adresse IP.\nEnfin, la journalisation se fait soit via syslog, soit par des journaux d\u0026rsquo;accès et d\u0026rsquo;erreurs dédiés aux différents hôtes virtuels.\nCe que ne gère pas httpd :\nles entêtes HTTP.\nl\u0026rsquo;URL Rewriting ?\nQuoi d\u0026rsquo;autres ?!\nSite web : https://bsd.plumbing/\nConfiguration La configuration du serveur httpd se fait, à minima, au-travers d\u0026rsquo;un seul fichier de configuration, à créer : /etc/httpd.conf.\nExemple :\nprefork 3 types { include \u0026#34;/usr/share/misc/mime.types\u0026#34; } server \u0026#34;adr_ip\u0026#34; { … } La configuration d\u0026rsquo;hôte virtuel, étant à envisager, il est préférable de créer un fichier par hôte et de l\u0026rsquo;inclure dans le fichier de configuration par le biais du mot clé include.\nConfiguration Globale Voici les paramètres de niveau global :\nchroot : spécifie le répertoire chroot(2) . S\u0026rsquo;il n\u0026rsquo;est pas spécifié, il a pour valeur /var/www/ qui est le répertoire home de l\u0026rsquo;utilisateur web www. default type : spécifie les types de média utilisés pour une extension donnée ou un type de fichier. S\u0026rsquo;il n\u0026rsquo;est pas spécifié, le type par défaut est application/octect-stream. logdir : spécifie le répertoire où les journaux seront écrits. Par défaut, il fait référence au répertoire enfant logs/ à l\u0026rsquo;intérieur du chroot. prefork : le nombre de processus du serveur. Par défaut, httpd utilise 3 processus serveur. Augmenter cette valeur améliore la performance et prévient les délais de connexion au serveur. Macros Des macros peuvent être définies. Considérez-les comme des variables. On ne peut utiliser des mots clés réservés. Elles commencent forcément par une lettre, un chiffre ou le symbole \u0026lsquo;_ \u0026rsquo; suivi de tout autre caractère.\nExemple :\nip_ext=\u0026#34;10.0.0.1\u0026#34; server \u0026#34;default\u0026#34; { listen on $ip_ext port 80 … } Dans cet exemple, la macro est la variable ip_ext ; sa valeur étant 10.0.0.1.\nLes Hôtes Virtuels La gestion des hôtes virtuels se fait dans chaque section server, en déclarant le nom du serveur entre double-quotes.\nPour plus d\u0026rsquo;informations, lire la section SERVERS du manpage httpd.conf(5).\nLes Types Médias La section types configure les types de média supportés. Si rien n\u0026rsquo;est spécifié, par défaut, httpd gére les types de média pour :\ntext/css, text/html, text/plain image/gif, image/jpeg, image/png, image/svg+xml ainsi qu\u0026rsquo;application/javascript. Exemple :\ntypes { include \u0026#34;usr/share/misc/mime.types\u0026#34; } ou\ntypes { text/css css text/html html htm text/plain txt image/gif gif image/jpeg jpeg jpg image/png png application/javascript js application/xml xml } Avant de chercher à ajouter un nouveau type, assurez-vous qu\u0026rsquo;il ne soit pas déjà inclus dans le fichier /usr/share/misc/mimes.types ; si ce n\u0026rsquo;est pas le cas, ajoutez-le en suivant.* Utilisation Le service se nomme logiquement : httpd L\u0026rsquo;option de test de configuration : -n Ainsi la commande httpd -n permettra de s\u0026rsquo;assurer de la validité de l\u0026rsquo;ensemble de la configuration, à tout moment.\nPar convention/préférence, il est intéressant de créer un répertoire /etc/httpd.d/ dans lequel sera écrit les configurations serveurs des hôtes virtuels, tel que :\n:# mkdir -p /etc/httpd.d Modification du fichier de configuration /etc/httpd.conf :\ntypes { include \u0026#34;usr/share/misc/mime.types\u0026#34; } Puis utilisez le mot clé include pour ajouter la configuration d\u0026rsquo;un hôte virtuel au fur et à mesure des besoins, tel que\ninclude \u0026#34;etc/httpd.d/nom-de-domaine.conf\u0026#34; Gestion des logs La gestion des logs est intéressante.\nVous ne voulez pas de log, indiquez no log dans votre section server. Vous pouvez demander à syslog(3) d\u0026rsquo;enregistrer la journalisation, en lieu et place des journaux individualisés. Spécifiez tout simplement : log syslog Vous pouvez invoquer individuellement les logs d\u0026rsquo;accès ou d\u0026rsquo;erreur, tel que : log access \u0026#34;nom-fichier-acces.log\u0026#34; log error \u0026#34;nom-fichier-erreurs.log\u0026#34; Néanmoins, sachez qu\u0026rsquo;il est possible d\u0026rsquo;intégrer les différentes options entre crochets, tel que :\nlog { access \u0026#34;nom-fichier-acces.log\u0026#34; error \u0026#34;nom-fichier-erreurs.log } Et, pour finir, vous pouvez y intégrer l\u0026rsquo;option style qui va vous permettre de définir le style de journalisation désiré, tel que :\ncommon ou combined : ces deux styles imitent le format de journalisation des standards des serveurs web Apache ou nginx. common est le type par défaut, si aucun n\u0026rsquo;est spécifié. forwarded étend le style combined en ajoutant deux champs d\u0026rsquo;information contenant la valeur des entêtes X-Forwarded-For et X-Forwarded-Port (respectivement, la première doit retourner l\u0026rsquo;adresse ip du client, la seconde celle du port de connexion sur le serveur). Intéressant quand httpd est derrière un proxy web, tel nginx ou relayd. connection imite le format de journalisation du serveur relayd(8) . Chaque entrée du journal est un résumé de chaque connexion qui peut contenir de multiples requêtes. Authentification Web httpd peut faire de l\u0026rsquo;authentification web.\nDans un premier temps, il faut utiliser l\u0026rsquo;outil htpasswd(5) , (accessible nativement depuis OpenBSD 5.6), tel que :\n:# cd /var/www/ :# htpasswd nom-fichier identifiant Password: Retype Password: Par mesure de sécurité, ensuite, attribuez-lui des droits en exécution 0400, accessible rien que par l\u0026rsquo;utilisateur web www.\nPuis ensuite dans une des directives location ou server, ajoutez ce qui ressemble à :\nauthenticate \u0026#34;! Acces sous Restriction !\u0026#34; with \u0026#34;/nom-fichier\u0026#34; PHP-FPM DangerAttention, si vous mettez en place PHP et permettez la connexion en clair, sur le protocole HTTP, il est recommandé fortement de mettre en frontal relayd afin de lutter contre la faille Httpoxy ! Pour autant que vous avez installer PHP sur le serveur, httpd peut servir du contenu PHP, par le biais de la directive location, tel que :\nExemple :\nlocation \u0026#34;*.php\u0026#34; { fastcgi socket \u0026#34;/run/php-fpm.sock\u0026#34; } Il est nécessaire que le socket FastCGI corresponde bien à celui de PHP-FPM.\nSlowcgi DangerAttention, si vous mettez en place CGI et permettez la connexion en clair, sur le protocole HTTP, il est recommandé fortement de mettre en frontal relayd afin de lutter contre la faille Httpoxy ! slowcgi(8) est un serveur FastCGI de connexion CGI , lui aussi intégré dans le système de base d\u0026rsquo;OpenBSD, depuis la version 5.4.\nhttpd peut servir du contenu CGI, disponible depuis le répertoire enfant cgi-bin/ du chroot web, par le biais de la directive location, tel que :\nExemple :\nlocation \u0026#34;/cgi-bin/*.cgi\u0026#34; { fastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34; root \u0026#34;/\u0026#34; } Là aussi, il est nécessaire que le nom du socket FastCGI corresponde bien.\nAttentionATTENTION : Il semble important de mettre en place une authentification web pour protéger le contenu délivré par les scripts CGI ! TLS httpd prend très bien en charge la configuration TLS.\nExemple :\nlisten on adresse_ip tls port 443 hsts preload tls { certificate \u0026#34;/etc/ssl/chezmoi.tld-fullchain.pem\u0026#34; key \u0026#34;/etc/ssl/private/chezmoi.tld.key\u0026#34; ticket lifetime 3600 } La directive hsts active la gestion HTTP Strict Transport Security. Les options suivantes sont possibles : max-age en nombre de secondes - paramètre le temps maximum durant lequel cet hôte peut être considéré comme hôte HSTS. preload confirme et authentifie que le site est autorisé à être inclu dans la liste de préchargement des navigateurs web. subdomains signale que les sous-domaines doivent être considérés comme hôtes HSTS. Il semble important par mesure de sécurité d'utiliser cette option lors de fonctionnement avec des sous-domaines, même si ces derniers ont leurs propres certificats TLS . La directive tls permet de spécifier la configuration TLS du serveur. Les différentes options sont comprises dans les crochets. Les options suivantes sont possibles : certificate - nécessaire - pour spécifier le certificat serveur, encodé au format PEM. key - nécessaire - pour spécifier le fichier de clé privée, encodée lui aussi au format PEM. ATTENTION : ce fichier doit absolument résider en-dehors du chroot web . Il est possible de paramétrer : les options de chiffrement ciphers, les clés d\u0026rsquo;échange dhe, les courbes elliptiques ecdhe - par défaut, sont actives : X25519, P-256 et P-384 -, une réponse ocsp - il faudra générer un fichier OCSP au format DER avec l\u0026rsquo;outil oscpcheck(8) -, de spécifier les protocols TLS - sachant que seul TLSv1.2 est actif par défaut - ainsi que la durée de vie du ticket de session ticket lifetime en nombre de secondes - qui par défaut est de 2 heures. Il ne sert à rien de spécifier une valeur d\u0026rsquo;option par défaut, puisque par défaut, sans écriture, c\u0026rsquo;est la valeur qui lui est appliquée !\nAuto-indexation httpd peut faire de l\u0026rsquo;auto-indexation de répertoire et ainsi afficher le contenu d\u0026rsquo;un répertoire en particulier. Ajoutez tout simplement, soit dans une directive server, soit location :\ndirectory auto index Documentation Manpages La documentation se fait au-travers des différents manpages, tels que :\nhttpd(8) , httpd.conf(5) ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eOpenBSD\u003c/strong\u003e intègre par défaut dans le système de base un serveur web,\nnommé \u003cstrong\u003ehttpd\u003c/strong\u003e, depuis 5.7.\u003cbr\u003e\nC\u0026rsquo;est un serveur qui se veut sécurisé, tant par le fonctionnement chrooté\nque par la séparation des privilèges, l\u0026rsquo;usage de chiffrements forts, de\ncourbes elliptiques, et autres paramétres forts pour\n\u003cabbr title=\"Transport Layer Security\"\u003eTLS\u003c/abbr\u003e\n, par défaut.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ehttpd\u003c/strong\u003e est un serveur \u003cabbr title=\"HyperText Transfert Protocol\"\u003eHTTP\u003c/abbr\u003e\n de\nfichiers statiques, qui supporte les appels directs ou asynchrones FastCGI\n(soit par socket Unix - \u003cem\u003ec\u0026rsquo;est mieux\u003c/em\u003e -, soit par\n\u003cabbr title=\"Transfert Control Protocol\"\u003eTCP\u003c/abbr\u003e\n/\u003cabbr title=\"Internet Protocol\"\u003eIP\u003c/abbr\u003e\n).\nIl est bien sûr possible de gérer les connexions TLS, via la bibliothèque\nLibreSSL, et fonctionne sur la double couche de protocole IPv4 et IPv6.\u003c/p\u003e\n\u003cp\u003eUne configuration flexible d\u0026rsquo;hôtes virtuels est possible, soit par nom d\u0026rsquo;hôte,\nsoit par adresse IP.\u003c/p\u003e\n\u003cp\u003eEnfin, la journalisation se fait soit via \u003ccode\u003esyslog\u003c/code\u003e, soit par des journaux\nd\u0026rsquo;accès et d\u0026rsquo;erreurs dédiés aux différents hôtes virtuels.\u003c/p\u003e\n\u003cp\u003eCe que ne gère pas \u003cstrong\u003ehttpd\u003c/strong\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eles entêtes HTTP.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003el\u0026rsquo;URL Rewriting ?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eQuoi d\u0026rsquo;autres ?!\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSite web : \u003ca href=\"https://bsd.plumbing/\" rel=\"external\"\u003ehttps://bsd.plumbing/\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLa configuration du serveur httpd se fait, \u003cem\u003eà minima\u003c/em\u003e, au-travers d\u0026rsquo;un seul\nfichier de configuration, à créer : \u003ccode\u003e/etc/httpd.conf\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eprefork 3\n\ntypes { include \u0026#34;/usr/share/misc/mime.types\u0026#34; }\n\nserver \u0026#34;adr_ip\u0026#34; {\n    …\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLa configuration d\u0026rsquo;hôte virtuel, étant à envisager, il est préférable de\ncréer un fichier par hôte et de l\u0026rsquo;inclure dans le fichier de configuration\npar le biais du mot clé \u003ccode\u003einclude\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"configuration-globale\"\u003eConfiguration Globale\u003c/h3\u003e\n\u003cp\u003eVoici les paramètres de niveau global :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003echroot\u003c/code\u003e : spécifie le répertoire \n\u003ca class=\"man\" href=\"https://man.openbsd.org/chroot.2\" title=\"Page du Manuel OpenBSD pour : chroot\"\u003echroot(2)\u003c/a\u003e\n. S\u0026rsquo;il n\u0026rsquo;est pas\nspécifié, il a pour valeur \u003ccode\u003e/var/www/\u003c/code\u003e qui est le répertoire home de\nl\u0026rsquo;utilisateur web \u003ccode\u003ewww\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003edefault type\u003c/code\u003e : spécifie les types de média utilisés pour une extension\ndonnée ou un type de fichier. S\u0026rsquo;il n\u0026rsquo;est pas spécifié, le type par défaut\nest \u003ccode\u003eapplication/octect-stream\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elogdir\u003c/code\u003e : spécifie le répertoire où les journaux seront écrits. Par défaut,\nil fait référence au répertoire enfant \u003ccode\u003elogs/\u003c/code\u003e à l\u0026rsquo;intérieur du chroot.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eprefork\u003c/code\u003e : le nombre de processus du serveur. Par défaut, httpd utilise\n3 processus serveur. Augmenter cette valeur améliore la performance\net prévient les délais de connexion au serveur.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"macros\"\u003eMacros\u003c/h3\u003e\n\u003cp\u003eDes macros peuvent être définies. Considérez-les comme des variables. On\nne peut utiliser des mots clés réservés. Elles commencent forcément par\nune lettre, un chiffre ou le symbole \u0026lsquo;\u003ccode\u003e_\u003c/code\u003e \u0026rsquo; suivi de tout autre caractère.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eip_ext=\u0026#34;10.0.0.1\u0026#34;\n\nserver \u0026#34;default\u0026#34; {\n    listen on $ip_ext port 80\n    …\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDans cet exemple, la macro est la variable \u003ccode\u003eip_ext\u003c/code\u003e ; sa valeur étant \u003ccode\u003e10.0.0.1\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"les-hôtes-virtuels\"\u003eLes Hôtes Virtuels\u003c/h3\u003e\n\u003cp\u003eLa gestion des hôtes virtuels se fait dans chaque section \u003ccode\u003eserver\u003c/code\u003e, en\ndéclarant le nom du serveur entre double-quotes.\u003c/p\u003e\n\u003cp\u003ePour plus d\u0026rsquo;informations, lire la section \u003ca href=\"https://man.openbsd.org/httpd.conf.5#SERVERS\" rel=\"external\"\u003e\u003ccode\u003eSERVERS\u003c/code\u003e\u003c/a\u003e du manpage \u003ccode\u003ehttpd.conf(5)\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"les-types-médias\"\u003eLes Types Médias\u003c/h3\u003e\n\u003cp\u003eLa section \u003ccode\u003etypes\u003c/code\u003e configure les types de média supportés. Si rien n\u0026rsquo;est\nspécifié, par défaut, httpd gére les types de média pour :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003etext/css\u003c/code\u003e, \u003ccode\u003etext/html\u003c/code\u003e, \u003ccode\u003etext/plain\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eimage/gif\u003c/code\u003e, \u003ccode\u003eimage/jpeg\u003c/code\u003e, \u003ccode\u003eimage/png\u003c/code\u003e, \u003ccode\u003eimage/svg+xml\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eainsi qu\u0026rsquo;\u003ccode\u003eapplication/javascript\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003etypes { include \u0026#34;usr/share/misc/mime.types\u0026#34; }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eou\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003etypes {\n    text/css        css\n    text/html       html htm\n    text/plain      txt\n    image/gif       gif\n    image/jpeg      jpeg jpg\n    image/png       png\n    application/javascript  js\n    application/xml     xml\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eAvant de chercher à ajouter un nouveau type, assurez-vous qu\u0026rsquo;il ne soit\npas déjà inclus dans le fichier \u003ccode\u003e/usr/share/misc/mimes.types\u003c/code\u003e ; si ce n\u0026rsquo;est\npas le cas, ajoutez-le en suivant.*\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"utilisation\"\u003eUtilisation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLe service se nomme logiquement : \u003ccode\u003ehttpd\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;option de test de configuration : \u003ccode\u003e-n\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAinsi la commande \u003ccode\u003ehttpd -n\u003c/code\u003e permettra de s\u0026rsquo;assurer de la validité de\nl\u0026rsquo;ensemble de la configuration, à tout moment.\u003c/p\u003e\n\u003cp\u003ePar convention/préférence, il est intéressant de créer un répertoire \u003ccode\u003e/etc/httpd.d/\u003c/code\u003e\ndans lequel sera écrit les configurations serveurs des hôtes virtuels, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /etc/httpd.d\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eModification du fichier de configuration \u003ccode\u003e/etc/httpd.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003etypes { include \u0026#34;usr/share/misc/mime.types\u0026#34; }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003ePuis utilisez le mot clé \u003ccode\u003einclude\u003c/code\u003e pour ajouter la configuration d\u0026rsquo;un hôte\nvirtuel au fur et à mesure des besoins, tel que\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003einclude \u0026#34;etc/httpd.d/nom-de-domaine.conf\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"gestion-des-logs\"\u003eGestion des logs\u003c/h3\u003e\n\u003cp\u003eLa gestion des logs est intéressante.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVous ne voulez pas de log, indiquez \u003ccode\u003eno log\u003c/code\u003e dans votre section \u003ccode\u003eserver\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eVous pouvez demander à \n\u003ca class=\"man\" href=\"https://man.openbsd.org/syslog.3\" title=\"Page du Manuel OpenBSD pour : syslog\"\u003esyslog(3)\u003c/a\u003e\n d\u0026rsquo;enregistrer la journalisation,\nen lieu et place des journaux individualisés. \u003cbr\u003e\nSpécifiez tout simplement : \u003ccode\u003elog syslog\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eVous pouvez invoquer individuellement les logs d\u0026rsquo;accès ou d\u0026rsquo;erreur, tel que :\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elog access \u0026#34;nom-fichier-acces.log\u0026#34;\nlog error  \u0026#34;nom-fichier-erreurs.log\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eNéanmoins, sachez qu\u0026rsquo;il est possible d\u0026rsquo;intégrer les différentes options\nentre crochets, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003elog {\n    access \u0026#34;nom-fichier-acces.log\u0026#34;\n    error  \u0026#34;nom-fichier-erreurs.log\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eEt, pour finir, vous pouvez y intégrer l\u0026rsquo;option \u003ccode\u003estyle\u003c/code\u003e qui va vous permettre\nde définir le style de journalisation désiré, tel que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecommon\u003c/code\u003e ou \u003ccode\u003ecombined\u003c/code\u003e : ces deux styles imitent le format de journalisation\ndes standards des serveurs web Apache ou nginx. \u003ccode\u003ecommon\u003c/code\u003e est le type\npar défaut, si aucun n\u0026rsquo;est spécifié.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eforwarded\u003c/code\u003e étend le style \u003ccode\u003ecombined\u003c/code\u003e en ajoutant deux champs d\u0026rsquo;information\ncontenant la valeur des entêtes \u003ccode\u003eX-Forwarded-For\u003c/code\u003e et \u003ccode\u003eX-Forwarded-Port\u003c/code\u003e\n\u003cem\u003e(respectivement, la première doit retourner l\u0026rsquo;adresse ip du client,\nla seconde celle du port de connexion sur le serveur)\u003c/em\u003e. Intéressant\nquand \u003cstrong\u003ehttpd\u003c/strong\u003e est derrière un proxy web, tel nginx ou relayd.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003econnection\u003c/code\u003e imite le format de journalisation du serveur \n\u003ca class=\"man\" href=\"https://man.openbsd.org/relayd.8\" title=\"Page du Manuel OpenBSD pour : relayd\"\u003erelayd(8)\u003c/a\u003e\n.\nChaque entrée du journal est un résumé de chaque connexion qui peut\ncontenir de multiples requêtes.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"authentification-web\"\u003eAuthentification Web\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ehttpd\u003c/strong\u003e peut faire de l\u0026rsquo;authentification web.\u003c/p\u003e\n\u003cp\u003eDans un premier temps, il faut utiliser l\u0026rsquo;outil \n\u003ca class=\"man\" href=\"https://man.openbsd.org/htpasswd.5\" title=\"Page du Manuel OpenBSD pour : htpasswd\"\u003ehtpasswd(5)\u003c/a\u003e\n,\n\u003cem\u003e(accessible nativement depuis OpenBSD 5.6)\u003c/em\u003e, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cd /var/www/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# htpasswd nom-fichier identifiant\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePassword:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRetype Password:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cspan class=\"red\"\u003ePar mesure de sécurité, ensuite, attribuez-lui des droits\nen exécution \u003ccode\u003e0400\u003c/code\u003e, accessible rien que par l\u0026rsquo;utilisateur web \u003ccode\u003ewww\u003c/code\u003e.\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003ePuis ensuite dans une des directives \u003ccode\u003elocation\u003c/code\u003e ou \u003ccode\u003eserver\u003c/code\u003e, ajoutez ce\nqui ressemble à :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003eauthenticate \u0026#34;! Acces sous Restriction !\u0026#34; with \u0026#34;/nom-fichier\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"php-fpm\"\u003ePHP-FPM\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003eAttention, si vous mettez en place PHP et permettez la connexion en clair,\nsur le protocole HTTP, il est recommandé fortement de mettre en frontal\n\u003ca class=\"inside\" href=\"/fr/web/httpd/relayd-headers-httpd/#relayd-httpoxy\" title=\"Lien interne vers l\u0026#39;article : 'Relayd : Gestion des entêtes pour httpd'\"\u003erelayd afin de lutter contre la faille Httpoxy\u003c/a\u003e\n!\u003c/div\u003e\n\n\u003cp\u003ePour autant que vous avez installer PHP sur le serveur, \u003cstrong\u003ehttpd\u003c/strong\u003e peut servir\ndu contenu PHP, par le biais de la directive \u003ccode\u003elocation\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003elocation \u0026#34;*.php\u0026#34; {\n    fastcgi socket \u0026#34;/run/php-fpm.sock\u0026#34;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl est nécessaire que le socket FastCGI corresponde bien à celui de PHP-FPM.\u003c/p\u003e\n\u003ch3 id=\"slowcgi\"\u003eSlowcgi\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-danger\"\u003eDanger\u003c/div\u003e\u003cdiv class=\"alert alert-danger\" role=\"alert\"\u003eAttention, si vous mettez en place CGI et permettez la connexion en clair,\nsur le protocole HTTP, il est recommandé fortement de mettre en frontal\n\u003ca class=\"inside\" href=\"/fr/web/httpd/relayd-headers-httpd/#relayd-httpoxy\" title=\"Lien interne vers l\u0026#39;article : 'Relayd : Gestion des entêtes pour httpd'\"\u003erelayd afin de lutter contre la faille Httpoxy\u003c/a\u003e\n!\u003c/div\u003e\n\n\u003cp\u003e\u003cstrong\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/slowcgi.8\" title=\"Page du Manuel OpenBSD pour : slowcgi\"\u003eslowcgi(8)\u003c/a\u003e\n\u003c/strong\u003e est un serveur FastCGI de connexion\n\u003cabbr title=\"Common Gateway Interface\"\u003eCGI\u003c/abbr\u003e\n, \u003cem\u003elui aussi intégré dans le système\nde base d\u0026rsquo;OpenBSD, depuis la version 5.4\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003ehttpd\u003c/strong\u003e peut servir du contenu CGI, disponible depuis le répertoire enfant\n\u003ccode\u003ecgi-bin/\u003c/code\u003e du chroot web, par le biais de la directive \u003ccode\u003elocation\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003elocation \u0026#34;/cgi-bin/*.cgi\u0026#34; {\n    fastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34;\n    root \u0026#34;/\u0026#34;\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eLà aussi, il est nécessaire que le nom du socket FastCGI corresponde bien.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eATTENTION : Il semble important de mettre en place une\n\u003ca href=\"/fr/web/httpd/httpd/#authentification-web\"\u003eauthentification web\u003c/a\u003e pour protéger le contenu délivré\npar les scripts CGI !\u003c/div\u003e\n\n\u003ch3 id=\"tls\"\u003eTLS\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ehttpd\u003c/strong\u003e prend très bien en charge la configuration TLS.\u003c/p\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003elisten on adresse_ip tls port 443\nhsts preload\ntls {\n    certificate \u0026#34;/etc/ssl/chezmoi.tld-fullchain.pem\u0026#34;\n    key \u0026#34;/etc/ssl/private/chezmoi.tld.key\u0026#34;\n    ticket lifetime 3600\n}\n\u003c/code\u003e\u003c/pre\u003e\u003cul\u003e\n\u003cli\u003eLa directive \u003ccode\u003ehsts\u003c/code\u003e active la gestion \u003cstrong\u003eHTTP Strict Transport Security\u003c/strong\u003e. \u003cbr\u003e\nLes options suivantes sont possibles :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emax-age\u003c/code\u003e en nombre de secondes - paramètre le temps maximum durant lequel\ncet hôte peut être considéré comme hôte HSTS.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003epreload\u003c/code\u003e confirme et authentifie que le site est autorisé à être inclu\ndans la liste de préchargement des navigateurs web.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003esubdomains\u003c/code\u003e signale que les sous-domaines doivent être considérés comme\nhôtes HSTS. \u003cbr\u003e\n\u003cspan class=\"red\"\u003eIl semble important par mesure de sécurité d'utiliser\n        cette option lors de fonctionnement avec des sous-domaines, même si ces\n        derniers ont leurs propres certificats TLS\u003c/span\u003e\n.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eLa directive \u003ccode\u003etls\u003c/code\u003e permet de spécifier la configuration TLS du serveur. Les\ndifférentes options sont comprises dans les crochets. Les options suivantes\nsont possibles :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003ecertificate\u003c/code\u003e - nécessaire - pour spécifier le certificat serveur, encodé\nau format PEM.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ekey\u003c/code\u003e - nécessaire - pour spécifier le fichier de clé privée, encodée lui\naussi au format PEM. \u003cbr\u003e\n\u003cspan class=\"red\"\u003eATTENTION : ce fichier doit absolument résider\n        en-dehors du chroot web\u003c/span\u003e\n.\u003c/li\u003e\n\u003cli\u003eIl est possible de paramétrer :\n\u003cul\u003e\n\u003cli\u003eles options de chiffrement \u003ccode\u003eciphers\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eles clés d\u0026rsquo;échange \u003ccode\u003edhe\u003c/code\u003e,\u003c/li\u003e\n\u003cli\u003eles courbes elliptiques \u003ccode\u003eecdhe\u003c/code\u003e - \u003cem\u003epar défaut, sont actives : \u003ccode\u003eX25519\u003c/code\u003e,\n\u003ccode\u003eP-256\u003c/code\u003e et \u003ccode\u003eP-384\u003c/code\u003e\u003c/em\u003e -,\u003c/li\u003e\n\u003cli\u003eune réponse \u003ccode\u003eocsp\u003c/code\u003e - \u003cem\u003eil faudra générer un fichier OCSP au format DER\navec l\u0026rsquo;outil \n\u003ca class=\"man\" href=\"https://man.openbsd.org/oscpcheck.8\" title=\"Page du Manuel OpenBSD pour : oscpcheck\"\u003eoscpcheck(8)\u003c/a\u003e\n\u003c/em\u003e -,\u003c/li\u003e\n\u003cli\u003ede spécifier les \u003ccode\u003eprotocols\u003c/code\u003e TLS - \u003cem\u003esachant que seul TLSv1.2 est\nactif par défaut\u003c/em\u003e -\u003c/li\u003e\n\u003cli\u003eainsi que la durée de vie du ticket de session \u003ccode\u003eticket lifetime\u003c/code\u003e en\nnombre de secondes - \u003cem\u003equi par défaut est de 2 heures\u003c/em\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cspan class=\"IMP\"\u003eIl ne sert à rien de spécifier une valeur d\u0026rsquo;option par défaut,\npuisque par défaut, sans écriture, c\u0026rsquo;est la valeur qui lui est appliquée !\u003c/span\u003e\u003c/p\u003e\n\u003ch3 id=\"auto-indexation\"\u003eAuto-indexation\u003c/h3\u003e\n\u003cp\u003e\u003cstrong\u003ehttpd\u003c/strong\u003e peut faire de l\u0026rsquo;auto-indexation de répertoire et ainsi afficher le\ncontenu d\u0026rsquo;un répertoire en particulier. Ajoutez tout simplement, soit dans une\ndirective \u003ccode\u003eserver\u003c/code\u003e, soit \u003ccode\u003elocation\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-httpd\" data-lang=\"httpd\"\u003edirectory auto index\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"manpages\"\u003eManpages\u003c/h3\u003e\n\u003cp\u003eLa documentation se fait au-travers des différents manpages, tels que :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.8\" title=\"Page du Manuel OpenBSD pour : httpd\"\u003ehttpd(8)\u003c/a\u003e\n, \n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.conf.5\" title=\"Page du Manuel OpenBSD pour : httpd.conf\"\u003ehttpd.conf(5)\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n",
            "summary": "Présentation du serveur web httpd natif sous OpenBSD",
            "tags": ["httpd", "OpenBSD"],
            "date_published": "2019-11-17T01:08:30+01:00",
            "date_modified": "2020-05-07T18:25:36+02:00"
        },{
            "id": "urn:uuid:40c89672-3a49-4959-9579-8d76f9d1624f",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/openbsd-munin-server/",
            "title": "Munin : Monitorer OpenBSD avec httpd ",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Munin est un outil de surveillance des ordinateurs. Il présente ces informations par le biais d\u0026rsquo;une interface web, qui visualise des graphiques statiques, générés toutes les 5 minutes, par défaut. Un certain nombre de plugins de monitoring divers sont utilisables sans gros effort.\nMunin permet de monitorer facilement la performance de tout matériel informatique (ordinateurs, réseaux, applications, mesures diverses, etc.). Il permet de discerner les problèmes de performance des ressources.\nSite web : http://munin-monitoring.org/ Version : 2.0.49 OpenBSD : 6.6 Services : httpd + munin_node + munin_asyncd Documentation Il est toujours utile de lire les documentations pkg-readmes fournies ; celles disponibles sont dans /usr/local/share/doc/pkg-readmes/, à-propos de :\nmunin-node munin-server la documentation officielle : http://munin-monitoring.org/wiki/Documentation http://munin.readthedocs.org/ la FAQ officielle : http://munin-monitoring.org/wiki/faq Installation :# pkg_add munin-node munin-server Un utilisateur _munin a été créé et le répertoire web, par défaut, est dans /var/www/htdocs/munin/. Ce répertoire reçoit les droits de l\u0026rsquo;utilisateur _munin et du groupe web www.\nPour information, cela installe en dépendance quelques paquets de plus, dont p5-Net-CIDR - ce paquet est utile pour la configuration de l\u0026rsquo;option cidr_allow dans le fichier de configuration du nœud de munin ; s\u0026rsquo;il n\u0026rsquo;est pas installé, faites-le !\nSi vous désirez le support des moniteurs SNMP (Simple Network Management Protocol) , il faut installer le paquet p5-Net-SNMP.\nConfiguration Deux fichiers de configuration principaux sont dans /etc/munin :\nmunin.conf relatif au serveur lui-même munin-node.conf relatif au nœud de surveillance local. Une fois, ces fichiers configurés, il est possible de démarrer les deux services de munin.\nmunin.conf Généralement, il y a peu de choses à changer, néanmoins, pour informations, certaines variables peuvent être configurées.\ndbdir : répertoire de la base de donnée de munin htmldir : répertoire de destination des données graphiques générées. logdir : répertoire des journaux de munin rundir : répertoire où s\u0026rsquo;exécute le processus munin. Si vous préférez une exécution du processus par cron plus que par script CGI, vous pouvez modifier les deux variables graph_strategy et html_strategy.\nPar défaut sera configurée une arborescence basique basée sur localhost, tel que :\n[localhost] address 127.0.0.1 user_node_name yes Si vous préférez une arborescence par nom de domaine, modifiez/commentez/ajoutez localhost par le nom de domaine désiré, tel huc.fr.eu.org. Bien sûr, il est possible de surveiller autant d\u0026rsquo;hôtes que désiré.\nIl est possible de gérer les différents nœuds par groupe ; cela permet de regrouper les informations. Je vous renvoie aux documentations officielles et autres manpages.\nLes noms de nœuds, de groupe de nœuds ainsi que les adresses IPv6 doivent être encadrés de [ ].\nAjouter un nœud Exemple :\n# server name [srvr.huc.fr.eu.org] # address IP address 192.168.1.1 use_node_name yes # first pc [pc1.huc.fr.eu.org] address 192.168.1.10 use_node_name yes Recevoir les alertes par mail Pour recevoir les alertes par mail, il est nécessaire de renseigner une ou plusieurs adresses de contact, tel que :\ncontact.root.command mail -s \u0026#34;Munin notification\u0026#34; email contact.other-user.command mail -s \u0026#34;Munin notification\u0026#34; email-user Ceci étant un exemple, remplacez par les informations nécessaires à votre situation.\nmunin-node.conf La partie de la configuration du fichier de nœud étant expliquée sur sa propre page, il suffit de suivre les informations et de les adapter au nœud du serveur lui-même.\ncrontab Après avoir configuré les deux fichiers de configuration ci-dessus, il est important de paramétrer une tâche cron, tel que :\n# crontab for munin-server */5 * * * * su -s /bin/sh _munin /usr/local/bin/munin-cron newsyslog.conf Il est nécessaire de modifier le fichier de configuration du journal /etc/newsyslog.conf pour créer une rotation des journaux générés par munin.\nAjoutez-y :\n# munin-server /var/www/logs/munin/munin-cgi-graph.log www:_munin 644 7 250 * Z /var/www/logs/munin/munin-cgi-html.log www:_munin 644 7 250 * Z /var/www/logs/munin/munin-graph.log _munin:_munin 644 7 250 * Z /var/www/logs/munin/munin-html.log _munin:_munin 644 7 250 * Z /var/www/logs/munin/munin-limits.log _munin:_munin 644 7 250 * Z /var/www/logs/munin/munin-update.log _munin:_munin 644 7 250 * Z # munin-node /var/log/munin/munin-node.log root:wheel 644 7 250 * Z Ce sont tous les journaux gérés et nécessaires à minima pour munin.\nhttpd Ici, je vous renvoie à mon article de découverte du serveur httpd, et tout particulièrement aux informations d' utilisations .\nModification du fichier de configuration /etc/httpd.conf pour y ajouter :\ninclude \u0026#34;/etc/httpd.d/munin.conf\u0026#34; Création du fichier de config du serveur pour nagios /etc/httpd.d/munin.conf :\nserver \u0026#34;192.168.1.3\u0026#34; { listen on * port 80 root \u0026#34;/htdocs/munin\u0026#34; # location \u0026#34;/cgi-bin/munin-cgi*\u0026#34; { # fastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34; # root \u0026#34;/\u0026#34; # } location \u0026#34;/\u0026#34; { directory index index.html } } Les fichiers dans le répertoire web de munin doivent avoir les droits de l\u0026rsquo;utilisateur _munin et du groupe web www, par défaut.\nChroot web Du fait du chroot web, il est nécessaire de faire les modifications systèmes suivantes :\n:# mkdir -p /var/www/{logs,var/run}/munin :# chown _munin: /var/www/{logs,var/run}/munin mais en plus de modifier la configuration du fichier du serveur :\nhtmldir /var/www/htdocs/munin logdir /var/www/logs/munin rundir /var/www/var/run/munin Packet-Filter Concernant les règles pour PF (Packet Filter) , il faut ouvrir en entrée et sortie, vers et depuis les nœuds :\npour Munin lui-même : 4949/tcp pour SNMP : 161, 162 en udp et tcp - cela dépend de votre configuration SNMP , bien sûr. Démarrage des services Pensez à activer et démarrer les services nécessaires, si ce n\u0026rsquo;est pas fait !\n:# rcctl enable munin_node munin_asyncd slowcgi httpd :# rcctl start munin_node munin_asyncd slowcgi :# httpd -n \u0026amp;\u0026amp; rcctl start httpd Dépannage Erreur : Failed to create rundir (/var/run/munin): Permission denied Citation :\nFailed to create rundir (/var/run/munin): Permission denied at /usr/local/libexec/munin/munin-update line 39. Avez-vous réellement fait lu le chapitre chroot ? Erreur : [FATAL] There is nothing to do here, since there are no nodes with any plugins Citation :\n[FATAL] There is nothing to do here, since there are no nodes with any plugins. Please refer to http://munin-monitoring.org/wiki/FAQ_no_graphs at /usr/local/libexec/munin/munin-html line 40. Avez-vous démarré vos services munin ?\nAvez-vous activé/désactivé des plugins ? Si oui, avez vous redémarré le service munin-node ?\nRemerciements Une spéciale dédicace à Solene Rapenne qui fait partie de l\u0026rsquo;équipe d\u0026rsquo;OpenBSD, et qui m\u0026rsquo;a bien aider pour démarrer ce projet.\n",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eMunin\u003c/strong\u003e est un outil de surveillance des ordinateurs. Il présente ces\ninformations par le biais d\u0026rsquo;une interface web, qui visualise des graphiques\nstatiques, générés toutes les 5 minutes, par défaut. Un certain nombre de\nplugins de monitoring divers sont utilisables sans gros effort.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMunin\u003c/strong\u003e permet de monitorer facilement la performance de tout matériel\ninformatique (ordinateurs, réseaux, applications, mesures diverses, etc.). \u003cbr\u003e\nIl permet de discerner les problèmes de performance des ressources.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"http://munin-monitoring.org/\" rel=\"external\"\u003ehttp://munin-monitoring.org/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion : 2.0.49\u003c/li\u003e\n\u003cli\u003eOpenBSD : 6.6\u003c/li\u003e\n\u003cli\u003eServices : httpd + munin_node + munin_asyncd\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eIl est toujours utile de lire les documentations \u003ccode\u003epkg-readmes\u003c/code\u003e fournies ;\ncelles disponibles sont dans \u003ccode\u003e/usr/local/share/doc/pkg-readmes/\u003c/code\u003e, à-propos de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003emunin-node\u003c/li\u003e\n\u003cli\u003emunin-server\u003c/li\u003e\n\u003cli\u003ela documentation officielle :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://munin-monitoring.org/wiki/Documentation\" rel=\"external\"\u003ehttp://munin-monitoring.org/wiki/Documentation\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://munin.readthedocs.org/\" rel=\"external\"\u003ehttp://munin.readthedocs.org/\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ela FAQ officielle : \u003ca href=\"http://munin-monitoring.org/wiki/faq\" rel=\"external\"\u003ehttp://munin-monitoring.org/wiki/faq\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# pkg_add munin-node munin-server\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUn utilisateur \u003ccode\u003e_munin\u003c/code\u003e a été créé et le répertoire web, par défaut, est dans\n\u003ccode\u003e/var/www/htdocs/munin/\u003c/code\u003e. Ce répertoire reçoit les droits de l\u0026rsquo;utilisateur\n\u003ccode\u003e_munin\u003c/code\u003e et du groupe web \u003ccode\u003ewww\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePour information, cela installe en dépendance quelques paquets de plus, dont\n\u003ccode\u003ep5-Net-CIDR\u003c/code\u003e - \u003cem\u003ece paquet est utile pour la configuration de l\u0026rsquo;option\n\u003ccode\u003ecidr_allow\u003c/code\u003e dans le \u003ca href=\"/fr/monitor/openbsd-munin-server/#munin-nodeconf\"\u003efichier de configuration du nœud de munin\u003c/a\u003e ;\ns\u0026rsquo;il n\u0026rsquo;est pas installé, faites-le !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eSi vous désirez le support des moniteurs \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003eSNMP \u003cem\u003e(Simple Network Management Protocol)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, il faut installer\nle paquet \u003ccode\u003ep5-Net-SNMP\u003c/code\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eDeux fichiers de configuration principaux sont dans \u003ccode\u003e/etc/munin\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003emunin.conf\u003c/code\u003e relatif au serveur lui-même\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003emunin-node.conf\u003c/code\u003e relatif au nœud de surveillance local.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eUne fois, ces fichiers configurés, il est possible de démarrer les deux\nservices de munin.\u003c/p\u003e\n\u003ch3 id=\"muninconf\"\u003emunin.conf\u003c/h3\u003e\n\u003cp\u003eGénéralement, il y a peu de choses à changer, néanmoins, pour informations,\ncertaines variables peuvent être configurées.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003edbdir\u003c/code\u003e : répertoire de la base de donnée de munin\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003ehtmldir\u003c/code\u003e : répertoire de destination des données graphiques générées.\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003elogdir\u003c/code\u003e : répertoire des journaux de munin\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003erundir\u003c/code\u003e : répertoire où s\u0026rsquo;exécute le processus munin.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSi vous préférez une exécution du processus par cron plus que par script CGI,\nvous pouvez modifier les deux variables \u003ccode\u003egraph_strategy\u003c/code\u003e et \u003ccode\u003ehtml_strategy\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePar défaut sera configurée une arborescence basique basée sur localhost,\ntel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[localhost]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaddress 127.0.0.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003euser_node_name yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi vous préférez une arborescence par nom de domaine, modifiez/commentez/ajoutez\n\u003ccode\u003elocalhost\u003c/code\u003e par le nom de domaine désiré, tel \u003ccode\u003ehuc.fr.eu.org\u003c/code\u003e. Bien sûr, il est\npossible de surveiller autant d\u0026rsquo;hôtes que désiré.\u003c/p\u003e\n\u003cp\u003eIl est possible de gérer les différents nœuds par groupe ; cela permet de\nregrouper les informations. Je vous renvoie aux documentations officielles et\nautres manpages.\u003c/p\u003e\n\u003cp\u003eLes noms de nœuds, de groupe de nœuds ainsi que les adresses IPv6 doivent être\nencadrés de \u003ccode\u003e[ ]\u003c/code\u003e.\u003c/p\u003e\n\u003ch4 id=\"ajouter-un-nœud\"\u003eAjouter un nœud\u003c/h4\u003e\n\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# server name\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[srvr.huc.fr.eu.org]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# address IP\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaddress 192.168.1.1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003euse_node_name yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# first pc\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003e[pc1.huc.fr.eu.org]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eaddress 192.168.1.10\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003euse_node_name yes\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"recevoir-les-alertes-par-mail\"\u003eRecevoir les alertes par mail\u003c/h4\u003e\n\u003cp\u003ePour recevoir les alertes par mail, il est nécessaire de renseigner une ou\nplusieurs adresses de contact, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econtact.root.command mail -s \u0026#34;Munin notification\u0026#34; email\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003econtact.other-user.command mail -s \u0026#34;Munin notification\u0026#34; email-user\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCeci étant un exemple, remplacez par les informations nécessaires à votre\nsituation.\u003c/p\u003e\n\u003ch3 id=\"munin-nodeconf\"\u003emunin-node.conf\u003c/h3\u003e\n\u003cp\u003eLa partie de la \u003ca class=\"inside\" href=\"/fr/sys/openbsd/munin-node/\" title=\"Lien interne vers l\u0026#39;article : ''\"\u003econfiguration du fichier de nœud\u003c/a\u003e\n\nétant expliquée sur sa propre page, il suffit de suivre les informations et de\nles adapter au nœud du serveur lui-même.\u003c/p\u003e\n\u003ch3 id=\"crontab\"\u003ecrontab\u003c/h3\u003e\n\u003cp\u003eAprès avoir configuré les deux fichiers de configuration ci-dessus, il est\nimportant de paramétrer une tâche cron, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# crontab for munin-server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e*/5     *       *       *       *       su  -s /bin/sh _munin /usr/local/bin/munin-cron\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"newsyslogconf\"\u003enewsyslog.conf\u003c/h3\u003e\n\u003cp\u003eIl est nécessaire de modifier le fichier de configuration du journal\n\u003ccode\u003e/etc/newsyslog.conf\u003c/code\u003e pour créer une rotation des journaux générés par munin.\u003c/p\u003e\n\u003cp\u003eAjoutez-y :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# munin-server\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/www/logs/munin/munin-cgi-graph.log  www:_munin  644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/www/logs/munin/munin-cgi-html.log   www:_munin  644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/www/logs/munin/munin-graph.log  _munin:_munin   644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/www/logs/munin/munin-html.log   _munin:_munin   644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/www/logs/munin/munin-limits.log _munin:_munin   644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/www/logs/munin/munin-update.log _munin:_munin   644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# munin-node\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e/var/log/munin/munin-node.log   root:wheel      644  7     250  *     Z\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCe sont tous les journaux gérés et nécessaires à minima pour munin.\u003c/p\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003eIci, je vous renvoie à mon article de découverte du serveur \u003cstrong\u003ehttpd\u003c/strong\u003e, et tout\nparticulièrement aux informations d'\n\u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/#utilisation\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003eutilisations\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eModification du fichier de configuration \u003ccode\u003e/etc/httpd.conf\u003c/code\u003e pour y ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einclude \u0026#34;/etc/httpd.d/munin.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCréation du fichier de config du serveur pour nagios \u003ccode\u003e/etc/httpd.d/munin.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver \u0026#34;192.168.1.3\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elisten on * port 80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/htdocs/munin\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#    location \u0026#34;/cgi-bin/munin-cgi*\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#        fastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#        root \u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e#    }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elocation \u0026#34;/\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edirectory index index.html\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes fichiers dans le répertoire web de munin doivent avoir les droits de\nl\u0026rsquo;utilisateur \u003ccode\u003e_munin\u003c/code\u003e et du groupe web \u003ccode\u003ewww\u003c/code\u003e, par défaut.\u003c/p\u003e\n\u003ch4 id=\"chroot-web\"\u003eChroot web\u003c/h4\u003e\n\u003cp\u003eDu fait du chroot web, il est nécessaire de faire les modifications systèmes suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /var/www/\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003elogs,var/run\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e/munin\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chown _munin: /var/www/\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003elogs,var/run\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e/munin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003emais en plus de modifier la \u003ca href=\"/fr/monitor/openbsd-munin-server/#munin.conf\"\u003econfiguration du fichier du serveur\u003c/a\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003ehtmldir /var/www/htdocs/munin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003elogdir /var/www/logs/munin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003erundir  /var/www/var/run/munin\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"packet-filter\"\u003ePacket-Filter\u003c/h3\u003e\n\u003cp\u003eConcernant les règles pour \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\u003cspan lang=\"en\"\u003ePF \u003cem\u003e(Packet Filter)\u003c/em\u003e\u003c/span\u003e\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n, il faut ouvrir en entrée et sortie,\nvers et depuis les nœuds :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour Munin lui-même : \u003ccode\u003e4949/tcp\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003epour SNMP : \u003ccode\u003e161\u003c/code\u003e, \u003ccode\u003e162\u003c/code\u003e en \u003ccode\u003eudp\u003c/code\u003e et \u003ccode\u003etcp\u003c/code\u003e - cela dépend de votre configuration\n\u003ca class=\"tag\" href=\"/fr/tags/snmp\"\u003eSNMP\u003c/a\u003e\n, bien sûr.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"démarrage-des-services\"\u003eDémarrage des services\u003c/h2\u003e\n\u003cp\u003ePensez à activer et démarrer les services nécessaires, si ce n\u0026rsquo;est pas fait !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl enable munin_node munin_asyncd slowcgi httpd\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# rcctl start munin_node munin_asyncd slowcgi\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# httpd -n \u003cspan style=\"color:#5bc4bf\"\u003e\u0026amp;\u0026amp;\u003c/span\u003e rcctl start httpd\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"erreur--failed-to-create-rundir-varrunmunin-permission-denied\"\u003eErreur : Failed to create rundir (/var/run/munin): Permission denied\u003c/h3\u003e\n\u003cdiv class=\"info-quote\"\u003e\n    \u003cp class=\"is-white-50\"\u003eCitation :\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"quote\"\u003e\n    \u003cfigure\u003e\n        \u003cblockquote\u003e\n            Failed to create rundir (/var/run/munin): Permission denied at /usr/local/libexec/munin/munin-update line 39.\n        \u003c/blockquote\u003e\n    \u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cul\u003e\n\u003cli\u003eAvez-vous réellement fait lu le chapitre \u003cstrong\u003e\u003ca href=\"/fr/monitor/openbsd-munin-server/#chroot-web\"\u003echroot\u003c/a\u003e\u003c/strong\u003e ?\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"erreur--fatal-there-is-nothing-to-do-here-since-there-are-no-nodes-with-any-plugins\"\u003eErreur : [FATAL] There is nothing to do here, since there are no nodes with any plugins\u003c/h3\u003e\n\u003cdiv class=\"info-quote\"\u003e\n    \u003cp class=\"is-white-50\"\u003eCitation :\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"quote\"\u003e\n    \u003cfigure\u003e\n        \u003cblockquote\u003e\n            [FATAL] There is nothing to do here, since there are no nodes with any plugins.  Please refer to \u003ca href=\"http://munin-monitoring.org/wiki/FAQ_no_graphs\" rel=\"external\"\u003ehttp://munin-monitoring.org/wiki/FAQ_no_graphs\u003c/a\u003e at /usr/local/libexec/munin/munin-html line 40.\n        \u003c/blockquote\u003e\n    \u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAvez-vous démarré vos services munin ?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAvez-vous activé/désactivé des plugins ? Si oui, avez vous redémarré le\nservice \u003ccode\u003emunin-node\u003c/code\u003e ?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cp\u003eUne spéciale dédicace à \u003ca href=\"http://solene.perso.pw\" rel=\"external\"\u003eSolene Rapenne\u003c/a\u003e qui fait partie\nde l\u0026rsquo;équipe d\u0026rsquo;OpenBSD, et qui m\u0026rsquo;a bien aider pour démarrer ce projet.\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment mettre en place Munin pour monitorer, faire de la métrologie, surveiller du matériel informatique, sous OpenBSD, fonctionnant en relation avec le service web httpd",
            "tags": ["httpd", "Munin", "OpenBSD", "serveur", "supervision"],
            "date_published": "2019-11-16T23:18:30+01:00",
            "date_modified": "2019-11-22T20:00:00+01:00"
        },{
            "id": "urn:uuid:a5173605-f648-c1f5-16c4-738d57782f27",
            "url": "http://doc.huc.fr.eu.org/fr/monitor/openbsd-nagios/",
            "title": "Nagios : Monitorer OpenBSD avec httpd + slowcgi",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Nagios est un moniteur d\u0026rsquo;hôtes et de services conçu pour vous informer sur vos machines clientes, utilisateurs finaux ou gestionnaires.\nLe démon de surveillance exécute des contrôles intermittents sur les hôtes et les services que vous spécifiez à l\u0026rsquo;aide de \u0026ldquo;plugins\u0026rdquo; externes qui retournent les informations d\u0026rsquo;état à Nagios. En cas de problèmes, le démon peut envoyer à des contacts administratifs dans une variété de pays différents par différents biais (courriel, messagerie instantanée, SMS, etc.) des informations sur l\u0026rsquo;état actuel ; les rapports peuvent tous être consultés par l\u0026rsquo;intermédiaire d\u0026rsquo;un navigateur Web.\nSite web : https://www.nagios.org/projects/ Version : 4.3.1 OpenBSD : 6.6 Services : httpd + slowcgi + nagios + php73_fpm Documentation Il est toujours utile de lire les documentations pkg-readmes fournies ; celles disponibles sont dans /usr/local/share/doc/pkg-readmes/, à-propos de :\nfemail-chroot nagios php-7.3 Installation du serveur Nagios Afin de fonctionner avec le serveur web natif à OpenBSD, dixit httpd(8) , installez les paquets nagios-*-chroot spécifiques pour l\u0026rsquo;usage avec ce serveur web natif :\n:# pkg_add nagios-4.3.1p1-chroot nagios-web-4.3.1p2-chroot quirks-3.182 signed on 2019-11-15T10:35:39Z nagios-4.3.1p1-chroot:libltdl-2.4.2p1: ok nagios-4.3.1p1-chroot:monitoring-plugins-2.2p8: ok useradd: Warning: home directory `/var/www/nagios\u0026#39; doesn\u0026#39;t exist, and -m was not specified nagios-4.3.1p1-chroot: ok nagios-web-4.3.1p2-chroot:femail-1.0p1: ok nagios-web-4.3.1p2-chroot:femail-chroot-1.0p3: ok nagios-web-4.3.1p2-chroot:argon2-20171227: ok nagios-web-4.3.1p2-chroot:php-7.3.11: ok nagios-web-4.3.1p2-chroot:php-gd-7.3.11: ok nagios-web-4.3.1p2-chroot: ok The following new rcscripts were installed: /etc/rc.d/nagios /etc/rc.d/php73_fpm See rcctl(8) for details. New and changed readme(s): /usr/local/share/doc/pkg-readmes/femail-chroot /usr/local/share/doc/pkg-readmes/nagios /usr/local/share/doc/pkg-readmes/php-7.3 Le répertoire web par défaut est /var/www/nagios ; des scripts CGI sont installés dans /var/www/cgi-gin/nagios/.\nFemail-chroot :# cd /var/www/ :# mkdir -p etc/ssl :# cp /etc/{resolv.conf,hosts,localtime} etc/ :# install -m 444 -o root -g bin /etc/ssl/cert.pem /etc/ssl/openssl.cnf /var/www/etc/ssl :# chmod -R 444 etc/* :# chmod -R a+X etc/ :# cp /bin/sh /var/www/bin/ Test config nagios La commande de test de la configuration de nagios est :\n:$ su -m _nagios -c \u0026#34;/usr/local/sbin/nagios -v /etc/nagios/nagios.cfg\u0026#34; Exemple :\n:$ su -m _nagios -c \u0026#34;/usr/local/sbin/nagios -v /etc/nagios/nagios.cfg\u0026#34; Nagios Core 4.3.1 Copyright (c) 2009-present Nagios Core Development Team and Community Contributors Copyright (c) 1999-2009 Ethan Galstad Last Modified: 02-23-2017 License: GPL Website: https://www.nagios.org Reading configuration data... Read main config file okay... Read object config files okay... Running pre-flight check on configuration data... Checking objects... Checked 8 services. Checked 1 hosts. Checked 1 host groups. Checked 0 service groups. Checked 1 contacts. Checked 1 contact groups. Checked 24 commands. Checked 5 time periods. Checked 0 host escalations. Checked 0 service escalations. Checking for circular paths... Checked 1 hosts Checked 0 service dependencies Checked 0 host dependencies Checked 5 timeperiods Checking global event handlers... Checking obsessive compulsive processor commands... Checking misc settings... Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check Ensuite, penser à activer et démarrer le service nagios avec le contrôleur rcctl(8) .\nPHP-FPM Le service se nomme : php73_fpm L\u0026rsquo;outil pour tester la configuration est : php-fpm-73 avec l\u0026rsquo;option -t, par exemple. httpd configuration Le fragment de configuration pour httpd nécessaire est expliqué dans mon article présentant httpd.\nActiver les modules Les commandes suivantes sont à exécuter à chaque installation d\u0026rsquo;un module PHP, pecl, et opcache :\n:# cd /etc/php-7.3.sample :# for i in *; do ln -sf ../php-7.3.sample/$i ../php-7.3/; done OpenSSL Functions Du fait de la prison /var/www :\n:# mkdir -p /var/www/etc/ssl :# install -m 444 -o root -g bin /etc/ssl/cert.pem /etc/ssl/openssl.cnf /var/www/etc/ssl/ slowcgi Le service se nomme tout simplement : slowcgi. Les scripts cgi fournis dans /var/www/cgi-bin/ sont accessibles grâce à slowcgi(8) . Ceux de nagios sont fournis dans le répertoire enfant nagios/. httpd Ici, je vous renvoie à mon article de découverte du serveur httpd, et tout particulièrement aux informations d' utilisations .\nModification du fichier de configuration /etc/httpd.conf pour y ajouter :\ninclude \u0026#34;/etc/httpd.d/nagios.conf\u0026#34; Création du fichier de config du serveur pour nagios /etc/httpd.d/nagios.conf :\nserver \u0026#34;192.168.1.3\u0026#34; { listen on * port 80 root \u0026#34;/\u0026#34; location \u0026#34;/cgi-bin/nagios/*.cgi\u0026#34; { authenticate \u0026#34;! Nagios Restricted !\u0026#34; with \u0026#34;/nagios.ht\u0026#34; fastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34; root \u0026#34;/\u0026#34; } location \u0026#34;/\u0026#34; { authenticate \u0026#34;! Nagios Restricted !\u0026#34; with \u0026#34;/nagios.ht\u0026#34; directory index index.php root \u0026#34;/nagios\u0026#34; } location \u0026#34;*.php\u0026#34; { fastcgi socket \u0026#34;/run/php-fpm.sock\u0026#34; root \u0026#34;/nagios\u0026#34; } } Il est hautement recommandé de créer une authentification web avec accès restreint !\nCréation de l\u0026rsquo;authentification web Sachant que le compte admin par défaut est nagiosadmin, utilisons l\u0026rsquo;outil htpasswd :\n:# htpasswd nagios.ht nagiosadmin Réfléchissez bien avant de vouloir changer de nom d\u0026rsquo;administrateur, car il faudra le modifier au moins dans le fichier objects/contacts.cfg…\nEnsuite, il faut lui donner des droits d\u0026rsquo;exécution 0400, et utilisateur web www, autrement l\u0026rsquo;authentification ne se fera pas.\nIl est ensuite possible de configurer d\u0026rsquo;autres utlisateurs, de la même manière auquels un rôle sera attribué, tel que celui d\u0026rsquo;operator.\nConfiguration Tous les fichiers de configuration se trouvent dans /etc/nagios - qui se trouve être un alias de /var/www/etc/nagios :\ncgi.cfg Option use_authentication : Seulement le temps de tester que tout fonctionne, il est possible de mettre la valeur à O pour désactiver l\u0026rsquo;authentification ATTENTION, c'est une très mauvaise idée de fonctionner sans authentification ! Les options authorized_for_* : si vous avez paramétré un rôle particulier, ou tout autre nom d\u0026rsquo;utilisateur, vous pouvez l\u0026rsquo;ajouter selon ce qui est désirable d\u0026rsquo;être utilisé par ce rôle, ou cet utilisateur.\nOption show_context_help : utile pour avoir une aide contextuelle\nIl peut être intéressant de configurer les options *_sound qui émettront un son caractéristique lié à l\u0026rsquo;erreur remontée.\nLaissez l\u0026rsquo;option lock_author_names sur la valeur 1 permet d\u0026rsquo;empêcher le changement de nom d\u0026rsquo;utilisateur.\nnagios.cfg Option admin_email : remplacer la valeur par défaut, par votre courriel. Option date_format : choisir la valeur euro Option use_timezone : paramètrer Europe/Paris Les fichiers de configuration se trouvent dans le répertoire enfant objects :\ncontacts.cfg Définition alias : remplacer par un alias d\u0026rsquo;administration personnalisé, si besoin. Définition contact_name : remplacer par votre identifiant Définition email : remplacer par votre courriel administrateur Dépannage Erreur : not have permission to view Citation :\nIt appears as though you do not have permission to view information for any of the hosts you requested…\nIf you believe this is an error, check the HTTP server authentication requirements for accessing this CGI and check the authorization options in your CGI configuration file. Êtes-vous sûr d\u0026rsquo;avoir créé un utilisateur qui a/aura les droits de regarder la vue en question ?\nSi oui, êtes-vous sûr d\u0026rsquo;avoir autorisé l\u0026rsquo;utilisateur dans les fichiers de configuration, tel celui de cgi.cfg, cf les options authorized_* ?\nSi oui, êtes-vous sûr d\u0026rsquo;avoir relancé les différents services, tel httpd ou nagios ?\nCherchez votre oubli !\nAutres moniteurs réseaux :\nIcinga2 LibreNMS : https://www.librenms.org Zabbix : https://www.zabbix.com ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eNagios est un moniteur d\u0026rsquo;hôtes et de services conçu pour vous informer sur vos\nmachines clientes, utilisateurs finaux ou gestionnaires.\u003c/p\u003e\n\u003cp\u003eLe démon de surveillance exécute des contrôles intermittents sur les hôtes et\nles services que vous spécifiez à l\u0026rsquo;aide de \u0026ldquo;plugins\u0026rdquo; externes qui retournent\nles informations d\u0026rsquo;état à Nagios. En cas de problèmes, le démon peut envoyer à\ndes contacts administratifs dans une variété de pays différents par différents\nbiais (courriel, messagerie instantanée, SMS, etc.) des informations sur l\u0026rsquo;état\nactuel ; les rapports peuvent tous être consultés par l\u0026rsquo;intermédiaire d\u0026rsquo;un\nnavigateur Web.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSite web : \u003ca href=\"https://www.nagios.org/projects/\" rel=\"external\"\u003ehttps://www.nagios.org/projects/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eVersion : 4.3.1\u003c/li\u003e\n\u003cli\u003eOpenBSD : 6.6\u003c/li\u003e\n\u003cli\u003eServices : httpd + slowcgi + nagios + php73_fpm\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cp\u003eIl est toujours utile de lire les documentations \u003ccode\u003epkg-readmes\u003c/code\u003e fournies ;\ncelles disponibles sont dans \u003ccode\u003e/usr/local/share/doc/pkg-readmes/\u003c/code\u003e, à-propos de :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003efemail-chroot\u003c/li\u003e\n\u003cli\u003enagios\u003c/li\u003e\n\u003cli\u003ephp-7.3\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation-du-serveur-nagios\"\u003eInstallation du serveur Nagios\u003c/h2\u003e\n\u003cp\u003eAfin de fonctionner avec le serveur web natif à OpenBSD, dixit \n\u003ca class=\"man\" href=\"https://man.openbsd.org/httpd.8\" title=\"Page du Manuel OpenBSD pour : httpd\"\u003ehttpd(8)\u003c/a\u003e\n,\ninstallez les paquets \u003ccode\u003enagios-*-chroot\u003c/code\u003e spécifiques pour l\u0026rsquo;usage avec ce\nserveur web natif :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# pkg_add nagios-4.3.1p1-chroot nagios-web-4.3.1p2-chroot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003equirks-3.182 signed on 2019-11-15T10:35:39Z\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-4.3.1p1-chroot:libltdl-2.4.2p1: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-4.3.1p1-chroot:monitoring-plugins-2.2p8: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003euseradd: Warning: home directory \u003cspan style=\"color:#48b685\"\u003e`\u003c/span\u003e/var/www/nagios\u003cspan style=\"color:#48b685\"\u003e\u0026#39; doesn\u0026#39;\u003c/span\u003et exist, and -m was not specified\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-4.3.1p1-chroot: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-web-4.3.1p2-chroot:femail-1.0p1: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-web-4.3.1p2-chroot:femail-chroot-1.0p3: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-web-4.3.1p2-chroot:argon2-20171227: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-web-4.3.1p2-chroot:php-7.3.11: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-web-4.3.1p2-chroot:php-gd-7.3.11: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003enagios-web-4.3.1p2-chroot: ok\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThe following new rcscripts were installed: /etc/rc.d/nagios /etc/rc.d/php73_fpm\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSee rcctl\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e details.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNew and changed readme\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003es\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    /usr/local/share/doc/pkg-readmes/femail-chroot\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    /usr/local/share/doc/pkg-readmes/nagios\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    /usr/local/share/doc/pkg-readmes/php-7.3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe répertoire web par défaut est \u003ccode\u003e/var/www/nagios\u003c/code\u003e ; des scripts CGI sont installés dans \u003ccode\u003e/var/www/cgi-gin/nagios/\u003c/code\u003e.\u003c/p\u003e\n\u003ch3 id=\"femail-chroot\"\u003eFemail-chroot\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cd /var/www/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p etc/ssl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cp /etc/\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003eresolv.conf,hosts,localtime\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e etc/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# install -m \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e -o root -g bin /etc/ssl/cert.pem /etc/ssl/openssl.cnf /var/www/etc/ssl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chmod -R \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e etc/*\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# chmod -R a+X etc/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cp /bin/sh /var/www/bin/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"test-config-nagios\"\u003eTest config nagios\u003c/h3\u003e\n\u003cp\u003eLa commande de test de la configuration de nagios est :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ su -m _nagios -c \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/local/sbin/nagios -v /etc/nagios/nagios.cfg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eExemple :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ su -m _nagios -c \u003cspan style=\"color:#48b685\"\u003e\u0026#34;/usr/local/sbin/nagios -v /etc/nagios/nagios.cfg\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNagios Core 4.3.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ec\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 2009-present Nagios Core Development Team and Community Contributors\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCopyright \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ec\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e 1999-2009 Ethan Galstad\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLast Modified: 02-23-2017\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eLicense: GPL\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWebsite: https://www.nagios.org\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eReading configuration data...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Read main config file okay...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e   Read object config files okay...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRunning pre-flight check on configuration data...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking objects...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e services.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e hosts.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e host groups.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e service groups.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e contacts.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e contact groups.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e24\u003c/span\u003e commands.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e time periods.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e host escalations.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e service escalations.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e circular paths...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e hosts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e service dependencies\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e host dependencies\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    Checked \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e timeperiods\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking global event handlers...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking obsessive compulsive processor commands...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking misc settings...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTotal Warnings: \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTotal Errors:   \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eThings look okay - No serious problems were detected during the pre-flight check\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eEnsuite, penser à activer et démarrer le service \u003ccode\u003enagios\u003c/code\u003e avec le contrôleur\n\n\u003ca class=\"man\" href=\"https://man.openbsd.org/rcctl.8\" title=\"Page du Manuel OpenBSD pour : rcctl\"\u003ercctl(8)\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch3 id=\"php-fpm\"\u003ePHP-FPM\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe service se nomme : \u003ccode\u003ephp73_fpm\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eL\u0026rsquo;outil pour tester la configuration est : \u003ccode\u003ephp-fpm-73\u003c/code\u003e avec l\u0026rsquo;option \u003ccode\u003e-t\u003c/code\u003e,\npar exemple.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch4 id=\"httpd-configuration\"\u003ehttpd configuration\u003c/h4\u003e\n\u003cp\u003eLe \u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/#php-fpm\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003efragment de configuration\u003c/a\u003e\n\npour \u003ccode\u003ehttpd\u003c/code\u003e nécessaire est expliqué dans mon article présentant httpd.\u003c/p\u003e\n\u003ch4 id=\"activer-les-modules\"\u003eActiver les modules\u003c/h4\u003e\n\u003cp\u003eLes commandes suivantes sont à exécuter à chaque installation d\u0026rsquo;un module PHP,\npecl, et opcache :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# cd /etc/php-7.3.sample\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e i in *; \u003cspan style=\"color:#815ba4\"\u003edo\u003c/span\u003e ln -sf ../php-7.3.sample/\u003cspan style=\"color:#ef6155\"\u003e$i\u003c/span\u003e ../php-7.3/; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"openssl-functions\"\u003eOpenSSL Functions\u003c/h4\u003e\n\u003cp\u003eDu fait de la prison \u003ccode\u003e/var/www\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# mkdir -p /var/www/etc/ssl\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# install -m \u003cspan style=\"color:#f99b15\"\u003e444\u003c/span\u003e -o root -g bin /etc/ssl/cert.pem /etc/ssl/openssl.cnf /var/www/etc/ssl/\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"slowcgi\"\u003eslowcgi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eLe service se nomme tout simplement : \u003ccode\u003eslowcgi\u003c/code\u003e.\u003c/li\u003e\n\u003cli\u003eLes scripts cgi fournis dans \u003ccode\u003e/var/www/cgi-bin/\u003c/code\u003e sont accessibles grâce à\n\n    \u003ca class=\"man\" href=\"https://man.openbsd.org/slowcgi.8\" title=\"Page du Manuel OpenBSD pour : slowcgi\"\u003eslowcgi(8)\u003c/a\u003e\n. \u003cbr\u003e\nCeux de nagios sont fournis dans le répertoire enfant \u003ccode\u003enagios/\u003c/code\u003e.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"httpd\"\u003ehttpd\u003c/h3\u003e\n\u003cp\u003eIci, je vous renvoie à mon article de découverte du serveur \u003cstrong\u003ehttpd\u003c/strong\u003e, et tout\nparticulièrement aux informations d'\n\u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/#utilisation\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003eutilisations\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eModification du fichier de configuration \u003ccode\u003e/etc/httpd.conf\u003c/code\u003e pour y ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003einclude \u0026#34;/etc/httpd.d/nagios.conf\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCréation du fichier de config du serveur pour nagios \u003ccode\u003e/etc/httpd.d/nagios.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eserver \u0026#34;192.168.1.3\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elisten on * port 80\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elocation \u0026#34;/cgi-bin/nagios/*.cgi\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eauthenticate \u0026#34;! Nagios Restricted !\u0026#34; with \u0026#34;/nagios.ht\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003efastcgi socket \u0026#34;/run/slowcgi.sock\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elocation \u0026#34;/\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eauthenticate \u0026#34;! Nagios Restricted !\u0026#34; with \u0026#34;/nagios.ht\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003edirectory index index.php\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/nagios\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003elocation \u0026#34;*.php\u0026#34; {\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003efastcgi socket \u0026#34;/run/php-fpm.sock\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#06b6ef\"\u003eroot \u0026#34;/nagios\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cspan class=\"IMP\"\u003eIl est hautement recommandé de créer une authentification web\navec accès restreint !\u003c/span\u003e\u003c/p\u003e\n\u003ch4 id=\"création-de-lauthentification-web\"\u003eCréation de l\u0026rsquo;authentification web\u003c/h4\u003e\n\u003cp\u003eSachant que le compte admin par défaut est \u003ccode\u003enagiosadmin\u003c/code\u003e, utilisons l\u0026rsquo;outil\n\u003ca class=\"inside\" href=\"/fr/web/httpd/httpd/#authentification-web\" title=\"Lien interne vers l\u0026#39;article : 'httpd : présentation du serveur HTTP d\u0026#39;OpenBSD'\"\u003ehtpasswd\u003c/a\u003e\n :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# htpasswd nagios.ht nagiosadmin\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cspan class=\"IMP\"\u003eRéfléchissez bien avant de vouloir changer de nom\nd\u0026rsquo;administrateur, car il faudra le modifier au moins dans le fichier\n\u003ccode\u003eobjects/contacts.cfg\u003c/code\u003e…\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eEnsuite, il faut lui donner des droits d\u0026rsquo;exécution \u003ccode\u003e0400\u003c/code\u003e, et utilisateur web\n\u003ccode\u003ewww\u003c/code\u003e, autrement l\u0026rsquo;authentification ne se fera pas.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003eIl est ensuite possible de configurer d\u0026rsquo;autres utlisateurs, de la même manière\nauquels un rôle sera attribué, tel que celui d\u0026rsquo;\u003ccode\u003eoperator\u003c/code\u003e\u003c/em\u003e.\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eTous les fichiers de configuration se trouvent dans \u003ccode\u003e/etc/nagios\u003c/code\u003e - \u003cem\u003equi se\ntrouve être un alias de \u003ccode\u003e/var/www/etc/nagios\u003c/code\u003e \u003c/em\u003e :\u003c/p\u003e\n\u003ch3 id=\"cgicfg\"\u003ecgi.cfg\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eOption \u003ccode\u003euse_authentication\u003c/code\u003e : \u003cbr\u003e\n\u003cspan class=\"IMP\"\u003eSeulement le temps de tester que tout fonctionne, il est\npossible de mettre la valeur à \u003ccode\u003eO\u003c/code\u003e pour désactiver l\u0026rsquo;authentification\u003c/span\u003e \u003cbr\u003e\n\u003cspan class=\"red\"\u003eATTENTION, c'est une très mauvaise idée de fonctionner\n    sans authentification !\u003c/span\u003e\n\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLes options \u003ccode\u003eauthorized_for_*\u003c/code\u003e : si vous avez paramétré un rôle particulier,\nou tout autre nom d\u0026rsquo;utilisateur, vous pouvez l\u0026rsquo;ajouter selon ce qui est\ndésirable d\u0026rsquo;être utilisé par ce rôle, ou cet utilisateur.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOption \u003ccode\u003eshow_context_help\u003c/code\u003e : utile pour avoir une aide contextuelle\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIl peut être intéressant de configurer les options \u003ccode\u003e*_sound\u003c/code\u003e qui émettront un\nson caractéristique lié à l\u0026rsquo;erreur remontée.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLaissez l\u0026rsquo;option \u003ccode\u003elock_author_names\u003c/code\u003e sur la valeur \u003ccode\u003e1\u003c/code\u003e permet d\u0026rsquo;empêcher le\nchangement de nom d\u0026rsquo;utilisateur.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"nagioscfg\"\u003enagios.cfg\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eOption \u003ccode\u003eadmin_email\u003c/code\u003e : remplacer la valeur par défaut, par votre courriel.\u003c/li\u003e\n\u003cli\u003eOption \u003ccode\u003edate_format\u003c/code\u003e : choisir la valeur \u003ccode\u003eeuro\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eOption \u003ccode\u003euse_timezone\u003c/code\u003e : paramètrer \u003ccode\u003eEurope/Paris\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes fichiers de configuration se trouvent dans le répertoire enfant \u003ccode\u003eobjects\u003c/code\u003e :\u003c/p\u003e\n\u003ch3 id=\"contactscfg\"\u003econtacts.cfg\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eDéfinition \u003ccode\u003ealias\u003c/code\u003e : remplacer par un alias d\u0026rsquo;administration personnalisé, si besoin.\u003c/li\u003e\n\u003cli\u003eDéfinition \u003ccode\u003econtact_name\u003c/code\u003e : remplacer par votre identifiant\u003c/li\u003e\n\u003cli\u003eDéfinition \u003ccode\u003eemail\u003c/code\u003e : remplacer par votre courriel administrateur\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"erreur--not-have-permission-to-view\"\u003eErreur : not have permission to view\u003c/h3\u003e\n\u003cdiv class=\"info-quote\"\u003e\n    \u003cp class=\"is-white-50\"\u003eCitation :\u003c/p\u003e\n\u003c/div\u003e\n\u003cdiv class=\"quote\"\u003e\n    \u003cfigure\u003e\n        \u003cblockquote\u003e\n            \u003cspan class=\"red\"\u003eIt appears as though you do not have permission to view information for any of the hosts you requested…\u003c/span\u003e\u003cbr\u003e\n\u003cbr\u003e\nIf you believe this is an error, check the HTTP server authentication requirements for accessing this CGI and check the authorization options in your CGI configuration file.\n        \u003c/blockquote\u003e\n    \u003c/figure\u003e\n\u003c/div\u003e\n\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eÊtes-vous sûr d\u0026rsquo;avoir créé un utilisateur qui a/aura les droits de regarder\nla vue en question ?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi oui, êtes-vous sûr d\u0026rsquo;avoir autorisé l\u0026rsquo;utilisateur dans les fichiers de\nconfiguration, tel celui de \u003ccode\u003ecgi.cfg\u003c/code\u003e, cf les options \u003ccode\u003eauthorized_*\u003c/code\u003e ?\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eSi oui, êtes-vous sûr d\u0026rsquo;avoir relancé les différents services, tel httpd ou\nnagios ?\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cspan class=\"error\"\u003eCherchez votre oubli !\u003c/span\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAutres moniteurs réseaux :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eIcinga2\u003c/li\u003e\n\u003cli\u003eLibreNMS : \u003ca href=\"https://www.librenms.org\" rel=\"external\"\u003ehttps://www.librenms.org\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eZabbix : \u003ca href=\"https://www.zabbix.com\" rel=\"external\"\u003ehttps://www.zabbix.com\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
            "summary": "Comment mettre en place Nagios, sous OpenBSD, couplé avec les services web httpd et CGI slowcGI pour assurer le monitoring du matériel informatique. ",
            "tags": ["httpd", "nagios", "OpenBSD", "slowcgi", "serveur", "supervision"],
            "date_published": "2019-11-14T10:56:30+01:00",
            "date_modified": "2019-11-17T06:05:06+01:00"
        },{
            "id": "urn:uuid:91ab9e09-6243-7f68-4a02-854d55a35531",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-icmp/",
            "title": "PF accepte de gèrer le protocole ICMP",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description AstuceCet article peut très bien être utile pour le PF embarqué dans Debian GNU/kFreeBSD ! Suivant les recommandations que l\u0026rsquo;on retrouve sur mon autre article , à-propos des règles à mettre en place pour autoriser ou bloquer le flux ICMP, voici les règles PF adéquates, pour tout BSD qui utilise Packet Filter, dont OpenBSD :\nGestion Les codes ICMP à rejeter (…) icmp_block_types=\u0026#34;{ 4 6 15 16 17 18 31 32 33 34 35 36 37 38 39 }\u0026#34; (…) block drop quick on egress inet proto icmp icmp-type 3 code 6 block drop in quick on egress inet proto icmp icmp-type 3 code 7 block drop quick on egress inet proto icmp icmp-type 3 code 8 block drop quick on egress inet proto icmp icmp-type $icmp_block_types (…) AttentionIl semble que PF ne comprend pas les options 37, 38 (respectivement Domain Name Request, et Domain Name Reply) ; du moins, il ne les traduit pas, comme il le fait très bien avec les autres options ! Les codes ICMP à autoriser InfoL\u0026rsquo;équivalent limit d\u0026rsquo;Iptables n\u0026rsquo;existe pas pour PF !\nIl semble que c\u0026rsquo;est géré finement par le noyau BSD d\u0026rsquo;OpenBSD. (…) icmp_types=\u0026#34;{ 8 11 12 }\u0026#34; (…) block log pass out (…) pass in quick on egress inet proto icmp from any to egress icmp-type { 3 code 3, 3 code 4 } pass in quick on egress inet proto icmp from any to egress icmp-type $icmp_types pass out quick on egress inet proto icmp from egress to any icmp-type { 3 code 3, 3 code 4 } pass out quick on egress inet proto icmp from egress to any icmp-type $icmp_types Bien-sûr, vous pouvez autoriser tous les autres codes qui peuvent être autorisés et dont les recommandations sont de limiter. Les trois codes mis en exergue sont un minima !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eCet article peut très bien être utile pour le PF embarqué dans \u003ca href=\"https://wiki.debian.org/fr/Debian_GNU/kFreeBSD\" rel=\"external\"\u003eDebian GNU/kFreeBSD\u003c/a\u003e !\u003c/div\u003e\n\n\u003cp\u003eSuivant les recommandations que l\u0026rsquo;on retrouve sur mon autre \n\u003ca class=\"inside\" href=\"/fr/sec/firewall/linux-firewall-icmp/\" title=\"Lien interne vers l\u0026#39;article : 'Linux : firewall ICMP'\"\u003earticle\u003c/a\u003e\n,\nà-propos des règles à mettre en place pour autoriser ou bloquer le flux\nICMP, voici les règles PF adéquates, pour tout BSD qui utilise Packet Filter,\ndont OpenBSD :\u003c/p\u003e\n\u003ch2 id=\"gestion\"\u003eGestion\u003c/h2\u003e\n\u003ch3 id=\"les-codes-icmp-à-rejeter\"\u003eLes codes ICMP à rejeter\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eicmp_block_types\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ 4 6 15 16 17 18 31 32 33 34 35 36 37 38 39 }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblock drop quick on egress inet proto icmp icmp-type \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e code \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblock drop in quick on egress inet proto icmp icmp-type \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e code \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblock drop quick on egress inet proto icmp icmp-type \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e code \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblock drop quick on egress inet proto icmp icmp-type \u003cspan style=\"color:#ef6155\"\u003e$icmp_block_types\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eIl semble que PF ne comprend pas les options \u003cstrong\u003e37\u003c/strong\u003e,\n\u003cstrong\u003e38\u003c/strong\u003e \u003cem\u003e(respectivement \u003cstrong\u003eDomain Name Request\u003c/strong\u003e, et \u003cstrong\u003eDomain Name Reply\u003c/strong\u003e)\u003c/em\u003e ;\ndu moins, il ne les traduit pas, comme il le fait très bien avec les autres options !\u003c/div\u003e\n\n\u003ch3 id=\"les-codes-icmp-à-autoriser\"\u003eLes codes ICMP à autoriser\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eL\u0026rsquo;équivalent \u003ccode\u003elimit\u003c/code\u003e d\u0026rsquo;Iptables n\u0026rsquo;existe pas pour PF !\u003cbr\u003e\nIl semble que c\u0026rsquo;est géré finement par le noyau BSD d\u0026rsquo;OpenBSD.\u003c/div\u003e\n\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eicmp_types\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ 8 11 12 }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblock log\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass out\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass in quick on egress inet proto icmp from any to egress icmp-type \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e code 3, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e code \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass in quick on egress inet proto icmp from any to egress icmp-type \u003cspan style=\"color:#ef6155\"\u003e$icmp_types\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass out quick on egress inet proto icmp from egress to any icmp-type \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e code 3, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e code \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass out quick on egress inet proto icmp from egress to any icmp-type \u003cspan style=\"color:#ef6155\"\u003e$icmp_types\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eBien-sûr, vous pouvez autoriser tous les autres codes qui peuvent être autorisés\net dont les recommandations sont de limiter. Les trois codes mis en exergue sont un minima !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Exemple de règles pour gèrer le protocole ICMP avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "ICMP"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:f89c68fa-753e-d557-40ae-6b3a8655b277",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-icmpv6/",
            "title": "PF accepte de gérer le protocole ICMPv6",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description AstuceCet article peut très bien être utile pour le PF embarqué dans Debian GNU/kFreeBSD ! Reprenant le principe des informations renfermées dans mon autre article , à-propos des recommandations faites pour autoriser ou bloquer le flux ICMPv6, voici les règles PF adéquates pour tout BSD qui utilise Packet Filter, dont OpenBSD :\nAttentionNe JAMAIS oublier que toute la pile IPv6, à la différence d\u0026rsquo;IPv4, se repose vraiment sur ICMPv6 ; ainsi, une mauvaise configuration d\u0026rsquo;ICMPv6 empêchera assurément tout ou partie du flux IPv6 de fonctionner correctement, ou comme attendu ! Gestion Les codes ICMP à rejeter Ces types ICMPv6 sont à rejeter absolument :\nicmp6_block = \u0026#34;{ 100 101 127 138 139 140 144 145 146 147 150 200 201 }\u0026#34; block drop quick log on egress inet6 proto icmp6 icmp6-type $icmp6_block InfoATTENTION : Concernant les types 144 à 147, ce sont les messages qui servent à la mobilité d\u0026rsquo;un nœud (tel qu\u0026rsquo;une tablette, un laptop, etc…) ; dans ce contexte, il est nécessaire de ne pas les supprimer. Les codes ICMPv6 à autoriser ⇒ Gestion d\u0026rsquo;une station :\nicmp6_auth = \u0026#34;{ unreach toobig timex paramprob echoreq echoreq neighbradv neighbrsol }\u0026#34; pass out quick on egress inet6 proto icmp6 from any to ff02::2 icmp6-type { routersol, listenrepv2 } pass in quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv } pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts pass in quick on egress inet6 proto icmp6 from any to egress icmp6-type redir allow-opts Explications\nLa première règle définit les types ICMPv6 autorisés nécessaires, au minimum.\nLa deuxième règle autorise en sortie :\nles sollicitations depuis notre station à destination d\u0026rsquo;un routeur — ff02::2 est l\u0026rsquo;adresse multicast local de tout routeur — ainsi que les messages \u0026ldquo;Multicast Listener Report Message v2\u0026rdquo; listenrepv2 ces deux types ICMPv6 sont nécessaires pour communiquer localement cette règle est placée en premier car il faut bien que la station annonce qu\u0026rsquo;elle a besoin d\u0026rsquo;une adresse routable. La troisième règle autorise en entrée les annonces de routeur — type 143 — à destination du nœud local de notre station — ff02::1.\nc\u0026rsquo;est la réponse du routeur vers la requête précédente de notre station La quatrième règle autorise en entrée et en sortie, tous les types mentionnés dans la première règle — la macro $icmp6_auth.\nLa cinquième règle autorise en entrée toute annonce ICMPv6 de redirection vers une route plus courte.\nLes règles deux et trois sont strictement nécessaires pour débuter une communication sur le protocole IPv6 ; sans elles, la station sera incapable de le faire correctement !\n⇒ Gestion d\u0026rsquo;un routeur :\nPour débuter, faisons simplement :\nicmp6_auth = \u0026#34;{ echoreq echoreq neighbradv neighbrsol }\u0026#34; pass in quick on egress inet6 proto icmp6 icmp6-type { routersol, listenrepv2 } pass out quick on egress inet6 proto icmp6 icmp6-type routeradv pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth Limiter le trafic Pour limiter le trafic ICMPv6, PF peut utiliser les STO .\nPour reprendre l\u0026rsquo;exemple ci-dessus, en utilisant l\u0026rsquo;option max-src-conn-rate :\nicmp6_auth = \u0026#34;{ unreach toobig timex paramprob echoreq neighbradv neighbrsol }\u0026#34; icmp6_sto = \u0026#34;( max-src-conn-rate 100/10 )\u0026#34; pass out quick on egress inet6 proto icmp6 from any to ff02::2 icmp6-type { routersol, listenrepv2 } pass in quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv } pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto pass in quick on egress inet6 proto icmp6 from any to egress icmp6-type redir allow-opts $icmp6_sto Autorisations plus restrictives icmp6_auth = \u0026#34;{ unreach, toobig, timex code 0, timex code 1, paramprob code 1, paramprob code 2, echorep, echoreq, neighbradv, neighbrsol }\u0026#34; icmp6_out = \u0026#34;{ echorep, echoreq, neighbradv, neighbrsol }\u0026#34; icmp6_sto = \u0026#34;( max-src-conn-rate 100/10 )\u0026#34; pass out quick on egress inet6 proto icmp6 from any to ff02::2 icmp6-type { routersol, listenrepv2 } pass in quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv, redir } pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto pass out quick on egress inet6 proto from egress to any icmp6 icmp6-type $icmp6_out allow-opts $icmp6_sto Explications\nLa règle icmp6_auth ne gére que ce qui est absolument nécessaire… attention à bien utiliser les virgules séparant les codes, autrement elle ne serait pas fonctionnelle !\nLa règle icmp6_out n\u0026rsquo;autorise seulement que les messages d\u0026rsquo;echo et les messages de découvertes des voisins.\non a ajouté dans la première règle in la gestion des messages de redirection vers une route plus courte, seulement depuis un routeur vers notre machine. ATTENTION : autoriser le message de redirection de toute autre manière posera des problèmes de sécurité, à tel point qu\u0026rsquo;il semble recommander de les supprimer dans le contexte de parefeu !\n⇒ Cas d\u0026rsquo;un routeur :\nicmp6_auth = \u0026#34;{ unreach toobig timex paramprob echoreq echoreq neighbradv neighbrsol }\u0026#34; icmp6_sto = \u0026#34;( max-src-conn-rate 100/10 )\u0026#34; pass in quick on egress inet6 proto icmp6 icmp6-type { routersol, listenrepv2 } pass out quick on egress inet6 proto icmp6 icmp6-type { routeradv, redir } pass quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto Documentation http://livre.g6.asso.fr/index.php/Lien-local Stateful Tracking Options ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-tip\"\u003eAstuce\u003c/div\u003e\u003cdiv class=\"alert alert-tip\" role=\"alert\"\u003eCet article peut très bien être utile pour le PF embarqué dans\n\u003ca href=\"https://wiki.debian.org/fr/Debian_GNU/kFreeBSD\" rel=\"external\"\u003eDebian GNU/kFreeBSD\u003c/a\u003e !\u003c/div\u003e\n\n\u003cp\u003eReprenant le principe des informations renfermées dans mon autre\n\n\u003ca class=\"inside\" href=\"/fr/sec/firewall/linux-firewall-icmpv6/\" title=\"Lien interne vers l\u0026#39;article : 'Linux : firewall ICMPv6'\"\u003earticle\u003c/a\u003e\n,\nà-propos des recommandations faites pour autoriser ou bloquer le flux\nICMPv6, voici les règles PF adéquates pour tout BSD qui utilise\nPacket Filter, dont OpenBSD :\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eNe JAMAIS oublier que toute la pile IPv6, à la différence d\u0026rsquo;IPv4, se repose\nvraiment sur ICMPv6 ; ainsi, une mauvaise configuration d\u0026rsquo;ICMPv6 empêchera\nassurément tout ou partie du flux IPv6 de fonctionner correctement, ou\ncomme attendu !\u003c/div\u003e\n\n\u003ch2 id=\"gestion\"\u003eGestion\u003c/h2\u003e\n\u003ch3 id=\"les-codes-icmp-à-rejeter\"\u003eLes codes ICMP à rejeter\u003c/h3\u003e\n\u003cp\u003eCes types ICMPv6 sont à rejeter absolument :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_block\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ 100 101 127 138 139 140 144 145 146 147 150 200 201 }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eblock drop quick log on egress inet6 proto icmp6 icmp6-type $icmp6_block\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Concernant les types 144 à 147, ce sont les messages qui\nservent à la mobilité d\u0026rsquo;un nœud (tel qu\u0026rsquo;une tablette, un laptop, etc…) ;\ndans ce contexte, il est nécessaire de ne pas les supprimer.\u003c/div\u003e\n\n\u003chr\u003e\n\u003ch3 id=\"les-codes-icmpv6-à-autoriser\"\u003eLes codes ICMPv6 à autoriser\u003c/h3\u003e\n\u003cp\u003e⇒ Gestion d\u0026rsquo;une station :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_auth\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ unreach toobig timex paramprob echoreq echoreq neighbradv neighbrsol }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet6 proto icmp6 from any       to ff02::2 icmp6-type { routersol, listenrepv2 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in  quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass     quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in  quick on egress inet6 proto icmp6 from any to egress icmp6-type redir allow-opts\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLa première règle définit les types ICMPv6 autorisés nécessaires,\nau minimum.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa deuxième règle autorise en sortie :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eles sollicitations depuis notre station à destination d\u0026rsquo;un routeur\n— \u003ccode\u003eff02::2\u003c/code\u003e est l\u0026rsquo;adresse multicast local de tout routeur —\u003c/li\u003e\n\u003cli\u003eainsi que les messages \u0026ldquo;Multicast Listener Report Message v2\u0026rdquo;\n\u003ccode\u003elistenrepv2\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eces deux types ICMPv6 sont nécessaires pour communiquer localement\u003c/li\u003e\n\u003cli\u003ecette règle est placée en premier car il faut bien que la station\nannonce qu\u0026rsquo;elle a besoin d\u0026rsquo;une adresse routable.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa troisième règle autorise en entrée les annonces de routeur — type 143 —\nà destination du nœud local de notre station — \u003ccode\u003eff02::1\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ec\u0026rsquo;est la réponse du routeur vers la requête précédente de notre\nstation\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa quatrième règle autorise en entrée et en sortie, tous les types\nmentionnés dans la première règle — la macro \u003ccode\u003e$icmp6_auth\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa cinquième règle autorise en entrée toute annonce ICMPv6 de\nredirection vers une route plus courte.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eLes règles deux et trois sont strictement nécessaires pour débuter une\ncommunication sur le protocole IPv6 ; sans elles, la station sera\nincapable de le faire correctement !\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Gestion d\u0026rsquo;un routeur :\u003c/p\u003e\n\u003cp\u003ePour débuter, faisons simplement :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_auth\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ echoreq echoreq neighbradv neighbrsol }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in  quick on egress inet6 proto icmp6 icmp6-type { routersol, listenrepv2 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet6 proto icmp6 icmp6-type routeradv\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass     quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"limiter-le-trafic\"\u003eLimiter le trafic\u003c/h4\u003e\n\u003cp\u003ePour limiter le trafic ICMPv6, PF peut utiliser les\n\u003cabbr title=\"Stateful Tracking Options\"\u003eSTO\u003c/abbr\u003e\n.\u003c/p\u003e\n\u003cp\u003ePour reprendre l\u0026rsquo;exemple ci-dessus, en utilisant l\u0026rsquo;option\n\u003ccode\u003emax-src-conn-rate\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_auth\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ unreach toobig timex paramprob echoreq neighbradv neighbrsol }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_sto\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;( max-src-conn-rate 100/10 )\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet6 proto icmp6 from any       to ff02::2 icmp6-type { routersol, listenrepv2 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in  quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass     quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in  quick on egress inet6 proto icmp6 from any to egress icmp6-type redir allow-opts $icmp6_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"autorisations-plus-restrictives\"\u003eAutorisations plus restrictives\u003c/h4\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_auth\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ unreach, toobig, timex code 0, timex code 1, paramprob code 1, paramprob code 2, echorep, echoreq, neighbradv, neighbrsol }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_out\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ echorep, echoreq, neighbradv, neighbrsol }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_sto\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;( max-src-conn-rate 100/10 )\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet6 proto icmp6 from any       to ff02::2 icmp6-type { routersol, listenrepv2 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in  quick on egress inet6 proto icmp6 from fe80::/64 to ff02::1 icmp6-type { routeradv, redir }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass     quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet6 proto from egress to any icmp6 icmp6-type $icmp6_out allow-opts $icmp6_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eExplications\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLa règle \u003ccode\u003eicmp6_auth\u003c/code\u003e ne gére que ce qui est absolument nécessaire…\n\u003cstrong\u003eattention à bien utiliser les virgules séparant les codes,\nautrement elle ne serait pas fonctionnelle\u003c/strong\u003e !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa règle \u003ccode\u003eicmp6_out\u003c/code\u003e n\u0026rsquo;autorise seulement que les messages d\u0026rsquo;echo et\nles messages de découvertes des voisins.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eon a ajouté dans la première règle \u003ccode\u003ein\u003c/code\u003e la gestion des messages de\nredirection vers une route plus courte, seulement depuis un routeur\nvers notre machine. \u003cstrong\u003eATTENTION\u003c/strong\u003e : autoriser le message de redirection\nde toute autre manière posera des problèmes de sécurité, à tel point\nqu\u0026rsquo;il semble recommander de les supprimer dans le contexte de parefeu !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e⇒ Cas d\u0026rsquo;un routeur :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_auth\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;{ unreach toobig timex paramprob echoreq echoreq neighbradv neighbrsol }\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003eicmp6_sto\u003c/span\u003e  \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;( max-src-conn-rate 100/10 )\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass in  quick on egress inet6 proto icmp6 icmp6-type { routersol, listenrepv2 }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass out quick on egress inet6 proto icmp6 icmp6-type { routeradv, redir }\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003epass     quick on egress inet6 proto icmp6 icmp6-type $icmp6_auth allow-opts $icmp6_sto\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://livre.g6.asso.fr/index.php/Lien-local\" rel=\"external\"\u003ehttp://livre.g6.asso.fr/index.php/Lien-local\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.openbsd.org/faq/pf/filter.html#stateopts\" rel=\"external\"\u003eStateful Tracking Options\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Exemple de règles pour gérer le protocole ICMPv6 avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "ICMPv6", "astuce"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:462c7508-287c-9fc0-eb84-90b18a91d1fb",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-traceroute/",
            "title": "PF accepte de gèrer les connexions de l'outil traceroute",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description La commande traceroute a un comportement particulier, car il est possible d\u0026rsquo;utiliser l\u0026rsquo;option -I afin de simuler le comportement d\u0026rsquo;ICMP, voire d\u0026rsquo;ICMPv6.\nVoici la règle utile afin de sortir sur le protocol udp :\npass out on egress inet proto udp to port 33433:33626\nLa commande équivalente nommée traceroute6 pour la pile IPv6 fonctionne avec les mêmes options, donc de la même manière !\nDocumentation Manpage Allez lire un peu le manpage traceroute(8), cela fait toujours du bien de se rafraîchir la mémoire !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa commande \u003ccode\u003etraceroute\u003c/code\u003e a un comportement particulier, car il est possible\nd\u0026rsquo;utiliser l\u0026rsquo;option \u003ccode\u003e-I\u003c/code\u003e afin de simuler le comportement d\u0026rsquo;ICMP, voire d\u0026rsquo;ICMPv6.\u003c/p\u003e\n\u003cp\u003eVoici la règle utile afin de sortir sur le protocol \u003ccode\u003eudp\u003c/code\u003e :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epass out on egress inet proto udp to port 33433:33626\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eLa commande équivalente nommée \u003ccode\u003etraceroute6\u003c/code\u003e pour la pile IPv6 fonctionne\navec les mêmes options, donc de la même manière !\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"manpage\"\u003eManpage\u003c/h3\u003e\n\u003cp\u003eAllez lire un peu le manpage \u003ca href=\"https://man.openbsd.org/traceroute.8\" rel=\"external\"\u003etraceroute(8)\u003c/a\u003e,\ncela fait toujours du bien de se rafraîchir la mémoire !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Exemple de règles pour gèrer les connexions de l'outil traceroute avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "traceroute", "astuce"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:b283ad20-2310-d52e-ed57-ae44b1c46620",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-saned/",
            "title": "PF accepte de gèrer les connexions du scanner logiciel saned",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Normalement le port donné pour le service sane est le 6566 sur le protocole tcp.\nIl suffit donc d\u0026rsquo;écrire une règle équivalente :\npass out on egress proto tcp from egress to egress:network port 6566 flag S/SA modulate state\nCas d\u0026rsquo;une imprimante MFP Epson Si vous avez une MFP de marque Epson, le port 1865 sur udp est celui qu\u0026rsquo;il faut contacter… par défaut. (d\u0026rsquo;autres sont possibles, dépendant de votre modèle)\nMais une analyse de l\u0026rsquo;activité sur l\u0026rsquo;interface pflog0, par le biais de la fameuse commande tcpdump -n -e -ttt -i pflog0 nous restitue qu\u0026rsquo;il envoie des paquets sur udp à l\u0026rsquo;attention du réseau local, puis interroge en envoyant des paquets broadcasts, avant d\u0026rsquo;obtenir une réponse de l\u0026rsquo;imprimante… bref, tout se passe en udp.\nOct 10 13:15:25.146815 rule 53/(match) block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8612: udp 16 Oct 10 13:15:25.146890 rule 53/(match) block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8610: udp 16 Oct 10 13:15:25.158437 rule 53/(match) block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8612: udp 16 Oct 10 13:15:25.158493 rule 53/(match) block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8610: udp 16 Oct 10 13:15:30.007313 rule 53/(match) block in on axe0: 192.168.1.2.4891 \u0026gt; 255.255.255.255.3289: udp 15 [ttl 1] Oct 10 13:15:30.020862 rule 53/(match) block in on axe0: 192.168.1.3.3289 \u0026gt; 192.168.1.2.4891: udp 76 Oct 10 13:15:31.171140 rule 53/(match) block in on axe0: 192.168.1.2.17068 \u0026gt; 255.255.255.255.1124: udp 37 [ttl 1] Le plus simple est d\u0026rsquo;autoriser le flux du protocole udp entrant et venant du réseau local vers ou depuis l\u0026rsquo;interface locale :\npass in quick on egress proto udp from egress to egress:network allow-opts pass in quick on egress proto udp from egress:network to egress allow-opts ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eNormalement le port donné pour le service \u003ccode\u003esane\u003c/code\u003e est le \u003ccode\u003e6566\u003c/code\u003e sur le protocole \u003ccode\u003etcp\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eIl suffit donc d\u0026rsquo;écrire une règle équivalente :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epass out on egress proto tcp from egress to egress:network port 6566 flag S/SA modulate state\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"cas-dune-imprimante-mfp-epson\"\u003eCas d\u0026rsquo;une imprimante MFP Epson\u003c/h3\u003e\n\u003cp\u003eSi vous avez une MFP de marque Epson, le port \u003ccode\u003e1865\u003c/code\u003e sur \u003ccode\u003eudp\u003c/code\u003e est celui qu\u0026rsquo;il\nfaut contacter…\npar défaut. \u003cem\u003e(d\u0026rsquo;autres sont possibles, dépendant de votre modèle)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eMais une analyse de l\u0026rsquo;activité sur l\u0026rsquo;interface \u003ccode\u003epflog0\u003c/code\u003e, par le biais de\nla fameuse commande \u003ccode\u003etcpdump -n -e -ttt -i pflog0\u003c/code\u003e nous restitue qu\u0026rsquo;il\nenvoie des paquets sur \u003ccode\u003eudp\u003c/code\u003e à l\u0026rsquo;attention du réseau local, puis interroge\nen envoyant des paquets broadcasts, avant d\u0026rsquo;obtenir une réponse de l\u0026rsquo;imprimante… \u003cbr\u003e\nbref, tout se passe en \u003ccode\u003eudp\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOct \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 13:15:25.146815 rule 53/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ematch\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8612: udp \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOct \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 13:15:25.146890 rule 53/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ematch\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8610: udp \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOct \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 13:15:25.158437 rule 53/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ematch\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8612: udp \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOct \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 13:15:25.158493 rule 53/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ematch\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e block in on axe0: 192.168.1.2.8612 \u0026gt; 192.168.1.255.8610: udp \u003cspan style=\"color:#f99b15\"\u003e16\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOct \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 13:15:30.007313 rule 53/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ematch\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e block in on axe0: 192.168.1.2.4891 \u0026gt; 255.255.255.255.3289: udp \u003cspan style=\"color:#f99b15\"\u003e15\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ettl 1\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOct \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 13:15:30.020862 rule 53/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ematch\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e block in on axe0: 192.168.1.3.3289 \u0026gt; 192.168.1.2.4891: udp \u003cspan style=\"color:#f99b15\"\u003e76\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOct \u003cspan style=\"color:#f99b15\"\u003e10\u003c/span\u003e 13:15:31.171140 rule 53/\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ematch\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e block in on axe0: 192.168.1.2.17068 \u0026gt; 255.255.255.255.1124: udp \u003cspan style=\"color:#f99b15\"\u003e37\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003ettl 1\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe plus simple est d\u0026rsquo;autoriser le flux du protocole \u003ccode\u003eudp\u003c/code\u003e entrant et\nvenant du réseau local vers ou depuis l\u0026rsquo;interface locale :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass in quick on egress proto udp from egress to egress:network allow-opts\npass in quick on egress proto udp from egress:network to egress allow-opts\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n",
            "summary": "Exemple de règles pour gèrer les connexions du logiciel de scanner saned avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "saned", "astuce"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:07bf5cba-e134-ea61-f822-8e8b35f5202f",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-avahi/",
            "title": "PF accepte de gèrer les connexions du service avahi",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Voici les règles pare-feu au besoin :\n# avahi pass on egress inet proto udp from any to 224.0.0.251 port mdns allow-opts pass on egress inet6 proto udp from any to ff02::fb port mdns allow-opts # ssdp pass on egress inet proto udp from any to 239.255.255.250 port 1900 allow-opts pass on egress inet6 proto udp from any to { ff02::c, ff05::c, ff08::c } port 1900 allow-opts Précisions Concernant le trafic SSDP :\npour IPv6 : ff02::c est l\u0026rsquo;adresse multicast de lien local ff05::c est l\u0026rsquo;adresse multicast de site local ff08::c est l\u0026rsquo;adresse multicast d\u0026rsquo;organisation local il existe aussi ff0e::c pour l\u0026rsquo;adresse multicast global - que nous n\u0026rsquo;utiliserons pas dans le contexte local ! ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoici les règles pare-feu au besoin :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# avahi\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass on egress inet proto udp from any to 224.0.0.251 port mdns allow-opts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass on egress inet6 proto udp from any to ff02::fb port mdns allow-opts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# ssdp\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass on egress inet proto udp from any to 239.255.255.250 port \u003cspan style=\"color:#f99b15\"\u003e1900\u003c/span\u003e allow-opts\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass on egress inet6 proto udp from any to \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e ff02::c, ff05::c, ff08::c \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e port \u003cspan style=\"color:#f99b15\"\u003e1900\u003c/span\u003e allow-opts\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"précisions\"\u003ePrécisions\u003c/h3\u003e\n\u003cp\u003eConcernant le trafic SSDP :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003epour IPv6 :\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003eff02::c\u003c/code\u003e est l\u0026rsquo;adresse multicast de lien local\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eff05::c\u003c/code\u003e est l\u0026rsquo;adresse multicast de site local\u003c/li\u003e\n\u003cli\u003e\u003ccode\u003eff08::c\u003c/code\u003e est l\u0026rsquo;adresse multicast d\u0026rsquo;organisation local\u003c/li\u003e\n\u003cli\u003eil existe aussi \u003ccode\u003eff0e::c\u003c/code\u003e pour l\u0026rsquo;adresse multicast global - que nous\nn\u0026rsquo;utiliserons pas dans le contexte local !\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n",
            "summary": "Exemple de règles pour gèrer les connexions avahi avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "avahi", "astuce"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:50280c20-3fe8-4e72-55ae-0f0eb38225fe",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-samba/",
            "title": "PF accepte de gèrer les connexions du service Samba",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Voici les règles PF nécessaires :\n⇒ macros\nsmb_ports_tcp = \u0026#34;{ 135 137 139 445 }\u0026#34; smb_ports_udp = \u0026#34;{ 135 137 138 445 }\u0026#34; ⇒ samba in\npass in quick on egress proto tcp from egress:network to egress port $smb_ports_tcp flags S/SA modulate state pass in quick on egress proto udp from egress:network to egress port $smb_ports_udp allow-opts ⇒ samba out\npass out on egress proto tcp from egress to egress:network port $smb_ports_tcp flags S/SA modulate state pass out on egress proto udp from egress to egress:network port $smb_ports_udp allow-opts ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoici les règles PF nécessaires :\u003c/p\u003e\n\u003cp\u003e⇒ macros\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esmb_ports_tcp = \u0026#34;{ 135 137 139 445 }\u0026#34;\nsmb_ports_udp = \u0026#34;{ 135 137 138 445 }\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ samba in\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass in quick on egress proto tcp from egress:network to egress port $smb_ports_tcp flags S/SA modulate state\npass in quick on egress proto udp from egress:network to egress port $smb_ports_udp allow-opts\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ samba out\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass out on egress proto tcp from egress to egress:network port $smb_ports_tcp flags S/SA modulate state\npass out on egress proto udp from egress to egress:network port $smb_ports_udp allow-opts\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n",
            "summary": "Exemple de règles pour gérer les connexions du service SMB avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "SMB", "astuce"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:efed9fc4-9c79-e5dd-79c0-579231f67909",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-syncthing/",
            "title": "PF accepte de gèrer les connexions du service Syncthing",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Voici les règles PF nécessaires :\n⇒ in :\npass in quick on egress inet proto tcp from egress:network to egress port 22000 flags S/SA modulate state pass in quick on egress inet proto udp from egress:network to egress port 21027 allow-opts ⇒ out :\npass out quick on egress inet proto tcp from egress to egress:network port 22000 flags S/SA modulate state pass out quick on egress inet proto udp from egress to egress:network port 21027 allow-opts Bien-sûr, ces règles pour Syncthing sont à modifier, surtout si vous modifiez les ports dans la configuration de Syncthing !\nCe sont des règles de bases, pour exemple !\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eVoici les règles PF nécessaires :\u003c/p\u003e\n\u003cp\u003e⇒ in :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass in quick on egress inet proto tcp from egress:network to egress port 22000 flags S/SA modulate state\npass in quick on egress inet proto udp from egress:network to egress port 21027 allow-opts\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ out :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003epass out quick on egress inet proto tcp from egress to egress:network port 22000 flags S/SA modulate state\npass out quick on egress inet proto udp from egress to egress:network port 21027 allow-opts\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eBien-sûr, ces règles pour Syncthing sont à modifier, surtout si vous modifiez les ports dans la configuration de Syncthing !\u003c/p\u003e\n\u003cp\u003eCe sont des règles de bases, pour exemple !\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Exemple de règles pour gèrer les connexions du service Syncthing avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "syncthing", "astuce"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:38d6f0ab-ee6b-f6df-23f2-54f406ee3b46",
            "url": "http://doc.huc.fr.eu.org/fr/sec/firewall/pf-ping/",
            "title": "PF accepte de gèrer les ping",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Très simplement :\n⇒ IPv4 :\npass on egress inet proto icmp all icmp-type echoreq\n⇒ IPv6 :\npass on egress inet6 proto icmp all icmp6-type echoreq\nDocumentation Manpage N\u0026rsquo;hésitez pas à (re?)lire le manpage concernant la commande ping, et son équivalent ping6 qui fonctionne de la même manière avec presque toutes les mêmes options…\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eTrès simplement :\u003c/p\u003e\n\u003cp\u003e⇒ IPv4 :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epass on egress inet proto icmp all icmp-type echoreq\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003e⇒ IPv6 :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003epass on egress inet6 proto icmp all icmp6-type echoreq\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003ch3 id=\"manpage\"\u003eManpage\u003c/h3\u003e\n\u003cp\u003eN\u0026rsquo;hésitez pas à (re?)lire le manpage concernant la commande\n\u003ca href=\"https://man.openbsd.org/ping.8\" rel=\"external\"\u003e\u003ccode\u003eping\u003c/code\u003e\u003c/a\u003e,\net son équivalent \u003ccode\u003eping6\u003c/code\u003e qui fonctionne de la même manière avec presque\ntoutes les mêmes options…\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Exemple de règles pour gèrer les ping avec le parefeu Packet-Filter (PF)",
            "tags": ["firewall", "PF", "Packet-Filter", "ping", "ICMP", "astuce"],
            "date_published": "2019-10-31T12:38:55+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:e4958059-6a84-eb04-9f14-553eae51fd40",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/vm-debian-10-buster/",
            "title": "[OpenBSD :: Virtualisation] Debian Buster (10.x)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description La virtualisation de machine virtuelle sous OpenBSD est officiellement disponible nativement dans le système de base depuis OpenBSD 5.9.\nVersion : native OS : OpenBSD 6.5, 6.6 Pré-requis AttentionATTENTION : Ce tutoriel ne documente pas dans les moindres détails les phases d\u0026rsquo;installation, voire de configuration.\nIl est VRAIMENT nécessaire de faire preuve de réflexion, discernement et d\u0026rsquo;avoir un minimum de compétences, pour comprendre les liens entre les différentes briques !\nMerci de votre compréhension…\nIl est nécessaire que votre machine sur laquelle vous souhaitez virtualiser ait un CPU compatible avec les fonctions adéquates. Pour le vérifier, tapez dans votre terminal/console la commande suivante :\n:$ dmesg | egrep \u0026#39;(VMX/EPT|SVM/RVI)\u0026#39; La réponse du système doit être :\n⇒ pour CPU Intel :\nvmm0 at mainbus0: VMX/EPT ⇒ pour CPU Amd :\nvmm0 at mainbus0: SVM/RVI Si aucune ligne n\u0026rsquo;apparaît, aucune virtualisation ne sera possible. Par acquis de conscience, vérifiez votre BIOS|UEFI que celle-ci ne soit pas désactivée.\nInfoDe même, en rapport avec les failles CPU relatives à Meltdown, Spectre, certains CPU Intel sont patchés pour remédier à L1TF. Sous OpenBSD, ces CPU reçoivent un correctif approprié. Malheureusement, cela impacte la virtualisation et rend celle-ci impossible. Vous pouvez vous retrouver dans la situation où vous auriez un CPU compatible, mais dans les faits, la virtualisation ne pourrait être pleinement fonctionnelle.\nPréférez AMD, en attendant ARM…\nIl est nécessaire d\u0026rsquo;installer le firmware vmm pour que le kernel gère.\n:# fw_update vmm Par convention, créons un répertoire \u0026lsquo;\u0026lsquo;vm\u0026rsquo;\u0026rsquo; dans notre répertoire personnel, et nous travaillerons à partir de celui-ci : :$ mkdir vm \u0026amp;\u0026amp; cd vm\nPrécisions réseaux L\u0026rsquo;interface vether0 de l\u0026rsquo;hôte aura pour adresse IPv4 : 192.168.0.1, cette adresse IP sera l\u0026rsquo;adresse de la passerelle pour l\u0026rsquo;interface réseau de la VM.\nL\u0026rsquo;interface enp0s3 de la VM Debian aura pour adresse IPv4 : 192.168.0.2\nDans les deux cas, le masque de réseau est de 24 bits.\nLe serveur DNS renseigné dans le fichier /etc/resolv.conf de la VM de Debian est, par convention 1.1.1.1. C\u0026rsquo;est celui de Cloudfare. Mais il peut être très bien tout autre, pourvu qu\u0026rsquo;il soit respectueux de la confidentialité… tel que ceux de Quad9, par exemple !\nCe même serveur DNS peut être renseigné dans la règle PF de redirection de flux DNS vers la VM.\nCréation de l\u0026rsquo;image qcow2 Dans les deux cas présentés, nous commencerons par créer la VM, très simplement avec l\u0026rsquo;outil natif à OpenBSD, nommé vmctl :\nOpenBSD ≤ 6.5 : :$ vmctl create ~/vm/buster.qcow2 -s 10G OpenBSD ≥ 6.6 : :$ vmctl create -s 10G ~/vm/buster.qcow2 Téléchargement de l\u0026rsquo;iso Debian InfoATTENTION, vérifiez à l\u0026rsquo;URL suivante le nom de l\u0026rsquo;image iso de debian : https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/\nEt, modifiez en conséquence le code ci-dessous !\nTéléchargeons l\u0026rsquo;iso Debian :\n$ ftp https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/{debian-10.1.0-amd64-netinst.iso,SHA512SUMS} Trying 2001:6b0:19::173... Trying 2001:6b0:19::165... Trying 194.71.11.165... Requesting https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso Redirected to https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso Trying 2001:6b0:19::137... Trying 194.71.11.137... Requesting https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso 100% |*************************************************************************************************************************************************************| 335 MB 00:54 351272960 bytes received in 54.52 seconds (6.14 MB/s) Trying 2001:6b0:19::165... Trying 2001:6b0:19::173... Trying 194.71.11.173... Requesting https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA512SUMS 100% |*************************************************************************************************************************************************************| 658 00:00 658 bytes received in 0.00 seconds (639.20 KB/s) Une fois téléchargée, vérifions sa somme de contrôle :\n:$ sha512 -C SHA512SUMS debian-10.1.0-amd64-netinst.iso (SHA512) debian-10.1.0-amd64-netinst.iso: OK Si OK, alors c\u0026rsquo;est bon… sinon, re-téléchargez !\nConfiguration Le fichier de configuration se trouve être /etc/vm.conf. Il faut écrire votre compte identifiant dans la variable USER, cela permettra à votre utilisateur d\u0026rsquo;utiliser l\u0026rsquo;outil vmctl…\nUSER=\u0026#34;\u0026#34; VM=\u0026#34;/home/$USER/vm\u0026#34; switch \u0026#34;sw\u0026#34; { interface bridge0 } vm \u0026#34;buster\u0026#34; { disable memory 1G cdrom $VM/debian-10.1.0-amd64-netinst.iso disk $VM/debian.qcow2 interface { switch \u0026#34;sw\u0026#34; } owner $USER } Vérifiez la configuration à l\u0026rsquo;aide de l\u0026rsquo;option -n de vmd :\n:$ vmd -n\nAprès avoir configuré les interfaces réseaux, il faut maintenant démarrer le service de gestion des VMs :\n:# rcctl enable vmd :# rcctl start vmd Il est assurément utile de s\u0026rsquo;occuper de la traduction d\u0026rsquo;adresses réseaux, et aussi des règles du parefeu…\nInterfaces réseaux Créons les interfaces réseaux nécessaires que sont vether0 et bridge0 qui permettront un contrôle fin de l\u0026rsquo;adressage IP et des règles PF.\nPour l\u0026rsquo;interface vether0, il est possible d\u0026rsquo;utiliser n\u0026rsquo;importe quelle classe privée IPv4 (A: 10.0/8 ; B: 172.0.0/16 ; C: 192.168.0.0/24) - nous utiliserons un type de classe C privée, telle que 192.168.0.x. Après tout, nous n\u0026rsquo;avons pas plus de 256 VM à administrer… ;)\nbridge0 Le fichier relatif est /etc/hostname.bridge0 :\nadd vether0 vether0 Le fichier relatif est /etc/hostname.vether0 :\ninet 192.168.0.1 255.255.255.0 Une fois les fichiers d\u0026rsquo;interfaces créés, donnez des droits 0600 dessus, puis démarrez les deux interfaces :\n:# chmod 0600 /etc/hostname.{bridge,vether}0 :# sh /etc/netstart {bridge,vether}0 NAT Pour nous faciliter la vie avec notre futur VM, nous allons autoriser la redirection des paquets IP, pour qu\u0026rsquo;elle puisse communiquer sur Internet - ne serait-ce que pour faire les mises à jour…\nDans un terminal/console, écrivez :\n:# sysctl net.inet.ip.forwarding=1 :# sysctl net.inet6.ip6.forwarding=1 La première ligne est pour IPv4, la seconde pour IPv6.\nPuis, pour garder les paramètres au redémarrage, modifiez le fichier /etc/sysctl.conf pour ajouter :\nnet.inet.ip.forwarding=1 net.inet6.ip6.forwarding=1 AttentionSi vous ne voulez pas que votre VM soit \u0026ldquo;visible\u0026rdquo; sur le réseau, n\u0026rsquo;activez pas la traduction d\u0026rsquo;adresses réseaux ! PF Il sera ensuite nécessaire de modifier le fichier /etc/pf.conf ajouter au moins les règles suivantes :\n(…) domain = \u0026#34;1.1.1.1\u0026#34; match out on egress from (vether0:network) to any nat-to (egress) (…) pass in quick proto { udp tcp } from (vether0:network) to any port domain rdr-to $domain port domain pass on vether0 from 127.0.0.1 to any pass on vether0 from (vether0:network) to any (…) La première règle indique que tout ce qui vient du réseau lié à l\u0026rsquo;interface vether0 doit être traduit (NATé) vers les adresses IP faisant partie du groupe egress.\nLa deuxième règle demande à ce que tout flux entrant qui vient du service domain (port 53) sur les protocoles udp et tcp depuis le réseau lié à l\u0026rsquo;interface vether0 soit redirigée vers le service en question. L\u0026rsquo;adresse IPv4 1.1.1.1 est celle du serveur DNS de Cloudflare ; elle peut être très bien celle de tout autre serveur DNS.\nLa troisième règle autorise tout ce qui passe en entrée et en sortie sur l\u0026rsquo;interface vether0 depuis l\u0026rsquo;interface locale vers ailleurs…\nQuant à la quatrième, elle autorise tout du réseau, en entrée et en sortie, lié à l\u0026rsquo;interface vether0 vers partout !\nInstallation Démarrer la VM pour l\u0026rsquo;installation :\nPour OpenBSD ≤ 6.5 : :$ vmctl start buster -c Pour OpenBSD ≥ 6.6 : :$ vmctl start -c buster Choisir le menu \u0026ldquo;Install\u0026rdquo; - NE PAS APPUYEZ sur la touche ENTRÉE ; appuyez sur la touche TAB pour éditer le menu. Il va falloir corriger la ligne :\n\u0026gt; /install.amd/vmlinuz vga=788 initrd=/install.amd/initrd.gz --- quiet` en \u0026gt; /install.amd/vmlinuz vga=off initrd=/install.amd/initrd.gz --- quiet console=ttyS0,115200n8` ; une fois, transformée, appuyez sur la touche \u0026lt;kbd\u0026gt;ENTRÉE\u0026lt;/kbd\u0026gt; ! Le reste de l\u0026rsquo;installation de Debian se fait comme tout autre installation… à vous de paramétrer selon vos besoins.\nUne fois l\u0026rsquo;installation terminée, ne redémarrez pas par le biais de l\u0026rsquo;installateur, choisissez d\u0026rsquo;exécuter le shell, puis écrivez la commande : :# halt afin d\u0026rsquo;arrêter la VM proprement !\nPour finir Une fois que vous avez fini l\u0026rsquo;installation de Debian dans votre VM, que vous avez fait les derniers réglages nécessaires pour son bon fonctionnement, pensez à éditer à nouveau le fichier /etc/vm.conf :\nSupprimer/commenter toute écriture relative à la déclaration cdrom…\nRemplacer le mot clé disable par enable pour la VM debian - si vous désirez que la VM correspondante démarre, soit lors du démarrage de votre machine, si et seulement si le service vmd est bien actif et démarré lors du processus de démarrage machine, soit lorsque vous redémarrez le service vmd lui-même par vos soins.\nDépannage vmctl vmm bios firmware not found Vous n\u0026rsquo;avez tout simplement pas installé le firmware vmm !\nDocumentations Un tout petit laïus sur la commande vmctl : :$ man vmctl pour découvrir les différentes options bien utiles, dont show, status, start, et stop qu\u0026rsquo;il semble nécessaire de maîtriser !\nMerci de lire la documentation officielle FAQ Virtualisation- EN afin de bien comprendre le sujet, les différentes informations nécessaires à une meilleure préhension de celui-ci.\nIl est fortement intéressant de lire les pages de manuels, en anglais, relative à :\nvmctl(8) , vmd(8) , vm.conf(5) , vmm(4) sans oublier doas(1) , au besoin… Enjoy-IT! Enjoy-ID!\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLa virtualisation de machine virtuelle sous OpenBSD est officiellement\ndisponible nativement dans le système de base depuis OpenBSD 5.9.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eVersion : \u003cstrong\u003enative\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003eOS : OpenBSD \u003cstrong\u003e6.5\u003c/strong\u003e, \u003cstrong\u003e6.6\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"pré-requis\"\u003ePré-requis\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003e\u003cp\u003e\u003cstrong\u003eATTENTION\u003c/strong\u003e : Ce tutoriel ne documente pas dans les moindres détails\nles phases d\u0026rsquo;installation, voire de configuration.\u003c/p\u003e\n\u003cp\u003eIl est \u003cstrong\u003eVRAIMENT\u003c/strong\u003e nécessaire de faire preuve de réflexion, discernement\net d\u0026rsquo;avoir un minimum de compétences, pour comprendre les liens entre les\ndifférentes briques !\u003c/p\u003e\n\u003cp\u003eMerci de votre compréhension…\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eIl est nécessaire que votre machine sur laquelle vous souhaitez virtualiser\nait un CPU compatible avec les fonctions adéquates. Pour le vérifier, tapez\ndans votre terminal/console la commande suivante :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ dmesg | egrep \u003cspan style=\"color:#48b685\"\u003e\u0026#39;(VMX/EPT|SVM/RVI)\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa réponse du système doit être :\u003c/p\u003e\n\u003cp\u003e⇒ pour CPU Intel :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmm0 at mainbus0: VMX/EPT\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e⇒ pour CPU Amd :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-ksh\" data-lang=\"ksh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evmm0 at mainbus0: SVM/RVI\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSi aucune ligne n\u0026rsquo;apparaît, aucune virtualisation ne sera possible. Par\nacquis de conscience, vérifiez votre BIOS|UEFI que celle-ci ne soit pas\ndésactivée.\u003c/p\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eDe même, en rapport avec les failles CPU relatives à Meltdown, Spectre,\ncertains CPU Intel sont patchés pour remédier à \u003ca href=\"https://www.intel.fr/content/www/fr/fr/architecture-and-technology/l1tf.html\" rel=\"external\"\u003eL1TF\u003c/a\u003e.\nSous OpenBSD, ces CPU reçoivent un correctif approprié. Malheureusement,\ncela impacte la virtualisation et rend celle-ci impossible.\nVous pouvez vous retrouver dans la situation où vous auriez un CPU\ncompatible, mais dans les faits, la virtualisation ne pourrait être\npleinement fonctionnelle.\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ePréférez AMD, en attendant ARM…\u003c/em\u003e\u003c/p\u003e\n\u003c/div\u003e\n\n\u003chr\u003e\n\u003cp\u003eIl est nécessaire d\u0026rsquo;installer le firmware \u003ccode\u003evmm\u003c/code\u003e pour que le kernel gère.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# fw_update vmm\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003ePar convention, créons un répertoire \u0026lsquo;\u0026lsquo;vm\u0026rsquo;\u0026rsquo; dans notre répertoire personnel,\net nous travaillerons à partir de celui-ci :  \u003cbr\u003e\n\u003ccode\u003e:$ mkdir vm \u0026amp;\u0026amp; cd vm\u003c/code\u003e\u003c/p\u003e\n\u003ch3 id=\"précisions-réseaux\"\u003ePrécisions réseaux\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e de l\u0026rsquo;hôte aura pour adresse IPv4 : \u003ccode\u003e192.168.0.1\u003c/code\u003e,\ncette adresse IP sera l\u0026rsquo;adresse de la passerelle pour l\u0026rsquo;interface réseau de\nla VM.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eL\u0026rsquo;interface \u003ccode\u003eenp0s3\u003c/code\u003e de la VM Debian aura pour adresse IPv4 : \u003ccode\u003e192.168.0.2\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eDans les deux cas, le masque de réseau est de 24 bits.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLe serveur DNS renseigné dans le fichier \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e de la VM de\nDebian est, par convention \u003ccode\u003e1.1.1.1\u003c/code\u003e. C\u0026rsquo;est celui de Cloudfare.  \u003cbr\u003e\nMais il peut être très bien tout autre, pourvu qu\u0026rsquo;il soit respectueux\nde la confidentialité… tel que ceux de Quad9, par exemple !\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCe même serveur DNS peut être renseigné dans la règle PF de redirection\nde flux DNS vers la VM.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"création-de-limage-qcow2\"\u003eCréation de l\u0026rsquo;image qcow2\u003c/h2\u003e\n\u003cp\u003eDans les deux cas présentés, nous commencerons par créer la VM, très simplement\navec l\u0026rsquo;outil natif à OpenBSD, nommé \u003ccode\u003evmctl\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eOpenBSD ≤ 6.5 : \u003ccode\u003e:$ vmctl create ~/vm/buster.qcow2 -s 10G\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eOpenBSD ≥ 6.6 : \u003ccode\u003e:$ vmctl create -s 10G ~/vm/buster.qcow2\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"téléchargement-de-liso-debian\"\u003eTéléchargement de l\u0026rsquo;iso Debian\u003c/h2\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003e\u003cp\u003eATTENTION, vérifiez à l\u0026rsquo;URL suivante le nom de l\u0026rsquo;image iso de debian : \u003cbr\u003e\n\u003ca href=\"https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/\" rel=\"external\"\u003ehttps://cdimage.debian.org/debian-cd/current/amd64/iso-cd/\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eEt, modifiez en conséquence le code ci-dessous !\u003c/p\u003e\n\u003c/div\u003e\n\n\u003cp\u003eTéléchargeons l\u0026rsquo;iso Debian :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ ftp https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/\u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003edebian-10.1.0-amd64-netinst.iso,SHA512SUMS\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 2001:6b0:19::173...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 2001:6b0:19::165...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 194.71.11.165...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRequesting https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRedirected to https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 2001:6b0:19::137...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 194.71.11.137...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRequesting https://gemmei.ftp.acc.umu.se/debian-cd/current/amd64/iso-cd/debian-10.1.0-amd64-netinst.iso\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e100% |*************************************************************************************************************************************************************|   \u003cspan style=\"color:#f99b15\"\u003e335\u003c/span\u003e MB    00:54\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e351272960\u003c/span\u003e bytes received in 54.52 seconds \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e6.14 MB/s\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 2001:6b0:19::165...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 2001:6b0:19::173...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTrying 194.71.11.173...\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRequesting https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/SHA512SUMS\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e100% |*************************************************************************************************************************************************************|   \u003cspan style=\"color:#f99b15\"\u003e658\u003c/span\u003e       00:00\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e658\u003c/span\u003e bytes received in 0.00 seconds \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e639.20 KB/s\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUne fois téléchargée, vérifions sa somme de contrôle :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ sha512 -C SHA512SUMS debian-10.1.0-amd64-netinst.iso\n(SHA512) debian-10.1.0-amd64-netinst.iso: OK\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eSi \u003cstrong\u003eOK\u003c/strong\u003e, alors c\u0026rsquo;est bon… \u003cspan class=\"red\"\u003esinon, re-téléchargez\u003c/span\u003e\n !\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eLe fichier de configuration se trouve être \u003ccode\u003e/etc/vm.conf\u003c/code\u003e. Il faut écrire\nvotre compte identifiant dans la variable \u003ccode\u003eUSER\u003c/code\u003e, cela permettra à votre\nutilisateur d\u0026rsquo;utiliser l\u0026rsquo;outil \u003ccode\u003evmctl\u003c/code\u003e…\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eUSER\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eVM\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;/home/\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/vm\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eswitch \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sw\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    interface bridge0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003evm \u003cspan style=\"color:#48b685\"\u003e\u0026#34;buster\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    disable\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    memory 1G\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    cdrom \u003cspan style=\"color:#ef6155\"\u003e$VM\u003c/span\u003e/debian-10.1.0-amd64-netinst.iso\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    disk \u003cspan style=\"color:#ef6155\"\u003e$VM\u003c/span\u003e/debian.qcow2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    interface \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e switch \u003cspan style=\"color:#48b685\"\u003e\u0026#34;sw\u0026#34;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    owner \u003cspan style=\"color:#ef6155\"\u003e$USER\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eVérifiez la configuration à l\u0026rsquo;aide de l\u0026rsquo;option \u003ccode\u003e-n\u003c/code\u003e de vmd :\u003c/p\u003e\n\u003cp\u003e\u003ccode\u003e:$ vmd -n\u003c/code\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eAprès avoir configuré les \u003ca href=\"/fr/sys/openbsd/vm-debian-10-buster/#interfaces-réseaux\"\u003einterfaces réseaux\u003c/a\u003e,\nil faut maintenant démarrer le service de gestion des VMs :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# rcctl enable vmd\n:# rcctl start vmd\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eIl est assurément utile de s\u0026rsquo;occuper de la \u003ca href=\"/fr/sys/openbsd/vm-debian-10-buster/#nat\"\u003etraduction d\u0026rsquo;adresses réseaux\u003c/a\u003e,\net aussi des \u003ca href=\"/fr/sys/openbsd/vm-debian-10-buster/#pf\"\u003erègles du parefeu\u003c/a\u003e…\u003c/p\u003e\n\u003ch3 id=\"interfaces-réseaux\"\u003eInterfaces réseaux\u003c/h3\u003e\n\u003cp\u003eCréons les interfaces réseaux nécessaires que sont \u003ccode\u003evether0\u003c/code\u003e et \u003ccode\u003ebridge0\u003c/code\u003e\nqui permettront un contrôle fin de l\u0026rsquo;adressage IP et des règles PF.\u003c/p\u003e\n\u003cp\u003ePour l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e, il est possible d\u0026rsquo;utiliser n\u0026rsquo;importe quelle\nclasse privée IPv4 \u003cem\u003e(A: 10.0/8 ; B: 172.0.0/16 ; C: 192.168.0.0/24)\u003c/em\u003e -\nnous utiliserons un type de classe C privée, telle que \u003ccode\u003e192.168.0.x\u003c/code\u003e.\n\u003cem\u003eAprès tout, nous n\u0026rsquo;avons pas plus de 256 VM à administrer\u003c/em\u003e… ;)\u003c/p\u003e\n\u003ch4 id=\"bridge0\"\u003ebridge0\u003c/h4\u003e\n\u003cp\u003eLe fichier relatif est \u003ccode\u003e/etc/hostname.bridge0\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eadd vether0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"vether0\"\u003evether0\u003c/h4\u003e\n\u003cp\u003eLe fichier relatif est \u003ccode\u003e/etc/hostname.vether0\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003einet 192.168.0.1 255.255.255.0\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003chr\u003e\n\u003cp\u003eUne fois les fichiers d\u0026rsquo;interfaces créés, donnez des droits 0600 dessus,\npuis démarrez les deux interfaces :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# chmod 0600 /etc/hostname.{bridge,vether}0\n:# sh /etc/netstart {bridge,vether}0\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"nat\"\u003eNAT\u003c/h3\u003e\n\u003cp\u003ePour nous faciliter la vie avec notre futur VM, nous allons autoriser la\nredirection des paquets IP, pour qu\u0026rsquo;elle puisse communiquer sur Internet -\n\u003cem\u003ene serait-ce que pour faire les mises à jour\u003c/em\u003e…\u003c/p\u003e\n\u003cp\u003eDans un terminal/console, écrivez :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sysctl net.inet.ip.forwarding\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:# sysctl net.inet6.ip6.forwarding\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLa première ligne est pour IPv4, la seconde pour IPv6.\u003c/p\u003e\n\u003cp\u003ePuis, pour garder les paramètres au redémarrage, modifiez le fichier\n\u003ccode\u003e/etc/sysctl.conf\u003c/code\u003e pour ajouter :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-cfg\" data-lang=\"cfg\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003enet.inet.ip.forwarding\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#06b6ef\"\u003enet.inet6.ip6.forwarding\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\n\u003cdiv class=\"tab-info i-warning\"\u003eAttention\u003c/div\u003e\u003cdiv class=\"alert alert-warning\" role=\"alert\"\u003eSi vous ne voulez pas que votre VM soit \u0026ldquo;visible\u0026rdquo; sur le réseau,\nn\u0026rsquo;activez pas la traduction d\u0026rsquo;adresses réseaux !\u003c/div\u003e\n\n\u003ch3 id=\"pf\"\u003ePF\u003c/h3\u003e\n\u003cp\u003eIl sera ensuite nécessaire de modifier le fichier \u003ccode\u003e/etc/pf.conf\u003c/code\u003e ajouter\nau moins les règles suivantes :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003edomain\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#34;1.1.1.1\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ematch out on egress from \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003evether0:network\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e to any nat-to \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eegress\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass in quick proto \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e udp tcp \u003cspan style=\"color:#5bc4bf\"\u003e}\u003c/span\u003e from \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003evether0:network\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e to any port domain rdr-to \u003cspan style=\"color:#ef6155\"\u003e$domain\u003c/span\u003e port domain\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass on vether0 from 127.0.0.1 to any\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epass on vether0 from \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003evether0:network\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e to any\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e…\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eLa première règle indique que tout ce qui vient du réseau lié à l\u0026rsquo;interface\n\u003ccode\u003evether0\u003c/code\u003e doit être traduit (NATé) vers les adresses IP faisant partie\ndu groupe \u003ccode\u003eegress\u003c/code\u003e.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa deuxième règle demande à ce que tout flux entrant qui vient du service\n\u003ccode\u003edomain\u003c/code\u003e (port \u003ccode\u003e53\u003c/code\u003e) sur les protocoles \u003ccode\u003eudp\u003c/code\u003e et \u003ccode\u003etcp\u003c/code\u003e depuis\nle réseau lié à l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e soit redirigée vers le service\nen question. \u003cbr\u003e\nL\u0026rsquo;adresse IPv4 \u003ccode\u003e1.1.1.1\u003c/code\u003e est celle du serveur DNS de Cloudflare ;\nelle peut être très bien celle de tout autre serveur DNS.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eLa troisième règle autorise tout ce qui passe en entrée et en sortie\nsur l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e depuis l\u0026rsquo;interface \u003ccode\u003elocale\u003c/code\u003e  vers ailleurs…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eQuant à la quatrième, elle autorise tout du réseau, en entrée et en sortie,\nlié à l\u0026rsquo;interface \u003ccode\u003evether0\u003c/code\u003e vers partout !\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eDémarrer la VM pour l\u0026rsquo;installation :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ePour OpenBSD ≤ 6.5 : \u003ccode\u003e:$ vmctl start buster -c\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003ePour OpenBSD ≥ 6.6 : \u003ccode\u003e:$ vmctl start -c buster\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChoisir le menu \u0026ldquo;Install\u0026rdquo; - \u003cstrong\u003eNE PAS APPUYEZ sur la touche \u003ckbd\u003eENTRÉE\u003c/kbd\u003e\u003c/strong\u003e ;\nappuyez sur la touche \u003ckbd\u003eTAB\u003c/kbd\u003e pour éditer le menu. Il va falloir\ncorriger la ligne :\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e\u0026gt; /install.amd/vmlinuz vga=788 initrd=/install.amd/initrd.gz --- quiet` en\n\u0026gt; /install.amd/vmlinuz vga=off initrd=/install.amd/initrd.gz --- quiet console=ttyS0,115200n8` ;\n\u003c/code\u003e\u003c/pre\u003e\u003cpre\u003e\u003ccode\u003eune fois, transformée, appuyez sur la touche \u0026lt;kbd\u0026gt;ENTRÉE\u0026lt;/kbd\u0026gt; !\n\u003c/code\u003e\u003c/pre\u003e\n\u003cp\u003eLe reste de l\u0026rsquo;installation de Debian se fait comme tout autre installation…\nà vous de paramétrer selon vos besoins.\u003c/p\u003e\n\u003cp\u003eUne fois l\u0026rsquo;installation terminée, ne redémarrez pas par le biais de l\u0026rsquo;installateur,\nchoisissez d\u0026rsquo;exécuter le shell, puis écrivez la commande : \u003cbr\u003e\n\u003ccode\u003e:# halt\u003c/code\u003e afin d\u0026rsquo;arrêter la VM proprement !\u003c/p\u003e\n\u003ch3 id=\"pour-finir\"\u003ePour finir\u003c/h3\u003e\n\u003cp\u003eUne fois que vous avez fini l\u0026rsquo;installation de Debian dans votre VM, que\nvous avez fait les derniers réglages nécessaires pour son bon fonctionnement,\npensez à éditer à nouveau le fichier \u003ccode\u003e/etc/vm.conf\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eSupprimer/commenter toute écriture relative à la déclaration \u003ccode\u003ecdrom\u003c/code\u003e…\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRemplacer le mot clé \u003ccode\u003edisable\u003c/code\u003e par \u003ccode\u003eenable\u003c/code\u003e pour la VM \u003ccode\u003edebian\u003c/code\u003e - \u003cbr\u003e\nsi vous désirez que la VM correspondante démarre, soit lors du démarrage\nde votre machine, si et seulement si le service \u003ccode\u003evmd\u003c/code\u003e est bien actif\net démarré lors du processus de démarrage machine, soit lorsque vous\nredémarrez le service \u003ccode\u003evmd\u003c/code\u003e lui-même par vos soins.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"vmctl-vmm-bios-firmware-not-found\"\u003evmctl vmm bios firmware not found\u003c/h3\u003e\n\u003cp\u003eVous n\u0026rsquo;avez tout simplement pas installé le firmware \u003cstrong\u003evmm\u003c/strong\u003e !\u003c/p\u003e\n\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cp\u003eUn tout petit laïus sur la commande \u003ccode\u003evmctl\u003c/code\u003e : \u003cbr\u003e\n\u003ccode\u003e:$ man vmctl\u003c/code\u003e pour découvrir les différentes options bien utiles,\ndont \u003ccode\u003eshow\u003c/code\u003e, \u003ccode\u003estatus\u003c/code\u003e, \u003ccode\u003estart\u003c/code\u003e, et \u003ccode\u003estop\u003c/code\u003e qu\u0026rsquo;il semble nécessaire de maîtriser !\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eMerci de lire la documentation officielle \u003cem\u003e\u003cem\u003eFAQ Virtualisation\u003c/em\u003e-\u003c/em\u003e \u003ca href=\"https://www.openbsd.org/faq/faq16.html\" rel=\"external\"\u003eEN\u003c/a\u003e\nafin de bien comprendre le sujet, les différentes informations nécessaires\nà une meilleure préhension de celui-ci.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eIl est fortement intéressant de lire les pages de manuels, en anglais, relative\nà :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmctl.8\" title=\"Page du Manuel OpenBSD pour : vmctl\"\u003evmctl(8)\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmd.8\" title=\"Page du Manuel OpenBSD pour : vmd\"\u003evmd(8)\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vm.conf.5\" title=\"Page du Manuel OpenBSD pour : vm.conf\"\u003evm.conf(5)\u003c/a\u003e\n,\u003c/li\u003e\n\u003cli\u003e\n\u003ca class=\"man\" href=\"https://man.openbsd.org/vmm.4\" title=\"Page du Manuel OpenBSD pour : vmm\"\u003evmm(4)\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003esans oublier \n\u003ca class=\"man\" href=\"https://man.openbsd.org/doas.1\" title=\"Page du Manuel OpenBSD pour : doas\"\u003edoas(1)\u003c/a\u003e\n, au besoin…\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eEnjoy-IT! \u003cbr\u003e\nEnjoy-ID!\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Virtualiser Debian Buster (10.x) sous OpenBSD grâce à vmd",
            "tags": ["OpenBSD", "Virtualisation", "Debian", "Buster", "vmd"],
            "date_published": "2019-10-15T22:00:34+02:00",
            "date_modified": "2025-11-19T15:01:42+01:00"
        },{
            "id": "urn:uuid:90fdf212-3d3a-ed2e-4f5b-d9c333c33a04",
            "url": "http://doc.huc.fr.eu.org/fr/dev/python/env-python-openbsd/",
            "title": "Python : environnement virtuel sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description OS : OpenBSD 6.x Depuis OpenBSD 6.0, l\u0026rsquo;option de montage wxallowed est configuré par défaut sur /usr/local. Pour ceux qui ne le savent pas, c\u0026rsquo;est une protection système. Si la partition a cette option, les logiciels sont autorisés à fonctionner depuis cette partition, sinon ils ne pourront fonctionner et émettront un message de violation W^X, tel que :\n:$ dmesg | grep wxallowed /home/hs/.local/share/virtualenvs/mybeautifullproject-q1koN8ay/bin/python3(26392): W^X binary outside wxallowed mountpoint` De fait, puisque seul /usr/local a cette option activée, si vous tentez d\u0026rsquo;exécuter un programme depuis, par exemple, votre $HOME, cela ne fonctionnera pas. Et, c\u0026rsquo;est tout le problème avec les environnements Python qui doivent fonctionner dans votre répertoire personnel.\nDans les faits, voici ce qui se passe pour virtualenv :\n:$ virtualenv mybeautifullproject Using base prefix \u0026#39;/usr/local\u0026#39; New python executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3 Also creating executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python ERROR: The executable $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3 could not be run: [Errno 13] Permission denied: \u0026#39;$HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python C\u0026rsquo;est pareil pour pipenv :\n:$ pipenv install requests Warning: the environment variable LANG is not set! We recommend setting this in ~/.profile (or equivalent) for proper expected behavior. Creating a virtualenv for this project… Pipfile: $HOME/python/mybeautifullproject.py/Pipfile Using /usr/local/bin/python3 (3.6.8) to create virtualenv… ⠇ Creating virtual environment...Already using interpreter /usr/local/bin/python3 Using base prefix \u0026#39;/usr/local\u0026#39; New python executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3 Also creating executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python ERROR: The executable $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3 could not be run: [Errno 13] Permission denied: \u0026#39;$HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3\u0026#39; ✘ Failed creating virtual environment [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/cli/command.py\u0026#34;, line 254, in install [pipenv.exceptions.VirtualenvCreationException]: editable_packages=state.installstate.editables, [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 1741, in do_install [pipenv.exceptions.VirtualenvCreationException]: pypi_mirror=pypi_mirror, [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 574, in ensure_project [pipenv.exceptions.VirtualenvCreationException]: pypi_mirror=pypi_mirror, [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 506, in ensure_virtualenv [pipenv.exceptions.VirtualenvCreationException]: python=python, site_packages=site_packages, pypi_mirror=pypi_mirror [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 935, in do_create_virtualenv [pipenv.exceptions.VirtualenvCreationException]: extra=[crayons.blue(\u0026#34;{0}\u0026#34;.format(c.err)),] [pipenv.exceptions.VirtualenvCreationException]: Failed to create virtual environment. D\u0026rsquo;autant que ce n\u0026rsquo;est vraiment pas un problème de droits utilisateurs :\n:$ ls -al mybeautifullproject/ total 40 drwxr-xr-x 5 hs hs 512 Jun 3 01:43 ./ drwxr-xr-x 3 hs hs 512 Jun 3 01:44 ../ drwxr-xr-x 2 hs hs 512 Jun 3 01:43 bin/ drwxr-xr-x 2 hs hs 512 Jun 3 01:43 include/ drwxr-xr-x 3 hs hs 512 Jun 3 01:43 lib/ :$ ls -al mybeautifullproject/bin/ total 40 drwxr-xr-x 2 hs hs 512 Jun 3 01:43 ./ drwxr-xr-x 5 hs hs 512 Jun 3 01:43 ../ lrwxr-xr-x 1 hs hs 7 Jun 3 01:43 python@ -\u0026gt; python3 -rwxr-xr-x 1 hs hs 10680 Jun 3 01:43 python3* lrwxr-xr-x 1 hs hs 7 Jun 3 01:43 python3.6@ -\u0026gt; python3 Configuration Une petite modification système va faciliter notre vie - puisque /usr/local est la seule partition autorisée à l\u0026rsquo;exécution des programmes qui nécessitent la violation W^X :\nCréation d\u0026rsquo;un répertoire utilisateur dedans : :# mkdir -p /usr/local/${my_user}/python Attribution des droits utilisateur et groupe correcte : :# chown -R ${my_user}:wheel /usr/local/${my_user} Création d\u0026rsquo;un lien symbolique : :# ln -s /usr/local/${my_user}/python $home/python Remplacez ${my_user} par votre identifiant de session ;)\nSi vous avez la bonne idée d\u0026rsquo;utiliser l\u0026rsquo;outil pipenv, il faudra créer un nouveau répertoire et le lier symboliquement ; lisez la section TL;DR ci-dessous…\nTL;DR Remplacez \u0026lsquo;\u0026rsquo;${my_user}\u0026rsquo;\u0026rsquo; par votre identifiant de session !\n⇒ Pour virtualenv :\n:# mkdir -p /usr/local/${my_user}/python :# chown -R ${my_user}:wheel /usr/local/${my_user} :# ln -s /usr/local/${my_user}/python $home/python` ⇒ Pour pipenv, il faut rajouter à ce qui suit au-dessus : \\\n:$ mkdir /usr/local/$USER/python/virtualenvs :$ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs` Documentations La documentation de pipenv - en anglais : https://pipenv.readthedocs.io/en/latest/ À-propos de l\u0026rsquo;option de montage wxallowed : le Guide de Migration OpenBSD 5.9 vers 6.0 - EN / FR La réponse expliquée sur le forum \u0026ldquo;obsd4*\u0026rdquo; Remerciements Ce tutoriel n\u0026rsquo;existerait pas sans Xavier… et, sans cet article anglais, nommé \u0026ldquo;Using cabal on OpenBSD\u0026rdquo; ",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eOS : OpenBSD 6.x\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDepuis OpenBSD 6.0, l\u0026rsquo;option de montage \u003ccode\u003ewxallowed\u003c/code\u003e est configuré par\ndéfaut sur \u003ccode\u003e/usr/local\u003c/code\u003e. Pour ceux qui ne le savent pas, c\u0026rsquo;est une protection\nsystème. Si la partition a cette option, les logiciels sont autorisés à\nfonctionner depuis cette partition, sinon ils ne pourront fonctionner et\némettront un message de violation \u003ccode\u003eW^X\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e:$ dmesg | grep wxallowed\n/home/hs/.local/share/virtualenvs/mybeautifullproject-q1koN8ay/bin/python3(26392): W^X binary outside wxallowed mountpoint`\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDe fait, puisque seul \u003ccode\u003e/usr/local\u003c/code\u003e a cette option activée, si vous tentez\nd\u0026rsquo;exécuter un programme depuis, par exemple, votre \u003ccode\u003e$HOME\u003c/code\u003e, cela ne fonctionnera\npas. Et, c\u0026rsquo;est tout le problème avec les environnements Python qui doivent\nfonctionner dans votre répertoire personnel.\u003c/p\u003e\n\u003cp\u003eDans les faits, voici ce qui se passe pour \u003ccode\u003evirtualenv\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e:$ virtualenv mybeautifullproject\nUsing base prefix \u0026#39;/usr/local\u0026#39;\nNew python executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3\nAlso creating executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python\nERROR: The executable $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3 could not be run: [Errno 13] Permission denied: \u0026#39;$HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eC\u0026rsquo;est pareil pour \u003ccode\u003epipenv\u003c/code\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e:$ pipenv install requests\nWarning: the environment variable LANG is not set!\nWe recommend setting this in ~/.profile (or equivalent) for proper expected behavior.\nCreating a virtualenv for this project…\nPipfile: $HOME/python/mybeautifullproject.py/Pipfile\nUsing /usr/local/bin/python3 (3.6.8) to create virtualenv…\n⠇ Creating virtual environment...Already using interpreter /usr/local/bin/python3\nUsing base prefix \u0026#39;/usr/local\u0026#39;\nNew python executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3\nAlso creating executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python\nERROR: The executable $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3 could not be run: [Errno 13] Permission denied: \u0026#39;$HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3\u0026#39;\n\n✘ Failed creating virtual environment\n[pipenv.exceptions.VirtualenvCreationException]:   File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/cli/command.py\u0026#34;, line 254, in install\n[pipenv.exceptions.VirtualenvCreationException]:       editable_packages=state.installstate.editables,\n[pipenv.exceptions.VirtualenvCreationException]:   File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 1741, in do_install\n[pipenv.exceptions.VirtualenvCreationException]:       pypi_mirror=pypi_mirror,\n[pipenv.exceptions.VirtualenvCreationException]:   File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 574, in ensure_project\n[pipenv.exceptions.VirtualenvCreationException]:       pypi_mirror=pypi_mirror,\n[pipenv.exceptions.VirtualenvCreationException]:   File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 506, in ensure_virtualenv\n[pipenv.exceptions.VirtualenvCreationException]:       python=python, site_packages=site_packages, pypi_mirror=pypi_mirror\n[pipenv.exceptions.VirtualenvCreationException]:   File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 935, in do_create_virtualenv\n[pipenv.exceptions.VirtualenvCreationException]:       extra=[crayons.blue(\u0026#34;{0}\u0026#34;.format(c.err)),]\n[pipenv.exceptions.VirtualenvCreationException]:\nFailed to create virtual environment.\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eD\u0026rsquo;autant que ce n\u0026rsquo;est vraiment pas un problème de droits utilisateurs :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e:$ ls -al mybeautifullproject/\ntotal 40\ndrwxr-xr-x  5 hs  hs  512 Jun  3 01:43 ./\ndrwxr-xr-x  3 hs  hs  512 Jun  3 01:44 ../\ndrwxr-xr-x  2 hs  hs  512 Jun  3 01:43 bin/\ndrwxr-xr-x  2 hs  hs  512 Jun  3 01:43 include/\ndrwxr-xr-x  3 hs  hs  512 Jun  3 01:43 lib/\n\n:$ ls -al mybeautifullproject/bin/\ntotal 40\ndrwxr-xr-x  2 hs  hs    512 Jun  3 01:43 ./\ndrwxr-xr-x  5 hs  hs    512 Jun  3 01:43 ../\nlrwxr-xr-x  1 hs  hs      7 Jun  3 01:43 python@ -\u0026gt; python3\n-rwxr-xr-x  1 hs  hs  10680 Jun  3 01:43 python3*\nlrwxr-xr-x  1 hs  hs      7 Jun  3 01:43 python3.6@ -\u0026gt; python3\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eUne petite modification système va faciliter notre vie - puisque \u003ccode\u003e/usr/local\u003c/code\u003e\nest la seule partition autorisée à l\u0026rsquo;exécution des programmes qui nécessitent\nla violation \u003ccode\u003eW^X\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCréation d\u0026rsquo;un répertoire utilisateur dedans : \u003cbr\u003e\n\u003ccode\u003e:# mkdir -p /usr/local/${my_user}/python\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eAttribution des droits utilisateur et groupe correcte : \u003cbr\u003e\n\u003ccode\u003e:# chown -R ${my_user}:wheel /usr/local/${my_user}\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eCréation d\u0026rsquo;un lien symbolique : \u003cbr\u003e\n\u003ccode\u003e:# ln -s /usr/local/${my_user}/python $home/python\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRemplacez \u003ccode\u003e${my_user}\u003c/code\u003e par votre identifiant de session ;)\u003c/p\u003e\n\u003cp\u003eSi vous avez la bonne idée d\u0026rsquo;utiliser l\u0026rsquo;outil \u003ccode\u003epipenv\u003c/code\u003e, il faudra créer\nun nouveau répertoire et le lier symboliquement ; lisez la section\n\u003ca href=\"/fr/dev/python/env-python-openbsd/#tldr\"\u003eTL;DR\u003c/a\u003e ci-dessous…\u003c/p\u003e\n\u003ch2 id=\"tldr\"\u003eTL;DR\u003c/h2\u003e\n\u003cp\u003eRemplacez \u0026lsquo;\u0026rsquo;${my_user}\u0026rsquo;\u0026rsquo; par votre identifiant de session !\u003c/p\u003e\n\u003cp\u003e⇒ Pour \u003cstrong\u003evirtualenv\u003c/strong\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e:# mkdir -p /usr/local/${my_user}/python\n:# chown -R ${my_user}:wheel /usr/local/${my_user}\n:# ln -s /usr/local/${my_user}/python $home/python`\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Pour \u003cstrong\u003epipenv\u003c/strong\u003e, il faut rajouter à ce qui suit au-dessus : \\\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode class=\"language-pdksh\" data-lang=\"pdksh\"\u003e:$ mkdir /usr/local/$USER/python/virtualenvs\n:$ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs`\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa documentation de \u003cstrong\u003epipenv\u003c/strong\u003e - \u003cem\u003een anglais\u003c/em\u003e : \u003ca href=\"https://pipenv.readthedocs.io/en/latest/\" rel=\"external\"\u003ehttps://pipenv.readthedocs.io/en/latest/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eÀ-propos de l\u0026rsquo;option de montage \u003cstrong\u003ewxallowed\u003c/strong\u003e : le Guide de Migration OpenBSD 5.9 vers 6.0 - \u003ca href=\"https://www.openbsd.org/faq/upgrade60.html\" rel=\"external\"\u003eEN\u003c/a\u003e / \u003ca href=\"https://wiki.openbsd.fr.eu.org/doku.php/openbsd.org/faq/upgrade60#changement-de-configuration-et-de-syntaxe\" rel=\"external\"\u003eFR\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLa \u003ca href=\"https://forum.openbsd.fr.eu.org/showthread.php?tid=2352\u0026amp;pid=18773#pid18773\" rel=\"external\"\u003eréponse\u003c/a\u003e expliquée sur le forum \u0026ldquo;obsd4*\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCe tutoriel n\u0026rsquo;existerait pas sans \u003ca href=\"https://ybad.name/sdj.html\" rel=\"external\"\u003eXavier\u003c/a\u003e…\u003c/li\u003e\n\u003cli\u003eet, sans cet \u003ca href=\"https://deftly.net/posts/2017-10-12-using-cabal-on-openbsd.html\" rel=\"external\"\u003earticle\u003c/a\u003e anglais, nommé \u0026ldquo;\u003cem\u003e\u003cstrong\u003eUsing cabal on OpenBSD\u003c/strong\u003e\u003c/em\u003e\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser les environnements Python virtuels sous OpenBSD (W^X)",
            "tags": ["Python", "Environnement", "OpenBSD"],
            "date_published": "2019-06-19T12:03:33+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:0bd7583d-e117-7f0a-e973-3bbd3253a50b",
            "url": "http://doc.huc.fr.eu.org/fr/sys/openbsd/env-python-openbsd/",
            "title": "Python : environnement virtuel sous OpenBSD",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description OS : OpenBSD 6.x Depuis OpenBSD 6.0, l\u0026rsquo;option de montage wxallowed est configuré par défaut sur /usr/local. Pour ceux qui ne le savent pas, c\u0026rsquo;est une protection système. Si la partition a cette option, les logiciels sont autorisés à fonctionner depuis cette partition, sinon ils ne pourront fonctionner et émettront un message de violation W^X, tel que :\n:$ dmesg | grep wxallowed /home/hs/.local/share/virtualenvs/mybeautifullproject-q1koN8ay/bin/python3(26392): W^X binary outside wxallowed mountpoint De fait, puisque seul /usr/local a cette option activée, si vous tentez d\u0026rsquo;exécuter un programme depuis, par exemple, votre $HOME, cela ne fonctionnera pas. Et, c\u0026rsquo;est tout le problème avec les environnements Python qui doivent fonctionner dans votre répertoire personnel.\nDans les faits, voici ce qui se passe pour virtualenv :\n:$ virtualenv mybeautifullproject Using base prefix \u0026#39;/usr/local\u0026#39; New python executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3 Also creating executable in $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python ERROR: The executable $HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python3 could not be run: [Errno 13] Permission denied: \u0026#39;$HOME/python/mybeautifullproject.py/mybeautifullproject/bin/python C\u0026rsquo;est pareil pour pipenv :\n:$ pipenv install requests Warning: the environment variable LANG is not set! We recommend setting this in ~/.profile (or equivalent) for proper expected behavior. Creating a virtualenv for this project… Pipfile: $HOME/python/mybeautifullproject.py/Pipfile Using /usr/local/bin/python3 (3.6.8) to create virtualenv… ⠇ Creating virtual environment...Already using interpreter /usr/local/bin/python3 Using base prefix \u0026#39;/usr/local\u0026#39; New python executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3 Also creating executable in $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python ERROR: The executable $HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3 could not be run: [Errno 13] Permission denied: \u0026#39;$HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3\u0026#39; ✘ Failed creating virtual environment [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/cli/command.py\u0026#34;, line 254, in install [pipenv.exceptions.VirtualenvCreationException]: editable_packages=state.installstate.editables, [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 1741, in do_install [pipenv.exceptions.VirtualenvCreationException]: pypi_mirror=pypi_mirror, [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 574, in ensure_project [pipenv.exceptions.VirtualenvCreationException]: pypi_mirror=pypi_mirror, [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 506, in ensure_virtualenv [pipenv.exceptions.VirtualenvCreationException]: python=python, site_packages=site_packages, pypi_mirror=pypi_mirror [pipenv.exceptions.VirtualenvCreationException]: File \u0026#34;$HOME/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;, line 935, in do_create_virtualenv [pipenv.exceptions.VirtualenvCreationException]: extra=[crayons.blue(\u0026#34;{0}\u0026#34;.format(c.err)),] [pipenv.exceptions.VirtualenvCreationException]: Failed to create virtual environment. D\u0026rsquo;autant que ce n\u0026rsquo;est vraiment pas un problème de droits utilisateurs :\n:$ ls -al mybeautifullproject/ total 40 drwxr-xr-x 5 hs hs 512 Jun 3 01:43 ./ drwxr-xr-x 3 hs hs 512 Jun 3 01:44 ../ drwxr-xr-x 2 hs hs 512 Jun 3 01:43 bin/ drwxr-xr-x 2 hs hs 512 Jun 3 01:43 include/ drwxr-xr-x 3 hs hs 512 Jun 3 01:43 lib/ :$ ls -al mybeautifullproject/bin/ total 40 drwxr-xr-x 2 hs hs 512 Jun 3 01:43 ./ drwxr-xr-x 5 hs hs 512 Jun 3 01:43 ../ lrwxr-xr-x 1 hs hs 7 Jun 3 01:43 python@ -\u0026gt; python3 -rwxr-xr-x 1 hs hs 10680 Jun 3 01:43 python3* lrwxr-xr-x 1 hs hs 7 Jun 3 01:43 python3.6@ -\u0026gt; python3 Configuration Une petite modification système va faciliter notre vie - puisque /usr/local est la seule partition autorisée à l\u0026rsquo;exécution des programmes qui nécessitent la violation W^X :\nCréation d\u0026rsquo;un répertoire utilisateur dedans : :# mkdir -p /usr/local/${my_user}/python\nAttribution des droits utilisateur et groupe correcte : :# chown -R ${my_user}:wheel /usr/local/${my_user}\nCréation d\u0026rsquo;un lien symbolique : :# ln -s /usr/local/${my_user}/python $home/python\nRemplacez ${my_user} par votre identifiant de session ;)\nSi vous avez la bonne idée d\u0026rsquo;utiliser l\u0026rsquo;outil pipenv, il faudra créer un nouveau répertoire et le lier symboliquement ; lisez la section TL;DR ci-dessous…\nTL;DR Remplacez \u0026lsquo;\u0026rsquo;${my_user}\u0026rsquo;\u0026rsquo; par votre identifiant de session !\n⇒ Pour virtualenv :\n:# mkdir -p /usr/local/${my_user}/python :# chown -R ${my_user}:wheel /usr/local/${my_user} :# ln -s /usr/local/${my_user}/python $home/python ⇒ Pour pipenv, il faut rajouter à ce qui suit au-dessus :\n:$ mkdir /usr/local/$USER/python/virtualenvs :$ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs Documentations La documentation de pipenv - en anglais : https://pipenv.readthedocs.io/en/latest/ À-propos de l\u0026rsquo;option de montage wxallowed : le Guide de Migration OpenBSD 5.9 vers 6.0 - EN La réponse expliquée sur le forum \u0026ldquo;obsd4*\u0026rdquo; Remerciements Ce tutoriel n\u0026rsquo;existerait pas sans Xavier… et, sans cet article anglais, nommé \u0026ldquo;Using cabal on OpenBSD\u0026rdquo; ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eOS : OpenBSD 6.x\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eDepuis OpenBSD 6.0, l\u0026rsquo;option de montage \u003ccode\u003ewxallowed\u003c/code\u003e est configuré par\ndéfaut sur \u003ccode\u003e/usr/local\u003c/code\u003e. Pour ceux qui ne le savent pas, c\u0026rsquo;est une protection\nsystème. Si la partition a cette option, les logiciels sont autorisés à\nfonctionner depuis cette partition, sinon ils ne pourront fonctionner et\némettront un message de violation \u003ccode\u003eW^X\u003c/code\u003e, tel que :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ dmesg | grep wxallowed\n/home/hs/.local/share/virtualenvs/mybeautifullproject-q1koN8ay/bin/python3(26392): W^X binary outside wxallowed mountpoint\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eDe fait, puisque seul \u003ccode\u003e/usr/local\u003c/code\u003e a cette option activée, si vous tentez\nd\u0026rsquo;exécuter un programme depuis, par exemple, votre \u003ccode\u003e$HOME\u003c/code\u003e, cela ne fonctionnera\npas. Et, c\u0026rsquo;est tout le problème avec les environnements Python qui doivent\nfonctionner dans votre répertoire personnel.\u003c/p\u003e\n\u003cp\u003eDans les faits, voici ce qui se passe pour \u003ccode\u003evirtualenv\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ virtualenv mybeautifullproject\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsing base prefix \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/usr/local\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNew python executable in \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/python/mybeautifullproject.py/mybeautifullproject/bin/python3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAlso creating executable in \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/python/mybeautifullproject.py/mybeautifullproject/bin/python\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eERROR: The executable \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/python/mybeautifullproject.py/mybeautifullproject/bin/python3 could not be run: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eErrno 13\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e Permission denied: \u003cspan style=\"color:#ef6155\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/python/mybeautifullproject.py/mybeautifullproject/bin/python\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eC\u0026rsquo;est pareil pour \u003ccode\u003epipenv\u003c/code\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ pipenv install requests\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWarning: the environment variable LANG is not set!\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eWe recommend setting this in ~/.profile \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eor equivalent\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e proper expected behavior.\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCreating a virtualenv \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e this project…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePipfile: \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/python/mybeautifullproject.py/Pipfile\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsing /usr/local/bin/python3 \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3.6.8\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e to create virtualenv…\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e⠇ Creating virtual environment...Already using interpreter /usr/local/bin/python3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsing base prefix \u003cspan style=\"color:#48b685\"\u003e\u0026#39;/usr/local\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eNew python executable in \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAlso creating executable in \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eERROR: The executable \u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3 could not be run: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003eErrno 13\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e Permission denied: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;$HOME/.local/share/virtualenvs/mybeautifullproject.py-oFlnu9vD/bin/python3\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e✘ Failed creating virtual environment\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:   File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.local/lib/python3.6/site-packages/pipenv/cli/command.py\u0026#34;\u003c/span\u003e, line 254, in install\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:       \u003cspan style=\"color:#ef6155\"\u003eeditable_packages\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003estate.installstate.editables,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:   File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;\u003c/span\u003e, line 1741, in do_install\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:       \u003cspan style=\"color:#ef6155\"\u003epypi_mirror\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003epypi_mirror,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:   File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;\u003c/span\u003e, line 574, in ensure_project\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:       \u003cspan style=\"color:#ef6155\"\u003epypi_mirror\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003epypi_mirror,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:   File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;\u003c/span\u003e, line 506, in ensure_virtualenv\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:       \u003cspan style=\"color:#ef6155\"\u003epython\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003epython, \u003cspan style=\"color:#ef6155\"\u003esite_packages\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003esite_packages, \u003cspan style=\"color:#ef6155\"\u003epypi_mirror\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003epypi_mirror\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:   File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;\u003c/span\u003e\u003cspan style=\"color:#ef6155\"\u003e$HOME\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e/.local/lib/python3.6/site-packages/pipenv/core.py\u0026#34;\u003c/span\u003e, line 935, in do_create_virtualenv\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:       \u003cspan style=\"color:#ef6155\"\u003eextra\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e=[\u003c/span\u003ecrayons.blue\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;{0}\u0026#34;\u003c/span\u003e.format\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003ec.err\u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e,\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003epipenv.exceptions.VirtualenvCreationException\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eFailed to create virtual environment.\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eD\u0026rsquo;autant que ce n\u0026rsquo;est vraiment pas un problème de droits utilisateurs :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ls -al mybeautifullproject/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etotal \u003cspan style=\"color:#f99b15\"\u003e40\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e hs  hs  \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 ./\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e hs  hs  \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:44 ../\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e hs  hs  \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 bin/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e hs  hs  \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 include/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e hs  hs  \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 lib/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e:$ ls -al mybeautifullproject/bin/\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003etotal \u003cspan style=\"color:#f99b15\"\u003e40\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e hs  hs    \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 ./\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e hs  hs    \u003cspan style=\"color:#f99b15\"\u003e512\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 ../\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e hs  hs      \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 python@ -\u0026gt; python3\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e-rwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e hs  hs  \u003cspan style=\"color:#f99b15\"\u003e10680\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 python3*\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003elrwxr-xr-x  \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e hs  hs      \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e Jun  \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e 01:43 python3.6@ -\u0026gt; python3\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eUne petite modification système va faciliter notre vie - puisque \u003ccode\u003e/usr/local\u003c/code\u003e\nest la seule partition autorisée à l\u0026rsquo;exécution des programmes qui nécessitent\nla violation \u003ccode\u003eW^X\u003c/code\u003e :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eCréation d\u0026rsquo;un répertoire utilisateur dedans : \u003cbr\u003e\n\u003ccode\u003e:# mkdir -p /usr/local/${my_user}/python\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAttribution des droits utilisateur et groupe correcte : \u003cbr\u003e\n\u003ccode\u003e:# chown -R ${my_user}:wheel /usr/local/${my_user}\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eCréation d\u0026rsquo;un lien symbolique : \u003cbr\u003e\n\u003ccode\u003e:# ln -s /usr/local/${my_user}/python $home/python\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eRemplacez \u003ccode\u003e${my_user}\u003c/code\u003e par votre identifiant de session ;)\u003c/p\u003e\n\u003cp\u003eSi vous avez la bonne idée d\u0026rsquo;utiliser l\u0026rsquo;outil \u003ccode\u003epipenv\u003c/code\u003e, il faudra créer\nun nouveau répertoire et le lier symboliquement ; lisez la section \u003ca href=\"/fr/sys/openbsd/env-python-openbsd/#tldr\"\u003eTL;DR\u003c/a\u003e\nci-dessous…\u003c/p\u003e\n\u003ch2 id=\"tldr\"\u003eTL;DR\u003c/h2\u003e\n\u003cp\u003eRemplacez \u0026lsquo;\u0026rsquo;${my_user}\u0026rsquo;\u0026rsquo; par votre identifiant de session !\u003c/p\u003e\n\u003cp\u003e⇒ Pour \u003cstrong\u003evirtualenv\u003c/strong\u003e :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:# mkdir -p /usr/local/${my_user}/python\n:# chown -R ${my_user}:wheel /usr/local/${my_user}\n:# ln -s /usr/local/${my_user}/python $home/python\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e⇒ Pour \u003cstrong\u003epipenv\u003c/strong\u003e, il faut rajouter à ce qui suit au-dessus :\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e:$ mkdir /usr/local/$USER/python/virtualenvs\n:$ ln -s /usr/local/$USER/python/virtualenvs $HOME/.local/share/virtualenvs\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"documentations\"\u003eDocumentations\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eLa documentation de \u003cstrong\u003epipenv\u003c/strong\u003e - \u003cem\u003een anglais\u003c/em\u003e :\n\u003ca href=\"https://pipenv.readthedocs.io/en/latest/\" rel=\"external\"\u003ehttps://pipenv.readthedocs.io/en/latest/\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eÀ-propos de l\u0026rsquo;option de montage \u003cstrong\u003ewxallowed\u003c/strong\u003e : le Guide de Migration OpenBSD\n5.9 vers 6.0 - \u003ca href=\"https://www.openbsd.org/faq/upgrade60.html\" rel=\"external\"\u003eEN\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eLa \u003ca href=\"https://forum.openbsd.fr.eu.org/showthread.php?tid=2352\u0026amp;pid=18773#pid18773\" rel=\"external\"\u003eréponse\u003c/a\u003e expliquée sur le forum \u0026ldquo;obsd4*\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"remerciements\"\u003eRemerciements\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003eCe tutoriel n\u0026rsquo;existerait pas sans \u003ca href=\"https://ybad.name/sdj.html\" rel=\"external\"\u003eXavier\u003c/a\u003e…\u003c/li\u003e\n\u003cli\u003eet, sans cet \u003ca href=\"https://deftly.net/posts/2017-10-12-using-cabal-on-openbsd.html\" rel=\"external\"\u003earticle\u003c/a\u003e anglais, nommé \u0026ldquo;\u003cem\u003e\u003cstrong\u003eUsing cabal on OpenBSD\u003c/strong\u003e\u003c/em\u003e\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n",
            "summary": "Utiliser les environnements Python virtuels sous OpenBSD (W^X)",
            "tags": ["Python", "OpenBSD"],
            "date_published": "2019-06-19T12:03:33+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:4bccc25a-ea7d-1881-03ca-8366786305f8",
            "url": "http://doc.huc.fr.eu.org/fr/sys/android/synchronisation-xiaomi-nextcloud/",
            "title": "Xiaomi : Synchronisation avec Nextcloud et OpenSync (MIUI)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Obsolète La documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités ! Description Le choix de l\u0026rsquo;outil de synchronisation des données calendriers et de contacts est délicat. Oubliez DavDroid/Davx5, la solution qui fonctionne est l\u0026rsquo;usage de l\u0026rsquo;app \u0026ldquo;OpenSync\u0026rdquo; — qui est un \u0026ldquo;fork\u0026rdquo; de la précédente application, disponible sur n\u0026rsquo;importe quel store -\nCelle-ci demande l\u0026rsquo;installation de l\u0026rsquo;app \u0026ldquo;Open Tasks\u0026rdquo;, complémentaire pour gérer les tâches.\nAvant de chercher à paramétrer votre connexion vers votre nuage informatique, tel Nextcloud, il faut configurer votre système MIUI.\nTesté sur interface : MIUI 8 (Android 6), 9 \u0026amp; 10 (Android 7), 11 (Android 9) puis Android 9, 10 - en effet, certains modèles de smartphones Xiaomi n\u0026rsquo;ont pas l\u0026rsquo;interface MIUI installée Configuration Android InfoCe qui suit concerne Android 9, 10 ! Android: Paramètres Le mode opératoire est le suivant :\nMenu \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;Applis et notifications\u0026rdquo; : recherchez \u0026ldquo;OpenSync\u0026rdquo;\nAppuyez sur le choix \u0026ldquo;Autorisations\u0026rdquo; pour activer \u0026ldquo;Agenda\u0026rdquo;, \u0026ldquo;Contacts\u0026rdquo; 1 et appuyez sur \u0026ldquo;Autorisations supplémentaires\u0026rdquo; pour activer \u0026ldquo;Tâches\u0026rdquo; Ensuite, appuyez sur \u0026ldquo;Options avancées\u0026rdquo;2 qui laissera apparaître, entres autres, le choix \u0026ldquo;Batterie\u0026rdquo;. Appuyez dessus puis choisissez \u0026ldquo;Optimisation de la batterie\u0026rdquo;\nLà - malheureusement, c\u0026rsquo;est un peu mal conçu - appuyez sur la liste \u0026ldquo;Non optimisée\u0026rdquo; pour faire apparaître \u0026ldquo;Toutes les applis\u0026rdquo;, puis cherchez à nouveau \u0026ldquo;OpenSync\u0026rdquo; pour sélectionner \u0026ldquo;Ne pas optimiser\u0026rdquo;, suivi de l\u0026rsquo;appui sur le bouton OK. Faites de même avec \u0026ldquo;OpenTasks\u0026rdquo;, puisque vous êtes dans la bonne rubrique ;) 1 v10: il semble qu\u0026rsquo;il faille appuyer sur les noms \u0026ldquo;Agenda\u0026rdquo;, puis \u0026ldquo;Contacts\u0026rdquo; pour avoir accès au choix d\u0026rsquo;autoriser ou de refuser l\u0026rsquo;autorisation\nFaites quasiment de même avec \u0026ldquo;OpenTasks\u0026rdquo; en validant les autorisations sur \u0026ldquo;Contacts\u0026rdquo;, et en \u0026ldquo;Autorisations supplémentaires\u0026rdquo;, activez \u0026ldquo;Tâches\u0026rdquo;.\nAndroid: Avancées Pour finir, vérifiez dans les \u0026ldquo;Options avancées\u0026rdquo;2 , puis \u0026ldquo;Batterie\u0026rdquo; que \u0026ldquo;Optimisation de la batterie\u0026rdquo; soit bien positionnée sur \u0026ldquo;Non optimisée\u0026rdquo; - ce qui devrait être le cas, puisque paramétré précédemment ; sinon, faites-le !\n2 v10 : ce menu s\u0026rsquo;appelle \u0026ldquo;Préférences avancées\u0026rdquo;\nMIUI InfoCe qui suit concerne MIUI 8, 9, 10, 11 ! MIUI: Paramètres Menu \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;applications installées\u0026rdquo;3 , cherchez \u0026ldquo;OpenSync\u0026rdquo; et appuyez sur le nom de l\u0026rsquo;application.\n3 v11 : ce menu s\u0026rsquo;appelle tout simplement \u0026ldquo;Applis\u0026rdquo;\nActivez le \u0026ldquo;Démarrage automatique\u0026rdquo;\nAppuyez sur \u0026ldquo;Autorisations de l\u0026rsquo;application\u0026rdquo;, puis activez \u0026ldquo;Agenda\u0026rdquo;, \u0026ldquo;Contacts\u0026rdquo;\net appuyez sur \u0026ldquo;Autorisations supplémentaires\u0026rdquo; pour activer \u0026ldquo;Tâches\u0026rdquo; Appuyez sur \u0026ldquo;Autres autorisations\u0026rdquo; pour au moins \u0026ldquo;Démarrer en arrière plan\u0026rdquo; - v11 : ce menu semble ne plus exister\nAppuyez sur \u0026ldquo;Économiseur de batterie\u0026rdquo; pour choisir \u0026ldquo;Pas de restriction\u0026rdquo; - si cette option n\u0026rsquo;est pas choisie, au lieu de l\u0026rsquo;option \u0026ldquo;Économiseur de batterie (recommandée)\u0026rdquo;, OpenSync ne synchronisera pas correctement.\nToujours dans le menu \u0026ldquo;Paramètres\u0026rdquo;, à \u0026ldquo;Autorisations\u0026rdquo;, puis \u0026ldquo;Gestion du démarrage automatique\u0026rdquo;, vérifiez que vous ayez bien \u0026ldquo;OpenSync\u0026rdquo; et \u0026ldquo;OpenTasks\u0026rdquo;, toutes les deux activées.\nMIUI: Sécurité Ensuite, dans l\u0026rsquo;application \u0026ldquo;Sécurité\u0026rdquo; :\ntapez sur l\u0026rsquo;icône \u0026ldquo;Batterie\u0026rdquo; puis sélectionnez le choix \u0026ldquo;Économiseur de batterie\u0026rdquo;, et vérifiez que les deux app \u0026ldquo;OpenSync\u0026rdquo; et \u0026ldquo;OpenTasks\u0026rdquo; aient bien leur paramétrage d\u0026rsquo;arrière plan sur \u0026ldquo;Pas de restriction\u0026rdquo;. Il suffit de cliquer sur l\u0026rsquo;icône correspondante à l\u0026rsquo;app, pour aboutir sur le paramétrage en question. OpenSync Maintenant, ouvrez l\u0026rsquo;app \u0026ldquo;OpenSync\u0026rdquo;, et ajoutez votre paramétrage de connexion vers votre serveur Nextcloud.\nPuis redémarrez votre smartphone !\nEnsuite, ouvrez à nouveau \u0026ldquo;OpenSync\u0026rdquo; et exécutez une synchronisation des différentes données que vous avez paramétré.\nDocumentation https://help.nextcloud.com/t/opensync-xiaomi-synchronization-issue/28108 ",
            "content_html": "\u003cdiv class=\"tab-info i-deprecated\"\u003e\u003cstrong\u003eObsolète\u003c/strong\u003e\u003c/div\u003e\n\u003cdiv class=\"alert alert-deprecated\" role=\"alert\"\u003e\u003cstrong\u003eLa documentation écrite ci-dessous semble obsolète… Il vaut mieux ne plus tenir compte de ces informations, qui restent à titre d\u0026#39;\u0026#34;information historique\u0026#34;. Veuillez en tenir compte et prendre vos responsabilités !\u003c/strong\u003e\u003c/div\u003e\n\n\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eLe choix de l\u0026rsquo;outil de synchronisation des données calendriers et de contacts\nest délicat. Oubliez DavDroid/Davx5, la solution qui fonctionne est l\u0026rsquo;usage\nde l\u0026rsquo;app \u0026ldquo;\u003cstrong\u003e\u003ca href=\"https://deependhulla.com/android-apps/opensync-app\" rel=\"external\"\u003eOpenSync\u003c/a\u003e\u003c/strong\u003e\u0026rdquo; — qui est un \u0026ldquo;fork\u0026rdquo; de la précédente application,\ndisponible sur n\u0026rsquo;importe quel store -\u003c/p\u003e\n\u003cp\u003eCelle-ci demande l\u0026rsquo;installation de l\u0026rsquo;app \u0026ldquo;Open Tasks\u0026rdquo;, complémentaire pour\ngérer les tâches.\u003c/p\u003e\n\u003cp\u003eAvant de chercher à paramétrer votre connexion vers votre nuage informatique,\ntel Nextcloud, il faut configurer votre système MIUI.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eTesté sur interface :\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"/fr/sys/android/synchronisation-xiaomi-nextcloud/#miui\"\u003eMIUI\u003c/a\u003e 8 (Android 6), 9 \u0026amp; 10 (Android 7), 11 (Android 9)\u003c/li\u003e\n\u003cli\u003epuis \u003ca href=\"/fr/sys/android/synchronisation-xiaomi-nextcloud/#android\"\u003eAndroid\u003c/a\u003e 9, 10 - \u003cem\u003een effet, certains modèles\nde smartphones Xiaomi n\u0026rsquo;ont pas l\u0026rsquo;interface MIUI installée\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003ch3 id=\"android\"\u003eAndroid\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCe qui suit concerne Android 9, 10 !\u003c/div\u003e\n\n\u003ch4 id=\"android-paramètres\"\u003eAndroid: Paramètres\u003c/h4\u003e\n\u003cp\u003eLe mode opératoire est le suivant :\u003c/p\u003e\n\u003cp\u003eMenu \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;Applis et notifications\u0026rdquo; : recherchez \u0026ldquo;OpenSync\u0026rdquo;\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eAppuyez sur le choix \u0026ldquo;Autorisations\u0026rdquo; pour activer \u0026ldquo;Agenda\u0026rdquo;, \u0026ldquo;Contacts\u0026rdquo;\n\u003csup\u003e\u003cspan class=\"orange\"\u003e1\u003c/span\u003e\n\u003c/sup\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eet appuyez sur \u0026ldquo;Autorisations supplémentaires\u0026rdquo; pour activer \u0026ldquo;Tâches\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eEnsuite, appuyez sur \u0026ldquo;Options avancées\u0026rdquo;\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e\nqui laissera apparaître, entres autres, le choix \u0026ldquo;Batterie\u0026rdquo;. \u003cbr\u003e\nAppuyez dessus puis choisissez \u0026ldquo;Optimisation de la batterie\u0026rdquo;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eLà - \u003cem\u003emalheureusement, c\u0026rsquo;est un peu mal conçu\u003c/em\u003e - appuyez sur la liste \u0026ldquo;Non optimisée\u0026rdquo;\npour faire apparaître \u0026ldquo;Toutes les applis\u0026rdquo;, puis cherchez à nouveau \u0026ldquo;OpenSync\u0026rdquo;\npour sélectionner \u0026ldquo;Ne pas optimiser\u0026rdquo;, suivi de l\u0026rsquo;appui sur le bouton OK.\u003c/li\u003e\n\u003cli\u003eFaites de même avec \u0026ldquo;OpenTasks\u0026rdquo;, puisque vous êtes dans la bonne rubrique ;)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003csup\u003e\u003cspan class=\"orange\"\u003e1\u003c/span\u003e\n\u003c/sup\u003e \u003cem\u003ev10: il semble qu\u0026rsquo;il faille\nappuyer sur les noms \u0026ldquo;Agenda\u0026rdquo;, puis \u0026ldquo;Contacts\u0026rdquo; pour avoir accès au choix\nd\u0026rsquo;autoriser ou de refuser l\u0026rsquo;autorisation\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eFaites quasiment de même avec \u0026ldquo;OpenTasks\u0026rdquo; en validant les autorisations sur\n\u0026ldquo;Contacts\u0026rdquo;, et en \u0026ldquo;Autorisations supplémentaires\u0026rdquo;, activez \u0026ldquo;Tâches\u0026rdquo;.\u003c/p\u003e\n\u003ch4 id=\"android-avancées\"\u003eAndroid: Avancées\u003c/h4\u003e\n\u003cp\u003ePour finir, vérifiez dans les \u0026ldquo;Options avancées\u0026rdquo;\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e,\npuis \u0026ldquo;Batterie\u0026rdquo; que \u0026ldquo;Optimisation de la batterie\u0026rdquo; soit bien positionnée sur\n\u0026ldquo;Non optimisée\u0026rdquo; - \u003cem\u003ece qui devrait être le cas, puisque paramétré précédemment ;\nsinon, faites-le\u003c/em\u003e !\u003c/p\u003e\n\u003cp\u003e\u003csup\u003e\u003cspan class=\"orange\"\u003e2\u003c/span\u003e\n\u003c/sup\u003e \u003cem\u003ev10 : ce menu s\u0026rsquo;appelle \u0026ldquo;Préférences avancées\u0026rdquo;\u003c/em\u003e\u003c/p\u003e\n\u003ch3 id=\"miui\"\u003eMIUI\u003c/h3\u003e\n\n\u003cdiv class=\"tab-info i-info\"\u003eInfo\u003c/div\u003e\u003cdiv class=\"alert alert-info\" role=\"alert\"\u003eCe qui suit concerne MIUI 8, 9, 10, 11 !\u003c/div\u003e\n\n\u003ch4 id=\"miui-paramètres\"\u003eMIUI: Paramètres\u003c/h4\u003e\n\u003cp\u003eMenu \u0026ldquo;Paramètres\u0026rdquo; \u0026gt; \u0026ldquo;applications installées\u0026rdquo;\u003csup\u003e\u003cspan class=\"orange\"\u003e3\u003c/span\u003e\n\u003c/sup\u003e,\ncherchez \u0026ldquo;OpenSync\u0026rdquo; et appuyez sur le nom de l\u0026rsquo;application.\u003c/p\u003e\n\u003cp\u003e\u003csup\u003e\u003cspan class=\"orange\"\u003e3\u003c/span\u003e\n\u003c/sup\u003e \u003cem\u003ev11 : ce menu s\u0026rsquo;appelle tout simplement \u0026ldquo;Applis\u0026rdquo;\u003c/em\u003e\u003c/p\u003e\n\u003chr\u003e\n\u003cul\u003e\n\u003cli\u003e\n\u003cp\u003eActivez le \u0026ldquo;Démarrage automatique\u0026rdquo;\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAppuyez sur \u0026ldquo;Autorisations de l\u0026rsquo;application\u0026rdquo;, puis activez \u0026ldquo;Agenda\u0026rdquo;, \u0026ldquo;Contacts\u0026rdquo;\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eet appuyez sur \u0026ldquo;Autorisations supplémentaires\u0026rdquo; pour activer \u0026ldquo;Tâches\u0026rdquo;\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAppuyez sur \u0026ldquo;Autres autorisations\u0026rdquo; pour au moins\n\u0026ldquo;Démarrer en arrière plan\u0026rdquo; - \u003cem\u003ev11 : ce menu semble ne plus exister\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eAppuyez sur \u0026ldquo;Économiseur de batterie\u0026rdquo; pour choisir \u0026ldquo;Pas de restriction\u0026rdquo; -\nsi cette option n\u0026rsquo;est pas choisie, au lieu de l\u0026rsquo;option \u0026ldquo;Économiseur de batterie (recommandée)\u0026rdquo;,\nOpenSync ne synchronisera pas correctement.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003cp\u003eToujours dans le menu \u0026ldquo;Paramètres\u0026rdquo;, à \u0026ldquo;Autorisations\u0026rdquo;, puis \u0026ldquo;Gestion du démarrage automatique\u0026rdquo;,\nvérifiez que vous ayez bien \u0026ldquo;OpenSync\u0026rdquo; et \u0026ldquo;OpenTasks\u0026rdquo;, toutes les deux activées.\u003c/p\u003e\n\u003ch4 id=\"miui-sécurité\"\u003eMIUI: Sécurité\u003c/h4\u003e\n\u003cp\u003eEnsuite, dans l\u0026rsquo;application \u0026ldquo;Sécurité\u0026rdquo; :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003etapez sur l\u0026rsquo;icône \u0026ldquo;Batterie\u0026rdquo; puis\u003c/li\u003e\n\u003cli\u003esélectionnez le choix \u0026ldquo;Économiseur de batterie\u0026rdquo;,\u003c/li\u003e\n\u003cli\u003eet vérifiez que les deux app \u0026ldquo;OpenSync\u0026rdquo; et \u0026ldquo;OpenTasks\u0026rdquo; aient bien leur\nparamétrage d\u0026rsquo;arrière plan sur \u0026ldquo;Pas de restriction\u0026rdquo;. \u003cbr\u003e\nIl suffit de cliquer sur l\u0026rsquo;icône correspondante à l\u0026rsquo;app, pour aboutir\nsur le paramétrage en question.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"opensync\"\u003eOpenSync\u003c/h3\u003e\n\u003cp\u003eMaintenant, ouvrez l\u0026rsquo;app \u0026ldquo;OpenSync\u0026rdquo;, et ajoutez votre paramétrage de connexion\nvers votre serveur Nextcloud.\u003c/p\u003e\n\u003cp\u003ePuis redémarrez votre smartphone !\u003c/p\u003e\n\u003cp\u003eEnsuite, ouvrez à nouveau \u0026ldquo;OpenSync\u0026rdquo; et exécutez une synchronisation des\ndifférentes données que vous avez paramétré.\u003c/p\u003e\n\u003ch2 id=\"documentation\"\u003eDocumentation\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://help.nextcloud.com/t/opensync-xiaomi-synchronization-issue/28108\" rel=\"external\"\u003ehttps://help.nextcloud.com/t/opensync-xiaomi-synchronization-issue/28108\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003chr\u003e\n",
            "summary": "Comment synchroniser les données d'un smartphone de marque Xiaomi avec un nuage informatique, tel nextcloud",
            "tags": ["Xiaomi", "Android", "MIUI", "nextcloud"],
            "date_published": "2019-06-18T15:28:31+02:00",
            "date_modified": "2020-05-15T16:00:00+02:00"
        },{
            "id": "urn:uuid:d3b13644-c429-7a9a-3666-fbe6dfc1d550",
            "url": "http://doc.huc.fr.eu.org/fr/web/php/php-composer-openbsd/",
            "title": "PHP : Composer (sous OpenBSD)",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Description Je ne présenterais ni PHP, ni composer…\nInstallation pkg_add -v composer\nAprès l\u0026rsquo;installation de Composer, faites une mise à jour de lui-même : composer self-update\nConfiguration De même, je ne détaillerais pas la configuration ni de PHP, ni de Composer, d\u0026rsquo;autant que par défaut pour ce dernier, il n\u0026rsquo;y a rien à faire en soit - il est bien sûr possible de configurer certaines options…\nDiagnostic Pour finir, on exécute ensuite un petit diagnostic :\n$ composer diagnose Checking platform settings: OK Checking git settings: OK git version 2.46.1 Checking http connectivity to packagist: OK Checking https connectivity to packagist: OK Checking github.com rate limit: OK Checking disk free space: OK Checking pubkeys: Tags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0 87719BA6 8F3BB723 4E5D42D0 84A14642 Dev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B 0C708369 153E328C AD90147D AFE50952 OK Checking Composer version: OK Checking Composer and its dependencies for vulnerabilities: OK Composer version: 2.8.6 PHP version: 8.2.28 PHP binary path: /usr/local/bin/php-8.2 OpenSSL version: LibreSSL 4.0.0 curl version: 8.12.0 libz 1.3.1.1-motley ssl LibreSSL/4.0.0 zip: extension present, unzip present, 7-Zip not available Tous les voyants sont OK, Composer a la dernière version en cours, et il s\u0026rsquo;exécute bien avec la version de PHP désirée\nDépannage PHP 7 Pour information, par défaut, Composer est configuré pour être exécuté avec php-7.0 sous la 6.4, et php-7.1 sous 6.5 - qu\u0026rsquo;il installe en dépendances (avec femail*)\nLe problème qui se pose est que si vous utilisez php-7.2, voire php-7.3, Composer s\u0026rsquo;exécutera avec l\u0026rsquo;environnement PHP pour lequel il est paramétré par défaut - logique, vous me direz !\nAlors, comment le contraindre ?\nTrès facilement : # sed -i -e \u0026quot;s/php-7.x/php-7.y/\u0026quot; \u0026quot;$(which composer)\u0026quot;\noù :\n7.x est votre installation PHP par défaut, et 7.y la version de PHP que vous préférez utiliser, telle que 7.2, par exemple… Error: Do not run Composer as root/super user Et, oui, il n\u0026rsquo;est pas recommandé d'exécuter Composer avec des droits d'administrateurs - alors ne le faites pas !\nPlus d\u0026rsquo;informations, sur : https://getcomposer.org/root\nError: Missing pubkey for… Il est possible que lors du diagnostique, vous vous retrouvez avec ce message d\u0026rsquo;erreur sur fond rouge :\nChecking pubkeys: FAIL Missing pubkey for tags verification Missing pubkey for dev verification Run composer self-update --update-keys to set them up Il vous dit quoi faire !!!\nDonc :\n$ composer self-update --update-keys Open https://composer.github.io/pubkeys.html to find the latest keys Enter Dev / Snapshot Public Key (including lines with -----): Là, le shell reste en attente jusqu\u0026rsquo;à ce que vous lui copiez la clé demandée, que vous trouverez sur https://composer.github.io/pubkeys.html, puisqu\u0026rsquo;il a même la gentillesse de vous le dire !\nIl vous demande de rentrer dans un premier temps, la clé Dev / Snapshot Public, puis une fois validée, vous demandera d\u0026rsquo;intégrer la clé Tags Public. Et pour finir vous dira dans quel répertoire personnel, elles seront enregistrées.\nSi l\u0026rsquo;entrée saisie n\u0026rsquo;est pas correcte, vous aurez un message d\u0026rsquo;erreur : Invalid input, il vous sera redemandé de faire la saisie !\nError: curl version: missing… Si le test se plaint que la version de curl est manquante, tel que :\ncurl version: missing, using php streams fallback, which reduces performance Vérifiez si vous avez installé le paquet php-curl correspondant à votre version de PHP, et que vous avez bien lié le binaire dans le répertoire correspondant à votre version de PHP, tel que (par exemple) :\ndoas ln -sf /etc/php-8.2.sample/curl.ini /etc/php-8.2/; done Puis relancez le diagnostic ;)\n",
            "content_html": "\u003ch2 id=\"description\"\u003eDescription\u003c/h2\u003e\n\u003cp\u003eJe ne présenterais ni \u003ca href=\"https://php.net\" rel=\"external\"\u003ePHP\u003c/a\u003e, ni\n\u003ca href=\"https://getcomposer.org\" rel=\"external\"\u003ecomposer\u003c/a\u003e…\u003c/p\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003c/h2\u003e\n\u003cp\u003e\u003ccode\u003epkg_add -v composer\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eAprès l\u0026rsquo;installation de \u003cstrong\u003eComposer\u003c/strong\u003e, faites une mise à jour de lui-même : \u003cbr\u003e\n\u003ccode\u003ecomposer self-update\u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"configuration\"\u003eConfiguration\u003c/h2\u003e\n\u003cp\u003eDe même, je ne détaillerais pas la configuration ni de PHP, ni de Composer,\nd\u0026rsquo;autant que par défaut pour ce dernier, il n\u0026rsquo;y a rien à faire en soit -\n\u003cem\u003eil est bien sûr possible de configurer certaines options…\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"diagnostic\"\u003eDiagnostic\u003c/h2\u003e\n\u003cp\u003ePour finir, on exécute ensuite un petit diagnostic :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ composer diagnose\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking platform settings: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking git settings: OK git version 2.46.1\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking http connectivity to packagist: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking https connectivity to packagist: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking github.com rate limit: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking disk free space: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking pubkeys:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTags Public Key Fingerprint: 57815BA2 7E54DC31 7ECC7CC5 573090D0  87719BA6 8F3BB723 4E5D42D0 84A14642\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eDev Public Key Fingerprint: 4AC45767 E5EC2265 2F0C1167 CBBB8A2B  0C708369 153E328C AD90147D AFE50952\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking Composer version: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking Composer and its dependencies \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e vulnerabilities: OK\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eComposer version: 2.8.6\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePHP version: 8.2.28\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ePHP binary path: /usr/local/bin/php-8.2\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOpenSSL version: LibreSSL 4.0.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl version: 8.12.0 libz 1.3.1.1-motley ssl LibreSSL/4.0.0\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ezip: extension present, unzip present, 7-Zip not available\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTous les voyants sont \u003cstrong\u003eOK\u003c/strong\u003e, Composer a la dernière version en cours,\net il s\u0026rsquo;exécute bien avec la version de PHP désirée\u003c/p\u003e\n\u003ch2 id=\"dépannage\"\u003eDépannage\u003c/h2\u003e\n\u003ch3 id=\"php-7\"\u003ePHP 7\u003c/h3\u003e\n\u003cp\u003ePour information, par défaut, Composer est configuré pour être exécuté\navec php-7.0 sous la 6.4, et php-7.1 sous 6.5 - qu\u0026rsquo;il installe en dépendances\n\u003cem\u003e(avec femail*)\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eLe problème qui se pose est que si vous utilisez php-7.2, voire php-7.3,\nComposer s\u0026rsquo;exécutera avec l\u0026rsquo;environnement PHP pour lequel il est paramétré par\ndéfaut - \u003cem\u003elogique, vous me direz !\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAlors, \u003cstrong\u003ecomment le contraindre ?\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eTrès facilement : \u003cbr\u003e\n\u003ccode\u003e# sed -i -e \u0026quot;s/php-7.x/php-7.y/\u0026quot; \u0026quot;$(which composer)\u0026quot;\u003c/code\u003e\u003c/p\u003e\n\u003cp\u003eoù :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ccode\u003e7.x\u003c/code\u003e est votre installation PHP par défaut,\u003c/li\u003e\n\u003cli\u003eet \u003ccode\u003e7.y\u003c/code\u003e la version de PHP que vous préférez utiliser, \u003cem\u003etelle que 7.2, par exemple…\u003c/em\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"error-do-not-run-composer-as-rootsuper-user\"\u003eError: Do not run Composer as root/super user\u003c/h3\u003e\n\u003cp\u003eEt, oui, il n\u0026rsquo;est \u003cspan class=\"red\"\u003epas recommandé d'exécuter Composer avec des\ndroits d'administrateurs\u003c/span\u003e\n - alors \u003cstrong\u003ene le faites pas\u003c/strong\u003e !\u003c/p\u003e\n\u003cp\u003ePlus d\u0026rsquo;informations, sur : \u003ca href=\"https://getcomposer.org/root\" rel=\"external\"\u003ehttps://getcomposer.org/root\u003c/a\u003e\u003c/p\u003e\n\u003ch3 id=\"error-missing-pubkey-for\"\u003eError: Missing pubkey for…\u003c/h3\u003e\n\u003cp\u003eIl est possible que lors du diagnostique, vous vous retrouvez avec ce\nmessage d\u0026rsquo;erreur sur fond rouge :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eChecking pubkeys: FAIL\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMissing pubkey \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e tags verification\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMissing pubkey \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e dev verification\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eRun composer self-update --update-keys to set them up\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e\u003cstrong\u003eIl vous dit quoi faire\u003c/strong\u003e !!!\u003c/p\u003e\n\u003cp\u003eDonc :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ composer self-update --update-keys\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOpen https://composer.github.io/pubkeys.html to find the latest keys\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEnter Dev / Snapshot Public Key \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eincluding lines with -----\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLà, le shell reste en attente jusqu\u0026rsquo;à ce que vous lui \u003cstrong\u003ecopiez la clé demandée\u003c/strong\u003e,\nque vous trouverez sur \u003ca href=\"https://composer.github.io/pubkeys.html\" rel=\"external\"\u003ehttps://composer.github.io/pubkeys.html\u003c/a\u003e, puisqu\u0026rsquo;il\na même la gentillesse de vous le dire !\u003c/p\u003e\n\u003cp\u003eIl vous demande de rentrer dans un premier temps, la clé \u003ccode\u003eDev / Snapshot Public\u003c/code\u003e,\npuis une fois validée, vous demandera d\u0026rsquo;intégrer la clé \u003ccode\u003eTags Public\u003c/code\u003e. \u003cbr\u003e\nEt pour finir vous dira dans quel répertoire personnel, elles seront enregistrées.\u003c/p\u003e\n\u003cp\u003eSi l\u0026rsquo;entrée saisie n\u0026rsquo;est pas correcte, vous aurez un message d\u0026rsquo;erreur : \u003ccode\u003eInvalid input\u003c/code\u003e,\nil vous sera redemandé de faire la saisie !\u003c/p\u003e\n\u003ch3 id=\"error-curl-version-missing\"\u003eError: curl version: missing…\u003c/h3\u003e\n\u003cp\u003eSi le test se plaint que la version de curl est manquante, tel que :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ecurl version: missing, using php streams fallback, which reduces performance\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eVérifiez si vous avez installé le paquet \u003ccode\u003ephp-curl\u003c/code\u003e correspondant à votre version\nde PHP, et que vous avez bien lié le binaire dans le répertoire correspondant à\nvotre version de PHP, tel que \u003cem\u003e(par exemple)\u003c/em\u003e :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-sh\" data-lang=\"sh\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edoas ln -sf /etc/php-8.2.sample/curl.ini /etc/php-8.2/; \u003cspan style=\"color:#815ba4\"\u003edone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePuis relancez le diagnostic ;)\u003c/p\u003e\n\u003chr\u003e\n",
            "summary": "Comment installer configurer PHP Composer sous OpenBSD",
            "tags": ["PHP", "Composer", "OpenBSD"],
            "date_published": "2019-05-27T17:24:38+02:00",
            "date_modified": "2025-11-10T10:51:13+01:00"
        },{
            "id": "urn:uuid:5f7f4473-c49f-be9c-6629-878b00a2a3b7",
            "url": "http://doc.huc.fr.eu.org/fr/trad/developpez.net/dive-into-python-6-closures-et-generateurs/",
            "title": "Dive Into Python 3 - 6 : Closures et Générateurs",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Chapitre 6 : Closures et Générateurs \u0026ldquo;My spelling is Wobbly. It’s good spelling but it Wobbles, and the letters get in the wrong places.\u0026rdquo; — Winnie-the-Pooh\nEn plongée Ayant grandit en fils de bibliothécaire et de spécialiste en langue anglaise, j\u0026rsquo;ai toujours été fasciné par les langages. Pas les langages de programmation. Enfin si, les langages de programmation, mais aussi les langages naturels. Prenez l\u0026rsquo;anglais. L\u0026rsquo;anglais est un langage schizophrénique qui emprunte des mots de l\u0026rsquo;allemand, du français, de l’espagnol et du latin (pour en citer quelque uns). En fait, \u0026ldquo;emprunte\u0026rdquo; n\u0026rsquo;est pas le bon mot ; \u0026ldquo;pille\u0026rdquo; est plus approprié. Ou peut être, \u0026ldquo;assimile\u0026rdquo; — comme les Borgs. Ouais, j\u0026rsquo;aime ça.\nNous sommes les Borgs. Vos caractèristiques linguistiques et étymologiques seront ajoutées aux nôtres. La résistance est futile.\nDans ce chapitre, vous allez apprendre les noms pluriels. Mais aussi, les fonctions qui retournent d\u0026rsquo;autres fonctions, les expressions régulières avancées, et les générateurs. Mais d\u0026rsquo;abord, discutons de comment former les noms pluriels. (Si vous n\u0026rsquo;avez pas encore lu le chapitre sur les expressions régulières, maintenant serait le bon moment. Ce chapitre assume que vous comprenez les bases des expressions régulières, et il en vient rapidement à des usages plus avancés.)\nSi vous avez grandit dans un pays anglophone ou apprit l\u0026rsquo;anglais dans un contexte scolaire, vous êtes probablement familier avec les règles de base :\nSi un mot se termine avec un S, X, ou Z, ajoutez ES. Bass devient basses, fax devient faxes, et waltz devient waltzes. Si un mot se termine avec un H sonore, ajoutez ES ; s\u0026rsquo;il se termine avec un H muet, ajoutez juste un S. Qu\u0026rsquo;est-ce qu\u0026rsquo;un H sonore ? C\u0026rsquo;est un H qui combiné avec d\u0026rsquo;autres lettres forme un son que vous pouvez entendre. Donc coach devient coaches et rash devient rashes, parce que vous pouvez entendre les sons CH et SH quand vous les prononcez. Mais cheetah devient cheetahs, parce que le H est muet. Si un mot se termine avec un Y qui sonne comme in I, remplacez le Y par IES ; si le Y est combiné avec une voyelle pour sonner différemment, ajoutez juste un S. Donc vacancy devient vacancies, mais day devient days. Si tout échoue, alors ajoutez simplement S et espérez que ça ira. (Je sais, il y a plein d\u0026rsquo;exceptions. Man devient men et woman devient women, mais human devient humans. Mouse devient mice and louse devient lice, mais house devient houses. Knife devient knives et wife devient wives, mais lowlife devient lowlifes. Et ne parlons même pas des mots qui sont leur propre pluriel comme sheep, deer et haiku.)\nBien évidemment, les autres langues sont complètement différentes.\nDéveloppons une librairie Python qui forme automatiquement le pluriel des mots anglais. Nous commencerons seulement avec ces quatre règles, mais gardez à l\u0026rsquo;esprit que vous allez inévitablement en ajouter d\u0026rsquo;autres.\nJe sais, utilisons les expression régulières ! Dons vous recherchez des mots qui, au moins en anglais, signifie que vous recherchez des chaînes de caractères. Vous avez des règles qui disent que vous devez trouver différentes combinaisons de caractères, et leur faire différentes choses. Cela semble être un boulot pour les expressions régulières !\nimport re def plural(noun): if re.search(\u0026#39;[sxz]$\u0026#39;, noun): ### (1) return re.sub(\u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;, noun) ### (2) elif re.search(\u0026#39;[^aeioudgkprt]h$\u0026#39;, noun): return re.sub(\u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;, noun) elif re.search(\u0026#39;[^aeiou]y$\u0026#39;, noun): return re.sub(\u0026#39;y$\u0026#39;, \u0026#39;ies\u0026#39;, noun) else: return noun + \u0026#39;s\u0026#39; (1) C\u0026rsquo;est une expression régulière, mais elle utilise une syntaxe que vous n\u0026rsquo;avez pas vu dans le chapitre Expressions Régulières. Les crochets signifient \u0026ldquo;correspond exactement à un de ces caractères\u0026rdquo;. Donc [sxz] signifie \u0026quot; s, ou x, ou z \u0026ldquo;, mais seulement à un d\u0026rsquo;entre eux. Le $ devrait être familier ; il correspond à la fin de chaîne. Combinés, cette expression régulière vérifie si noun se termine avec s, x ou z.\n(2) Cette fonction re.sub() exécute une substitution de chaînes par expression régulière.\nRegardons les substitutions par expression régulière plus en détail.\n\u0026gt;\u0026gt;\u0026gt; import re \u0026gt;\u0026gt;\u0026gt; re.search(\u0026#39;[abc]\u0026#39;, \u0026#39;Mark\u0026#39;) ### (1) \u0026lt;_sre.SRE_Match object at 0x001C1FA8\u0026gt; \u0026gt;\u0026gt;\u0026gt; re.sub(\u0026#39;[abc]\u0026#39;, \u0026#39;o\u0026#39;, \u0026#39;Mark\u0026#39;) ### (2) \u0026#39;Mork\u0026#39; \u0026gt;\u0026gt;\u0026gt; re.sub(\u0026#39;[abc]\u0026#39;, \u0026#39;o\u0026#39;, \u0026#39;rock\u0026#39;) ### (3) \u0026#39;rook\u0026#39; \u0026gt;\u0026gt;\u0026gt; re.sub(\u0026#39;[abc]\u0026#39;, \u0026#39;o\u0026#39;, \u0026#39;caps\u0026#39;) ### (4) \u0026#39;oops\u0026#39; (1) Est-ce que la chaîne Mark contient a, b, ou c ? Oui, elle contient a.\n(2) OK, maintenant trouvons a, b, ou c, et replaçons-le par o. Mark devient Mork.\n(3) La même fonction transforme rock en rook.\n(4) Vous devez penser que cela devrait transformer caps en oaps, mais en fait non. re.sub remplace toutes les correspondances, pas seulement la première. Donc cette expression régulière transforme caps en oops, parce que le c et le a sont tous les deux transformés en o.\nEt maintenant, revenons à la fonction plural()…\ndef plural(noun): if re.search(\u0026#39;[sxz]$\u0026#39;, noun): return re.sub(\u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;, noun) ### (1) elif re.search(\u0026#39;[^aeioudgkprt]h$\u0026#39;, noun): ### (2) return re.sub(\u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;, noun) elif re.search(\u0026#39;[^aeiou]y$\u0026#39;, noun): ### (3) return re.sub(\u0026#39;y$\u0026#39;, \u0026#39;ies\u0026#39;, noun) else: return noun + \u0026#39;s\u0026#39; (1) Ici, vous remplacez la fin de chaîne (correspondant à $) par la chaîne es. En d\u0026rsquo;autres mots, cela ajoute es à la chaîne. Vous pouvez obtenir la même chose avec la concaténation de chaîne, par exemple noun + 'es', mais j\u0026rsquo;ai choisi d\u0026rsquo;utiliser les expressions régulières pour chaque règle, pour des raisons qui deviendront plus claires plus loin dans ce chapitre.\n(2) Regardez attentivement, c\u0026rsquo;est une autre nouvelle variation. Le ^, en premier caractère entre crochets, signifie quelque chose de spécial : la négation. [^abc] signifie \u0026ldquo;n\u0026rsquo;importe quel caractère sauf a, b, ou c\u0026rdquo;. Donc [^aeioudgkprt] signifie n\u0026rsquo;importe quel caractère sauf a, e, i, o, u, d, g, k, p, r, ou t. Puis ce caractère doit être suivi par h, suivi par la fin de chaîne. Vous cherchez les mots qui finissent avec un H où le H est sonore.\n(3) Même motif ici : trouver les mots qui se terminent par Y, où le caractère avant le Y n\u0026rsquo;est pas a, e, i, o, ou u. Vous cherchez les mots qui finissent avec un Y qui sonne comme un I.\nRegardons la négation d\u0026rsquo;expression régulière plus en détail.\n\u0026gt;\u0026gt;\u0026gt; import re \u0026gt;\u0026gt;\u0026gt; re.search(\u0026#39;[^aeiou]y$\u0026#39;, \u0026#39;vacancy\u0026#39;) ### (1) \u0026lt;_sre.SRE_Match object at 0x001C1FA8\u0026gt; \u0026gt;\u0026gt;\u0026gt; re.search(\u0026#39;[^aeiou]y$\u0026#39;, \u0026#39;boy\u0026#39;) ### (2) \u0026gt;\u0026gt;\u0026gt; \u0026gt;\u0026gt;\u0026gt; re.search(\u0026#39;[^aeiou]y$\u0026#39;, \u0026#39;day\u0026#39;) \u0026gt;\u0026gt;\u0026gt; \u0026gt;\u0026gt;\u0026gt; re.search(\u0026#39;[^aeiou]y$\u0026#39;, \u0026#39;pita\u0026#39;) ### (3) \u0026gt;\u0026gt;\u0026gt; (1) vacancy correspond à cette expression régulière, parce qu\u0026rsquo;il se termine en cy, et c n\u0026rsquo;est pas a, e, i, o, ou u.\n(2) boy ne correspond pas, parce qu\u0026rsquo;il se termine en oy, et vous avez spécifiquement dit que le caractère avant le y ne peut pas être o. day ne correspond pas, parce qu\u0026rsquo;il se termine en ay.\n(3) pita ne correspond pas, parce qu\u0026rsquo;il ne se termine pas en y.\n\u0026gt;\u0026gt;\u0026gt; re.sub(\u0026#39;y$\u0026#39;, \u0026#39;ies\u0026#39;, \u0026#39;vacancy\u0026#39;) ### (1) \u0026#39;vacancies\u0026#39; \u0026gt;\u0026gt;\u0026gt; re.sub(\u0026#39;y$\u0026#39;, \u0026#39;ies\u0026#39;, \u0026#39;agency\u0026#39;) \u0026#39;agencies\u0026#39; \u0026gt;\u0026gt;\u0026gt; re.sub(\u0026#39;([^aeiou])y$\u0026#39;, r\u0026#39;\\1ies\u0026#39;, \u0026#39;vacancy\u0026#39;) ### (2) \u0026#39;vacancies\u0026#39; (1) Cette expression régulière transforme vacancy en vacancies et agency en agencies, ce qui est ce que vous voulez. Notez que cela transforme aussi boy en boies, mais cela n\u0026rsquo;arrivera jamais dans la fonction parce que vous avez fait cette recherche d\u0026rsquo;abord avec re.search pour savoir si vous devez la faire avec re.sub.\n(2) Juste en passant, je voudrais pointer le fait qu\u0026rsquo;il est possible de combiner ces deux expressions régulières (une pour trouver si la règle s\u0026rsquo;applique, et une autre pour effectivement l\u0026rsquo;appliquer) en une unique expression régulière. Cela ressemblerait à ça. Cela doit sembler en grande partie familier : vous utilisez un groupe de capture, que vous avez appris dans l’Étude de Cas : Analyser les Numéros de Téléphone. Le groupe est utilisé pour capturer le caractère avant la lettre y. Puis dans la chaîne de substitution, vous utilisez une nouvelle syntaxe, \\1, qui signifie « hé, tu te souviens de ce premier groupe ? met le ici. » Dans ce cas, vous capturez le c avant le y ; quand vous faite la substitution, vous substituez c à la place de c, et ies à la place de y. (Si vous avez plus d\u0026rsquo;un groupe de capture, vous pouvez utiliser \\2 et \\3 et ainsi de suite.)\nLes substitutions par expression régulière sont extrêmement puissantes, et la syntaxe \\1 les rend encore plus puissante. Mais combiner toute l’opération en une seule expression régulière est aussi plus difficile à lire, et cela ne correspond pas directement à la façon dont vous décrivez les règles du pluriel. Vous avez initialement posé les règles comme \u0026ldquo;si le mot se termine en S, X, ou Z, alors ajouter ES\u0026rdquo;. Si vous regardez cette fonction, vous avez deux lignes de code qui disent \u0026ldquo;si le mot se termine en S, X, ou Z, alors ajouter ES\u0026rdquo;. Il n\u0026rsquo;est pas possible d\u0026rsquo;être plus direct.\nUne liste de fonctions Maintenant, vous allez ajouter un niveau d\u0026rsquo;abstraction. Vous avez commencé par définir une liste de règles : si ceci, faire cela, autrement aller à la prochaine règle. Compliquons temporairement une partie du programme, ainsi vous pourrez en simplifier une autre partie.\nimport re def match_sxz(noun): return re.search(\u0026#39;[sxz]$\u0026#39;, noun) def apply_sxz(noun): return re.sub(\u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;, noun) def match_h(noun): return re.search(\u0026#39;[^aeioudgkprt]h$\u0026#39;, noun) def apply_h(noun): return re.sub(\u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;, noun) def match_y(noun): ### (1) return re.search(\u0026#39;[^aeiou]y$\u0026#39;, noun) def apply_y(noun): ### (2) return re.sub(\u0026#39;y$\u0026#39;, \u0026#39;ies\u0026#39;, noun) def match_default(noun): return True def apply_default(noun): return noun + \u0026#39;s\u0026#39; rules = ((match_sxz, apply_sxz), ### (3) (match_h, apply_h), (match_y, apply_y), (match_default, apply_default) ) def plural(noun): for matches_rule, apply_rule in rules: ### (4) if matches_rule(noun): return apply_rule(noun) (1) Maintenant, chaque règle de correspondance est sa propre fonction qui retourne les résultats de l\u0026rsquo;appel de la fonction re.search().\n(2) Chaque règle d\u0026rsquo;application est aussi sa propre fonction qui appelle la fonction re.sub() pour appliquer la règle de pluriel appropriée.\n(3) Au lieu d\u0026rsquo;avoir une fonction (plural()) avec de multiple règles, vous avez la structure de données rules qui est une séquence de paires de fonctions.\n(4) Puisque les règles ont été placées dans une structure de données séparée, la nouvelle fonction plural() peut être réduite à quelques lignes de code. En utilisant une boucle for, vous pouvez extraire les règles de correspondance et les règles d\u0026rsquo;application deux à la fois (une de correspondance et une d\u0026rsquo;application) de la structure rules. À la première itération de la boucle for, matches_rule recevra match_sxz, et apply_rule recevra apply_sxz. À la seconde itération (en présumant que vous arrivez jusque là), matches_rules sera assignée à match_h, et apply_rule sera assignée à apply_h. La fonction est garantie de retourner quelque chose éventuellement, parce que la dernière règle (match_default) retourne simplement True, cela signifie que la règle d\u0026rsquo;application correspondante (apply_default) sera toujours appliquée.\nLa raison pour laquelle cette technique fonctionne est que tout en Python est un objet, y compris les fonctions. La structure de données rules contient des fonctions — pas des noms de fonctions, mais de vrais objets fonction. Quand ils sont assignés dans la boucle for, alors matches_rule et apply_rule sont de vraies fonctions que vous pouvez appeler. À la première itération de la boucle for, c\u0026rsquo;est équivalent à appeler matches_sxz(noun), et si elle retourne une correspondance, à appeler apply_sxz(noun).\nSi cet additionnel niveau d\u0026rsquo;abstraction prête à confusion, essayez de dérouler la fonction pour voir l’équivalence. La boucle for complète est équivalente à :\ndef plural(noun): if match_sxz(noun): return apply_sxz(noun) if match_h(noun): return apply_h(noun) if match_y(noun): return apply_y(noun) if match_default(noun): return apply_default(noun) Le bénéfice ici est que la fonction plural() est maintenant simplifiée. Elle prend une séquence de règles, définies quelque part, et les itére d\u0026rsquo;une manière générique.\nTrouver une règle de correspondance. Une correspondance ? Alors appeler la règle d\u0026rsquo;application et retourner le résultat. Pas de correspondance ? Aller a l’étape 1. Les règles peuvent être définies n\u0026rsquo;importe où, de n\u0026rsquo;importe quelle façon. La fonction plural() ne s\u0026rsquo;en préoccupe pas.\nMaintenant, est-ce qu\u0026rsquo;ajouter ce niveau d\u0026rsquo;abstraction en valait la peine ? Et bien, pas encore. Considérez ce qu\u0026rsquo;il faudrait pour ajouter une nouvelle règle à la fonction. Dans le premier exemple, cela nécessiterait d\u0026rsquo;ajouter une instruction if à la fonction plural(). Dans le second exemple, cela nécessiterait d\u0026rsquo;ajouter deux fonctions, match_foo() et apply_foo(), et puis mettre à jour la séquence rules pour spécifier où dans la séquence les nouvelles fonctions de correspondance et d\u0026rsquo;application doivent être appelées par rapport aux autres règles.\nMais ce n\u0026rsquo;est qu\u0026rsquo;une étape dans la prochaine section. Allons-y…\nUne liste de motifs Définir des fonctions nommées séparées pour chaque règle de correspondance et d\u0026rsquo;application n\u0026rsquo;est pas vraiment nécessaire. Vous ne les appelez jamais directement ; vous les ajoutez à la séquence rules et les appelez depuis-là. De plus, chaque fonction suit l’un des deux motifs. Toutes les fonctions de correspondances appelent re.search() et toutes les fonctions d\u0026rsquo;applications appelent re.sub(). Examinons les motifs afin de définir de nouvelles règles plus faciles :\nimport re def build_match_and_apply_functions(pattern, search, replace): def matches_rule(word): ### (1) return re.search(pattern, word) def apply_rule(word): ### (2) return re.sub(search, replace, word) return (matches_rule, apply_rule) ### (3) (1) build_match_and_apply_functions() est une fonction qui construit d\u0026rsquo;autres fonction de manière dynamique. Elle prend pattern, search et replace, puis définit une fonction matches_rule() qui appelle re.search() avec le pattern (motif) qui a été passé à la fonction build_match_and_apply_functions(), et (le mot) word qui a été passé à la fonction matches_rule() que vous construisez. Waouh.\n(2) Construire la fonction d\u0026rsquo;application fonctionne de la même manière. La fonction d\u0026rsquo;application est une fonction qui prend un paramètre, et qui appelle re.sub() avec les paramètres search et replace qui ont été passés à la fonction build_match_and_apply_functions(), et (le mot) word qui a été passé à la fonction apply_rule() que vous construisez. Cette technique utilisant les valeurs de paramètres externes au sein d\u0026rsquo;une fonction dynamique est appelée closures. Vous définissez essentiellement des constantes au sein de la fonction d\u0026rsquo;application que vous construisez : elle prend un paramètre (word), mais elle le traite alors avec deux autres valeurs (search et replace) qui ont été paramétrées quand vous avez défini la fonction application.\n(3) Finalement, la fonction build_match_and_apply_functions() retourne un tuple de deux valeurs : les deux fonctions que vous venez de créer. Les constantes que vous avez définies dans ces fonctions (pattern dans la fonction matches_rule(), et search dans la fonction apply_rule()) restent avec ces fonctions, même après que votre retour de build_match_and_apply_functions(). C\u0026rsquo;est incroyablement cool.\nSi cela prête vraiment à confusion (et cela devrait l\u0026rsquo;être, c\u0026rsquo;est bizarre), cela peut devenir plus clair en analysant comment l\u0026rsquo;utiliser.\npatterns = \\ ### (1) ( (\u0026#39;[sxz]$\u0026#39;, \u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;), (\u0026#39;[^aeioudgkprt]h$\u0026#39;, \u0026#39;$\u0026#39;, \u0026#39;es\u0026#39;), (\u0026#39;(qu|[^aeiou])y$\u0026#39;, \u0026#39;y$\u0026#39;, \u0026#39;ies\u0026#39;), (\u0026#39;$\u0026#39;, \u0026#39;$\u0026#39;, \u0026#39;s\u0026#39;) ### (2) ) rules = [build_match_and_apply_functions(pattern, search, replace) ### (3) for (pattern, search, replace) in patterns] (1) Nos \u0026ldquo;règles\u0026rdquo; du pluriel sont maintenant définies comme tuple de tuples de chaînes (non pas de fonctions). La première chaîne dans chaque groupe est le motif d\u0026rsquo;expression régulière que vous utiliseriez avec re.search() pour voir si la règle correspond. La deuxième et la troisième chaîne dans chaque groupe sont les expressions de recherche et de remplacement que vous utiliseriez avec re.sub() pour effectivement appliquer la règle afin de transformer un nom en son pluriel.\n(2) Il y a un léger changement ici, dans la règle par défaut. Dans l\u0026rsquo;exemple précédent, la fonction match_default() retournait simplement True, signifiant que si aucune des règles spécifiques ne correspond, le code ajouterait simplement un s à la fin du mot donné. Cette exemple fait quelque chose de fonctionnellement équivalent. La dernière expression régulière demande si le mot a une fin ($ correspond à la fin d\u0026rsquo;une chaîne). Bien sur, chaque chaîne a une fin, même une chaîne vide, donc cette expression correspond toujours. Ainsi, elle sert le même objectif que la fonction matches_default() qui retournait toujours True : elle assure que si aucune règle spécifique ne correspond, le code ajoute un s à la fin du mot donné.\n(3) Cette ligne est magique. Elle prend la séquence de chaînes dans patterns et les transforme en une séquence de fonctions. Comment ? En faisant correspondre les chaînes à la fonction build_match_and_apply_functions(). C\u0026rsquo;est-à-dire, elle prend chaque triplet de chaînes et appelle la fonction build_match_and_apply_functions() avec ces trois chaînes comme arguments. La fonction build_match_and_apply_functions() retourne un tuple de deux fonctions. Cela signifie que rules est donc fonctionnellement équivalente à l\u0026rsquo;exemple précédent : une liste de tuples où chaque tuple est une paire de fonctions. La première fonction est la fonction de correspondance qui appelle re.search(), et la seconde fonction est la fonction d\u0026rsquo;application qui appelle re.sub().\nCette version du script est complétée par le point d’entrée principal, la fonction plural().\ndef plural(noun): for matches_rule, apply_rule in rules: ### (1) if matches_rule(noun): return apply_rule(noun) (1) Puisque la liste rules est la même que dans l\u0026rsquo;exemple précédent (c\u0026rsquo;est vraiment le cas), cela ne devrait pas être surprenant que la fonction plural() n\u0026rsquo;a pas changé du tout. Elle est complètement générique ; elle prend une liste de fonctions de règle et les appelle dans l\u0026rsquo;ordre. Elle ne se soucie pas de comment les règles sont définies. Dans l\u0026rsquo;exemple précédent, elles étaient définies comme des fonctions nommées séparées. Maintenant, elles sont construites dynamiquement en faisant correspondre la sortie de la fonction build_match_and_apply_functions() avec une liste brute de chaînes. Cela n\u0026rsquo;a aucune d\u0026rsquo;importance ; la fonction plural() fonctionne toujours de la même façon.\nUn fichier de motifs Vous avez extrait tout le code dupliqué et ajoutez assez d\u0026rsquo;abstraction pour les que les règles du pluriel soient définies dans une liste de chaînes. La prochaine étape logique est de prendre ces chaînes et de les mettre dans un fichier séparé, où elles peuvent être maintenues séparément du code qui les utilise.\nEn premier, créons un fichier texte qui contient les règles que vous voulez. Pas de structure de données sophistiquée, juste des chaînes délimitées par des espaces dans trois colonnes. Appelons-le plural4-rules.txt.\n[sxz]$ $ es [^aeioudgkprt]h$ $ es [^aeiou]y$ y$ ies $ $ s Maintenant regardons comment nous pouvons utiliser ce fichier de règles.\nimport re def build_match_and_apply_functions(pattern, search, replace): ### (1) def matches_rule(word): return re.search(pattern, word) def apply_rule(word): return re.sub(search, replace, word) return (matches_rule, apply_rule) rules = [] with open(\u0026#39;plural4-rules.txt\u0026#39;, encoding=\u0026#39;utf-8\u0026#39;) as pattern_file: ### (2) for line in pattern_file: ### (3) pattern, search, replace = line.split(None, 3) ### (4) rules.append(build_match_and_apply_functions( ### (5) pattern, search, replace)) (1) La fonction build_match_and_apply_functions() n\u0026rsquo;a pas changé. Vous utilisez toujours des closures pour construire deux fonctions dynamiquement qui utilisent les variables définies dans la fonction externe.\n(2) La fonction globale open() ouvre un fichier et retourne un objet fichier. Dans ce cas, le fichier que nous ouvrons contient les motifs de chaînes pour mettre au pluriel des noms. L\u0026rsquo;instruction with crée ce qui est appelé un contexte : quand le bloc with se termine, Python va automatiquement fermer le fichier, même si une exception se produit à l’intérieur du bloc with. Vous en apprendrez plus à-propos des blocs with et des objets fichier dans le chapitre Fichiers.\n(3) L\u0026rsquo;idiome for line in \u0026lt;fileobject\u0026gt; lit les données depuis le fichier ouvert, une ligne à la fois, et assigne le texte à la variable line. Vous en apprendrez plus à-propos de la lecture de fichier dans le chapitre Fichiers.\n(4) Chaque ligne du fichier a en fait trois valeurs, mais elles sont séparées par des espaces blancs (tabulation ou espace, cela n\u0026rsquo;a pas d\u0026rsquo;importance). Pour les séparer, utilisez la méthode de chaîne split(). Le premier argument de la méthode split() est None, ce qui signifie \u0026ldquo;découpe à chaque espace blanc (tabulation ou espace, cela n\u0026rsquo;a pas d\u0026rsquo;importance).\u0026rdquo; Le second argument est 3, ce qui signifie \u0026ldquo;découpe sur les espaces blancs 3 fois, puis laisse en l’état le reste de la ligne.\u0026rdquo; Une ligne comme [sxz]$ $ es sera découpée en liste ['[sxz]$', '$', 'es'], ce qui signifie que pattern aura \u0026lsquo;[sxz]$\u0026rsquo;, search aura \u0026lsquo;$\u0026rsquo;, et replace aura \u0026lsquo;es\u0026rsquo;. C\u0026rsquo;est beaucoup de puissance dans une seule petite ligne de code.\n(5) Finalement, vous passez pattern, search, et replace à la fonction build_match_and_apply_functions(), qui retourne un tuple de fonctions. Vous ajouter ce tuple à la liste rules, et rules finit par stocker la liste des fonctions de correspondance et d\u0026rsquo;application que la fonction plural() attend.\nL’amélioration ici est que vous avez complètement séparé les règles du pluriel dans une fichier externe, ainsi il peut être maintenu séparément du code qui l\u0026rsquo;utilise. Le code avec le code, les données avec les données, et tout va bien.\nGénérateurs Est-ce que ce ne serait pas grandiose d\u0026rsquo;avoir une fonction générique plural() qui analyse le fichier de règles ? Récupère les règles, cherche une correspondance, applique la transformation appropriée, va à la règle suivante. C\u0026rsquo;est tout ce que la fonction plural() a à faire, et c\u0026rsquo;est tout ce que la fonction plural() devrait faire.\ndef rules(rules_filename): with open(rules_filename, encoding=\u0026#39;utf-8\u0026#39;) as pattern_file: for line in pattern_file: pattern, search, replace = line.split(None, 3) yield build_match_and_apply_functions(pattern, search, replace) def plural(noun, rules_filename=\u0026#39;plural5-rules.txt\u0026#39;): for matches_rule, apply_rule in rules(rules_filename): if matches_rule(noun): return apply_rule(noun) raise ValueError(\u0026#39;no matching rule for {0}\u0026#39;.format(noun)) Mais comment est-ce que ça fonctionne ? Regardons d\u0026rsquo;abord un premier exemple interactif.\n\u0026gt;\u0026gt;\u0026gt; def make_counter(x): … print(\u0026#39;entering make_counter\u0026#39;) … while True: … yield x ### (1) … print(\u0026#39;incrementing x\u0026#39;) … x = x + 1 … \u0026gt;\u0026gt;\u0026gt; counter = make_counter(2) ### (2) \u0026gt;\u0026gt;\u0026gt; counter ### (3) \u0026lt;generator object at 0x001C9C10\u0026gt; \u0026gt;\u0026gt;\u0026gt; next(counter) ### (4) entering make_counter 2 \u0026gt;\u0026gt;\u0026gt; next(counter) ### (5) incrementing x 3 \u0026gt;\u0026gt;\u0026gt; next(counter) ### (6) incrementing x 4 (1) La présence du mot-clef yield dans make_counter signifie que ce n\u0026rsquo;est pas une fonction normale. C\u0026rsquo;est un type spécial de fonction qui génère des valeurs l\u0026rsquo;une après l\u0026rsquo;autre. Vous pouvez l\u0026rsquo;imaginez comme une fonction pouvant être interrompue et reprise. L\u0026rsquo;appeler retournera un générateur qui peut être utiliser pour générer des valeurs successives de x.\n(2) Pour créer une instance du générateur make_counter, appelez-le juste comme une autre fonction. Notez qu\u0026rsquo;en fait cela n’exécute pas le code de la fonction. Vous pouvez le voir parce que la première ligne de la fonction make_counter appelle print(), mais rien n\u0026rsquo;est encore affiché.\n(3) La fonction make_counter retourne un objet générateur.\n(4) La fonction next() prend un objet générateur et retourne sa prochaine valeur. La première fois que vous appelez next() avec le générateur counter, elle exécute le code dans make_counter jusqu\u0026rsquo;à la première instruction yield, puis retourne la valeur qui a été générée. Dans ce cas, ce sera 2, car vous avez initialement créé le générateur en appelant make_counter(2).\n(5) Appeler de façon répétitive next() avec le mème objet générateur reprend exactement là où il s\u0026rsquo;était arrêté et continue jusqu\u0026rsquo;à ce qu\u0026rsquo;il rencontre la prochaine instruction yield. Toutes les variables, état local, etc, sont sauvegardées à yield et rétablies à next(). La prochaine ligne de code attendant d’être exécutée appelle print(), qui affiche incrementing x. Après cela, l\u0026rsquo;instruction x = x + 1. Puis elle boucle à nouveau au travers de la boucle while, et la première chose recontrée est l\u0026rsquo;instruction yield x, qui sauvegarde l’état de toute chose et retourne la valeur courante de x (maintenant 3).\n(6) La deuxième fois que vous appelez next(), vous faites à nouveau les même choses, mais cette fois x vaut 4.\nPuisque make_counter définit une boucle infinie, vous pouvez théoriquement faire cela pour toujours, et ça continuerait juste d’incrémenter x et de cracher des valeurs. Mais regardons plutôt des utilisations plus productives des générateurs.\n“yield” met en pause une fonction. “next()” la reprend où elle s’était interrompue.\nUn générateur Fibonacci def fib(max): a, b = 0, 1 ### (1) while a \u0026lt; max: yield a ### (2) a, b = b, a + b ### (3) (1) La séquence de Fibonacci est une séquence de nombres où chaque nombre est la somme des deux nombres qui le précèdent. Elle commence avec 0 et 1, progresse doucement d\u0026rsquo;abord, puis de plus en plus rapidement. Pour commencer la séquence, vous avez besoin de deux variables : a commence à 0, et b commence à 1.\n(2) Générons a qui est le nombre courant dans la séquence.\n(3) Assignons b, qui est le prochain nombre dans la séquence, à a, mais calculons aussi la prochaine valeur (a + b) et assignons-la à b pour l\u0026rsquo;utiliser plus tard. Notez que cela se produit en parallèle ; si a vaut 3 et b vaut 5, alors a, b = b, a + b paramètrera 5 à a (la précédente valeur de b) et 8 à b (la somme des précédentes valeurs de a et b).\nDonc vous avez une fonction qui restitue les nombres Fibonacci successifs. Bien sur, vous pouvez faire cela avec la récursion, mais cette manière est plus facile à lire. De même, cela fonctionne bien avec les boucles for.\n\u0026gt;\u0026gt;\u0026gt; from fibonacci import fib \u0026gt;\u0026gt;\u0026gt; for n in fib(1000): ### (1) … print(n, end=\u0026#39; \u0026#39;) ### (2) 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 \u0026gt;\u0026gt;\u0026gt; list(fib(1000)) ### (3) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987] (1) Vous pouvez utiliser un générateur tel que fib() directement dans la boucle for. La boucle for appellera automatiquement la fonction next(), récupèrera les valeurs du générateur fib() et les assignera à la variable d\u0026rsquo;index (n) de la boucle for.\n(2) A chaque passage dans la boucle for, n reçoit une nouvelle valeur de l\u0026rsquo;instruction yield dans fib(), tout ce que vous avez à faire est de l\u0026rsquo;afficher. Une fois que fib() est à court de nombres (a devient plus grand que max, qui dans ce cas vaut 1000), alors la boucle for se termine normalement.\n(3) C\u0026rsquo;est un idiome utile : passez un générateur à la fonction list(), et il itérera le générateur tout entier (exactement comme la boucle for de l\u0026rsquo;exemple précédent) et retournera une liste de toutes les valeurs.\nUn générateur de règles du pluriel Retournons à plural5.py et voyons comment cette version de plural() fonctionne.\ndef rules(rules_filename): with open(rules_filename, encoding=\u0026#39;utf-8\u0026#39;) as pattern_file: for line in pattern_file: pattern, search, replace = line.split(None, 3) ### (1) yield build_match_and_apply_functions(pattern, search, replace) ### (2) def plural(noun, rules_filename=\u0026#39;plural5-rules.txt\u0026#39;): for matches_rule, apply_rule in rules(rules_filename): ### (3) if matches_rule(noun): return apply_rule(noun) raise ValueError(\u0026#39;no matching rule for {0}\u0026#39;.format(noun)) (1) Ici, pas de magie. Souvenez-vous que les lignes du fichier de règles ont trois valeurs séparées par des espaces, donc vous utilisez line.split(None, 3) pour récupérer les trois \u0026ldquo;colonnes\u0026rdquo; et les assigner à trois variables locales.\n(2) Et puis vous générez. Qu\u0026rsquo;est-ce que vous générez ? Deux fonctions, construites dynamiquement avec notre vieille amie, build_match_and_apply_functions(), qui est identique à celle des exemples précédents. En d\u0026rsquo;autres mots, rules() est un générateur qui crache des fonctions de correspondance et d\u0026rsquo;application à la demande.\n(3) Puisque rules() est un générateur, vous pouvez l\u0026rsquo;utiliser directement dans une boucle for. Au premier passage dans la boucle for, vous appellerez la fonction rules(), qui ouvrira le fichier de motifs, lira la première ligne, construira dynamiquement une fonction de correspondance et une fonction d\u0026rsquo;application à partir des motifs de cette ligne, et générera les fonctions construites dynamiquement. Au second passage dans la boucle for, vous reprendrez exactement là où vous avez laissé rules() (qui était au milieu de la boucle for line in pattern_file). La première chose qu\u0026rsquo;elle fera sera de lire la ligne suivante du fichier (qui est toujours ouvert), de construire dynamiquement une autre fonction de correspondance et une autre fonction d\u0026rsquo;application sur la base des motifs de cette ligne, et générera les deux fonctions.\nQu\u0026rsquo;avez-vous gagné par rapport à l’étape 4 ? Le temps de démarrage. À l’étape 4, quand vous importez le module plural4, il lit tout le fichier de motifs et construit une liste de toutes les règles possibles, avant mème que ne vous pensiez à appeler la fonction plural(). Avec les générateurs, vous pouvez tout faire de façon paresseuse : vous lisez la première règle et créez les fonctions puis les testez, et si ça fonctionne vous ne lisez même pas le reste du fichier ou créez d\u0026rsquo;autres fonctions.\nQu\u0026rsquo;avez-vous perdu ? De la performance ! Chaque fois que vous appelez la fonction plural(), le générateur rules recommence depuis le début — ce qui signifie ouvrir à nouveau le fichier de motifs et le lire depuis le début, une ligne à la fois.\nEt si vous pouviez avoir le meilleur des deux mondes : temps de démarrage minimal (ne pas exécuter de code à import), et performance maximale (ne pas construire les même fonctions encore et encore). Oh, et vous voulez toujours garder les règles dans un fichier séparé (parce que le code avec le code et les données avec les données), tant que vous n\u0026rsquo;avez jamais besoin de lire deux fois la même ligne.\nPour faire cela, vous allez devoir construire votre propre itérateur. Mais avant que vous fassiez cela, vous devez apprendre les classes Python.\nPour aller plus loin (en anglais) PEP 255: Simple Generators Understanding Python’s “with” statement Closures in Python Fibonacci numbers ",
            "content_html": "\u003ch1 id=\"chapitre-6--closures-et-générateurs\"\u003eChapitre 6 : Closures et Générateurs\u003c/h1\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u0026ldquo;My spelling is Wobbly. It’s good spelling but it Wobbles, and the letters get in the wrong places.\u0026rdquo; — Winnie-the-Pooh\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"en-plongée\"\u003eEn plongée\u003c/h2\u003e\n\u003cp\u003eAyant grandit en fils de bibliothécaire et de spécialiste en langue anglaise, j\u0026rsquo;ai toujours été fasciné par les langages. Pas les langages de programmation. Enfin si, les langages de programmation, mais aussi les langages naturels. Prenez l\u0026rsquo;anglais. L\u0026rsquo;anglais est un langage schizophrénique qui emprunte des mots de l\u0026rsquo;allemand, du français, de l’espagnol et du latin (pour en citer quelque uns). En fait, \u0026ldquo;emprunte\u0026rdquo; n\u0026rsquo;est pas le bon mot ; \u0026ldquo;pille\u0026rdquo; est plus approprié. Ou peut être, \u0026ldquo;assimile\u0026rdquo; — comme les Borgs. Ouais, j\u0026rsquo;aime ça.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNous sommes les Borgs. Vos caractèristiques linguistiques et étymologiques seront ajoutées aux nôtres. La résistance est futile.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eDans ce chapitre, vous allez apprendre les noms pluriels. Mais aussi, les fonctions qui retournent d\u0026rsquo;autres fonctions, les expressions régulières avancées, et les générateurs. Mais d\u0026rsquo;abord, discutons de comment former les noms pluriels. (Si vous n\u0026rsquo;avez pas encore lu \u003ca\u003ele chapitre sur les expressions régulières\u003c/a\u003e, maintenant serait le bon moment. Ce chapitre assume que vous comprenez les bases des expressions régulières, et il en vient rapidement à des usages plus avancés.)\u003c/p\u003e\n\u003cp\u003eSi vous avez grandit dans un pays anglophone ou apprit l\u0026rsquo;anglais dans un contexte scolaire, vous êtes probablement familier avec les règles de base :\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSi un mot se termine avec un S, X, ou Z, ajoutez ES. \u003cem\u003eBass\u003c/em\u003e devient \u003cem\u003ebasses\u003c/em\u003e, \u003cem\u003efax\u003c/em\u003e devient \u003cem\u003efaxes\u003c/em\u003e, et \u003cem\u003ewaltz\u003c/em\u003e devient \u003cem\u003ewaltzes\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eSi un mot se termine avec un H sonore, ajoutez ES ; s\u0026rsquo;il se termine avec un H muet, ajoutez juste un S. Qu\u0026rsquo;est-ce qu\u0026rsquo;un H sonore ? C\u0026rsquo;est un H qui combiné avec d\u0026rsquo;autres lettres forme un son que vous pouvez entendre. Donc \u003cem\u003ecoach\u003c/em\u003e devient \u003cem\u003ecoaches\u003c/em\u003e et \u003cem\u003erash\u003c/em\u003e devient \u003cem\u003erashes\u003c/em\u003e, parce que vous pouvez entendre les sons CH et SH quand vous les prononcez. Mais \u003cem\u003echeetah\u003c/em\u003e devient \u003cem\u003echeetahs\u003c/em\u003e, parce que le H est muet.\u003c/li\u003e\n\u003cli\u003eSi un mot se termine avec un Y qui sonne comme in I, remplacez le Y par IES ; si le Y est combiné avec une voyelle pour sonner différemment, ajoutez juste un S. Donc \u003cem\u003evacancy\u003c/em\u003e devient \u003cem\u003evacancies\u003c/em\u003e, mais \u003cem\u003eday\u003c/em\u003e devient \u003cem\u003edays\u003c/em\u003e.\u003c/li\u003e\n\u003cli\u003eSi tout échoue, alors ajoutez simplement S et espérez que ça ira.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e(Je sais, il y a plein d\u0026rsquo;exceptions. \u003cem\u003eMan\u003c/em\u003e devient \u003cem\u003emen\u003c/em\u003e et \u003cem\u003ewoman\u003c/em\u003e devient \u003cem\u003ewomen\u003c/em\u003e, mais \u003cem\u003ehuman\u003c/em\u003e devient \u003cem\u003ehumans\u003c/em\u003e. \u003cem\u003eMouse\u003c/em\u003e devient \u003cem\u003emice\u003c/em\u003e and \u003cem\u003elouse\u003c/em\u003e devient \u003cem\u003elice\u003c/em\u003e, mais \u003cem\u003ehouse\u003c/em\u003e devient \u003cem\u003ehouses\u003c/em\u003e. \u003cem\u003eKnife\u003c/em\u003e devient \u003cem\u003eknives\u003c/em\u003e et \u003cem\u003ewife\u003c/em\u003e devient \u003cem\u003ewives\u003c/em\u003e, mais \u003cem\u003elowlife\u003c/em\u003e devient \u003cem\u003elowlifes\u003c/em\u003e. Et ne parlons même pas des mots qui sont leur propre pluriel comme \u003cem\u003esheep\u003c/em\u003e, \u003cem\u003edeer\u003c/em\u003e et \u003cem\u003ehaiku\u003c/em\u003e.)\u003c/p\u003e\n\u003cp\u003eBien évidemment, les autres langues sont complètement différentes.\u003c/p\u003e\n\u003cp\u003eDéveloppons une librairie Python qui forme automatiquement le pluriel des mots anglais. Nous commencerons seulement avec ces quatre règles, mais gardez à l\u0026rsquo;esprit que vous allez inévitablement en ajouter d\u0026rsquo;autres.\u003c/p\u003e\n\u003ch2 id=\"je-sais-utilisons-les-expression-régulières-\"\u003eJe sais, utilisons les expression régulières !\u003c/h2\u003e\n\u003cp\u003eDons vous recherchez des mots qui, au moins en anglais, signifie que vous recherchez des chaînes de caractères. Vous avez des règles qui disent que vous devez trouver différentes combinaisons de caractères, et leur faire différentes choses. Cela semble être un boulot pour les expressions régulières !\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplural\u003c/span\u003e(noun):          \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[sxz]$\u0026#39;\u003c/span\u003e, noun):             \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e, noun)        \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelif\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeioudgkprt]h$\u0026#39;\u003c/span\u003e, noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e, noun)       \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelif\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeiou]y$\u0026#39;\u003c/span\u003e, noun):      \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ies\u0026#39;\u003c/span\u003e, noun)     \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e noun \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) C\u0026rsquo;est une expression régulière, mais elle utilise une syntaxe que vous n\u0026rsquo;avez pas vu dans le chapitre \u003ca\u003e\u003cem\u003eExpressions Régulières\u003c/em\u003e\u003c/a\u003e. Les crochets signifient \u0026ldquo;correspond exactement à un de ces caractères\u0026rdquo;. Donc \u003ccode\u003e[sxz]\u003c/code\u003e signifie \u0026quot; \u003ccode\u003es\u003c/code\u003e, ou \u003ccode\u003ex\u003c/code\u003e, ou \u003ccode\u003ez\u003c/code\u003e \u0026ldquo;, mais seulement à un d\u0026rsquo;entre eux. Le \u003ccode\u003e$\u003c/code\u003e devrait être familier ; il correspond à la fin de chaîne. Combinés, cette expression régulière vérifie si \u003ccode\u003enoun\u003c/code\u003e se termine avec \u003ccode\u003es\u003c/code\u003e, \u003ccode\u003ex\u003c/code\u003e ou \u003ccode\u003ez\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) Cette fonction \u003ccode\u003ere.sub()\u003c/code\u003e exécute une substitution de chaînes par expression régulière.\u003c/p\u003e\n\u003cp\u003eRegardons les substitutions par expression régulière plus en détail.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[abc]\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Mark\u0026#39;\u003c/span\u003e)    \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e_sre\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eSRE_Match object at \u003cspan style=\"color:#f99b15\"\u003e0x001C1FA8\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[abc]\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;Mark\u0026#39;\u003c/span\u003e)  \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Mork\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[abc]\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;rock\u0026#39;\u003c/span\u003e)  \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;rook\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[abc]\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;o\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;caps\u0026#39;\u003c/span\u003e)  \u003cspan style=\"color:#776e71\"\u003e### (4)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;oops\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Est-ce que la chaîne \u003ccode\u003eMark\u003c/code\u003e contient \u003ccode\u003ea\u003c/code\u003e, \u003ccode\u003eb\u003c/code\u003e, ou \u003ccode\u003ec\u003c/code\u003e ? Oui, elle contient \u003ccode\u003ea\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) OK, maintenant trouvons \u003ccode\u003ea\u003c/code\u003e, \u003ccode\u003eb\u003c/code\u003e, ou \u003ccode\u003ec\u003c/code\u003e, et replaçons-le par \u003ccode\u003eo\u003c/code\u003e. \u003ccode\u003eMark\u003c/code\u003e devient \u003ccode\u003eMork\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(3) La même fonction transforme \u003ccode\u003erock\u003c/code\u003e en \u003ccode\u003erook\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(4) Vous devez penser que cela devrait transformer \u003ccode\u003ecaps\u003c/code\u003e en \u003ccode\u003eoaps\u003c/code\u003e, mais en fait non. \u003ccode\u003ere.sub\u003c/code\u003e remplace \u003cem\u003etoutes\u003c/em\u003e les correspondances, pas seulement la première. Donc cette expression régulière transforme \u003ccode\u003ecaps\u003c/code\u003e en \u003ccode\u003eoops\u003c/code\u003e, parce que le \u003ccode\u003ec\u003c/code\u003e et le \u003ccode\u003ea\u003c/code\u003e sont tous les deux transformés en \u003ccode\u003eo\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eEt maintenant, revenons à la fonction \u003ccode\u003eplural()\u003c/code\u003e…\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplural\u003c/span\u003e(noun):          \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[sxz]$\u0026#39;\u003c/span\u003e, noun):            \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e, noun)         \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelif\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeioudgkprt]h$\u0026#39;\u003c/span\u003e, noun):  \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e, noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelif\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeiou]y$\u0026#39;\u003c/span\u003e, noun):        \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ies\u0026#39;\u003c/span\u003e, noun)     \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eelse\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e noun \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Ici, vous remplacez la fin de chaîne (correspondant à \u003ccode\u003e$\u003c/code\u003e) par la chaîne \u003ccode\u003ees\u003c/code\u003e. En d\u0026rsquo;autres mots, cela ajoute \u003ccode\u003ees\u003c/code\u003e à la chaîne. Vous pouvez obtenir la même chose avec la concaténation de chaîne, par exemple \u003ccode\u003enoun + 'es'\u003c/code\u003e, mais j\u0026rsquo;ai choisi d\u0026rsquo;utiliser les expressions régulières pour chaque règle, pour des raisons qui deviendront plus claires plus loin dans ce chapitre.\u003c/p\u003e\n\u003cp\u003e(2) Regardez attentivement, c\u0026rsquo;est une autre nouvelle variation. Le \u003ccode\u003e^\u003c/code\u003e, en premier caractère entre crochets, signifie quelque chose de spécial : la négation. \u003ccode\u003e[^abc]\u003c/code\u003e signifie \u0026ldquo;n\u0026rsquo;importe quel caractère \u003cem\u003esauf\u003c/em\u003e \u003ccode\u003ea\u003c/code\u003e, \u003ccode\u003eb\u003c/code\u003e, ou \u003ccode\u003ec\u003c/code\u003e\u0026rdquo;. Donc \u003ccode\u003e[^aeioudgkprt]\u003c/code\u003e signifie n\u0026rsquo;importe quel caractère sauf \u003ccode\u003ea\u003c/code\u003e, \u003ccode\u003ee\u003c/code\u003e, \u003ccode\u003ei\u003c/code\u003e, \u003ccode\u003eo\u003c/code\u003e, \u003ccode\u003eu\u003c/code\u003e, \u003ccode\u003ed\u003c/code\u003e, \u003ccode\u003eg\u003c/code\u003e, \u003ccode\u003ek\u003c/code\u003e, \u003ccode\u003ep\u003c/code\u003e, \u003ccode\u003er\u003c/code\u003e, ou \u003ccode\u003et\u003c/code\u003e. Puis ce caractère doit être suivi par \u003ccode\u003eh\u003c/code\u003e, suivi par la fin de chaîne. Vous cherchez les mots qui finissent avec un H où le H est sonore.\u003c/p\u003e\n\u003cp\u003e(3) Même motif ici : trouver les mots qui se terminent par Y, où le caractère avant le Y n\u0026rsquo;est \u003cem\u003epas\u003c/em\u003e \u003ccode\u003ea\u003c/code\u003e, \u003ccode\u003ee\u003c/code\u003e, \u003ccode\u003ei\u003c/code\u003e, \u003ccode\u003eo\u003c/code\u003e, ou \u003ccode\u003eu\u003c/code\u003e. Vous cherchez les mots qui finissent avec un Y qui sonne comme un I.\u003c/p\u003e\n\u003cp\u003eRegardons la négation d\u0026rsquo;expression régulière plus en détail.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeiou]y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;vacancy\u0026#39;\u003c/span\u003e)  \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e_sre\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eSRE_Match object at \u003cspan style=\"color:#f99b15\"\u003e0x001C1FA8\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeiou]y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;boy\u0026#39;\u003c/span\u003e)      \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeiou]y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;day\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeiou]y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;pita\u0026#39;\u003c/span\u003e)     \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) \u003ccode\u003evacancy\u003c/code\u003e correspond à cette expression régulière, parce qu\u0026rsquo;il se termine en \u003ccode\u003ecy\u003c/code\u003e, et \u003ccode\u003ec\u003c/code\u003e n\u0026rsquo;est pas \u003ccode\u003ea\u003c/code\u003e, \u003ccode\u003ee\u003c/code\u003e, \u003ccode\u003ei\u003c/code\u003e, \u003ccode\u003eo\u003c/code\u003e, ou \u003ccode\u003eu\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) \u003ccode\u003eboy\u003c/code\u003e ne correspond pas, parce qu\u0026rsquo;il se termine en \u003ccode\u003eoy\u003c/code\u003e, et vous avez spécifiquement dit que le caractère avant le \u003ccode\u003ey\u003c/code\u003e ne peut pas être \u003ccode\u003eo\u003c/code\u003e. \u003ccode\u003eday\u003c/code\u003e ne correspond pas, parce qu\u0026rsquo;il se termine en \u003ccode\u003eay\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(3) \u003ccode\u003epita\u003c/code\u003e ne correspond pas, parce qu\u0026rsquo;il ne se termine pas en \u003ccode\u003ey\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ies\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;vacancy\u0026#39;\u003c/span\u003e)               \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;vacancies\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ies\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;agency\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;agencies\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;([^aeiou])y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003er\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\\1ies\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;vacancy\u0026#39;\u003c/span\u003e)  \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;vacancies\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Cette expression régulière transforme \u003ccode\u003evacancy\u003c/code\u003e en \u003ccode\u003evacancies\u003c/code\u003e et \u003ccode\u003eagency\u003c/code\u003e en \u003ccode\u003eagencies\u003c/code\u003e, ce qui est ce que vous voulez. Notez que cela transforme aussi \u003ccode\u003eboy\u003c/code\u003e en \u003ccode\u003eboies\u003c/code\u003e, mais cela n\u0026rsquo;arrivera jamais dans la fonction parce que vous avez fait cette recherche d\u0026rsquo;abord avec \u003ccode\u003ere.search\u003c/code\u003e pour savoir si vous devez la faire avec \u003ccode\u003ere.sub\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) Juste en passant, je voudrais pointer le fait qu\u0026rsquo;il est possible de combiner ces deux expressions régulières (une pour trouver si la règle s\u0026rsquo;applique, et une autre pour effectivement l\u0026rsquo;appliquer) en une unique expression régulière. Cela ressemblerait à ça. Cela doit sembler en grande partie familier : vous utilisez un groupe de capture, que vous avez appris dans l’\u003ca\u003eÉtude de Cas :  Analyser les Numéros de Téléphone\u003c/a\u003e. Le groupe est utilisé pour capturer le caractère avant la lettre \u003ccode\u003ey\u003c/code\u003e. Puis dans la chaîne de substitution, vous utilisez une nouvelle syntaxe, \u003ccode\u003e\\1\u003c/code\u003e, qui signifie « hé, tu te souviens de ce premier groupe ? met le ici. » Dans ce cas, vous capturez le \u003ccode\u003ec\u003c/code\u003e avant le \u003ccode\u003ey\u003c/code\u003e ; quand vous faite la substitution, vous substituez \u003ccode\u003ec\u003c/code\u003e à la place de \u003ccode\u003ec\u003c/code\u003e, et \u003ccode\u003eies\u003c/code\u003e à la place de \u003ccode\u003ey\u003c/code\u003e. (Si vous avez plus d\u0026rsquo;un groupe de capture, vous pouvez utiliser \u003ccode\u003e\\2\u003c/code\u003e et \u003ccode\u003e\\3\u003c/code\u003e et ainsi de suite.)\u003c/p\u003e\n\u003cp\u003eLes substitutions par expression régulière sont extrêmement puissantes, et la syntaxe \u003ccode\u003e\\1\u003c/code\u003e les rend encore plus puissante. Mais combiner toute l’opération en une seule expression régulière est aussi plus difficile à lire, et cela ne correspond pas directement à la façon dont vous décrivez les règles du pluriel. Vous avez initialement posé les règles comme \u0026ldquo;si le mot se termine en S, X, ou Z, alors ajouter ES\u0026rdquo;. Si vous regardez cette fonction, vous avez deux lignes de code qui disent \u0026ldquo;si le mot se termine en S, X, ou Z, alors ajouter ES\u0026rdquo;. Il n\u0026rsquo;est pas possible d\u0026rsquo;être plus direct.\u003c/p\u003e\n\u003ch2 id=\"une-liste-de-fonctions\"\u003eUne liste de fonctions\u003c/h2\u003e\n\u003cp\u003eMaintenant, vous allez ajouter un niveau d\u0026rsquo;abstraction. Vous avez commencé par définir une liste de règles : si ceci, faire cela, autrement aller à la prochaine règle. Compliquons temporairement une partie du programme, ainsi vous pourrez en simplifier une autre partie.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ematch_sxz\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[sxz]$\u0026#39;\u003c/span\u003e, noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eapply_sxz\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e, noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ematch_h\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeioudgkprt]h$\u0026#39;\u003c/span\u003e, noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eapply_h\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e, noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ematch_y\u003c/span\u003e(noun):                             \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeiou]y$\u0026#39;\u003c/span\u003e, noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eapply_y\u003c/span\u003e(noun):                             \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ies\u0026#39;\u003c/span\u003e, noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ematch_default\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eTrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eapply_default\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e noun \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erules \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e ((match_sxz, apply_sxz),               \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         (match_h, apply_h),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         (match_y, apply_y),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         (match_default, apply_default)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplural\u003c/span\u003e(noun):           \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e matches_rule, apply_rule \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e rules:     \u003cspan style=\"color:#776e71\"\u003e### (4)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e matches_rule(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_rule(noun)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Maintenant, chaque règle de correspondance est sa propre fonction qui retourne les résultats de l\u0026rsquo;appel de la fonction \u003ccode\u003ere.search()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) Chaque règle d\u0026rsquo;application est aussi sa propre fonction qui appelle la fonction \u003ccode\u003ere.sub()\u003c/code\u003e pour appliquer la règle de pluriel appropriée.\u003c/p\u003e\n\u003cp\u003e(3) Au lieu d\u0026rsquo;avoir une fonction (\u003ccode\u003eplural()\u003c/code\u003e) avec de multiple règles, vous avez la structure de données \u003ccode\u003erules\u003c/code\u003e qui  est une séquence de paires de fonctions.\u003c/p\u003e\n\u003cp\u003e(4) Puisque les règles ont été placées dans une structure de données séparée, la nouvelle fonction \u003ccode\u003eplural()\u003c/code\u003e peut être réduite à quelques lignes de code. En utilisant une boucle \u003ccode\u003efor\u003c/code\u003e, vous pouvez extraire les règles de correspondance et les règles d\u0026rsquo;application deux à la fois (une de correspondance et une d\u0026rsquo;application) de la structure \u003ccode\u003erules\u003c/code\u003e. À la première itération de la boucle \u003ccode\u003efor\u003c/code\u003e, \u003ccode\u003ematches_rule\u003c/code\u003e recevra \u003ccode\u003ematch_sxz\u003c/code\u003e, et \u003ccode\u003eapply_rule\u003c/code\u003e recevra \u003ccode\u003eapply_sxz\u003c/code\u003e. À la seconde itération (en présumant que vous arrivez jusque là), \u003ccode\u003ematches_rules\u003c/code\u003e sera assignée à \u003ccode\u003ematch_h\u003c/code\u003e, et \u003ccode\u003eapply_rule\u003c/code\u003e sera assignée à \u003ccode\u003eapply_h\u003c/code\u003e. La fonction est garantie de retourner quelque chose éventuellement, parce que la dernière règle (\u003ccode\u003ematch_default\u003c/code\u003e) retourne simplement \u003ccode\u003eTrue\u003c/code\u003e, cela signifie que la règle d\u0026rsquo;application correspondante (\u003ccode\u003eapply_default\u003c/code\u003e) sera toujours appliquée.\u003c/p\u003e\n\u003cp\u003eLa raison pour laquelle cette technique fonctionne est que \u003ca\u003etout en Python est un objet\u003c/a\u003e, y compris les fonctions. La structure de données \u003ccode\u003erules\u003c/code\u003e contient des fonctions — pas des noms de fonctions, mais de vrais objets fonction. Quand ils sont assignés dans la boucle \u003ccode\u003efor\u003c/code\u003e, alors \u003ccode\u003ematches_rule\u003c/code\u003e et \u003ccode\u003eapply_rule\u003c/code\u003e sont de vraies fonctions que vous pouvez appeler. À la première itération de la boucle \u003ccode\u003efor\u003c/code\u003e, c\u0026rsquo;est équivalent à appeler \u003ccode\u003ematches_sxz(noun)\u003c/code\u003e, et si elle retourne une correspondance, à appeler \u003ccode\u003eapply_sxz(noun)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eSi cet additionnel niveau d\u0026rsquo;abstraction prête à confusion, essayez de dérouler la fonction pour voir l’équivalence. La boucle \u003ccode\u003efor\u003c/code\u003e complète est équivalente à :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplural\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e match_sxz(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_sxz(noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e match_h(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_h(noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e match_y(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_y(noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e match_default(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_default(noun)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLe bénéfice ici est que la fonction \u003ccode\u003eplural()\u003c/code\u003e est maintenant simplifiée. Elle prend une séquence de règles, définies quelque part, et les itére d\u0026rsquo;une manière générique.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eTrouver une règle de correspondance.\u003c/li\u003e\n\u003cli\u003eUne correspondance ? Alors appeler la règle d\u0026rsquo;application et retourner le résultat.\u003c/li\u003e\n\u003cli\u003ePas de correspondance ? Aller a l’étape 1.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eLes règles peuvent être définies n\u0026rsquo;importe où, de n\u0026rsquo;importe quelle façon. La fonction \u003ccode\u003eplural()\u003c/code\u003e ne s\u0026rsquo;en préoccupe pas.\u003c/p\u003e\n\u003cp\u003eMaintenant, est-ce qu\u0026rsquo;ajouter ce niveau d\u0026rsquo;abstraction en valait la peine ? Et bien, pas encore. Considérez ce qu\u0026rsquo;il faudrait pour ajouter une nouvelle règle à la fonction. Dans le premier exemple, cela nécessiterait d\u0026rsquo;ajouter une instruction \u003ccode\u003eif\u003c/code\u003e à la fonction \u003ccode\u003eplural()\u003c/code\u003e. Dans le second exemple, cela nécessiterait d\u0026rsquo;ajouter deux fonctions, \u003ccode\u003ematch_foo()\u003c/code\u003e et \u003ccode\u003eapply_foo()\u003c/code\u003e, et puis mettre à jour la séquence \u003ccode\u003erules\u003c/code\u003e pour spécifier où dans la séquence les nouvelles fonctions de correspondance et d\u0026rsquo;application doivent être appelées par rapport aux autres règles.\u003c/p\u003e\n\u003cp\u003eMais ce n\u0026rsquo;est qu\u0026rsquo;une étape dans la prochaine section. Allons-y…\u003c/p\u003e\n\u003ch2 id=\"une-liste-de-motifs\"\u003eUne liste de motifs\u003c/h2\u003e\n\u003cp\u003eDéfinir des fonctions nommées séparées pour chaque règle de correspondance et d\u0026rsquo;application n\u0026rsquo;est pas vraiment nécessaire. Vous ne les appelez jamais directement ; vous les ajoutez à la séquence \u003ccode\u003erules\u003c/code\u003e et les appelez depuis-là. De plus, chaque fonction suit l’un des deux motifs. Toutes les fonctions de correspondances appelent \u003ccode\u003ere.search()\u003c/code\u003e et toutes les fonctions d\u0026rsquo;applications appelent \u003ccode\u003ere.sub()\u003c/code\u003e. Examinons les motifs afin de définir de nouvelles règles plus faciles :\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ebuild_match_and_apply_functions\u003c/span\u003e(pattern, search, replace):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ematches_rule\u003c/span\u003e(word):                                     \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(pattern, word)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eapply_rule\u003c/span\u003e(word):                                       \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(search, replace, word)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e (matches_rule, apply_rule)                           \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e est une fonction qui construit d\u0026rsquo;autres fonction de manière dynamique. Elle prend \u003ccode\u003epattern\u003c/code\u003e, \u003ccode\u003esearch\u003c/code\u003e et \u003ccode\u003ereplace\u003c/code\u003e, puis définit une fonction \u003ccode\u003ematches_rule()\u003c/code\u003e qui appelle \u003ccode\u003ere.search()\u003c/code\u003e avec le \u003ccode\u003epattern\u003c/code\u003e (motif) qui a été passé à la fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e, et (le mot) \u003ccode\u003eword\u003c/code\u003e qui a été passé à la fonction \u003ccode\u003ematches_rule()\u003c/code\u003e que vous construisez. Waouh.\u003c/p\u003e\n\u003cp\u003e(2) Construire la fonction d\u0026rsquo;application fonctionne de la même manière. La fonction d\u0026rsquo;application est une fonction qui prend un paramètre, et qui appelle \u003ccode\u003ere.sub()\u003c/code\u003e avec les paramètres \u003ccode\u003esearch\u003c/code\u003e et \u003ccode\u003ereplace\u003c/code\u003e qui ont été passés à la fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e, et (le mot) \u003ccode\u003eword\u003c/code\u003e qui a été passé à la fonction \u003ccode\u003eapply_rule()\u003c/code\u003e que vous construisez. Cette technique utilisant les valeurs de paramètres externes au sein d\u0026rsquo;une fonction dynamique est appelée \u003cem\u003eclosures\u003c/em\u003e. Vous définissez essentiellement des constantes au sein de la fonction d\u0026rsquo;application que vous construisez : elle prend un paramètre (\u003ccode\u003eword\u003c/code\u003e), mais elle le traite alors avec deux autres valeurs (\u003ccode\u003esearch\u003c/code\u003e et \u003ccode\u003ereplace\u003c/code\u003e) qui ont été paramétrées quand vous avez défini la fonction application.\u003c/p\u003e\n\u003cp\u003e(3) Finalement, la fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e retourne un tuple de deux valeurs : les deux fonctions que vous venez de créer. Les constantes que vous avez définies dans ces fonctions (\u003ccode\u003epattern\u003c/code\u003e dans la fonction \u003ccode\u003ematches_rule()\u003c/code\u003e, et \u003ccode\u003esearch\u003c/code\u003e dans la fonction \u003ccode\u003eapply_rule()\u003c/code\u003e) restent avec ces fonctions, même après que votre retour de \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e. C\u0026rsquo;est incroyablement cool.\u003c/p\u003e\n\u003cp\u003eSi cela prête vraiment à confusion (et cela devrait l\u0026rsquo;être, c\u0026rsquo;est bizarre), cela peut devenir plus clair en analysant comment l\u0026rsquo;utiliser.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003epatterns \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \\                                                        \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  (\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[sxz]$\u0026#39;\u003c/span\u003e,           \u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e,  \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;[^aeioudgkprt]h$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e,  \u003cspan style=\"color:#48b685\"\u003e\u0026#39;es\u0026#39;\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;(qu|[^aeiou])y$\u0026#39;\u003c/span\u003e,  \u003cspan style=\"color:#48b685\"\u003e\u0026#39;y$\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;ies\u0026#39;\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e,                \u003cspan style=\"color:#48b685\"\u003e\u0026#39;$\u0026#39;\u003c/span\u003e,  \u003cspan style=\"color:#48b685\"\u003e\u0026#39;s\u0026#39;\u003c/span\u003e)                                 \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  )\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erules \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e [build_match_and_apply_functions(pattern, search, replace)  \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e         \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e (pattern, search, replace) \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e patterns]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Nos \u0026ldquo;règles\u0026rdquo; du pluriel sont maintenant définies comme tuple de tuples de chaînes (non pas de fonctions). La première chaîne dans chaque groupe est le motif d\u0026rsquo;expression régulière que vous utiliseriez avec \u003ccode\u003ere.search()\u003c/code\u003e pour voir si la règle correspond. La deuxième et la troisième chaîne dans chaque groupe sont les expressions de recherche et de remplacement que vous utiliseriez avec \u003ccode\u003ere.sub()\u003c/code\u003e pour effectivement appliquer la règle afin de transformer un nom en son pluriel.\u003c/p\u003e\n\u003cp\u003e(2) Il y a un léger changement ici, dans la règle par défaut. Dans l\u0026rsquo;exemple précédent, la fonction \u003ccode\u003ematch_default()\u003c/code\u003e retournait simplement \u003ccode\u003eTrue\u003c/code\u003e, signifiant que si aucune des règles spécifiques ne correspond, le code ajouterait simplement un \u003ccode\u003es\u003c/code\u003e à la fin du mot donné. Cette exemple fait quelque chose de fonctionnellement équivalent. La dernière expression régulière demande si le mot a une fin (\u003ccode\u003e$\u003c/code\u003e correspond à la fin d\u0026rsquo;une chaîne). Bien sur, chaque chaîne a une fin, même une chaîne vide, donc cette expression correspond toujours. Ainsi, elle sert le même objectif que la fonction \u003ccode\u003ematches_default()\u003c/code\u003e qui retournait toujours \u003ccode\u003eTrue\u003c/code\u003e : elle assure que si aucune règle spécifique ne correspond, le code ajoute un \u003ccode\u003es\u003c/code\u003e à la fin du mot donné.\u003c/p\u003e\n\u003cp\u003e(3) Cette ligne est magique. Elle prend la séquence de chaînes dans \u003ccode\u003epatterns\u003c/code\u003e et les transforme en une séquence de fonctions. Comment ? En faisant correspondre les chaînes à la fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e. C\u0026rsquo;est-à-dire, elle prend chaque triplet de chaînes et appelle la fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e avec ces trois chaînes comme arguments. La fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e retourne un tuple de deux fonctions. Cela signifie que \u003ccode\u003erules\u003c/code\u003e est donc fonctionnellement équivalente à l\u0026rsquo;exemple précédent : une liste de tuples où chaque tuple est une paire de fonctions. La première fonction est la fonction de correspondance qui appelle \u003ccode\u003ere.search()\u003c/code\u003e, et la seconde fonction est la fonction d\u0026rsquo;application qui appelle \u003ccode\u003ere.sub()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eCette version du script est complétée par le point d’entrée principal, la fonction \u003ccode\u003eplural()\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplural\u003c/span\u003e(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e matches_rule, apply_rule \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e rules:  \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e matches_rule(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_rule(noun)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Puisque la liste \u003ccode\u003erules\u003c/code\u003e est la même que dans l\u0026rsquo;exemple précédent (c\u0026rsquo;est vraiment le cas), cela ne devrait pas être surprenant que la fonction \u003ccode\u003eplural()\u003c/code\u003e n\u0026rsquo;a pas changé du tout. Elle est complètement générique ; elle prend une liste de fonctions de règle et les appelle dans l\u0026rsquo;ordre. Elle ne se soucie pas de comment les règles sont définies. Dans l\u0026rsquo;exemple précédent, elles étaient définies comme des fonctions nommées séparées. Maintenant, elles sont construites dynamiquement en faisant correspondre la sortie de la fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e avec une liste brute de chaînes. Cela n\u0026rsquo;a aucune d\u0026rsquo;importance ; la fonction \u003ccode\u003eplural()\u003c/code\u003e fonctionne toujours de la même façon.\u003c/p\u003e\n\u003ch2 id=\"un-fichier-de-motifs\"\u003eUn fichier de motifs\u003c/h2\u003e\n\u003cp\u003eVous avez extrait tout le code dupliqué et ajoutez assez d\u0026rsquo;abstraction pour les que les règles du pluriel soient définies dans une liste de chaînes. La prochaine étape logique est de prendre ces chaînes et de les mettre dans un fichier séparé, où elles peuvent être maintenues séparément du code qui les utilise.\u003c/p\u003e\n\u003cp\u003eEn premier, créons un fichier texte qui contient les règles que vous voulez. Pas de structure de données sophistiquée, juste des chaînes délimitées par des espaces dans trois colonnes. Appelons-le \u003ccode\u003eplural4-rules.txt\u003c/code\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[sxz]$               $    es\n[^aeioudgkprt]h$     $    es\n[^aeiou]y$          y$    ies\n$                    $    s\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eMaintenant regardons comment nous pouvons utiliser ce fichier de règles.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ere\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ebuild_match_and_apply_functions\u003c/span\u003e(pattern, search, replace):     \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ematches_rule\u003c/span\u003e(word):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esearch(pattern, word)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eapply_rule\u003c/span\u003e(word):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e re\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esub(search, replace, word)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e (matches_rule, apply_rule)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erules \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e []\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e open(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;plural4-rules.txt\u0026#39;\u003c/span\u003e, encoding\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e pattern_file:  \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e line \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e pattern_file:                                      \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        pattern, search, replace \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e line\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e)             \u003cspan style=\"color:#776e71\"\u003e### (4)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        rules\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eappend(build_match_and_apply_functions(              \u003cspan style=\"color:#776e71\"\u003e### (5)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e                pattern, search, replace))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) La fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e n\u0026rsquo;a pas changé. Vous utilisez toujours des closures pour construire deux fonctions dynamiquement qui utilisent les variables définies dans la fonction externe.\u003c/p\u003e\n\u003cp\u003e(2) La fonction globale \u003ccode\u003eopen()\u003c/code\u003e ouvre un fichier et retourne un objet fichier. Dans ce cas, le fichier que nous ouvrons contient les motifs de chaînes pour mettre au pluriel des noms. L\u0026rsquo;instruction \u003ccode\u003ewith\u003c/code\u003e crée ce qui est appelé un \u003cem\u003econtexte\u003c/em\u003e : quand le bloc \u003ccode\u003ewith\u003c/code\u003e se termine, Python va automatiquement fermer le fichier, même si une exception se produit à l’intérieur du bloc \u003ccode\u003ewith\u003c/code\u003e. Vous en apprendrez plus à-propos des blocs \u003ccode\u003ewith\u003c/code\u003e et des objets fichier dans le chapitre \u003ca\u003eFichiers\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(3) L\u0026rsquo;idiome \u003ccode\u003efor line in \u0026lt;fileobject\u0026gt;\u003c/code\u003e lit les données depuis le fichier ouvert, une ligne à la fois, et assigne le texte à la variable \u003ccode\u003eline\u003c/code\u003e. Vous en apprendrez plus à-propos de la lecture de fichier dans le chapitre  \u003ca\u003eFichiers\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003e(4) Chaque ligne du fichier a en fait trois valeurs, mais elles sont séparées par des espaces blancs (tabulation ou espace, cela n\u0026rsquo;a pas d\u0026rsquo;importance). Pour les séparer, utilisez la méthode de chaîne \u003ccode\u003esplit()\u003c/code\u003e. Le premier argument de la méthode \u003ccode\u003esplit()\u003c/code\u003e est \u003ccode\u003eNone\u003c/code\u003e, ce qui signifie \u0026ldquo;découpe à chaque espace blanc (tabulation ou espace, cela n\u0026rsquo;a pas d\u0026rsquo;importance).\u0026rdquo; Le second argument est \u003ccode\u003e3\u003c/code\u003e, ce qui signifie \u0026ldquo;découpe sur les espaces blancs 3 fois, puis laisse en l’état le reste de la ligne.\u0026rdquo; Une ligne comme \u003ccode\u003e[sxz]$ $ es\u003c/code\u003e sera découpée en liste \u003ccode\u003e['[sxz]$', '$', 'es']\u003c/code\u003e, ce qui signifie que \u003ccode\u003epattern\u003c/code\u003e aura \u0026lsquo;\u003ccode\u003e[sxz]$\u003c/code\u003e\u0026rsquo;, \u003ccode\u003esearch\u003c/code\u003e aura \u0026lsquo;\u003ccode\u003e$\u003c/code\u003e\u0026rsquo;, et \u003ccode\u003ereplace\u003c/code\u003e aura \u0026lsquo;\u003ccode\u003ees\u003c/code\u003e\u0026rsquo;. C\u0026rsquo;est beaucoup de puissance dans une seule petite ligne de code.\u003c/p\u003e\n\u003cp\u003e(5) Finalement, vous passez \u003ccode\u003epattern\u003c/code\u003e, \u003ccode\u003esearch\u003c/code\u003e, et \u003ccode\u003ereplace\u003c/code\u003e à la fonction \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e, qui retourne un tuple de fonctions. Vous ajouter ce tuple à la liste \u003ccode\u003erules\u003c/code\u003e, et \u003ccode\u003erules\u003c/code\u003e finit par stocker la liste des fonctions de correspondance et d\u0026rsquo;application que la fonction \u003ccode\u003eplural()\u003c/code\u003e attend.\u003c/p\u003e\n\u003cp\u003eL’amélioration ici est que vous avez complètement séparé les règles du pluriel dans une fichier externe, ainsi il peut être maintenu séparément du code qui l\u0026rsquo;utilise. Le code avec le code, les données avec  les données, et tout va bien.\u003c/p\u003e\n\u003ch2 id=\"générateurs\"\u003eGénérateurs\u003c/h2\u003e\n\u003cp\u003eEst-ce que ce ne serait pas grandiose d\u0026rsquo;avoir une fonction générique \u003ccode\u003eplural()\u003c/code\u003e qui analyse le fichier de règles ? Récupère les règles, cherche une correspondance, applique la transformation appropriée, va à la règle suivante. C\u0026rsquo;est tout ce que la fonction \u003ccode\u003eplural()\u003c/code\u003e a à faire, et c\u0026rsquo;est tout ce que la fonction \u003ccode\u003eplural()\u003c/code\u003e devrait faire.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erules\u003c/span\u003e(rules_filename):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e open(rules_filename, encoding\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e pattern_file:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e line \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e pattern_file:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            pattern, search, replace \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e line\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003eyield\u003c/span\u003e build_match_and_apply_functions(pattern, search, replace)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplural\u003c/span\u003e(noun, rules_filename\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;plural5-rules.txt\u0026#39;\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e matches_rule, apply_rule \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e rules(rules_filename):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e matches_rule(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_rule(noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eraise\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eValueError\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;no matching rule for \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{0}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(noun))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eMais comment est-ce que \u003cem\u003eça\u003c/em\u003e fonctionne ? Regardons d\u0026rsquo;abord un premier exemple interactif.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003emake_counter\u003c/span\u003e(x):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e     print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;entering make_counter\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e     \u003cspan style=\"color:#815ba4\"\u003ewhile\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eTrue\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e         \u003cspan style=\"color:#815ba4\"\u003eyield\u003c/span\u003e x                    \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e         print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;incrementing x\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e         x \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e x \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e \n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e counter \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e make_counter(\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e)          \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e counter                            \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003egenerator object at \u003cspan style=\"color:#f99b15\"\u003e0x001C9C10\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(counter)                      \u003cspan style=\"color:#776e71\"\u003e### (4)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eentering make_counter\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(counter)                      \u003cspan style=\"color:#776e71\"\u003e### (5)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eincrementing x\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e next(counter)                      \u003cspan style=\"color:#776e71\"\u003e### (6)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eincrementing x\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) La présence du mot-clef \u003ccode\u003eyield\u003c/code\u003e dans \u003ccode\u003emake_counter\u003c/code\u003e signifie que ce n\u0026rsquo;est pas une fonction normale. C\u0026rsquo;est un type spécial de fonction qui génère des valeurs l\u0026rsquo;une après l\u0026rsquo;autre. Vous pouvez l\u0026rsquo;imaginez comme une fonction pouvant être interrompue et reprise. L\u0026rsquo;appeler retournera un \u003cem\u003egénérateur\u003c/em\u003e qui peut être utiliser pour générer des valeurs successives de \u003ccode\u003ex\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) Pour créer une instance du générateur \u003ccode\u003emake_counter\u003c/code\u003e, appelez-le juste comme une autre fonction. Notez qu\u0026rsquo;en fait cela n’exécute pas le code de la fonction. Vous pouvez le voir parce que la première ligne de la fonction \u003ccode\u003emake_counter\u003c/code\u003e appelle \u003ccode\u003eprint()\u003c/code\u003e, mais rien n\u0026rsquo;est encore affiché.\u003c/p\u003e\n\u003cp\u003e(3) La fonction \u003ccode\u003emake_counter\u003c/code\u003e retourne un objet générateur.\u003c/p\u003e\n\u003cp\u003e(4) La fonction \u003ccode\u003enext()\u003c/code\u003e prend un objet générateur et retourne sa prochaine valeur. La première fois que vous appelez \u003ccode\u003enext()\u003c/code\u003e avec le générateur \u003ccode\u003ecounter\u003c/code\u003e, elle exécute le code dans \u003ccode\u003emake_counter\u003c/code\u003e jusqu\u0026rsquo;à la première instruction \u003ccode\u003eyield\u003c/code\u003e, puis retourne la valeur qui a été générée. Dans ce cas, ce sera \u003ccode\u003e2\u003c/code\u003e, car vous avez initialement créé le générateur en appelant \u003ccode\u003emake_counter(2)\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(5) Appeler de façon répétitive \u003ccode\u003enext()\u003c/code\u003e avec le mème objet générateur reprend exactement là où il s\u0026rsquo;était arrêté et continue jusqu\u0026rsquo;à ce qu\u0026rsquo;il rencontre la prochaine instruction \u003ccode\u003eyield\u003c/code\u003e. Toutes les variables, état local, etc, sont sauvegardées à \u003ccode\u003eyield\u003c/code\u003e et rétablies à \u003ccode\u003enext()\u003c/code\u003e. La prochaine ligne de code attendant d’être exécutée appelle \u003ccode\u003eprint()\u003c/code\u003e, qui affiche \u003ccode\u003eincrementing x\u003c/code\u003e. Après cela, l\u0026rsquo;instruction \u003ccode\u003ex = x + 1\u003c/code\u003e. Puis elle boucle à nouveau au travers de la boucle \u003ccode\u003ewhile\u003c/code\u003e, et la première chose recontrée est l\u0026rsquo;instruction \u003ccode\u003eyield x\u003c/code\u003e, qui sauvegarde l’état de toute chose et retourne la valeur courante de \u003ccode\u003ex\u003c/code\u003e (maintenant \u003ccode\u003e3\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003e(6) La deuxième fois que vous appelez \u003ccode\u003enext()\u003c/code\u003e, vous faites à nouveau les même choses, mais cette fois \u003ccode\u003ex\u003c/code\u003e vaut \u003ccode\u003e4\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003ePuisque \u003ccode\u003emake_counter\u003c/code\u003e définit une boucle infinie, vous pouvez théoriquement faire cela pour toujours, et ça continuerait juste d’incrémenter \u003ccode\u003ex\u003c/code\u003e et de cracher des valeurs. Mais regardons plutôt des utilisations plus productives des générateurs.\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003e“yield” met en pause une fonction. “next()” la reprend où elle s’était interrompue.\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"un-générateur-fibonacci\"\u003eUn générateur Fibonacci\u003c/h3\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003efib\u003c/span\u003e(max):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    a, b \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e          \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ewhile\u003c/span\u003e a \u003cspan style=\"color:#5bc4bf\"\u003e\u0026lt;\u003c/span\u003e max:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eyield\u003c/span\u003e a          \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        a, b \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e b, a \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e b  \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) La séquence de Fibonacci est une séquence de nombres où chaque nombre est la somme des deux nombres qui le précèdent. Elle commence avec \u003ccode\u003e0\u003c/code\u003e et \u003ccode\u003e1\u003c/code\u003e, progresse doucement d\u0026rsquo;abord, puis de plus en plus rapidement. Pour commencer la séquence, vous avez besoin de deux variables : \u003ccode\u003ea\u003c/code\u003e commence à \u003ccode\u003e0\u003c/code\u003e, et \u003ccode\u003eb\u003c/code\u003e commence à \u003ccode\u003e1\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) Générons \u003ccode\u003ea\u003c/code\u003e qui est le nombre courant dans la séquence.\u003c/p\u003e\n\u003cp\u003e(3) Assignons \u003ccode\u003eb\u003c/code\u003e, qui est le prochain nombre dans la séquence, à \u003ccode\u003ea\u003c/code\u003e, mais calculons aussi la prochaine valeur \u003ccode\u003e(a + b)\u003c/code\u003e et assignons-la à \u003ccode\u003eb\u003c/code\u003e pour l\u0026rsquo;utiliser plus tard. Notez que cela se produit en parallèle ; si \u003ccode\u003ea\u003c/code\u003e vaut \u003ccode\u003e3\u003c/code\u003e et \u003ccode\u003eb\u003c/code\u003e vaut \u003ccode\u003e5\u003c/code\u003e, alors \u003ccode\u003ea, b = b, a + b\u003c/code\u003e paramètrera \u003ccode\u003e5\u003c/code\u003e à \u003ccode\u003ea\u003c/code\u003e (la précédente valeur de \u003ccode\u003eb\u003c/code\u003e) et \u003ccode\u003e8\u003c/code\u003e à \u003ccode\u003eb\u003c/code\u003e (la somme des précédentes valeurs de \u003ccode\u003ea\u003c/code\u003e et \u003ccode\u003eb\u003c/code\u003e).\u003c/p\u003e\n\u003cp\u003eDonc vous avez une fonction qui restitue les nombres Fibonacci successifs. Bien sur, vous pouvez faire cela avec la récursion, mais cette manière est plus facile à lire. De même, cela fonctionne bien avec les boucles \u003ccode\u003efor\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003efrom\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003efibonacci\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e fib\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e n \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e fib(\u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e):      \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003e…\u003c/span\u003e     print(n, end\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39; \u0026#39;\u003c/span\u003e)    \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e21\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e34\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e55\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e89\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e144\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e233\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e377\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e610\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e987\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e\u0026gt;\u0026gt;\u0026gt;\u003c/span\u003e list(fib(\u003cspan style=\"color:#f99b15\"\u003e1000\u003c/span\u003e))          \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e[\u003cspan style=\"color:#f99b15\"\u003e0\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e8\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e13\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e21\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e34\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e55\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e89\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e144\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e233\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e377\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e610\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e987\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Vous pouvez utiliser un générateur tel que \u003ccode\u003efib()\u003c/code\u003e directement dans la boucle \u003ccode\u003efor\u003c/code\u003e. La boucle \u003ccode\u003efor\u003c/code\u003e appellera automatiquement la fonction \u003ccode\u003enext()\u003c/code\u003e, récupèrera les valeurs du générateur  \u003ccode\u003efib()\u003c/code\u003e et les assignera à la variable d\u0026rsquo;index (\u003ccode\u003en\u003c/code\u003e) de la boucle \u003ccode\u003efor\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003e(2) A chaque passage dans la boucle \u003ccode\u003efor\u003c/code\u003e, \u003ccode\u003en\u003c/code\u003e reçoit une nouvelle valeur de l\u0026rsquo;instruction \u003ccode\u003eyield\u003c/code\u003e dans \u003ccode\u003efib()\u003c/code\u003e,  tout ce que vous avez à faire est de l\u0026rsquo;afficher. Une fois que \u003ccode\u003efib()\u003c/code\u003e est à court de nombres (\u003ccode\u003ea\u003c/code\u003e devient plus grand que \u003ccode\u003emax\u003c/code\u003e, qui dans ce cas vaut \u003ccode\u003e1000\u003c/code\u003e), alors la boucle \u003ccode\u003efor\u003c/code\u003e se termine normalement.\u003c/p\u003e\n\u003cp\u003e(3) C\u0026rsquo;est un idiome utile : passez un générateur à la fonction \u003ccode\u003elist()\u003c/code\u003e, et il itérera le générateur tout entier (exactement comme la boucle \u003ccode\u003efor\u003c/code\u003e de l\u0026rsquo;exemple précédent) et retournera une liste de toutes les valeurs.\u003c/p\u003e\n\u003ch3 id=\"un-générateur-de-règles-du-pluriel\"\u003eUn générateur de règles du pluriel\u003c/h3\u003e\n\u003cp\u003eRetournons à \u003ccode\u003eplural5.py\u003c/code\u003e et voyons comment cette version de \u003ccode\u003eplural()\u003c/code\u003e fonctionne.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003erules\u003c/span\u003e(rules_filename):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003ewith\u003c/span\u003e open(rules_filename, encoding\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;utf-8\u0026#39;\u003c/span\u003e) \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e pattern_file:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e line \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e pattern_file:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            pattern, search, replace \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e line\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003esplit(\u003cspan style=\"color:#815ba4\"\u003eNone\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e)                   \u003cspan style=\"color:#776e71\"\u003e### (1)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003eyield\u003c/span\u003e build_match_and_apply_functions(pattern, search, replace)  \u003cspan style=\"color:#776e71\"\u003e### (2)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003eplural\u003c/span\u003e(noun, rules_filename\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;plural5-rules.txt\u0026#39;\u003c/span\u003e):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e matches_rule, apply_rule \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e rules(rules_filename):                   \u003cspan style=\"color:#776e71\"\u003e### (3)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003eif\u003c/span\u003e matches_rule(noun):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e apply_rule(noun)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003eraise\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eValueError\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;no matching rule for \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{0}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(noun))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e(1) Ici, pas de magie. Souvenez-vous que les lignes du fichier de règles ont trois valeurs séparées par des espaces, donc vous utilisez \u003ccode\u003eline.split(None, 3)\u003c/code\u003e pour récupérer les trois \u0026ldquo;colonnes\u0026rdquo; et les assigner à trois variables locales.\u003c/p\u003e\n\u003cp\u003e(2) \u003cem\u003eEt puis vous générez\u003c/em\u003e. Qu\u0026rsquo;est-ce que vous générez ? Deux fonctions, construites dynamiquement avec notre vieille amie, \u003ccode\u003ebuild_match_and_apply_functions()\u003c/code\u003e, qui est identique à celle des exemples précédents. En d\u0026rsquo;autres mots, \u003ccode\u003erules()\u003c/code\u003e est un générateur qui crache des fonctions de correspondance et d\u0026rsquo;application \u003cem\u003eà la demande\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003e(3) Puisque \u003ccode\u003erules()\u003c/code\u003e est un générateur, vous pouvez l\u0026rsquo;utiliser directement dans une boucle \u003ccode\u003efor\u003c/code\u003e. Au premier passage dans la boucle \u003ccode\u003efor\u003c/code\u003e, vous appellerez la fonction \u003ccode\u003erules()\u003c/code\u003e, qui ouvrira le fichier de motifs, lira la première ligne, construira dynamiquement une fonction de correspondance et une fonction d\u0026rsquo;application à partir des motifs de cette ligne, et générera les fonctions construites dynamiquement. Au second passage dans la boucle \u003ccode\u003efor\u003c/code\u003e, vous reprendrez exactement là où vous avez laissé \u003ccode\u003erules()\u003c/code\u003e (qui était au milieu de la boucle \u003ccode\u003efor line in pattern_file\u003c/code\u003e). La première chose qu\u0026rsquo;elle fera sera de lire la ligne suivante du fichier (qui est toujours ouvert), de construire dynamiquement une autre fonction de correspondance et une autre fonction d\u0026rsquo;application sur la base des motifs de cette ligne, et générera les deux fonctions.\u003c/p\u003e\n\u003cp\u003eQu\u0026rsquo;avez-vous gagné par rapport à l’étape 4 ? Le temps de démarrage. À l’étape 4, quand vous importez le module \u003ccode\u003eplural4\u003c/code\u003e, il lit tout le fichier de motifs et construit une liste de toutes les règles possibles, avant mème que ne vous pensiez à appeler la fonction \u003ccode\u003eplural()\u003c/code\u003e. Avec les générateurs, vous pouvez tout faire de façon paresseuse : vous lisez la première règle et créez les fonctions puis les testez, et si ça fonctionne vous ne lisez même pas le reste du fichier ou créez d\u0026rsquo;autres fonctions.\u003c/p\u003e\n\u003cp\u003eQu\u0026rsquo;avez-vous perdu ? De la performance ! Chaque fois que vous appelez la fonction \u003ccode\u003eplural()\u003c/code\u003e, le générateur \u003ccode\u003erules\u003c/code\u003e recommence depuis le début — ce qui signifie ouvrir à nouveau le fichier de motifs et le lire depuis le début, une ligne à la fois.\u003c/p\u003e\n\u003cp\u003eEt si vous pouviez avoir le meilleur des deux mondes : temps de démarrage minimal (ne pas exécuter de code à \u003ccode\u003eimport\u003c/code\u003e), \u003cem\u003eet\u003c/em\u003e performance maximale (ne pas construire les même fonctions encore et encore). Oh, et vous voulez toujours garder les règles dans un fichier séparé (parce que le code avec le code et les données avec les données), tant que vous n\u0026rsquo;avez jamais besoin de lire deux fois la même ligne.\u003c/p\u003e\n\u003cp\u003ePour faire cela, vous allez devoir construire votre propre itérateur. Mais avant que vous fassiez \u003cem\u003ecela\u003c/em\u003e, vous devez apprendre les classes Python.\u003c/p\u003e\n\u003ch2 id=\"pour-aller-plus-loin-en-anglais\"\u003ePour aller plus loin (en anglais)\u003c/h2\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://www.python.org/dev/peps/pep-0255/\" rel=\"external\"\u003ePEP 255: Simple Generators\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://effbot.org/zone/python-with-statement.htm\" rel=\"external\"\u003eUnderstanding Python’s “with” statement\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"http://ynniv.com/blog/2007/08/closures-in-python.html\" rel=\"external\"\u003eClosures in Python\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://en.wikipedia.org/wiki/Fibonacci_number\" rel=\"external\"\u003eFibonacci numbers\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n",
            "summary": "Relecture du chapitre 6 - Dive into Python pour la communauté DVP",
            "tags": ["Traduction", "Python"],
            "date_published": "2019-05-20T11:00:01+01:00",
            "date_modified": "2019-05-26T18:15:01+01:00"
        },{
            "id": "urn:uuid:aacef81b-80fa-a2ee-cf08-b082898b5159",
            "url": "http://doc.huc.fr.eu.org/fr/trad/developpez.net/pymotw3-structures-de-donnees/",
            "title": "Python 3 Module of the Week - Chap 2 : Data Structures ",
            "author": { "name": "Stéphane HUC" },
            "content_text": "Structures de Données Python inclut de nombreuses normes de programmation des structures de données, telles que list, tuple, dict, et set, dans le cadre de ses types natifs. Beaucoup d\u0026rsquo;application ne requièrent pas d\u0026rsquo;autres structures, mais quand elles le font, la bibliothèque standard fournit des versions puissantes et bien testées, prêtes à être utilisées.\nLe module enum fournit une implémentation du type enumeration qui a des capacités d\u0026rsquo;itération et de comparaison. Il peut être utilisé pour créer des symboles bien définis pour les valeurs, à la place des chaînes ou entiers littéraux.\nLe module collections inclus les implémentations de nombreuses structures de données qui étendent celles trouvées dans d\u0026rsquo;autres modules. Par exemple, Deque est une file d\u0026rsquo;attente double, qui permet l\u0026rsquo;addition ou la suppression d\u0026rsquo;éléments à chaque extrémité. defaultdict est un dictionnaire qui répond avec une valeur par défaut si une clé est manquante, alors que OrderedDict se souvient de la séquence dans laquelle les éléments sont ajoutés. namedtuple étend le tuple normal pour donner à chaque item membre un nom d\u0026rsquo;attribut en supplément de l\u0026rsquo;index numérique.\nPour de grandes quantités de données, un array peut utiliser plus efficacement la mémoire qu\u0026rsquo;une liste. Puisqu\u0026rsquo;un array est limité à un simple type de donnée, il peut utiliser une représentation de mémoire plus compacte qu\u0026rsquo;une list à usage général. En même temps, les instances array peuvent être manipulées en utilisant beaucoup des mêmes méthodes qu\u0026rsquo;une list, ainsi il peut être possible de remplacer une list avec un array sans faire beaucoup de changements.\nLe tri d\u0026rsquo;items dans une séquence est un aspect fondamental de la manipulation de données. La list de Python inclus une méthode sort(), mais parfois il est plus efficient de maintenir une liste dans un ordre trié, sans la trier à nouveau, à chaque fois que son contenu a changé.\nLes fonctions dans heapq modifient le contenu d\u0026rsquo;une liste tout en préservant l\u0026rsquo;ordre trié de la liste avec une faible surcharge.\nUne autre option pour construire des listes triés ou des tableaux est bisect. Il utilise une recherche binaire pour trouver le point d\u0026rsquo;insertion des nouveaux items, et est une alternative au tri répété d\u0026rsquo;une liste qui change fréquemment.\nBien que la list native peut simuler une queue, en utilisant les méthodes insert() et pop(), ceci n\u0026rsquo;est pas sûr. Pour avoir de vraies communications ordonnées entre les threads, utilisez le module queue. multiprocessing inclus une version de Queue qui fonctionne entre processus, rendant plus facile la conversion d\u0026rsquo;un programme multithread pour utiliser des processus à la place.\nstruct est utile pour décoder les données d\u0026rsquo;une autre application, qui viennent peut être d\u0026rsquo;un fichier binaire ou d\u0026rsquo;un flux de données, dans les types natifs de Python pour une manipulation plus facile.\nCe chapitre couvre deux modules relatifs à la gestion de la mémoire. Pour des structures de données hautement interconnectées, telles que des graphiques et des arbres, utilisez weakref pour maintenir des références tout en permettant que le récupérateur de mémoire nettoie les objets après qu\u0026rsquo;ils ne soient plus nécessaires. Utilisez les fonctions dans copy pour dupliquer des structures de données et leurs contenus, incluant les copies récursives avec deepcopy().\nDéboguer des structures de données peut consommer du temps, spécialement lorsque vous parcourez les sorties imprimées de grandes séquences ou de dictionnaires. Utilisez pprint pour créer des représentations faciles à lire qui peuvent être imprimées dans la console ou écrites dans un fichier journal pour déboguer facilement.\nEnfin, si les types disponibles ne répondent pas aux exigences, sous-classez l\u0026rsquo;un des types natifs et personnalisez-le, ou créez un nouveau type de conteneur en utilisant l\u0026rsquo;une des classes de base abstraites définies dans les collections en tant que base de départ.\nenum - Type d\u0026rsquo;Énumération collections - Types de Données de Conteneur array - Séquence de Données de Type Fixé heapq - Algorithme de Tri Heap bisect - Maintenir les Listes dans un Ordre Trié queue - Implémentation FIFO Thread-Safe struct - Structures de Données Binaires weakref - Références Impermanentes aux Objets copy - Objets Dupliqués pprint - Structures de Données Pretty-Print enum - Type d\u0026rsquo;Énumération Le module enum définit un type d\u0026rsquo;énumération avec des capacités d\u0026rsquo;itération et de comparaison. Il peut être utilisé pour créer des symboles bien définis pour des valeurs, à la place des chaînes ou entiers littéraux.\nCréer des Énumérations Une nouvelle énumération est définie par l\u0026rsquo;utilisation de la syntaxe class en sous-classant Enum et en ajoutant des attributs de classe décrivant les valeurs.\n# enum_create.py import enum class BugStatus(enum.Enum): new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 print(\u0026#39;\\nMember name: {}\u0026#39;.format(BugStatus.wont_fix.name)) print(\u0026#39;Member value: {}\u0026#39;.format(BugStatus.wont_fix.value)) Les membres de Enum sont convertis en instances à mesure que la classe est analysée. Chaque instance a une propriété name correspondant au nom de membre et une propriété value correspondante à la valeur assignée au nom dans la définition de classe.\n$ python3 enum_create.py Member name: wont_fix Member value: 4 Itération Itérer sur l\u0026rsquo;énumération class produit des membres individuels d\u0026rsquo;énumération.\n# enum_iterate.py import enum class BugStatus(enum.Enum): new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 for status in BugStatus: print(\u0026#39;{:15} = {}\u0026#39;.format(status.name, status.value)) Les membres sont produits dans l\u0026rsquo;ordre dans lequel ils sont déclarés dans la définition de classe.\n$ python3 enum_iterate.py new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 Comparer les Énumérations Parce que les membres d\u0026rsquo;énumération ne sont pas ordonnés, ils supportent la comparaison seulement par identité et égalité.\n# enum_comparison.py import enum class BugStatus(enum.Enum): new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 actual_state = BugStatus.wont_fix desired_state = BugStatus.fix_released print(\u0026#39;Equality:\u0026#39;, actual_state == desired_state, actual_state == BugStatus.wont_fix) print(\u0026#39;Identity:\u0026#39;, actual_state is desired_state, actual_state is BugStatus.wont_fix) print(\u0026#39;Ordered by value:\u0026#39;) try: print(\u0026#39;\\n\u0026#39;.join(\u0026#39; \u0026#39; + s.name for s in sorted(BugStatus))) except TypeError as err: print(\u0026#39; Cannot sort: {}\u0026#39;.format(err)) Les opérateurs de comparaison plus-grand-que et plus-petit-que soulèvent des erreurs d\u0026rsquo;exceptions TypeErrors.\n$ python3 enum_comparison.py Equality: False True Identity: False True Ordered by value: Cannot sort: \u0026#39;\u0026lt;\u0026#39; not supported between instances of \u0026#39;BugStatus \u0026#39; and \u0026#39;BugStatus\u0026#39; Utilisez la classe IntEnum pour les énumérations dans laquelle les membres doivent se comporter comme des nombres - par exemple, pour supporter les comparaisons.\n# enum_intenum.py import enum class BugStatus(enum.IntEnum): new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 print(\u0026#39;Ordered by value:\u0026#39;) print(\u0026#39;\\n\u0026#39;.join(\u0026#39; \u0026#39; + s.name for s in sorted(BugStatus))) $ python3 enum_intenum.py Ordered by value: fix_released fix_committed in_progress wont_fix invalid incomplete new Valeurs d\u0026rsquo;Énumération Uniques Les membres d\u0026rsquo;énumération avec les mêmes valeurs sont suivis comme des références d\u0026rsquo;alias du même objet membre. Les alias n\u0026rsquo;entraînent pas la présence de valeurs répétées dans l\u0026rsquo;itérateur pour Enum.\n# enum_aliases.py import enum class BugStatus(enum.Enum): new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 by_design = 4 closed = 1 for status in BugStatus: print(\u0026#39;{:15} = {}\u0026#39;.format(status.name, status.value)) print(\u0026#39;\\nSame: by_design is wont_fix: \u0026#39;, BugStatus.by_design is BugStatus.wont_fix) print(\u0026#39;Same: closed is fix_released: \u0026#39;, BugStatus.closed is BugStatus.fix_released) Parce que by_design et closed sont des alias pour d\u0026rsquo;autres membres, ils n\u0026rsquo;apparaissent pas séparément dans la sortie lors de l\u0026rsquo;itération de Enum. Le nom canonique pour un membre est le premier nom attaché à la valeur.\n$ python3 enum_aliases.py new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 Same: by_design is wont_fix: True Same: closed is fix_released: True Pour que tous les membres aient des valeurs uniques, ajoutez le décorateur @unique à Enum.\n# enum_unique_enforce.py import enum @enum.unique class BugStatus(enum.Enum): new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 # This will trigger an error with unique applied. by_design = 4 closed = 1 Les membres qui ont des valeurs répétées déclenchent une erreur d\u0026rsquo;exception ValueError quand la classe Enum est interprétée.\n$ python3 enum_unique_enforce.py Traceback (most recent call last): File \u0026#34;enum_unique_enforce.py\u0026#34;, line 11, in \u0026lt;module\u0026gt; class BugStatus(enum.Enum): File \u0026#34;.../lib/python3.7/enum.py\u0026#34;, line 848, in unique (enumeration, alias_details)) ValueError: duplicate values found in \u0026lt;enum \u0026#39;BugStatus\u0026#39;\u0026gt;: by_design -\u0026gt; wont_fix, closed -\u0026gt; fix_released Création d\u0026rsquo;Énumérations par Programme Dans certains cas, il est plus pratique de créer des énumérations par programme, plutôt que les coder en dur dans une définition de classe. Pour ces situations, Enum prend aussi en charge le fait de passer les noms des membres et les valeurs au constructeur de classe.\n# enum_programmatic_create.py import enum BugStatus = enum.Enum( value=\u0026#39;BugStatus\u0026#39;, names=(\u0026#39;fix_released fix_committed in_progress \u0026#39; \u0026#39;wont_fix invalid incomplete new\u0026#39;), ) print(\u0026#39;Member: {}\u0026#39;.format(BugStatus.new)) print(\u0026#39;\\nAll members:\u0026#39;) for status in BugStatus: print(\u0026#39;{:15} = {}\u0026#39;.format(status.name, status.value)) L\u0026rsquo;argument value est le nom de l\u0026rsquo;énumération, qui est utilisée pour construire la représentation des membres. L\u0026rsquo;argument names liste les membres de l\u0026rsquo;énumération. Quand une chaîne unique est passée, elle est divisée en espaces et en virgules, et les jetons résultants sont utilisés comme noms pour les membres, auxquels sont automatiquement attribuées des valeurs commençant par 1.\n$ python3 enum_programmatic_create.py Member: BugStatus.new All members: fix_released = 1 fix_committed = 2 in_progress = 3 wont_fix = 4 invalid = 5 incomplete = 6 new = 7 Pour plus de contrôles sur les valeurs associées aux membres, la chaîne names peut être remplacée par une séquence de deux tuples ou un dictionnaire faisant correspondre des noms aux valeurs.\n# enum_programmatic_mapping.py import enum BugStatus = enum.Enum( value=\u0026#39;BugStatus\u0026#39;, names=[ (\u0026#39;new\u0026#39;, 7), (\u0026#39;incomplete\u0026#39;, 6), (\u0026#39;invalid\u0026#39;, 5), (\u0026#39;wont_fix\u0026#39;, 4), (\u0026#39;in_progress\u0026#39;, 3), (\u0026#39;fix_committed\u0026#39;, 2), (\u0026#39;fix_released\u0026#39;, 1), ], ) print(\u0026#39;All members:\u0026#39;) for status in BugStatus: print(\u0026#39;{:15} = {}\u0026#39;.format(status.name, status.value)) Dans cet exemple, une liste de deux tuples est donnée au lieu d\u0026rsquo;une chaîne unique contenant seulement les noms des membres. Cela permet de reconstruire l\u0026rsquo;énumération BugStatus avec les membres dans le même ordre que la version définie dans enum_create.py.\n$ python3 enum_programmatic_mapping.py All members: new = 7 incomplete = 6 invalid = 5 wont_fix = 4 in_progress = 3 fix_committed = 2 fix_released = 1 Valeurs des Membres Non Entiers Les valeurs des membres d\u0026rsquo;énumération ne sont pas restreints aux entiers. En fait, tout type d\u0026rsquo;objet peut être associé avec un membre. Si la valeur est un tuple, les membres sont passés en tant qu\u0026rsquo;argument individuel à __init__().\n# enum_tuple_values.py import enum class BugStatus(enum.Enum): new = (7, [\u0026#39;incomplete\u0026#39;, \u0026#39;invalid\u0026#39;, \u0026#39;wont_fix\u0026#39;, \u0026#39;in_progress\u0026#39;]) incomplete = (6, [\u0026#39;new\u0026#39;, \u0026#39;wont_fix\u0026#39;]) invalid = (5, [\u0026#39;new\u0026#39;]) wont_fix = (4, [\u0026#39;new\u0026#39;]) in_progress = (3, [\u0026#39;new\u0026#39;, \u0026#39;fix_committed\u0026#39;]) fix_committed = (2, [\u0026#39;in_progress\u0026#39;, \u0026#39;fix_released\u0026#39;]) fix_released = (1, [\u0026#39;new\u0026#39;]) def __init__(self, num, transitions): self.num = num self.transitions = transitions def can_transition(self, new_state): return new_state.name in self.transitions print(\u0026#39;Name:\u0026#39;, BugStatus.in_progress) print(\u0026#39;Value:\u0026#39;, BugStatus.in_progress.value) print(\u0026#39;Custom attribute:\u0026#39;, BugStatus.in_progress.transitions) print(\u0026#39;Using attribute:\u0026#39;, BugStatus.in_progress.can_transition(BugStatus.new)) Dans cet exemple, chaque valeur de membre est un tuple contenant l\u0026rsquo;ID numérique (qui peut être enregistré dans une base de données) et une liste de transitions valide, sortant de l\u0026rsquo;état actuel.\n$ python3 enum_tuple_values.py Name: BugStatus.in_progress Value: (3, [\u0026#39;new\u0026#39;, \u0026#39;fix_committed\u0026#39;]) Custom attribute: [\u0026#39;new\u0026#39;, \u0026#39;fix_committed\u0026#39;] Using attribute: True Pour les cas les plus complexes, les tuples peuvent devenir difficiles à manier. Puisque les valeurs des membres peuvent être n\u0026rsquo;importe quel type d\u0026rsquo;objet, les dictionnaires peuvent être utilisés pour les cas où il y a beaucoup d\u0026rsquo;attributs distincts à suivre pour chaque valeur d\u0026rsquo;énumération. Les valeurs complexes sont directement transmises à __init __ () en tant que seul argument autre que self.\n# enum_complex_values.py import enum class BugStatus(enum.Enum): new = { \u0026#39;num\u0026#39;: 7, \u0026#39;transitions\u0026#39;: [ \u0026#39;incomplete\u0026#39;, \u0026#39;invalid\u0026#39;, \u0026#39;wont_fix\u0026#39;, \u0026#39;in_progress\u0026#39;, ], } incomplete = { \u0026#39;num\u0026#39;: 6, \u0026#39;transitions\u0026#39;: [\u0026#39;new\u0026#39;, \u0026#39;wont_fix\u0026#39;], } invalid = { \u0026#39;num\u0026#39;: 5, \u0026#39;transitions\u0026#39;: [\u0026#39;new\u0026#39;], } wont_fix = { \u0026#39;num\u0026#39;: 4, \u0026#39;transitions\u0026#39;: [\u0026#39;new\u0026#39;], } in_progress = { \u0026#39;num\u0026#39;: 3, \u0026#39;transitions\u0026#39;: [\u0026#39;new\u0026#39;, \u0026#39;fix_committed\u0026#39;], } fix_committed = { \u0026#39;num\u0026#39;: 2, \u0026#39;transitions\u0026#39;: [\u0026#39;in_progress\u0026#39;, \u0026#39;fix_released\u0026#39;], } fix_released = { \u0026#39;num\u0026#39;: 1, \u0026#39;transitions\u0026#39;: [\u0026#39;new\u0026#39;], } def __init__(self, vals): self.num = vals[\u0026#39;num\u0026#39;] self.transitions = vals[\u0026#39;transitions\u0026#39;] def can_transition(self, new_state): return new_state.name in self.transitions print(\u0026#39;Name:\u0026#39;, BugStatus.in_progress) print(\u0026#39;Value:\u0026#39;, BugStatus.in_progress.value) print(\u0026#39;Custom attribute:\u0026#39;, BugStatus.in_progress.transitions) print(\u0026#39;Using attribute:\u0026#39;, BugStatus.in_progress.can_transition(BugStatus.new)) Cet exemple exprime les mêmes données que l\u0026rsquo;exemple précédent, utilisant des dictionnaires plutôt que des tuples.\n$ python3 enum_complex_values.py Name: BugStatus.in_progress Value: {\u0026#39;num\u0026#39;: 3, \u0026#39;transitions\u0026#39;: [\u0026#39;new\u0026#39;, \u0026#39;fix_committed\u0026#39;]} Custom attribute: [\u0026#39;new\u0026#39;, \u0026#39;fix_committed\u0026#39;] Using attribute: True Lire aussi Documentation standard de la bibliothèque pour enum PEP 435 - Ajouter un type Enum à la bibliothèque standard Python flufl.enum – L\u0026rsquo;inspiration originelle d\u0026rsquo;enum, par by Barry Warsaw. collections - Types de Données de Conteneur But : Types de données de conteneur.\nLe module collections inclus les types de données de conteneur au-delà des types natifs list, dict et tuple.\nChainMap - Recherche dans plusieurs dictionnaires Counter - Compter les objets hachables defaultdict - Retourner une valeur par défaut aux clés manquantes deque - File d\u0026rsquo;attente double namedtuple - Sous-classe de tuple avec champs nommés OrderedDict - Se souvenir de l\u0026rsquo;ordre des clés ajoutées à un dictionnaire collections.abc - Classes de base abstraites pour les conteneurs Lire aussi Documentation standard de la bibliothèque pour collections Notes de portage de Python 2 à 3 pour les collections PEP 342 - Coroutines via Générateurs Améliorés PEP 492 - Coroutines avec syntaxe async et await ChainMap - Recherche dans plusieurs dictionnaires La classe ChainMap gère une séquence de dictionnaires, et recherche au-travers, dans l\u0026rsquo;ordre où ils sont donnés, pour trouver les valeurs associées aux clés. Une ChainMap constitue un bon conteneur \u0026ldquo;contextuel\u0026rdquo;, car il peut être traité comme une pile pour laquelle des modifications sont apportées à mesure que la pile grandit, ces modifications étant à nouveau ignorées à mesure que la pile se réduit.\nAccéder à des valeurs La ChainMap supporte la même API qu\u0026rsquo;une dictionnaire classique pour accéder aux valeurs existantes.\n# collections_chainmap_read.py import collections a = {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;} b = {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;} m = collections.ChainMap(a, b) print(\u0026#39;Individual Values\u0026#39;) print(\u0026#39;a = {}\u0026#39;.format(m[\u0026#39;a\u0026#39;])) print(\u0026#39;b = {}\u0026#39;.format(m[\u0026#39;b\u0026#39;])) print(\u0026#39;c = {}\u0026#39;.format(m[\u0026#39;c\u0026#39;])) print() print(\u0026#39;Keys = {}\u0026#39;.format(list(m.keys()))) print(\u0026#39;Values = {}\u0026#39;.format(list(m.values()))) print() print(\u0026#39;Items:\u0026#39;) for k, v in m.items(): print(\u0026#39;{} = {}\u0026#39;.format(k, v)) print() print(\u0026#39;\u0026#34;d\u0026#34; in m: {}\u0026#39;.format((\u0026#39;d\u0026#39; in m))) Les correspondances sous-jacentes font l\u0026rsquo;objet d\u0026rsquo;une recherche dans l\u0026rsquo;ordre dans lequel elles ont été transmises au constructeur, ainsi la valeur indiquée pour la clé c provient du dictionnaire a.\n$ python3 collections_chainmap_read.py Individual Values a = A b = B c = C Keys = [\u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;a\u0026#39;] Values = [\u0026#39;B\u0026#39;, \u0026#39;C\u0026#39;, \u0026#39;A\u0026#39;] Items: b = B c = C a = A \u0026#34;d\u0026#34; in m: False Réordonner La ChainMap enregistre dans son attribut maps une liste de correspondances, sur laquelle elle fait sa recherche. Cette liste est mutable, ainsi il est possible d\u0026rsquo;ajouter de nouvelles correspondances directement ou de changer l\u0026rsquo;ordre des éléments pour contrôler la recherche et le comportement de mise à jour.\n# collections_chainmap_reorder.py import collections a = {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;} b = {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;} m = collections.ChainMap(a, b) print(m.maps) print(\u0026#39;c = {}\\n\u0026#39;.format(m[\u0026#39;c\u0026#39;])) # reverse the list m.maps = list(reversed(m.maps)) print(m.maps) print(\u0026#39;c = {}\u0026#39;.format(m[\u0026#39;c\u0026#39;])) Quand la liste de correspondances est renversée, la valeur associée à c change.\n$ python3 collections_chainmap_reorder.py [{\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;}, {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}] c = C [{\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;}] c = D Mise à jour des Valeurs Une ChainMap ne met pas en cache les valeurs dans les correspondances sous-jacentes. Ainsi, si leur contenu est modifié, les résultats sont reflétés lors de l\u0026rsquo;accès à ChainMap.\n# collections_chainmap_update_behind.py import collections a = {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;} b = {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;} m = collections.ChainMap(a, b) print(\u0026#39;Before: {}\u0026#39;.format(m[\u0026#39;c\u0026#39;])) a[\u0026#39;c\u0026#39;] = \u0026#39;E\u0026#39; print(\u0026#39;After : {}\u0026#39;.format(m[\u0026#39;c\u0026#39;])) Changer les valeurs associées avec les clés existantes et ajouter de nouveaux éléments fonctionne de la même manière.\n$ python3 collections_chainmap_update_behind.py Before: C After : E Il est également possible de définir directement des valeurs via ChainMap, bien que seule la première correspondance de la chaîne soit réellement modifiée.\n# collections_chainmap_update_directly.py import collections a = {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;} b = {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;} m = collections.ChainMap(a, b) print(\u0026#39;Before:\u0026#39;, m) m[\u0026#39;c\u0026#39;] = \u0026#39;E\u0026#39; print(\u0026#39;After :\u0026#39;, m) print(\u0026#39;a:\u0026#39;, a) Quand la nouvelle valeur est enregistrée en utilisant m, la correspondance a est mise à jour.\n$ python3 collections_chainmap_update_directly.py Before: ChainMap({\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;}, {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}) After : ChainMap({\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;E\u0026#39;}, {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}) a: {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;E\u0026#39;} ChainMap fournit une méthode pratique pour créer une nouvelle instance avec une correspondance supplémentaire au début de la liste des correspondances pour éviter de modifier les structures de données sous-jacentes existantes.\n# collections_chainmap_new_child.py import collections a = {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;} b = {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;} m1 = collections.ChainMap(a, b) m2 = m1.new_child() print(\u0026#39;m1 before:\u0026#39;, m1) print(\u0026#39;m2 before:\u0026#39;, m2) m2[\u0026#39;c\u0026#39;] = \u0026#39;E\u0026#39; print(\u0026#39;m1 after:\u0026#39;, m1) print(\u0026#39;m2 after:\u0026#39;, m2) Ce comportement d\u0026rsquo;empilement est pratique pour utiliser les instances de ChainMap comme contextes de modèles ou d\u0026rsquo;applications. Il est spécifiquement facile d\u0026rsquo;ajouter ou de mettre à jour des valeurs en une itération, puis d\u0026rsquo;annuler les changements pour la prochaine itération.\n$ python3 collections_chainmap_new_child.py m1 before: ChainMap({\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;}, {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}) m2 before: ChainMap({}, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;}, {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}) m1 after: ChainMap({\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;}, {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}) m2 after: ChainMap({\u0026#39;c\u0026#39;: \u0026#39;E\u0026#39;}, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;}, {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;}) Pour les situations où le nouveau contexte est connu ou natif à l\u0026rsquo;avance, il est aussi possible de passer une correspondance à new_child().\n# collections_chainmap_new_child_explicit.py import collections a = {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;} b = {\u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;D\u0026#39;} c = {\u0026#39;c\u0026#39;: \u0026#39;E\u0026#39;} m1 = collections.ChainMap(a, b) m2 = m1.new_child(c) print(\u0026#39;m1[\u0026#34;c\u0026#34;] = {}\u0026#39;.format(m1[\u0026#39;c\u0026#39;])) print(\u0026#39;m2[\u0026#34;c\u0026#34;] = {}\u0026#39;.format(m2[\u0026#39;c\u0026#39;])) Ce qui est l\u0026rsquo;équivalent de :\nm2 = collections.ChainMap(c, *m1.maps) et produit :\n$ python3 collections_chainmap_new_child_explicit.py m1[\u0026#34;c\u0026#34;] = C m2[\u0026#34;c\u0026#34;] = E Compter les objets hachables Un Counter est un conteneur qui garde une trace du nombre de fois où des valeurs équivalentes sont ajoutées. Il peut être utilisé pour implémenter les mêmes algorithmes pour lesquels d\u0026rsquo;autres langages utilisent couramment des structures de données en sacs ou en multi-ensembles.\nInitialisation Counter prend en charge trois formes d\u0026rsquo;initialisation. Son constructeur peut être appelé avec une séquence d\u0026rsquo;items, un dictionnaire contenant des clés et des compteurs, ou en utilisant des arguments de mots-clés qui associent les noms de chaîne aux compteurs.\n# collections_counter_init.py import collections print(collections.Counter([\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;b\u0026#39;])) print(collections.Counter({\u0026#39;a\u0026#39;: 2, \u0026#39;b\u0026#39;: 3, \u0026#39;c\u0026#39;: 1})) print(collections.Counter(a=2, b=3, c=1)) Les résultats des trois formes d\u0026rsquo;initialisation sont les mêmes.\n$ python3 collections_counter_init.py Counter({\u0026#39;b\u0026#39;: 3, \u0026#39;a\u0026#39;: 2, \u0026#39;c\u0026#39;: 1}) Counter({\u0026#39;b\u0026#39;: 3, \u0026#39;a\u0026#39;: 2, \u0026#39;c\u0026#39;: 1}) Counter({\u0026#39;b\u0026#39;: 3, \u0026#39;a\u0026#39;: 2, \u0026#39;c\u0026#39;: 1}) Un Counter vide peut être construit sans arguments et rempli via la méthode update().\n# collections_counter_update.py import collections c = collections.Counter() print(\u0026#39;Initial :\u0026#39;, c) c.update(\u0026#39;abcdaab\u0026#39;) print(\u0026#39;Sequence:\u0026#39;, c) c.update({\u0026#39;a\u0026#39;: 1, \u0026#39;d\u0026#39;: 5}) print(\u0026#39;Dict :\u0026#39;, c) Les valeurs comptées sont augmentées en se basant sur les nouvelles données, plutôt que remplacées. Dans l\u0026rsquo;exemple précédent, le compteur pour a va de 3 à 4.\n$ python3 collections_counter_update.py Initial : Counter() Sequence: Counter({\u0026#39;a\u0026#39;: 3, \u0026#39;b\u0026#39;: 2, \u0026#39;c\u0026#39;: 1, \u0026#39;d\u0026#39;: 1}) Dict : Counter({\u0026#39;d\u0026#39;: 6, \u0026#39;a\u0026#39;: 4, \u0026#39;b\u0026#39;: 2, \u0026#39;c\u0026#39;: 1}) Accéder aux Compteurs Une fois qu\u0026rsquo;un Counter est rempli, ses valeurs peuvent être récupérées en utilisant l\u0026rsquo;API de dictionnaire.\n# collections_counter_get_values.py import collections c = collections.Counter(\u0026#39;abcdaab\u0026#39;) for letter in \u0026#39;abcde\u0026#39;: print(\u0026#39;{} : {}\u0026#39;.format(letter, c[letter])) Le Counter ne soulève pas d\u0026rsquo;erreur KeyError pour les items inconnus. Si une valeur n\u0026rsquo;est pas vue dans l\u0026rsquo;entrée (comme c\u0026rsquo;est le cas dans l\u0026rsquo;exemple avec e), son compteur est à 0.\n$ python3 collections_counter_get_values.py a : 3 b : 2 c : 1 d : 1 e : 0 La méthode elements() retourne un itérateur qui produit tous les items connus de Counter.\n# collections_counter_elements.py import collections c = collections.Counter(\u0026#39;extremely\u0026#39;) c[\u0026#39;z\u0026#39;] = 0 print(c) print(list(c.elements())) L\u0026rsquo;ordre des éléments n\u0026rsquo;est pas garanti, et les items avec des compteurs inférieurs ou égales à zéro ne sont pas inclus.\n$ python3 collections_counter_elements.py Counter({\u0026#39;e\u0026#39;: 3, \u0026#39;x\u0026#39;: 1, \u0026#39;t\u0026#39;: 1, \u0026#39;r\u0026#39;: 1, \u0026#39;m\u0026#39;: 1, \u0026#39;l\u0026#39;: 1, \u0026#39;y\u0026#39;: 1, \u0026#39;z\u0026#39;: 0}) [\u0026#39;e\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;t\u0026#39;, \u0026#39;r\u0026#39;, \u0026#39;m\u0026#39;, \u0026#39;l\u0026#39;, \u0026#39;y\u0026#39;] Utilisez most_common()pour produire une séquence de n valeurs d\u0026rsquo;entrées les plus fréquemment rencontrées et de leurs compteurs respectifs.\n# collections_counter_most_common.py import collections c = collections.Counter() with open(\u0026#39;/usr/share/dict/words\u0026#39;, \u0026#39;rt\u0026#39;) as f: for line in f: c.update(line.rstrip().lower()) print(\u0026#39;Most common:\u0026#39;) for letter, count in c.most_common(3): print(\u0026#39;{}: {:\u0026gt;7}\u0026#39;.format(letter, count)) Cet exemple compte les lettres apparaissant dans tous les mots du dictionnaire système pour produire une distribution de fréquence, puis imprime les trois lettres les plus courantes. Si vous omettez l\u0026rsquo;argument à most_common (), vous obtenez une liste de tous les éléments, par ordre de fréquence.\n$ python3 collections_counter_most_common.py Most common: e: 235331 i: 201032 a: 199554 Arithmétique Les instances de Counter supportent l\u0026rsquo;arithmétique et paramètrent des opérations pour l’agrégation des résultats. Cet exemple montre les opérateurs standards pour créer de nouvelles instances de Counter, mais les opérateurs sur place +=, -=, \u0026amp;=, et |= sont aussi supportés.\n# collections_counter_arithmetic.py import collections c1 = collections.Counter([\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;b\u0026#39;]) c2 = collections.Counter(\u0026#39;alphabet\u0026#39;) print(\u0026#39;C1:\u0026#39;, c1) print(\u0026#39;C2:\u0026#39;, c2) print(\u0026#39;\\nCombined counts:\u0026#39;) print(c1 + c2) print(\u0026#39;\\nSubtraction:\u0026#39;) print(c1 - c2) print(\u0026#39;\\nIntersection (taking positive minimums):\u0026#39;) print(c1 \u0026amp; c2) print(\u0026#39;\\nUnion (taking maximums):\u0026#39;) print(c1 | c2) Chaque fois qu\u0026rsquo;un nouveau Counter est produit par opération, chaque item avec un compteur zéro ou négatif est supprimé. Le compteur pour a est le même dans c1 et c2, la soustraction le laisse à zéro.\n$ python3 collections_counter_arithmetic.py C1: Counter({\u0026#39;b\u0026#39;: 3, \u0026#39;a\u0026#39;: 2, \u0026#39;c\u0026#39;: 1}) C2: Counter({\u0026#39;a\u0026#39;: 2, \u0026#39;l\u0026#39;: 1, \u0026#39;p\u0026#39;: 1, \u0026#39;h\u0026#39;: 1, \u0026#39;b\u0026#39;: 1, \u0026#39;e\u0026#39;: 1, \u0026#39;t\u0026#39;: 1}) Combined counts: Counter({\u0026#39;a\u0026#39;: 4, \u0026#39;b\u0026#39;: 4, \u0026#39;c\u0026#39;: 1, \u0026#39;l\u0026#39;: 1, \u0026#39;p\u0026#39;: 1, \u0026#39;h\u0026#39;: 1, \u0026#39;e\u0026#39;: 1, \u0026#39;t\u0026#39;: 1}) Subtraction: Counter({\u0026#39;b\u0026#39;: 2, \u0026#39;c\u0026#39;: 1}) Intersection (taking positive minimums): Counter({\u0026#39;a\u0026#39;: 2, \u0026#39;b\u0026#39;: 1}) Union (taking maximums): Counter({\u0026#39;b\u0026#39;: 3, \u0026#39;a\u0026#39;: 2, \u0026#39;c\u0026#39;: 1, \u0026#39;l\u0026#39;: 1, \u0026#39;p\u0026#39;: 1, \u0026#39;h\u0026#39;: 1, \u0026#39;e\u0026#39;: 1, \u0026#39;t\u0026#39;: 1}) defaultdict - Retourner une Valeur par Défaut aux Clés Manquantes Le dictionnaire standard inclut la méthode setdefault() pour récupérer une valeur et en établir une par défaut si la valeur n\u0026rsquo;existe pas. Par contraste, defaultdict permet à l\u0026rsquo;appelant de spécifier la valeur par défaut dès l\u0026rsquo;initialisation du conteneur.\n# collections_defaultdict.py import collections def default_factory(): return \u0026#39;default value\u0026#39; d = collections.defaultdict(default_factory, foo=\u0026#39;bar\u0026#39;) print(\u0026#39;d:\u0026#39;, d) print(\u0026#39;foo =\u0026gt;\u0026#39;, d[\u0026#39;foo\u0026#39;]) print(\u0026#39;bar =\u0026gt;\u0026#39;, d[\u0026#39;bar\u0026#39;]) Cette méthode fonctionne aussi dans la mesure où il est approprié que toutes les clés aient la même valeur par défaut. Elle peut être spécialement utile si la valeur par défaut est un type utilisé pour l’agrégation ou l\u0026rsquo;accumulation de valeurs, tels que list, set, ou même int. La documentation standard de la bibliothèque inclus de nombreux exemples dans lesquels defaultdict est utilisé de cette manière.\n$ python3 collections_defaultdict.py d: defaultdict(\u0026lt;function default_factory at 0x101341950\u0026gt;, {\u0026#39;foo\u0026#39;: \u0026#39;bar\u0026#39;}) foo =\u0026gt; bar bar =\u0026gt; default value Lire aussi defaultdict : exemples – Exemples d\u0026rsquo;utilisation de defaultdict dans la documentation standard de la bibliothèque Évolution des Dictionnaires par défaut en Python – Article, en anglais, de James Tauber de la relation entre defaultdict et d’autres moyens d’initialisation des dictionnaires. deque - File d\u0026rsquo;Attente Double Une file d\u0026rsquo;attente double, ou deque prend en charge l\u0026rsquo;ajout ou la suppression d\u0026rsquo;éléments depuis chaque extrémité de la queue. Les piles et les files d’attente les plus couramment utilisées sont des formes dégénérées de deques où les entrées et les sorties sont restreintes à une seule extrémité.\n# collections_deque.py import collections d = collections.deque(\u0026#39;abcdefg\u0026#39;) print(\u0026#39;Deque:\u0026#39;, d) print(\u0026#39;Length:\u0026#39;, len(d)) print(\u0026#39;Left end:\u0026#39;, d[0]) print(\u0026#39;Right end:\u0026#39;, d[-1]) d.remove(\u0026#39;c\u0026#39;) print(\u0026#39;remove(c):\u0026#39;, d) Puisque les deques sont un type de conteneur de séquences, ils prennent en charge certaines des opérations similaires à list, tel que l\u0026rsquo;examen des contenus avec __getitem__(), déterminer la longueur, et la suppression des éléments depuis le milieu de la queue par correspondance d\u0026rsquo;identité.\n$ python3 collections_deque.py Deque: deque([\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;f\u0026#39;, \u0026#39;g\u0026#39;]) Length: 7 Left end: a Right end: g remove(c): deque([\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;f\u0026#39;, \u0026#39;g\u0026#39;]) Remplissage Une deque peut être remplis depuis chaque extrémité, décrite à «gauche» ou à «droite» dans l\u0026rsquo;implémentation Python.\n# collections_deque_populating.py import collections # Add to the right d1 = collections.deque() d1.extend(\u0026#39;abcdefg\u0026#39;) print(\u0026#39;extend :\u0026#39;, d1) d1.append(\u0026#39;h\u0026#39;) print(\u0026#39;append :\u0026#39;, d1) # Add to the left d2 = collections.deque() d2.extendleft(range(6)) print(\u0026#39;extendleft:\u0026#39;, d2) d2.appendleft(6) print(\u0026#39;appendleft:\u0026#39;, d2) La fonction extendleft() effectue une itération sur son entrée et effectue l\u0026rsquo;équivalent d\u0026rsquo;un appendleft() pour chaque item. Le résultat final est que deque contient la séquence d\u0026rsquo;entrée dans l\u0026rsquo;ordre inverse.\n$ python3 collections_deque_populating.py extend : deque([\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;f\u0026#39;, \u0026#39;g\u0026#39;]) append : deque([\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;f\u0026#39;, \u0026#39;g\u0026#39;, \u0026#39;h\u0026#39;]) extendleft: deque([5, 4, 3, 2, 1, 0]) appendleft: deque([6, 5, 4, 3, 2, 1, 0]) Consommation De la même manière, les éléments de deque peuvent être consommés depuis les deux extrémités, ou de l\u0026rsquo;une, selon l\u0026rsquo;algorithme qui est appliqué.\n# collections_deque_consuming.py import collections print(\u0026#39;From the right:\u0026#39;) d = collections.deque(\u0026#39;abcdefg\u0026#39;) while True: try: print(d.pop(), end=\u0026#39;\u0026#39;) except IndexError: break print() print(\u0026#39;\\nFrom the left:\u0026#39;) d = collections.deque(range(6)) while True: try: print(d.popleft(), end=\u0026#39;\u0026#39;) except IndexError: break print() Utilisez pop() pour supprimer un item depuis l\u0026rsquo;extrémité «droite» de deque et popleft() pour prendre un item depuis l\u0026rsquo;extrémité «gauche».\n$ python3 collections_deque_consuming.py From the right: gfedcba From the left: 012345 Puisque les deques sont des processus sûrs (dits «thead-safe»), les contenus peuvent être consommés depuis chaque extrémité en même temps, depuis des processus séparés.\n# collections_deque_both_ends.py import collections import threading import time candle = collections.deque(range(5)) def burn(direction, nextSource): while True: try: next = nextSource() except IndexError: break else: print(\u0026#39;{:\u0026gt;8}: {}\u0026#39;.format(direction, next)) time.sleep(0.1) print(\u0026#39;{:\u0026gt;8} done\u0026#39;.format(direction)) return left = threading.Thread(target=burn, args=(\u0026#39;Left\u0026#39;, candle.popleft)) right = threading.Thread(target=burn, args=(\u0026#39;Right\u0026#39;, candle.pop)) left.start() right.start() left.join() right.join() Les processus dans cet exemple alternent entre chaque extrémité, supprimant les éléments jusqu\u0026rsquo;à ce que deque soit vide.\n$ python3 collections_deque_both_ends.py Left: 0 Right: 4 Right: 3 Left: 1 Right: 2 Left done Right done Rotation Un autre aspect utile de deque est la capacité à se retourner dans chaque direction, et ainsi à sauter par dessus certains items.\n# collections_deque_rotate.py import collections d = collections.deque(range(10)) print(\u0026#39;Normal :\u0026#39;, d) d = collections.deque(range(10)) d.rotate(2) print(\u0026#39;Right rotation:\u0026#39;, d) d = collections.deque(range(10)) d.rotate(-2) print(\u0026#39;Left rotation :\u0026#39;, d) La rotation de deque par la droite (utilisant la rotation positive) prend les éléments depuis l\u0026rsquo;extrémité droite et les déplacer à l\u0026rsquo;extrémité gauche. Les retourner par la gauche (avec une valeur négative) prend les items depuis l\u0026rsquo;extrémité gauche et les déplacent vers l\u0026rsquo;extrémité droite. Il peut être utile de visualiser les éléments dans la deque comme étant gravés le long du bord d’un cadran.\n$ python3 collections_deque_rotate.py Normal : deque([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) Right rotation: deque([8, 9, 0, 1, 2, 3, 4, 5, 6, 7]) Left rotation : deque([2, 3, 4, 5, 6, 7, 8, 9, 0, 1]) Contraindre la Taille de la Queue Une instance deque peut être configuré avec une longueur maximale, ainsi elle ne pourra jamais grandir plus que sa taille. Quand la file d\u0026rsquo;attente atteint la taille spécifiée, les éléments existants sont abandonnés au profit des nouveaux items ajoutés. Ce comportement est pratique pour chercher les n derniers éléments d\u0026rsquo;un flux d\u0026rsquo;une longueur indéterminé.\n# collections_deque_maxlen.py import collections import random # Set the random seed so we see the same output each time # the script is run. random.seed(1) d1 = collections.deque(maxlen=3) d2 = collections.deque(maxlen=3) for i in range(5): n = random.randint(0, 100) print(\u0026#39;n =\u0026#39;, n) d1.append(n) d2.appendleft(n) print(\u0026#39;D1:\u0026#39;, d1) print(\u0026#39;D2:\u0026#39;, d2) La longueur de la file d\u0026rsquo;attente est maintenue quelque soit l\u0026rsquo;extrémité à laquelle sont ajoutés les éléments.\n$ python3 collections_deque_maxlen.py n = 17 D1: deque([17], maxlen=3) D2: deque([17], maxlen=3) n = 72 D1: deque([17, 72], maxlen=3) D2: deque([72, 17], maxlen=3) n = 97 D1: deque([17, 72, 97], maxlen=3) D2: deque([97, 72, 17], maxlen=3) n = 8 D1: deque([72, 97, 8], maxlen=3) D2: deque([8, 97, 72], maxlen=3) n = 32 D1: deque([97, 8, 32], maxlen=3) D2: deque([32, 8, 97], maxlen=3) Lire aussi Wikipedia : Deque - Une discussion sur la structure de données deque (en anglais) Recettes Deque - Exemples d\u0026rsquo;utilisations des files d\u0026rsquo;attente depuis la documentation de la bibliothèque standard. namedtuple - Sous-classe de tuple avec champs nommés Le tuple standard utilise les index numériques pour accéder à ses membres.\n# collections_tuple.py bob = (\u0026#39;Bob\u0026#39;, 30, \u0026#39;male\u0026#39;) print(\u0026#39;Representation:\u0026#39;, bob) jane = (\u0026#39;Jane\u0026#39;, 29, \u0026#39;female\u0026#39;) print(\u0026#39;\\nField by index:\u0026#39;, jane[0]) print(\u0026#39;\\nFields by index:\u0026#39;) for p in [bob, jane]: print(\u0026#39;{} is a {} year old {}\u0026#39;.format(*p)) Ce qui fait des tuples des conteneurs pratiques pour des utilisations simples.\n$ python3 collections_tuple.py Representation: (\u0026#39;Bob\u0026#39;, 30, \u0026#39;male\u0026#39;) Field by index: Jane Fields by index: Bob is a 30 year old male Jane is a 29 year old female Par contraste, se souvenir quel index utiliser pour chaque valeur peut entraîner des erreurs, spécialement si le tuple a beaucoup de champs et est construit loin de l\u0026rsquo;endroit où il est utilisé. Un namedtuple assigne des noms, aussi bien que des index numériques, pour chaque membre.\nDéfinitions Les instances namedtuple sont juste plus efficient en mémoire que les tuples ordinaires car ils n\u0026rsquo;ont pas de dictionnaires par instance. Chaque type de namedtuple est représenté par sa propre classe, qui est créée en utilisant la fonction de fabrication namedtuple(). Les arguments sont des noms de la nouvelle classe et une chaîne contenant les noms des éléments.\n# collections_namedtuple_person.py import collections Person = collections.namedtuple(\u0026#39;Person\u0026#39;, \u0026#39;name age\u0026#39;) bob = Person(name=\u0026#39;Bob\u0026#39;, age=30) print(\u0026#39;\\nRepresentation:\u0026#39;, bob) jane = Person(name=\u0026#39;Jane\u0026#39;, age=29) print(\u0026#39;\\nField by name:\u0026#39;, jane.name) print(\u0026#39;\\nFields by index:\u0026#39;) for p in [bob, jane]: print(\u0026#39;{} is {} years old\u0026#39;.format(*p)) Comme l\u0026rsquo;exemple l\u0026rsquo;illustre, il est possible d\u0026rsquo;accéder aux champs du namedtuple par nom en utilisant la notation (obj.attr) aussi bien que par l\u0026rsquo;utilisation des index positionnés des tuples standards.\n$ python3 collections_namedtuple_person.py Representation: Person(name=\u0026#39;Bob\u0026#39;, age=30) Field by name: Jane Fields by index: Bob is 30 years old Jane is 29 years old Tout comme un tuple ordinaire, un namedtuple est immuable. Cette restriction permet aux instances tuples d\u0026rsquo;avoir une valeur de hachage cohérente, ce qui rend possible leur utilisation comme clés de dictionnaires et d\u0026rsquo;être incluses dans des ensembles.\n# collections_namedtuple_immutable.py import collections Person = collections.namedtuple(\u0026#39;Person\u0026#39;, \u0026#39;name age\u0026#39;) pat = Person(name=\u0026#39;Pat\u0026#39;, age=12) print(\u0026#39;\\nRepresentation:\u0026#39;, pat) pat.age = 21 Essayer de changer sa valeur par son nom d\u0026rsquo;attribut résulte en une erreur AttributError.\n$ python3 collections_namedtuple_immutable.py Representation: Person(name=\u0026#39;Pat\u0026#39;, age=12) Traceback (most recent call last): File \u0026#34;collections_namedtuple_immutable.py\u0026#34;, line 17, in \u0026lt;module\u0026gt; pat.age = 21 AttributeError: can\u0026#39;t set attribute Noms de Champs Invalides Les noms de champs sont invalides s\u0026rsquo;ils sont répétés ou en conflit avec des mots clés Python.\n# collections_namedtuple_bad_fields.py import collections try: collections.namedtuple(\u0026#39;Person\u0026#39;, \u0026#39;name class age\u0026#39;) except ValueError as err: print(err) try: collections.namedtuple(\u0026#39;Person\u0026#39;, \u0026#39;name age age\u0026#39;) except ValueError as err: print(err) Comme les noms des champs sont analysés, les valeurs invalides causent des erreurs d\u0026rsquo;exceptions ValueError.\n$ python3 collections_namedtuple_bad_fields.py Type names and field names cannot be a keyword: \u0026#39;class\u0026#39; Encountered duplicate field name: \u0026#39;age\u0026#39; Dans les situations où un namedtuple est créé sur la base des valeurs en-dehors du contrôle du programme (telle que représenter les lignes renvoyées par une requête de base de données, lorsque le schéma n\u0026rsquo;est pas connu à l\u0026rsquo;avance), l\u0026rsquo;option rename doit être paramétrée à True pour que les champs invalides soient renommés.\n# collections_namedtuple_rename.py import collections with_class = collections.namedtuple( \u0026#39;Person\u0026#39;, \u0026#39;name class age\u0026#39;, rename=True) print(with_class._fields) two_ages = collections.namedtuple( \u0026#39;Person\u0026#39;, \u0026#39;name age age\u0026#39;, rename=True) print(two_ages._fields) Les nouveaux noms des champs renommés dépendent de leur index dans le tuple, ainsi le champ avec le nom class devient _1 et le champ dupliqué age est changé en _2.\n$ python3 collections_namedtuple_rename.py (\u0026#39;name\u0026#39;, \u0026#39;_1\u0026#39;, \u0026#39;age\u0026#39;) (\u0026#39;name\u0026#39;, \u0026#39;age\u0026#39;, \u0026#39;_2\u0026#39;) Attributs Spéciaux namedtuple fournit de nombreux attributs et méthodes pratiques pour travailler avec les sous-classes et les instances. Toutes ces propriétés natives ont des noms préfixés avec un tiret bas (_), qui par convention dans la plupart des programmes Python indique un attribut privé. Pour namedtuple, cependant, le préfixe est intentionnel pour protéger le nom d\u0026rsquo;une collision avec les noms d\u0026rsquo;attributs fournis par utilisateur.\nLes noms de ces champs passés à namedtuple pour définir de nouvelle classe sont sauvegardés sont l\u0026rsquo;attribut _fields.\n# collections_namedtuple_fields.py import collections Person = collections.namedtuple(\u0026#39;Person\u0026#39;, \u0026#39;name age\u0026#39;) bob = Person(name=\u0026#39;Bob\u0026#39;, age=30) print(\u0026#39;Representation:\u0026#39;, bob) print(\u0026#39;Fields:\u0026#39;, bob._fields) Bien que l\u0026rsquo;argument soit une seule chaîne séparée par des espaces, la valeur enregistrée est la séquence de noms individuels.\n$ python3 collections_namedtuple_fields.py Representation: Person(name=\u0026#39;Bob\u0026#39;, age=30) Fields: (\u0026#39;name\u0026#39;, \u0026#39;age\u0026#39;) Les instances namedtuple peuvent être converties en instances OrderedDict par l\u0026rsquo;usage de _asdict().\n# collections_namedtuple_asdict.py import collections Person = collections.namedtuple(\u0026#39;Person\u0026#39;, \u0026#39;name age\u0026#39;) bob = Person(name=\u0026#39;Bob\u0026#39;, age=30) print(\u0026#39;Representation:\u0026#39;, bob) print(\u0026#39;As Dictionary:\u0026#39;, bob._asdict()) Les clés de OrderedDict sont dans le même ordre que les champs du namedtuple.\n$ python3 collections_namedtuple_asdict.py Representation: Person(name=\u0026#39;Bob\u0026#39;, age=30) As Dictionary: OrderedDict([(\u0026#39;name\u0026#39;, \u0026#39;Bob\u0026#39;), (\u0026#39;age\u0026#39;, 30)]) La méthode _replace() construit une nouvelle instance, en remplaçant les valeur de certains champs dans le processus.\n# collections_namedtuple_replace.py import collections Person = collections.namedtuple(\u0026#39;Person\u0026#39;, \u0026#39;name age\u0026#39;) bob = Person(name=\u0026#39;Bob\u0026#39;, age=30) print(\u0026#39;\\nBefore:\u0026#39;, bob) bob2 = bob._replace(name=\u0026#39;Robert\u0026#39;) print(\u0026#39;After:\u0026#39;, bob2) print(\u0026#39;Same?:\u0026#39;, bob is bob2) Bien que le nom implique que l\u0026rsquo;objet existant ait été modifié, parce que les instances namedtuple sont immuables, la méthode retourne actuellement un nouvel objet.\n$ python3 collections_namedtuple_replace.py Before: Person(name=\u0026#39;Bob\u0026#39;, age=30) After: Person(name=\u0026#39;Robert\u0026#39;, age=30) Same?: False OrderedDict - Se souvenir de l\u0026rsquo;ordre des clés ajoutées à un dictionnaire Un OrderedDict est une sous-classe de dictionnaire qui se souvient de l\u0026rsquo;ordre dans lequel son contenu est ajouté.\n# collections_ordereddict_iter.py import collections print(\u0026#39;Regular dictionary:\u0026#39;) d = {} d[\u0026#39;a\u0026#39;] = \u0026#39;A\u0026#39; d[\u0026#39;b\u0026#39;] = \u0026#39;B\u0026#39; d[\u0026#39;c\u0026#39;] = \u0026#39;C\u0026#39; for k, v in d.items(): print(k, v) print(\u0026#39;\\nOrderedDict:\u0026#39;) d = collections.OrderedDict() d[\u0026#39;a\u0026#39;] = \u0026#39;A\u0026#39; d[\u0026#39;b\u0026#39;] = \u0026#39;B\u0026#39; d[\u0026#39;c\u0026#39;] = \u0026#39;C\u0026#39; for k, v in d.items(): print(k, v) Avant Python 3.6 un dict ordinaire ne piste pas l\u0026rsquo;ordre d\u0026rsquo;insertion, et itère dessus les valeurs produites dans l\u0026rsquo;ordre en fonction de la manière dont les clés étaient stockées dans la table de hachage, qui à son tour, est influencé par une valeur aléatoire pour réduire les collisions. Dans un OrderedDict, par contraste, l\u0026rsquo;ordre dans lequel les éléments sont insérés est retenu et utilisé lors de la création de l\u0026rsquo;itérateur.\n$ python3.5 collections_ordereddict_iter.py Regular dictionary: c C b B a A OrderedDict: a A b B c C Sous Python 3.6, le natif dict piste l\u0026rsquo;ordre d\u0026rsquo;insertion, bien que ce comportement soit l’un des effets secondaires d’un changement d’implémentation, il ne faut pas s\u0026rsquo;y fier.\n$ python3.6 collections_ordereddict_iter.py Regular dictionary: a A b B c C OrderedDict: a A b B c C Égalité Un dict ordinaire cherche son contenu lorsqu\u0026rsquo;il teste l\u0026rsquo;égalité. Un OrderedDict considère lui aussi l\u0026rsquo;ordre dans lequel les items sont ajoutés.\n# collections_ordereddict_equality.py import collections print(\u0026#39;dict :\u0026#39;, end=\u0026#39; \u0026#39;) d1 = {} d1[\u0026#39;a\u0026#39;] = \u0026#39;A\u0026#39; d1[\u0026#39;b\u0026#39;] = \u0026#39;B\u0026#39; d1[\u0026#39;c\u0026#39;] = \u0026#39;C\u0026#39; d2 = {} d2[\u0026#39;c\u0026#39;] = \u0026#39;C\u0026#39; d2[\u0026#39;b\u0026#39;] = \u0026#39;B\u0026#39; d2[\u0026#39;a\u0026#39;] = \u0026#39;A\u0026#39; print(d1 == d2) print(\u0026#39;OrderedDict:\u0026#39;, end=\u0026#39; \u0026#39;) d1 = collections.OrderedDict() d1[\u0026#39;a\u0026#39;] = \u0026#39;A\u0026#39; d1[\u0026#39;b\u0026#39;] = \u0026#39;B\u0026#39; d1[\u0026#39;c\u0026#39;] = \u0026#39;C\u0026#39; d2 = collections.OrderedDict() d2[\u0026#39;c\u0026#39;] = \u0026#39;C\u0026#39; d2[\u0026#39;b\u0026#39;] = \u0026#39;B\u0026#39; d2[\u0026#39;a\u0026#39;] = \u0026#39;A\u0026#39; print(d1 == d2) Dans ce cas, puisque deux dictionnaires ordonnés sont créés depuis des valeurs dans un ordre différent, ils sont considérés différents.\n$ python3 collections_ordereddict_equality.py dict : True OrderedDict: False Réordonner Il est possible de changer l\u0026rsquo;ordre des clés dans un OrderedDict en les bougeant selon le début ou la fin de la séquence en utilisant move_to_end().\n# collections_ordereddict_move_to_end.py import collections d = collections.OrderedDict( [(\u0026#39;a\u0026#39;, \u0026#39;A\u0026#39;), (\u0026#39;b\u0026#39;, \u0026#39;B\u0026#39;), (\u0026#39;c\u0026#39;, \u0026#39;C\u0026#39;)] ) print(\u0026#39;Before:\u0026#39;) for k, v in d.items(): print(k, v) d.move_to_end(\u0026#39;b\u0026#39;) print(\u0026#39;\\nmove_to_end():\u0026#39;) for k, v in d.items(): print(k, v) d.move_to_end(\u0026#39;b\u0026#39;, last=False) print(\u0026#39;\\nmove_to_end(last=False):\u0026#39;) for k, v in d.items(): print(k, v) Le dernier argument demande à move_to_end() de bouger l\u0026rsquo;élément afin de devenir le dernier dans la séquence de clé (quand True) ou le premier (quand False).\n$ python3 collections_ordereddict_move_to_end.py Before: a A b B c C move_to_end(): a A c C b B move_to_end(last=False): b B a A c C Lire aussi Variable d\u0026rsquo;environnement pour contrôler la graine aléatoire de la valeur de l\u0026rsquo;algorithme de hachage pour les positions des clés dans le dictionnaire collections.abc - Classes de base abstraites pour les conteneurs But : Classes de bases abstraites pour types de données de conteneur.\nLe module collections.abc contient des classes de base abstraites qui définissent les API pour les structures de conteneur de données natives dans Python et fournies dans le module collections. Référez-vous à la table ci-dessous pour la liste des classes et leur but.\nClasse Classe(s) de Base But de l\u0026rsquo;API Container Fonctionnalités de base de conteneur, tel que l\u0026rsquo;opérateur inc. Hashable Ajoute le support de fourniture d\u0026rsquo;une valeur de hachage pour l\u0026rsquo;instance du conteneur. Iterable Peut créer un itérateur sur le contenu du conteneur. Iterator Iterable Est un itérateur sur le contenu du conteneur. Generator Iterator Étend les itérateurs avec le protocole générateur du PEP 342. Sized Ajoute les méthodes de conteneurs pour connaître la grosseur de leur taille. Callable Pour les conteneurs invoqués en tant que fonction. Sequence Sized, Iterable, Container Prend en charge la récupération d\u0026rsquo;éléments individuels, l\u0026rsquo;itération et la modification de l\u0026rsquo;ordre des éléments. MutableSequence Sequence Prend en charge l\u0026rsquo;ajout et la suppression des éléments d\u0026rsquo;une instance après qu\u0026rsquo;ils soient créés. ByteString Sequence API combinées de bytes et de bytearray. Set Sized, Iterable, Container Prend en charges les opérations d\u0026rsquo;ensemble telles que l\u0026rsquo;intersection et l\u0026rsquo;union. MutableSet Set Ajoute les méthodes de manipulation pour le contenu d\u0026rsquo;ensemble après qu\u0026rsquo;il soit créé. Mapping Sized, Iterable, Container Définit l\u0026rsquo;API en lecture seule utilisé par dict. MutableMapping Mapping Définit les méthodes de manipulation des contenus pour la correspondance après qu\u0026rsquo;ils soient créés. MappingView Sized Définit la vue de l\u0026rsquo;API pour l’accès à la correspondance depuis un itérateur. ItemsView MappingView, Set Partie de la vue de l\u0026rsquo;API. KeysView MappingView, Set Partie de la vue de l\u0026rsquo;API. ValuesView MappingView Partie de la vue de l\u0026rsquo;API. Awaitable API pour les objets qui peuvent être utilisés dans des expressions await, telles que des coroutines. Coroutine Awaitable API pour les classes qui implémentent le protocole coroutine. AsyncIterable API pour les itérables compatibles avec async for, telle que définit dans la PEP 492. AsyncIterator AsyncIterable API pour les itérateurs asynchrones. En plus de définir clairement les API pour les conteneurs avec des sémantiques différentes, ces classes de base abstraites peuvent être utilisées pour tester n\u0026rsquo;importe quel objet qui prend en charge une API avant de l\u0026rsquo;invoquer par l\u0026rsquo;usage d\u0026rsquo; isinstance(). Certaines de ces classes fournissent aussi des implémentations de méthodes, et elles peuvent être utilisées comme mixages(?) pour créer des types de conteneurs personnalisés sans implémenter chaque méthode à partir de rien.\narray - Séquence de Données de Type Fixé But : Gérer efficacement des séquences de données numériques de type fixé.\nLe module array définit une structure de données de séquence qui ressemble beaucoup à une list, excepté que tous les membres doivent être du même type primitif. Les types supportés sont tous les types numériques ou les autres primitifs de taille fixée, tels que les bytes.\nRéférez-vous à la table ci-dessous pour connaître certains des types supportés. La documentation de la bibliothèque standard pour array inclus une liste complète des codes de types.\nCode Type Taille minimal (octets) b int 1 B int 1 h signed short 2 H unsigned short 2 i signed int 2 I unsigned int 2 l signed long 4 L unsigned long 4 q signed long long 8 Q unsigned long long 8 f float 4 d double float 8 Initialisation Un array est instancié avec un argument décrivant le type de donnée à allouer, et si possible une séquence initiale de données à enregistrer dans le tableau.\n# array_string.py import array import binascii s = b\u0026#39;This is the array.\u0026#39; a = array.array(\u0026#39;b\u0026#39;, s) print(\u0026#39;As byte string:\u0026#39;, s) print(\u0026#39;As array :\u0026#39;, a) print(\u0026#39;As hex :\u0026#39;, binascii.hexlify(a)) Dans cet exemple, le tableau est configuré pour capturer une séquence d\u0026rsquo;octets et est initialisé avec une simple chaîne d\u0026rsquo;octets.\n$ python3 array_string.py As byte string: b\u0026#39;This is the array.\u0026#39; As array : array(\u0026#39;b\u0026#39;, [84, 104, 105, 115, 32, 105, 115, 32, 116, 104, 101, 32, 97, 114, 114, 97, 121, 46]) As hex : b\u0026#39;54686973206973207468652061727261792e\u0026#39; Manipuler des Tableaux Un array peut être étendu ou autrement manipulé de la même manière que les autres séquences Python.\n# array_sequence.py import array import pprint a = array.array(\u0026#39;i\u0026#39;, range(3)) print(\u0026#39;Initial :\u0026#39;, a) a.extend(range(3)) print(\u0026#39;Extended:\u0026#39;, a) print(\u0026#39;Slice :\u0026#39;, a[2:5]) print(\u0026#39;Iterator:\u0026#39;) print(list(enumerate(a))) Les opérations supportées incluent le découpage, l\u0026rsquo;itération, et l\u0026rsquo;ajout d\u0026rsquo;éléments à la fin.\n$ python3 array_sequence.py Initial : array(\u0026#39;i\u0026#39;, [0, 1, 2]) Extended: array(\u0026#39;i\u0026#39;, [0, 1, 2, 0, 1, 2]) Slice : array(\u0026#39;i\u0026#39;, [2, 0, 1]) Iterator: [(0, 0), (1, 1), (2, 2), (3, 0), (4, 1), (5, 2)] Tableaux et Fichiers Le contenu d\u0026rsquo;un tableau peut être écrit et lit depuis et vers des fichiers en utilisant des méthodes natives codées efficacement dans ce but.\n# array_file.py import array import binascii import tempfile a = array.array(\u0026#39;i\u0026#39;, range(5)) print(\u0026#39;A1:\u0026#39;, a) # Write the array of numbers to a temporary file output = tempfile.NamedTemporaryFile() a.tofile(output.file) # must pass an *actual* file output.flush() # Read the raw data with open(output.name, \u0026#39;rb\u0026#39;) as input: raw_data = input.read() print(\u0026#39;Raw Contents:\u0026#39;, binascii.hexlify(raw_data)) # Read the data into an array input.seek(0) a2 = array.array(\u0026#39;i\u0026#39;) a2.fromfile(input, len(a)) print(\u0026#39;A2:\u0026#39;, a2) Cet exemple illustre la lecture de donnée «brute», venant directement depuis le fichier binaire, versus la lecture dans un autre tableau et convertissant les octets dans les types appropriés.\n$ python3 array_file.py A1: array(\u0026#39;i\u0026#39;, [0, 1, 2, 3, 4]) Raw Contents: b\u0026#39;0000000001000000020000000300000004000000\u0026#39; A2: array(\u0026#39;i\u0026#39;, [0, 1, 2, 3, 4]) tofile() utilise tobytes() pour formater les données, et fromfile() utilise frombytes() pour les convertir à nouveau en une instance de tableau.\n# array_tobytes.py import array import binascii a = array.array(\u0026#39;i\u0026#39;, range(5)) print(\u0026#39;A1:\u0026#39;, a) as_bytes = a.tobytes() print(\u0026#39;Bytes:\u0026#39;, binascii.hexlify(as_bytes)) a2 = array.array(\u0026#39;i\u0026#39;) a2.frombytes(as_bytes) print(\u0026#39;A2:\u0026#39;, a2) Les deux fonctions tobytes() et frombytes() fonctionnent sur des chaînes d\u0026rsquo;octets, et non pas des chaînes Unicode.\n$ python3 array_tobytes.py A1: array(\u0026#39;i\u0026#39;, [0, 1, 2, 3, 4]) Bytes: b\u0026#39;0000000001000000020000000300000004000000\u0026#39; A2: array(\u0026#39;i\u0026#39;, [0, 1, 2, 3, 4]) Ordre Alternatif d\u0026rsquo;Octet Si la donnée dans le tableau n\u0026rsquo;est pas de l\u0026rsquo;ordre natif d\u0026rsquo;octet, ou si la donnée nécessite d\u0026rsquo;être échangée avant d\u0026rsquo;être envoyée au système avec un ordre d\u0026rsquo;octet différent (ou sur le réseau), il est possible de convertir un tableau entier sans itérer les éléments dans Python.\n# array_byteswap.py import array import binascii def to_hex(a): chars_per_item = a.itemsize * 2 # 2 hex digits hex_version = binascii.hexlify(a) num_chunks = len(hex_version) // chars_per_item for i in range(num_chunks): start = i * chars_per_item end = start + chars_per_item yield hex_version[start:end] start = int(\u0026#39;0x12345678\u0026#39;, 16) end = start + 5 a1 = array.array(\u0026#39;i\u0026#39;, range(start, end)) a2 = array.array(\u0026#39;i\u0026#39;, range(start, end)) a2.byteswap() fmt = \u0026#39;{:\u0026gt;12} {:\u0026gt;12} {:\u0026gt;12} {:\u0026gt;12}\u0026#39; print(fmt.format(\u0026#39;A1 hex\u0026#39;, \u0026#39;A1\u0026#39;, \u0026#39;A2 hex\u0026#39;, \u0026#39;A2\u0026#39;)) print(fmt.format(\u0026#39;-\u0026#39; * 12, \u0026#39;-\u0026#39; * 12, \u0026#39;-\u0026#39; * 12, \u0026#39;-\u0026#39; * 12)) fmt = \u0026#39;{!r:\u0026gt;12} {:12} {!r:\u0026gt;12} {:12}\u0026#39; for values in zip(to_hex(a1), a1, to_hex(a2), a2): print(fmt.format(*values)) La méthode byteswap() échange l\u0026rsquo;ordre d\u0026rsquo;octet des éléments dans le tableau depuis le langage C, qui est plus efficace pour boucler sur les données en Python.\n$ python3 array_byteswap.py A1 hex A1 A2 hex A2 -------- -------- -------- -------- b\u0026#39;78563412\u0026#39; 305419896 b\u0026#39;12345678\u0026#39; 2018915346 b\u0026#39;79563412\u0026#39; 305419897 b\u0026#39;12345679\u0026#39; 2035692562 b\u0026#39;7a563412\u0026#39; 305419898 b\u0026#39;1234567a\u0026#39; 2052469778 b\u0026#39;7b563412\u0026#39; 305419899 b\u0026#39;1234567b\u0026#39; 2069246994 b\u0026#39;7c563412\u0026#39; 305419900 b\u0026#39;1234567c\u0026#39; 2086024210 Lire aussi Documentation de la bibliothèque standard pour array struct - Le module struct. Python Numérique - NumPy est une bibliothèque Python pour travailler efficacement avec de grands ensembles de données. Notes de Portage de Python 2 vers 3 sur array heapq - Algorithme de Tri Heap But : Heapq implémente un algorithme de tri minitas(?) approprié pour utiliser les listes Python.\nUn heap est tel une arborescence de structure de données dans laquelle les nœuds enfants ont une relation d\u0026rsquo;ordre trié avec les nœuds parents. Le binary heaps peut être représenté en utilisant une liste ou un tableau organisé afin que les nœuds enfants d\u0026rsquo;élément N soient à la position 2 * N + 1 et 2 * N + 2 (pour les index basés sur zéro). Ce calque rend cela possible en réarrangeant le tas en place, ainsi il est n\u0026rsquo;est pas nécessaire de ré-allouer beaucoup de mémoire lors de l\u0026rsquo;ajout ou de la suppression d\u0026rsquo;items.\nUn max-heap s\u0026rsquo;assure que le nœud parent est plus large que ou égal à deux de ces enfants. Un min-heap requiert que le nœud parent soit plus petit ou égal à ces nœuds enfants. Le module Python heapq implémente un min-heap.\nExemple de Donnée Cet exemple dans ce chapitre utilise la donnée dans le script heapq_heapdata.py.\n# heapq_heapdata.py # This data was generated with the random module. data = [19, 9, 4, 10, 11] La sortie du tas est imprimé en utilisant le script heapq_showtree.py.\n# heapq_showtree.py import math from io import StringIO def show_tree(tree, total_width=36, fill=\u0026#39; \u0026#39;): \u0026#34;\u0026#34;\u0026#34;Pretty-print a tree.\u0026#34;\u0026#34;\u0026#34; output = StringIO() last_row = -1 for i, n in enumerate(tree): if i: row = int(math.floor(math.log(i + 1, 2))) else: row = 0 if row != last_row: output.write(\u0026#39;\\n\u0026#39;) columns = 2 ** row col_width = int(math.floor(total_width / columns)) output.write(str(n).center(col_width, fill)) last_row = row print(output.getvalue()) print(\u0026#39;-\u0026#39; * total_width) print() Créer un Heap Il y a deux manières de base de créer un heap : heappush() et heapify().\n# heapq_heappush.py import heapq from heapq_showtree import show_tree from heapq_heapdata import data heap = [] print(\u0026#39;random :\u0026#39;, data) print() for n in data: print(\u0026#39;add {:\u0026gt;3}:\u0026#39;.format(n)) heapq.heappush(heap, n) show_tree(heap) Quand heappush() est utilisé, l\u0026rsquo;ordre de tri du tas des éléments est maintenu lorsque de nouveaux éléments sont ajoutés à partir d\u0026rsquo;une source de données.\n$ python3 heapq_heappush.py random : [19, 9, 4, 10, 11] add 19: 19 ---------------------- add 9: 9 19 ---------------------- add 4: 4 19 9 ---------------------- add 10: 4 10 9 19 ---------------------- add 11: 4 10 9 19 11 ---------------------- Si la donnée est toujours en mémoire, il est plus efficient d\u0026rsquo;utiliser heapify() pour réarranger les items dans la liste.\n# heapq_heapify.py import heapq from heapq_showtree import show_tree from heapq_heapdata import data print(\u0026#39;random :\u0026#39;, data) heapq.heapify(data) print(\u0026#39;heapified :\u0026#39;) show_tree(data) Le résultat d\u0026rsquo;une construction d\u0026rsquo;une liste dans un ordre heap, un item à la fois, est le même que le fait de construire une liste non ordonnée en appelant heapify().\n$ python3 heapq_heapify.py random : [19, 9, 4, 10, 11] heapified : 4 9 19 10 11 ---------------------- Accéder au Contenu d\u0026rsquo;un Heap Une fois que le heap est organisé correctement, utilisez heappop() pour supprimer l\u0026rsquo;élément ayant la valeur la plus petite.\n# heapq_heappop.py import heapq from heapq_showtree import show_tree from heapq_heapdata import data print(\u0026#39;random :\u0026#39;, data) heapq.heapify(data) print(\u0026#39;heapified :\u0026#39;) show_tree(data) print() for i in range(2): smallest = heapq.heappop(data) print(\u0026#39;pop {:\u0026gt;3}:\u0026#39;.format(smallest)) show_tree(data) Dans cet exemple, adapté de la documentation de la bibliothèque standard, heapify() et heappop() sont utilisées pour trier une liste de nombres.\n$ python3 heapq_heappop.py random : [19, 9, 4, 10, 11] heapified : 4 9 19 10 11 ---------------------- pop 4: 9 10 19 11 ---------------------- pop 9: 10 11 19 ---------------------- Pour supprimer des éléments existants et les remplacer par de nouvelles valeurs en une unique opération, utilisez heapreplace().\n# heapq_heapreplace.py import heapq from heapq_showtree import show_tree from heapq_heapdata import data heapq.heapify(data) print(\u0026#39;start:\u0026#39;) show_tree(data) for n in [0, 13]: smallest = heapq.heapreplace(data, n) print(\u0026#39;replace {:\u0026gt;2} with {:\u0026gt;2}:\u0026#39;.format(smallest, n)) show_tree(data) Remplacer des éléments rend possible de maintenir un heap de taille fixée, tel qu\u0026rsquo;une file de travaux ordonnés par priorité.\n$ python3 heapq_heapreplace.py start: 4 9 19 10 11 ---------------------- replace 4 with 0: 0 9 19 10 11 ---------------------- replace 0 with 13: 9 10 19 13 11 ---------------------- Extrêmes des Données d\u0026rsquo;un Heap heapq inclus aussi deux fonctions qui examine un itérable et trouve une rangée des valeurs les plus grandes ou les plus petites qu\u0026rsquo;il contient.\n# heapq_extremes.py import heapq from heapq_heapdata import data print(\u0026#39;all :\u0026#39;, data) print(\u0026#39;3 largest :\u0026#39;, heapq.nlargest(3, data)) print(\u0026#39;from sort :\u0026#39;, list(reversed(sorted(data)[-3:]))) print(\u0026#39;3 smallest:\u0026#39;, heapq.nsmallest(3, data)) print(\u0026#39;from sort :\u0026#39;, sorted(data)[:3]) Utiliser nlargest() et nsmallest() est efficace seulement pour les valeurs relativement petites de n \u0026gt; 1, mais peut toujours devenir plus pratique dans quelques cas.\n$ python3 heapq_extremes.py all : [19, 9, 4, 10, 11] 3 largest : [19, 11, 10] from sort : [19, 11, 10] 3 smallest: [4, 9, 10] from sort : [4, 9, 10] Fusion Efficace des Séquences Triées Combiner de nombreuses séquences triées en une nouvelle séquence est facile pour de petits ensembles de données.\npython list(sorted(itertools.chain(*data))) Pour de plus grand ensembles de données, cette technique peut utiliser une somme considérable de mémoire. Au lieu de trier la séquence triée en entier, merge() utilise un tas pour générer un nouvelle séquence une à la fois, déterminant le nouvel item en utilisant une somme de mémoire fixée.\n# heapq_merge.py import heapq import random random.seed(2016) data = [] for i in range(4): new_data = list(random.sample(range(1, 101), 5)) new_data.sort() data.append(new_data) for i, d in enumerate(data): print(\u0026#39;{}: {}\u0026#39;.format(i, d)) print(\u0026#39;\\nMerged:\u0026#39;) for i in heapq.merge(*data): print(i, end=\u0026#39; \u0026#39;) print() Puisque l\u0026rsquo;implémentation de merge() utilise un tas, il consomme la mémoire basée sur le nombre de séquences à fusionner, plutôt que le nombre des éléments dans ces séquences.\n$ python3 heapq_merge.py 0: [33, 58, 71, 88, 95] 1: [10, 11, 17, 38, 91] 2: [13, 18, 39, 61, 63] 3: [20, 27, 31, 42, 45] Merged: 10 11 13 17 18 20 27 31 33 38 39 42 45 58 61 63 71 88 91 95 Lire aussi Documentation de la bibliothèque standard pour heapq Wikipedia - Heap (structure de données) - Une description générale des structures de données heap Priorité de la File d\u0026rsquo;attente - Une implémentation prioritaire de la file d\u0026rsquo;attente de Queue dans la bibliothèque standard. bisect - Maintenir les Listes dans un Ordre Trié But : Maintenir une liste dans un ordre trié sans avoir à appeler le tri chaque fois qu\u0026rsquo;un item est ajouté à la liste.\nLe module bisect implémente un algorithme pour insérer des éléments dans une liste tout en maintenant la liste dans un ordre trié.\nInsérer dans un Ordre Trié Voici un exemple dans lequel insort() est utilisé pour insérer des items dans la liste en ordre trié.\n# bisect_example.py import bisect # A series of random numbers values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1] print(\u0026#39;New Pos Contents\u0026#39;) print(\u0026#39;--- --- ------\u0026#39;) l = [] for i in values: position = bisect.bisect(l, i) bisect.insort(l, i) print(\u0026#39;{:3} {:3}\u0026#39;.format(i, position), l) La première colonne de sortie montre un nouveau nombre aléatoire. La seconde colonne montre la position où le nombre sera inséré dans la liste. Le reste de chaque ligne est la liste triée actuelle.\n$ python3 bisect_example.py New Pos Contents --- --- ------ 14 0 [14] 85 1 [14, 85] 77 1 [14, 77, 85] 26 1 [14, 26, 77, 85] 50 2 [14, 26, 50, 77, 85] 45 2 [14, 26, 45, 50, 77, 85] 66 4 [14, 26, 45, 50, 66, 77, 85] 79 6 [14, 26, 45, 50, 66, 77, 79, 85] 10 0 [10, 14, 26, 45, 50, 66, 77, 79, 85] 3 0 [3, 10, 14, 26, 45, 50, 66, 77, 79, 85] 84 9 [3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85] 77 8 [3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85] 1 0 [1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85] Ceci est un simple exemple. En fait, compte tenu de la quantité de données manipulées, il est plus rapide de simplifier la construction de la liste et la trier en une fois. Par contraste, pour des listes longues, des économies de temps et de mémoire considérables peuvent être obtenues à l\u0026rsquo;aide d\u0026rsquo;un algorithme de tri par insertion tel que celui-ci, spécialement quand l\u0026rsquo;opération comparant deux membres d\u0026rsquo;une liste requiert de coûteux calculs.\nTraitement des Doublons Le résultat de l\u0026rsquo;ensemble montré précédemment inclus une valeur répétée, 77. Le module bisect fournit deux manière de traiter les répétitions : les nouvelles valeurs peuvent être insérées soit à la gauche des valeurs existantes, soit à la droite. La fonction insort() est actuellement un alias de insort_right(), qui insère un item après une valeur existante. La fonction correspondante insort_left() insère un item avant la valeur existante.\n# bisect_example2.py import bisect # A series of random numbers values = [14, 85, 77, 26, 50, 45, 66, 79, 10, 3, 84, 77, 1] print(\u0026#39;New Pos Contents\u0026#39;) print(\u0026#39;--- --- ------\u0026#39;) # Use bisect_left and insort_left. l = [] for i in values: position = bisect.bisect_left(l, i) bisect.insort_left(l, i) print(\u0026#39;{:3} {:3}\u0026#39;.format(i, position), l) Quand la même donnée est manipulée par l\u0026rsquo;utilisation des fonctions bisect_left() et insort_left(), il en résulte la même liste triée mais l\u0026rsquo;insertion des positions est différente pour les valeurs dupliquées.\n$ python3 bisect_example2.py New Pos Contents --- --- ------ 14 0 [14] 85 1 [14, 85] 77 1 [14, 77, 85] 26 1 [14, 26, 77, 85] 50 2 [14, 26, 50, 77, 85] 45 2 [14, 26, 45, 50, 77, 85] 66 4 [14, 26, 45, 50, 66, 77, 85] 79 6 [14, 26, 45, 50, 66, 77, 79, 85] 10 0 [10, 14, 26, 45, 50, 66, 77, 79, 85] 3 0 [3, 10, 14, 26, 45, 50, 66, 77, 79, 85] 84 9 [3, 10, 14, 26, 45, 50, 66, 77, 79, 84, 85] 77 7 [3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85] 1 0 [1, 3, 10, 14, 26, 45, 50, 66, 77, 77, 79, 84, 85] Lire aussi Documentation de la bibliothèque standard pour bisect Wikipedia - Tri d\u0026rsquo;insertion - Une description de l\u0026rsquo;algorithme d\u0026rsquo;insertion de tri. queue - Implémentation FIFO Thread-Safe But : Fournir une implémentation FIFO de processus sûrs.\nLe module queue fournit une structure de données premier entré, premier sorti (FIFO) adaptée à la programmation multithread. Elle peut être utilisée pour passer des messages ou d\u0026rsquo;autres choses en toute sécurité entre les threads producteur et consommateur. Le verrouillage est géré pour l\u0026rsquo;appelant. Ainsi, de nombreux threads peuvent fonctionner avec la même instance de Queue facilement et en toute sécurité. La taille de la Queue (le nombre des éléments qu\u0026rsquo;elle contient) peut être restreinte à l\u0026rsquo;utilisation ou au traitement de la mémoire.\nNote Cette discussion présume que vous comprenez la nature générale d\u0026rsquo;une file d\u0026rsquo;attente. Si ce n\u0026rsquo;est pas le cas, vous devriez lire certaines références avant de continuer.\nFile d\u0026rsquo;attente FIFO de base La classe Queue implémente un conteneur premier entré, premier sorti de base. Les éléments sont ajoutés à la «fin» de la séquence en utilisant la fonction put(), et supprimé à la fin d\u0026rsquo;une autre par l\u0026rsquo;utilisation de get().\n# queue_fifo.py import queue q = queue.Queue() for i in range(5): q.put(i) while not q.empty(): print(q.get(), end=\u0026#39; \u0026#39;) print() Cet exemple utilise un unique thread pour illustrer comment les éléments sont supprimés de la file d\u0026rsquo;attente, dans le même ordre dans lequel ils ont été insérés.\n$ python3 queue_fifo.py 0 1 2 3 4 File d\u0026rsquo;Attente LIFO Par contraste à l\u0026rsquo;implémentation standard FIFO de Queue, la LifoQueue utilise l\u0026rsquo;ordre dernier entré, premier sorti (normalement associé à la pile de la structure de données).\n# queue_lifo.py import queue q = queue.LifoQueue() for i in range(5): q.put(i) while not q.empty(): print(q.get(), end=\u0026#39; \u0026#39;) print() L\u0026rsquo;élément le plus récemment entré dans la file d\u0026rsquo;attente est supprimé par get.\n$ python3 queue_lifo.py 4 3 2 1 0 Priorité dans la File d\u0026rsquo;Attente Parfois, l\u0026rsquo;ordre de traitement des éléments d\u0026rsquo;une file d\u0026rsquo;attente doit être basé sur les caractéristiques de ces éléments, plutôt que sur l\u0026rsquo;ordre dans lequel ils ont été créés ou ajoutés à la file d\u0026rsquo;attente. Par exemple, les travaux d\u0026rsquo;impression du service de la comptabilité peuvent avoir priorité sur une liste de codes qu\u0026rsquo;un développeur souhaite imprimer. PriorityQueues utilise l\u0026rsquo;ordre de tri de la file d\u0026rsquo;attente pour décider quel élément est à récupérer.\n# queue_priority.py import functools import queue import threading @functools.total_ordering class Job: def __init__(self, priority, description): self.priority = priority self.description = description print(\u0026#39;New job:\u0026#39;, description) return def __eq__(self, other): try: return self.priority == other.priority except AttributeError: return NotImplemented def __lt__(self, other): try: return self.priority \u0026lt; other.priority except AttributeError: return NotImplemented q = queue.PriorityQueue() q.put(Job(3, \u0026#39;Mid-level job\u0026#39;)) q.put(Job(10, \u0026#39;Low-level job\u0026#39;)) q.put(Job(1, \u0026#39;Important job\u0026#39;)) def process_job(q): while True: next_job = q.get() print(\u0026#39;Processing job:\u0026#39;, next_job.description) q.task_done() workers = [ threading.Thread(target=process_job, args=(q,)), threading.Thread(target=process_job, args=(q,)), ] for w in workers: w.setDaemon(True) w.start() q.join() Cet exemple comporte de multiples threads consommant les travaux, qui sont traités en fonction de la priorité des éléments dans la file d\u0026rsquo;attente au moment où get() est appelé. L\u0026rsquo;ordre de traitement des éléments ajoutés à la file d\u0026rsquo;attente, pendant l\u0026rsquo;exécution des threads consommateurs, dépend du basculement du contexte du thread.\n$ python3 queue_priority.py New job: Mid-level job New job: Low-level job New job: Important job Processing job: Important job Processing job: Mid-level job Processing job: Low-level job Construire un Thread Client de Podcast Le code source pour un client de podcast dans ce chapitre démontre comment utiliser la classe Queue avec de multiples threads. Le programme lit un ou plusieurs flux RSS, met en file d\u0026rsquo;attente les pièces jointes des cinq derniers épisodes de chaque flux à télécharger et traite plusieurs téléchargements en parallèle à l\u0026rsquo;aide de threads. La gestion des erreurs n’est pas suffisante pour une utilisation en production, mais l’implémentation du squelette illustre l’utilisation du module queue.\nEn premier, certains paramètres de fonctionnement sont établis. Habituellement, ce sont des entrées d\u0026rsquo;utilisateur (p.ex. : des préférences ou d\u0026rsquo;une base de données). L\u0026rsquo;exemple utilise des valeurs codées en dur pour le nombre des threads et la liste des URL à récupérer.\n# fetch_podcasts.py from queue import Queue import threading import time import urllib from urllib.parse import urlparse import feedparser # Set up some global variables num_fetch_threads = 2 enclosure_queue = Queue() # A real app wouldn\u0026#39;t use hard-coded data... feed_urls = [ \u0026#39;http://talkpython.fm/episodes/rss\u0026#39;, ] def message(s): print(\u0026#39;{}: {}\u0026#39;.format(threading.current_thread().name, s)) La fonction download_enclosures() s\u0026rsquo;exécute dans le thread de travail et traite les téléchargements en utilisant urllib.\ndef download_enclosures(q): \u0026#34;\u0026#34;\u0026#34;This is the worker thread function. It processes items in the queue one after another. These daemon threads go into an infinite loop, and exit only when the main thread ends. \u0026#34;\u0026#34;\u0026#34; while True: message(\u0026#39;looking for the next enclosure\u0026#39;) url = q.get() filename = url.rpartition(\u0026#39;/\u0026#39;)[-1] message(\u0026#39;downloading {}\u0026#39;.format(filename)) response = urllib.request.urlopen(url) data = response.read() # Save the downloaded file to the current directory message(\u0026#39;writing to {}\u0026#39;.format(filename)) with open(filename, \u0026#39;wb\u0026#39;) as outfile: outfile.write(data) q.task_done() Une fois que la fonction cible pour les threads est définie, le thread de travail peut être démarré. Quand download_enclosures() s\u0026rsquo;occupe de l\u0026rsquo;instruction url = q.get(), elle la bloque et attend jusqu\u0026rsquo;à ce que la file d\u0026rsquo;attente ait quelque chose à retourner. Cela signifie qu\u0026rsquo;il est prudent de démarrer les threads avant qu\u0026rsquo;il n\u0026rsquo;y ait quoi que ce soit dans la file d\u0026rsquo;attente.\n# Set up some threads to fetch the enclosures for i in range(num_fetch_threads): worker = threading.Thread( target=download_enclosures, args=(enclosure_queue,), name=\u0026#39;worker-{}\u0026#39;.format(i), ) worker.setDaemon(True) worker.start() L\u0026rsquo;étape suivante est de récupérer le contenu de flux en utilisant le module feedparser et de mettre en file d\u0026rsquo;attente les URL. Dès que possible, la première URL est ajoutée à la file d\u0026rsquo;attente, un des threads de travail la prend et démarre le téléchargement. La boucle continue d\u0026rsquo;ajouter les éléments jusqu\u0026rsquo;à ce que le flux soit complet, et les threads de travail retirent à tour de rôle de la file d\u0026rsquo;attente les URL pour les télécharger.\n# Download the feed(s) and put the enclosure URLs into # the queue. for url in feed_urls: response = feedparser.parse(url, agent=\u0026#39;fetch_podcasts.py\u0026#39;) for entry in response[\u0026#39;entries\u0026#39;][:5]: for enclosure in entry.get(\u0026#39;enclosures\u0026#39;, []): parsed_url = urlparse(enclosure[\u0026#39;url\u0026#39;]) message(\u0026#39;queuing {}\u0026#39;.format( parsed_url.path.rpartition(\u0026#39;/\u0026#39;)[-1])) enclosure_queue.put(enclosure[\u0026#39;url\u0026#39;]) Il ne reste plus qu\u0026rsquo;à attendre que la file se vide à nouveau, par l\u0026rsquo;utilisation de join().\n# Now wait for the queue to be empty, indicating that we have # processed all of the downloads. message(\u0026#39;*** main thread waiting\u0026#39;) enclosure_queue.join() message(\u0026#39;*** done\u0026#39;) L\u0026rsquo;exécution de cet exemple de script produit une sortie similaire à celle qui suit.\npython3 fetch_podcasts.py worker-0: looking for the next enclosure worker-1: looking for the next enclosure MainThread: queuing turbogears-and-the-future-of-python-web-frameworks.mp3 MainThread: queuing continuum-scientific-python-and-the-business-of-open-source.mp3 MainThread: queuing openstack-cloud-computing-built-on-python.mp3 MainThread: queuing pypy.js-pypy-python-in-your-browser.mp3 MainThread: queuing machine-learning-with-python-and-scikit-learn.mp3 MainThread: *** main thread waiting worker-0: downloading turbogears-and-the-future-of-python-web-frameworks.mp3 worker-1: downloading continuum-scientific-python-and-the-business-of-open-source.mp3 worker-0: looking for the next enclosure worker-0: downloading openstack-cloud-computing-built-on-python.mp3 worker-1: looking for the next enclosure worker-1: downloading pypy.js-pypy-python-in-your-browser.mp3 worker-0: looking for the next enclosure worker-0: downloading machine-learning-with-python-and-scikit-learn.mp3 worker-1: looking for the next enclosure worker-0: looking for the next enclosure MainThread: *** done La sortie actuelle dépendra du contenu des flux RSS utilisés.\nLire aussi Documentation de la bibliothèque standard pour queue deque - File d\u0026rsquo;Attente Double dans le chapitre collections Structures de Données en Files d\u0026rsquo;Attente - Un article Wikipédia en anglais expliquant les files d\u0026rsquo;attentes. FIFO - Un article Wikipédia expliquant les structures de données, premier entré, premier sorti. module feedparser - Un module pour analyser les flux RSS et Atom, créé par Mark Pilgrim et maintenu par Kurt McKee. struct - Structures de Données Binaires But : Conversion entre chaînes et données binaires.\nLe module struct inclut des fonctions pour la conversion entre les octets de chaînes et les types de données Python natifs tels que les nombres et les chaînes.\nFonctions versus Classe Struct Un ensemble de fonctions au niveau du module est disponible pour travailler avec des valeurs structurées, tout comme la classe Struct. Les spécificateurs de format sont convertis depuis leur format de chaînes vers une représentation compilée, similaire à la façon dont sont pratiques les expressions régulières. La conversion nécessite certaines ressources, ainsi il est plus efficient de la faire en une fois lors de la création de l\u0026rsquo;instance Struct et de l\u0026rsquo;appel des méthodes sur l\u0026rsquo;instance plutôt que d\u0026rsquo;utiliser les fonctions au niveau du module. Tous les exemples suivants utilisent la classe Struct.\nEmballage et Déballage Les structures prennent en charge l\u0026rsquo;emballage de données dans les chaînes, et le déballage de données depuis les chaînes par l\u0026rsquo;usage des spécificateurs de format composés de caractères représentant le type des données et d\u0026rsquo;indicateurs facultatifs de comptage et de finalité. Se référer à la documentation standard de la bibliothèque pour avoir la liste complète des spécificateurs de format supportés.\nDans cet exemple, le spécificateur appelle comme valeurs, un entier, un entier long, et un nombre à virgule flottante. Les espaces dans le spécificateur de format sont inclus pour séparer le type d\u0026rsquo;indicateurs, et sont ignorés lorsque le format est compilé.\n# struct_pack.py import struct import binascii values = (1, \u0026#39;ab\u0026#39;.encode(\u0026#39;utf-8\u0026#39;), 2.7) s = struct.Struct(\u0026#39;I 2s f\u0026#39;) packed_data = s.pack(*values) print(\u0026#39;Original values:\u0026#39;, values) print(\u0026#39;Format string :\u0026#39;, s.format) print(\u0026#39;Uses :\u0026#39;, s.size, \u0026#39;bytes\u0026#39;) print(\u0026#39;Packed Value :\u0026#39;, binascii.hexlify(packed_data)) L\u0026rsquo;exemple convertit la valeur encodée en une séquence d\u0026rsquo;octets hexadécimaux pour l\u0026rsquo;imprimer avec la fonction binascii.hexlify(), puisque certains des caractères sont nuls.\n$ python3 struct_pack.py Original values: (1, b\u0026#39;ab\u0026#39;, 2.7) Format string : I 2s f Uses : 12 bytes Packed Value : b\u0026#39;0100000061620000cdcc2c40\u0026#39; Utilisez unpack() pour extraire la donnée de sa représentation encodée.\n# struct_unpack.py import struct import binascii packed_data = binascii.unhexlify(b\u0026#39;0100000061620000cdcc2c40\u0026#39;) s = struct.Struct(\u0026#39;I 2s f\u0026#39;) unpacked_data = s.unpack(packed_data) print(\u0026#39;Unpacked Values:\u0026#39;, unpacked_data) Passer la valeur condensée à unpack() renvoie les mêmes valeurs (notez l’écart dans la valeur à virgule flottante).\n$ python3 struct_unpack.py Unpacked Values: (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) Endianness Par défaut, les valeurs sont codées à l\u0026rsquo;aide de la notion d\u0026rsquo;endianness de la bibliothèque C native. Il est facile de surcharger ce choix en fournissant une directive endianness explicite dans le format de chaînes.\n# struct_endianness.py import struct import binascii values = (1, \u0026#39;ab\u0026#39;.encode(\u0026#39;utf-8\u0026#39;), 2.7) print(\u0026#39;Original values:\u0026#39;, values) endianness = [ (\u0026#39;@\u0026#39;, \u0026#39;native, native\u0026#39;), (\u0026#39;=\u0026#39;, \u0026#39;native, standard\u0026#39;), (\u0026#39;\u0026lt;\u0026#39;, \u0026#39;little-endian\u0026#39;), (\u0026#39;\u0026gt;\u0026#39;, \u0026#39;big-endian\u0026#39;), (\u0026#39;!\u0026#39;, \u0026#39;network\u0026#39;), ] for code, name in endianness: s = struct.Struct(code + \u0026#39; I 2s f\u0026#39;) packed_data = s.pack(*values) print() print(\u0026#39;Format string :\u0026#39;, s.format, \u0026#39;for\u0026#39;, name) print(\u0026#39;Uses :\u0026#39;, s.size, \u0026#39;bytes\u0026#39;) print(\u0026#39;Packed Value :\u0026#39;, binascii.hexlify(packed_data)) print(\u0026#39;Unpacked Value :\u0026#39;, s.unpack(packed_data)) La table ci-dessous liste les spécificateurs d\u0026rsquo;ordre d\u0026rsquo;octets utilisés par Struct.\nCode Signification @ Ordre natif = Standard natif \u0026lt; little-endian \u0026gt; big-endian ! Ordre réseau $ python3 struct_endianness.py Original values: (1, b\u0026#39;ab\u0026#39;, 2.7) Format string : @ I 2s f for native, native Uses : 12 bytes Packed Value : b\u0026#39;0100000061620000cdcc2c40\u0026#39; Unpacked Value : (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) Format string : = I 2s f for native, standard Uses : 10 bytes Packed Value : b\u0026#39;010000006162cdcc2c40\u0026#39; Unpacked Value : (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) Format string : \u0026lt; I 2s f for little-endian Uses : 10 bytes Packed Value : b\u0026#39;010000006162cdcc2c40\u0026#39; Unpacked Value : (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) Format string : \u0026gt; I 2s f for big-endian Uses : 10 bytes Packed Value : b\u0026#39;000000016162402ccccd\u0026#39; Unpacked Value : (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) Format string : ! I 2s f for network Uses : 10 bytes Packed Value : b\u0026#39;000000016162402ccccd\u0026#39; Unpacked Value : (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) Tampons Travailler avec une donnée encodée en binaire est typiquement réservé pour les situations nécessitant de la performance ou de passer la donnée vers ou depuis des modules d\u0026rsquo;extensions. Ces cas peuvent être optimisés en évitant la surcharge liée à l\u0026rsquo;allocation d\u0026rsquo;un nouveau tampon pour chaque structure codée. Les méthodes pack_into() et unpack_from() prennent en charge l\u0026rsquo;écriture directe de tampons préalloués.\n# struct_buffers.py import array import binascii import ctypes import struct s = struct.Struct(\u0026#39;I 2s f\u0026#39;) values = (1, \u0026#39;ab\u0026#39;.encode(\u0026#39;utf-8\u0026#39;), 2.7) print(\u0026#39;Original:\u0026#39;, values) print() print(\u0026#39;ctypes string buffer\u0026#39;) b = ctypes.create_string_buffer(s.size) print(\u0026#39;Before :\u0026#39;, binascii.hexlify(b.raw)) s.pack_into(b, 0, *values) print(\u0026#39;After :\u0026#39;, binascii.hexlify(b.raw)) print(\u0026#39;Unpacked:\u0026#39;, s.unpack_from(b, 0)) print() print(\u0026#39;array\u0026#39;) a = array.array(\u0026#39;b\u0026#39;, b\u0026#39;\\0\u0026#39; * s.size) print(\u0026#39;Before :\u0026#39;, binascii.hexlify(a)) s.pack_into(a, 0, *values) print(\u0026#39;After :\u0026#39;, binascii.hexlify(a)) print(\u0026#39;Unpacked:\u0026#39;, s.unpack_from(a, 0)) L\u0026rsquo;attribut size à Struct nous dit la taille dont a besoin le tampon.\n$ python3 struct_buffers.py Original: (1, b\u0026#39;ab\u0026#39;, 2.7) ctypes string buffer Before : b\u0026#39;000000000000000000000000\u0026#39; After : b\u0026#39;0100000061620000cdcc2c40\u0026#39; Unpacked: (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) array Before : b\u0026#39;000000000000000000000000\u0026#39; After : b\u0026#39;0100000061620000cdcc2c40\u0026#39; Unpacked: (1, b\u0026#39;ab\u0026#39;, 2.700000047683716) Lire aussi Documentation de la bibliothèque standard pour struct Notes de portage de Python 2 vers 3 pour struct array - Le module array, pour travailler avec des séquences de valeurs de type fixé binascii - Le module binascii, pour produire des représentations ASCII de donnée binaire. Wikipédia : Endianess weakref - Références Impermanentes aux Objets But: Référer un objet «coûteux», tout en permettant à sa mémoire d\u0026rsquo;être réclamée par le ramasse miettes s\u0026rsquo;il n\u0026rsquo;y a pas d\u0026rsquo;autres références non faibles.\nLe module weakref prend en charge les références faibles aux objets. Une référence normale incrémente le compteur de référence sur l\u0026rsquo;objet et l\u0026rsquo;empêche d\u0026rsquo;être nettoyé. Ce résultat n\u0026rsquo;est pas toujours souhaitable, spécifiquement quand une référence circulaire doit être présente ou quand un cache d\u0026rsquo;objet doit être supprimé quand de la mémoire est nécessaire. Une référence faible est une poignée pour un objet qui ne l\u0026rsquo;empêche pas d\u0026rsquo;être nettoyé automatiquement.\nRéférences Les références faibles d\u0026rsquo;objets sont gérés au-travers de la classe ref. Pour récupérer l\u0026rsquo;objet original, appelez la référence objet.\n# weakref_ref.py import weakref class ExpensiveObject: def __del__(self): print(\u0026#39;(Deleting {})\u0026#39;.format(self)) obj = ExpensiveObject() r = weakref.ref(obj) print(\u0026#39;obj:\u0026#39;, obj) print(\u0026#39;ref:\u0026#39;, r) print(\u0026#39;r():\u0026#39;, r()) print(\u0026#39;deleting obj\u0026#39;) del obj print(\u0026#39;r():\u0026#39;, r()) Dans ce cas, puisque obj est supprimé avant le second appel à la référence, la ref retourne None.\n$ python3 weakref_ref.py obj: \u0026lt;__main__.ExpensiveObject object at 0x1007b1a58\u0026gt; ref: \u0026lt;weakref at 0x1007a92c8; to \u0026#39;ExpensiveObject\u0026#39; at 0x1007b1a58\u0026gt; r(): \u0026lt;__main__.ExpensiveObject object at 0x1007b1a58\u0026gt; deleting obj (Deleting \u0026lt;__main__.ExpensiveObject object at 0x1007b1a58\u0026gt;) r(): None Rappels de Référence Le constructeur ref accepte une fonction optionnelle de rappel qui est invoquée quand la référence de l\u0026rsquo;objet est supprimée.\n# weakref_ref_callback.py import weakref class ExpensiveObject: def __del__(self): print(\u0026#39;(Deleting {})\u0026#39;.format(self)) def callback(reference): \u0026#34;\u0026#34;\u0026#34;Invoked when referenced object is deleted\u0026#34;\u0026#34;\u0026#34; print(\u0026#39;callback({!r})\u0026#39;.format(reference)) obj = ExpensiveObject() r = weakref.ref(obj, callback) print(\u0026#39;obj:\u0026#39;, obj) print(\u0026#39;ref:\u0026#39;, r) print(\u0026#39;r():\u0026#39;, r()) print(\u0026#39;deleting obj\u0026#39;) del obj print(\u0026#39;r():\u0026#39;, r()) Le rappel reçoit la référence de l\u0026rsquo;objet en tant qu\u0026rsquo;argument après que la référence soit «morte» et ne se réfère plus à l\u0026rsquo;objet d\u0026rsquo;origine. Une utilisation de cette fonctionnalité est de supprimer la référence faible d\u0026rsquo;un objet depuis un cache.\n$ python3 weakref_ref_callback.py obj: \u0026lt;__main__.ExpensiveObject object at 0x1010b1978\u0026gt; ref: \u0026lt;weakref at 0x1010a92c8; to \u0026#39;ExpensiveObject\u0026#39; at 0x1010b1978\u0026gt; r(): \u0026lt;__main__.ExpensiveObject object at 0x1010b1978\u0026gt; deleting obj (Deleting \u0026lt;__main__.ExpensiveObject object at 0x1010b1978\u0026gt;) callback(\u0026lt;weakref at 0x1010a92c8; dead\u0026gt;) r(): None Finalisation des Objets Pour une gestion plus robuste des ressources lorsque des références faibles sont nettoyées, utilisez la méthode finalize pour associer les rappels aux objets. Une instance finalize est retenue jusqu\u0026rsquo;à ce que l\u0026rsquo;objet attaché soit supprimé, même si l\u0026rsquo;application ne retient pas de référence à la fin.\n# weakref_finalize.py import weakref class ExpensiveObject: def __del__(self): print(\u0026#39;(Deleting {})\u0026#39;.format(self)) def on_finalize(*args): print(\u0026#39;on_finalize({!r})\u0026#39;.format(args)) obj = ExpensiveObject() weakref.finalize(obj, on_finalize, \u0026#39;extra argument\u0026#39;) del obj Les arguments de finalize sont les objets à suivre, un rappel à invoquer quand les objets sont nettoyés, et que les arguments de positions ou nommés sont passés au rappel.\n$ python3 weakref_finalize.py (Deleting \u0026lt;__main__.ExpensiveObject object at 0x1019b10f0\u0026gt;) on_finalize((\u0026#39;extra argument\u0026#39;,)) L\u0026rsquo;instance finalize a une propriété en écriture nommée atexit pour contrôler quand le rappel est invoqué lorsqu’un programme se termine, s\u0026rsquo;il n\u0026rsquo;a pas déjà été appelé.\n# weakref_finalize_atexit.py import sys import weakref class ExpensiveObject: def __del__(self): print(\u0026#39;(Deleting {})\u0026#39;.format(self)) def on_finalize(*args): print(\u0026#39;on_finalize({!r})\u0026#39;.format(args)) obj = ExpensiveObject() f = weakref.finalize(obj, on_finalize, \u0026#39;extra argument\u0026#39;) f.atexit = bool(int(sys.argv[1])) Le comportement par défaut est d\u0026rsquo;invoquer le rappel. Paramétrer atexit sur false désactivera ce comportement.\n$ python3 weakref_finalize_atexit.py 1 on_finalize((\u0026#39;extra argument\u0026#39;,)) (Deleting \u0026lt;__main__.ExpensiveObject object at 0x1007b10f0\u0026gt;) $ python3 weakref_finalize_atexit.py 0 Donner à l\u0026rsquo;instance finalize une référence vers l\u0026rsquo;objet à suivre a pour conséquence de le retenir, ainsi l\u0026rsquo;objet n\u0026rsquo;est jamais passé au ramasse miettes.\n# weakref_finalize_reference.py import gc import weakref class ExpensiveObject: def __del__(self): print(\u0026#39;(Deleting {})\u0026#39;.format(self)) def on_finalize(*args): print(\u0026#39;on_finalize({!r})\u0026#39;.format(args)) obj = ExpensiveObject() obj_id = id(obj) f = weakref.finalize(obj, on_finalize, obj) f.atexit = False del obj for o in gc.get_objects(): if id(o) == obj_id: print(\u0026#39;found uncollected object in gc\u0026#39;) Comme cet exemple le montre, même si la référence explicite vers obj est supprimée, l\u0026rsquo;objet est retenu et visible par le ramasse miettes au-travers de f.\n$ python3 weakref_finalize_reference.py found uncollected object in gc Utiliser une méthode liée à un objet suivi en tant rappel peut également empêcher la finalisation correcte de l\u0026rsquo;objet.\n# weakref_finalize_reference_method.py import gc import weakref class ExpensiveObject: def __del__(self): print(\u0026#39;(Deleting {})\u0026#39;.format(self)) def do_finalize(self): print(\u0026#39;do_finalize\u0026#39;) obj = ExpensiveObject() obj_id = id(obj) f = weakref.finalize(obj, obj.do_finalize) f.atexit = False del obj for o in gc.get_objects(): if id(o) == obj_id: print(\u0026#39;found uncollected object in gc\u0026#39;) Puisque le rappel donné à finalize est une méthode liée à l\u0026rsquo;instance obj, l\u0026rsquo;objet de finalisation capture une référence vers obj, qui ne peut être supprimé ou collecté par le ramasse miettes.\n$ python3 weakref_finalize_reference_method.py found uncollected object in gc Mandataires Il est parfois plus pratique d\u0026rsquo;utiliser un mandataire, plutôt qu\u0026rsquo;une référence faible. Les mandataires peuvent être utilisés comme s\u0026rsquo;il s\u0026rsquo;agissait de l\u0026rsquo;objet d\u0026rsquo;origine et n\u0026rsquo;ont pas besoin d\u0026rsquo;être appelés avant que l\u0026rsquo;objet ne soit accessible. En conséquence, ils peuvent être passés à une bibliothèque qui ne sait pas qu\u0026rsquo;elle reçoit une référence au lieu d\u0026rsquo;un objet réel.\n# weakref_proxy.py import weakref class ExpensiveObject: def __init__(self, name): self.name = name def __del__(self): print(\u0026#39;(Deleting {})\u0026#39;.format(self)) obj = ExpensiveObject(\u0026#39;My Object\u0026#39;) r = weakref.ref(obj) p = weakref.proxy(obj) print(\u0026#39;via obj:\u0026#39;, obj.name) print(\u0026#39;via ref:\u0026#39;, r().name) print(\u0026#39;via proxy:\u0026#39;, p.name) del obj print(\u0026#39;via proxy:\u0026#39;, p.name) Si le mandataire est accédé après que l\u0026rsquo;objet en référence soit supprimé, une erreur d\u0026rsquo;exception ReferenceError est levée.\n$ python3 weakref_proxy.py via obj: My Object via ref: My Object via proxy: My Object (Deleting \u0026lt;__main__.ExpensiveObject object at 0x1007aa7b8\u0026gt;) Traceback (most recent call last): File \u0026#34;weakref_proxy.py\u0026#34;, line 30, in \u0026lt;module\u0026gt; print(\u0026#39;via proxy:\u0026#39;, p.name) ReferenceError: weakly-referenced object no longer exists Mettre en Cache des Objets Les classes ref et obj sont considérés de «bas niveau». Bien qu\u0026rsquo;elles soient utiles pour maintenir les références faibles d\u0026rsquo;objets individuels et de permettre des cycles pour être collectés par le ramasse miettes, les classes WeakKeyDictionary et WeakValueDictionary fournissent une API plus appropriée pour créer un cache de plusieurs objets.\nLa classe WeakValueDictionary utilise les références faibles vers les valeurs qu\u0026rsquo;elle capture, leur permettant d\u0026rsquo;être collectées par le ramasse miettes lorsque tout autre code ne les utilise pas. L\u0026rsquo;utilisation des appels explicites au ramasse miettes illustre la différence entre la gestion de la mémoire avec un dictionnaire standard et WeakValueDictionary :\n# weakref_valuedict.py import gc from pprint import pprint import weakref gc.set_debug(gc.DEBUG_UNCOLLECTABLE) class ExpensiveObject: def __init__(self, name): self.name = name def __repr__(self): return \u0026#39;ExpensiveObject({})\u0026#39;.format(self.name) def __del__(self): print(\u0026#39; (Deleting {})\u0026#39;.format(self)) def demo(cache_factory): # hold objects so any weak references # are not removed immediately all_refs = {} # create the cache using the factory print(\u0026#39;CACHE TYPE:\u0026#39;, cache_factory) cache = cache_factory() for name in [\u0026#39;one\u0026#39;, \u0026#39;two\u0026#39;, \u0026#39;three\u0026#39;]: o = ExpensiveObject(name) cache[name] = o all_refs[name] = o del o # decref print(\u0026#39; all_refs =\u0026#39;, end=\u0026#39; \u0026#39;) pprint(all_refs) print(\u0026#39;\\n Before, cache contains:\u0026#39;, list(cache.keys())) for name, value in cache.items(): print(\u0026#39; {} = {}\u0026#39;.format(name, value)) del value # decref # remove all references to the objects except the cache print(\u0026#39;\\n Cleanup:\u0026#39;) del all_refs gc.collect() print(\u0026#39;\\n After, cache contains:\u0026#39;, list(cache.keys())) for name, value in cache.items(): print(\u0026#39; {} = {}\u0026#39;.format(name, value)) print(\u0026#39; demo returning\u0026#39;) return demo(dict) print() demo(weakref.WeakValueDictionary) Toutes variables de boucle faisant référence aux valeurs mises en cache doivent être explicitement effacées pour que le compte de références de l\u0026rsquo;objet soit décrémenté. Autrement, le ramasse miettes ne supprimera pas les objets, et ils resteront toujours dans le cache. De la même manière, la variable all_refs est utilisée pour capturer les références afin de prévenir que le ramasse miettes les collecte prématurément.\n$ python3 weakref_valuedict.py CACHE TYPE: \u0026lt;class \u0026#39;dict\u0026#39;\u0026gt; all_refs = {\u0026#39;one\u0026#39;: ExpensiveObject(one), \u0026#39;three\u0026#39;: ExpensiveObject(three), \u0026#39;two\u0026#39;: ExpensiveObject(two)} Before, cache contains: [\u0026#39;one\u0026#39;, \u0026#39;three\u0026#39;, \u0026#39;two\u0026#39;] one = ExpensiveObject(one) three = ExpensiveObject(three) two = ExpensiveObject(two) Cleanup: After, cache contains: [\u0026#39;one\u0026#39;, \u0026#39;three\u0026#39;, \u0026#39;two\u0026#39;] one = ExpensiveObject(one) three = ExpensiveObject(three) two = ExpensiveObject(two) demo returning (Deleting ExpensiveObject(one)) (Deleting ExpensiveObject(three)) (Deleting ExpensiveObject(two)) CACHE TYPE: \u0026lt;class \u0026#39;weakref.WeakValueDictionary\u0026#39;\u0026gt; all_refs = {\u0026#39;one\u0026#39;: ExpensiveObject(one), \u0026#39;three\u0026#39;: ExpensiveObject(three), \u0026#39;two\u0026#39;: ExpensiveObject(two)} Before, cache contains: [\u0026#39;one\u0026#39;, \u0026#39;three\u0026#39;, \u0026#39;two\u0026#39;] one = ExpensiveObject(one) three = ExpensiveObject(three) two = ExpensiveObject(two) Cleanup: (Deleting ExpensiveObject(one)) (Deleting ExpensiveObject(three)) (Deleting ExpensiveObject(two)) After, cache contains: [] demo returning La classe WeakKeyDictionary fonctionne de manière similaire mais utilise les références faibles pour les clés au lieu des valeurs dans le dictionnaire.\nAttention La documentation de la bibliothèque pour weakref contient cet avertissement : Mise en garde : Étant donné qu\u0026rsquo;un WeakValueDictionary est construit sur un dictionnaire Python, sa taille ne doit pas changer lors de son itération. Cela peut être difficile à garantir pour un WeakValueDictionary parce que les actions effectuées par le programme pendant l\u0026rsquo;itération peuvent entraîner la disparition «par magie» d\u0026rsquo;éléments du dictionnaire (c\u0026rsquo;est un effet de bord du ramasse miettes des collections).\nLire aussi Documentation de la bibliothèque standard pour weakref gc - le module gc est l\u0026rsquo;interface pour l\u0026rsquo;interprétateur du ramasse miettes. PEP 205 - Proposition d\u0026rsquo;amélioration des \u0026ldquo;Références Faibles\u0026rdquo;. copy - Objets Dupliqués But : Fournir des fonctions pour dupliquer les objets en utilisant une sémantique de copie superficielle ou profonde\nLe module copy inclut deux fonctions, copy() et deepcopy(), pour dupliquer des objets existants.\nCopies Superficielles La copie superficielle créée par copy() est un nouveau conteneur rempli de références vers les contenus de l\u0026rsquo;objet original. Lors de la copie superficielle d\u0026rsquo;un objet list, une nouvelle list est construite et les éléments de l\u0026rsquo;objet original y sont ajoutés.\n# copy_shallow.py import copy import functools @functools.total_ordering class MyClass: def __init__(self, name): self.name = name def __eq__(self, other): return self.name == other.name def __gt__(self, other): return self.name \u0026gt; other.name a = MyClass(\u0026#39;a\u0026#39;) my_list = [a] dup = copy.copy(my_list) print(\u0026#39; my_list:\u0026#39;, my_list) print(\u0026#39; dup:\u0026#39;, dup) print(\u0026#39; dup is my_list:\u0026#39;, (dup is my_list)) print(\u0026#39; dup == my_list:\u0026#39;, (dup == my_list)) print(\u0026#39;dup[0] is my_list[0]:\u0026#39;, (dup[0] is my_list[0])) print(\u0026#39;dup[0] == my_list[0]:\u0026#39;, (dup[0] == my_list[0])) Pour une copie superficielle, l\u0026rsquo;instance MyClass n\u0026rsquo;est pas dupliquée, ainsi la référence dans la liste dup est le même objet que celui qui est dans my_list.\n$ python3 copy_shallow.py my_list: [\u0026lt;__main__.MyClass object at 0x101f9c160\u0026gt;] dup: [\u0026lt;__main__.MyClass object at 0x101f9c160\u0026gt;] dup is my_list: False dup == my_list: True dup[0] is my_list[0]: True dup[0] == my_list[0]: True Copies Profondes La copie profonde créée par deepcopy() est un nouveau conteneur avec des copies des contenus de l\u0026rsquo;objet original. Pour faire une copie profonde d\u0026rsquo;une list, une nouvelle list est construite, les éléments de la liste originale sont copiés, et ensuite ces copies sont ajoutées à la nouvelle liste.\nRemplacer l\u0026rsquo;appel de copy() par deepcopy() fait la différence dans la sortie apparente.\n# copy_deep.py import copy import functools @functools.total_ordering class MyClass: def __init__(self, name): self.name = name def __eq__(self, other): return self.name == other.name def __gt__(self, other): return self.name \u0026gt; other.name a = MyClass(\u0026#39;a\u0026#39;) my_list = [a] dup = copy.deepcopy(my_list) print(\u0026#39; my_list:\u0026#39;, my_list) print(\u0026#39; dup:\u0026#39;, dup) print(\u0026#39; dup is my_list:\u0026#39;, (dup is my_list)) print(\u0026#39; dup == my_list:\u0026#39;, (dup == my_list)) print(\u0026#39;dup[0] is my_list[0]:\u0026#39;, (dup[0] is my_list[0])) print(\u0026#39;dup[0] == my_list[0]:\u0026#39;, (dup[0] == my_list[0])) Le premier élément de la liste n\u0026rsquo;a plus du tout la même référence objet, mais quand les deux objets sont comparés, ils sont toujours évalués comme égaux.\n$ python3 copy_deep.py my_list: [\u0026lt;__main__.MyClass object at 0x101e9c160\u0026gt;] dup: [\u0026lt;__main__.MyClass object at 0x1044e1f98\u0026gt;] dup is my_list: False dup == my_list: True dup[0] is my_list[0]: False dup[0] == my_list[0]: True Personnaliser le Comportement des Copies Il est possible de contrôler comment les copies sont faites en utilisant les méthodes spéciales __copy__() et __deepcopy__().\n__copy__() est appelée sans aucun argument et devrait retourner une copie superficielle de l\u0026rsquo;objet. __deepcopy__() est appelée avec un dictionnaire memo et devrait retourner une copie profonde de l\u0026rsquo;objet. Tous les attributs membres qui ont besoin d\u0026rsquo;être copiés en profondeur devraient être passé vers copy.deepcopy(), avec le dictionnaire memo, pour contrôler la récursion. (Le dictionnaire memo est expliqué plus tard en détails). L\u0026rsquo;exemple suivant illustre comment les méthodes sont appelées.\n# copy_hooks.py import copy import functools @functools.total_ordering class MyClass: def __init__(self, name): self.name = name def __eq__(self, other): return self.name == other.name def __gt__(self, other): return self.name \u0026gt; other.name def __copy__(self): print(\u0026#39;__copy__()\u0026#39;) return MyClass(self.name) def __deepcopy__(self, memo): print(\u0026#39;__deepcopy__({})\u0026#39;.format(memo)) return MyClass(copy.deepcopy(self.name, memo)) a = MyClass(\u0026#39;a\u0026#39;) sc = copy.copy(a) dc = copy.deepcopy(a) Le dictionnaire memo est utilisé pour garder la trace des valeurs qui ont été déjà copiées, évitant ainsi une récursion infinie.\n$ python3 copy_hooks.py __copy__() __deepcopy__({}) Récursion dans les Copies Profondes Pour éviter les problèmes lors de la duplication récursive des structures de données, deepcopy() utilise un dictionnaire pour suivre les objets qui ont déjà été copiés. Le dictionnaire est passé à la méthode __deepcopy__() afin qu\u0026rsquo;il puisse être examiné là aussi.\nLe nouvel exemple montre comment une structure de données interconnectée telle qu\u0026rsquo;un graphe dirigé peut aider à protéger contre la récursivité, en implémentant la méthode __deepcopy__().\n# copy_recursion.py import copy class Graph: def __init__(self, name, connections): self.name = name self.connections = connections def add_connection(self, other): self.connections.append(other) def __repr__(self): return \u0026#39;Graph(name={}, id={})\u0026#39;.format( self.name, id(self)) def __deepcopy__(self, memo): print(\u0026#39;\\nCalling __deepcopy__ for {!r}\u0026#39;.format(self)) if self in memo: existing = memo.get(self) print(\u0026#39; Already copied to {!r}\u0026#39;.format(existing)) return existing print(\u0026#39; Memo dictionary:\u0026#39;) if memo: for k, v in memo.items(): print(\u0026#39; {}: {}\u0026#39;.format(k, v)) else: print(\u0026#39; (empty)\u0026#39;) dup = Graph(copy.deepcopy(self.name, memo), []) print(\u0026#39; Copying to new object {}\u0026#39;.format(dup)) memo[self] = dup for c in self.connections: dup.add_connection(copy.deepcopy(c, memo)) return dup root = Graph(\u0026#39;root\u0026#39;, []) a = Graph(\u0026#39;a\u0026#39;, [root]) b = Graph(\u0026#39;b\u0026#39;, [a, root]) root.add_connection(a) root.add_connection(b) dup = copy.deepcopy(root) La classe Graph inclut certaines méthodes basiques de graphe dirigé. Une instance peut être initialisée avec un nom et une liste de nœuds existants auxquels il est connecté. La méthode add_connection() est utilisée pour paramétrer les connexions bidirectionnelles. Elle est aussi utilisée par l\u0026rsquo;opérateur de copie profonde.\nLa méthode __deepcopy__() imprime les messages pour montrer comment elle est appelée, et gère le contenu du dictionnaire memo selon les besoins. Au lieu de copier en gros la liste complète de connexions, il crée une nouvelle liste et y ajoute des copies des connexions individuelles. Cela permet que le dictionnaire memo soit mise à jour à chaque fois qu\u0026rsquo;un nouveau nœud est dupliqué, et évite les problèmes de récursion ou de copies supplémentaires de nœuds. Comme précédemment, la méthode retourne la copie d\u0026rsquo;objet quand il est fait.\nCopie profonde d’un graphe objet avec des cycles Le graphe vu dans la figure inclut les nombreux cycles, mais la gestion de la récursion avec le dictionnaire memo empêche la traversée de provoquer une erreur de débordement de pile. Quand le nœud root est copié, il produit la sortie suivante.\n$ python3 copy_recursion.py Calling __deepcopy__ for Graph(name=root, id=4326183824) Memo dictionary: (empty) Copying to new object Graph(name=root, id=4367233208) Calling __deepcopy__ for Graph(name=a, id=4326186344) Memo dictionary: Graph(name=root, id=4326183824): Graph(name=root, id=4367233208) Copying to new object Graph(name=a, id=4367234720) Calling __deepcopy__ for Graph(name=root, id=4326183824) Already copied to Graph(name=root, id=4367233208) Calling __deepcopy__ for Graph(name=b, id=4326183880) Memo dictionary: Graph(name=root, id=4326183824): Graph(name=root, id=4367233208) Graph(name=a, id=4326186344): Graph(name=a, id=4367234720) 4326183824: Graph(name=root, id=4367233208) 4367217936: [Graph(name=root, id=4326183824), Graph(name=a, id=4326186344)] 4326186344: Graph(name=a, id=4367234720) Copying to new object Graph(name=b, id=4367235000) La seconde fois où le nœud root est rencontré, pendant que le nœud a soit copié, __deepcopy__() détecte la récursion et réutilise la valeur existante du dictionnaire memo au lieu de créer un nouvel objet.\nLire aussi Documentation de la bibliothèque standard pour copy pprint - Structures de Données Pretty-Print But : Structures de données Pretty-print\nLe module pprint contient une «jolie imprimante» pour produire des vues esthétiques des structures de données. Le formateur produit des représentations de structures de données qui peuvent être analysées correctement par l\u0026rsquo;interpréteur, et qui sont aussi faciles à lire pour un humain. La sortie est conservée sur une seule ligne, si possible, et en retrait lorsqu\u0026rsquo;elle est fractionnée sur plusieurs lignes.\nLes exemples dans ce chapitre dépendent tous du script pprint_data.py, qui est montré ici.\n# pprint_data.py data = [ (1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), (2, {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), (3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;t\u0026#39;\u0026#39;u\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;]), ] Impression La manière la plus simple d\u0026rsquo;utiliser le module est au-travers de la fonction pprint().\n# pprint_pprint.py from pprint import pprint from pprint_data import data print(\u0026#39;PRINT:\u0026#39;) print(data) print() print(\u0026#39;PPRINT:\u0026#39;) pprint(data) pprint() formate un objet et l\u0026rsquo;écrit dans le flux de données en le passant en argument (ou sys.stdout par défaut).\n$ python3 pprint_pprint.py PRINT: [(1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), (2, {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), ( 3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;tu\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;])] PPRINT: [(1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), (2, {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), (3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;tu\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;])] Formatage Pour formater une structure de données sans l\u0026rsquo;écrire directement vers un flux (par exemple, pour la journalisation) utilisez pformat() pour construire une représentation de chaînes.\n# pprint_pformat.py import logging from pprint import pformat from pprint_data import data logging.basicConfig( level=logging.DEBUG, format=\u0026#39;%(levelname)-8s %(message)s\u0026#39;, ) logging.debug(\u0026#39;Logging pformatted data\u0026#39;) formatted = pformat(data) for line in formatted.splitlines(): logging.debug(line.rstrip()) La chaîne formatée peut alors être imprimée ou journalisée indépendamment.\n$ python3 pprint_pformat.py DEBUG Logging pformatted data DEBUG [(1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), DEBUG (2, DEBUG {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, DEBUG \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, DEBUG \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, DEBUG \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, DEBUG \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, DEBUG \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, DEBUG \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, DEBUG \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), DEBUG (3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), DEBUG (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), DEBUG (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;tu\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;])] Classes Arbitraires La classe PrettyPrinter utilisée par pprint() peut aussi fonctionner avec des classes personnalisées, si elles définissent une méthode __repr__().\n# pprint_arbitrary_object.py from pprint import pprint class node: def __init__(self, name, contents=[]): self.name = name self.contents = contents[:] def __repr__(self): return ( \u0026#39;node(\u0026#39; + repr(self.name) + \u0026#39;, \u0026#39; + repr(self.contents) + \u0026#39;)\u0026#39; ) trees = [ node(\u0026#39;node-1\u0026#39;), node(\u0026#39;node-2\u0026#39;, [node(\u0026#39;node-2-1\u0026#39;)]), node(\u0026#39;node-3\u0026#39;, [node(\u0026#39;node-3-1\u0026#39;)]), ] pprint(trees) Les représentations de ces objets imbriqués sont combinées par PrettyPrinter pour retourner une représentation complète de chaînes.\n$ python3 pprint_arbitrary_object.py [node(\u0026#39;node-1\u0026#39;, []), node(\u0026#39;node-2\u0026#39;, [node(\u0026#39;node-2-1\u0026#39;, [])]), node(\u0026#39;node-3\u0026#39;, [node(\u0026#39;node-3-1\u0026#39;, [])])] Récursion Les structures de données récursives sont représentées avec une référence vers la source originale de données, restituées dans le format \u0026lt;Recursion on typename with id=number\u0026gt;.\n# pprint_recursion.py from pprint import pprint local_data = [\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, 1, 2] local_data.append(local_data) print(\u0026#39;id(local_data) =\u0026gt;\u0026#39;, id(local_data)) pprint(local_data) Dans cet exemple, la liste local_data est ajoutée à elle-même, créant une référence récursive.\n$ python3 pprint_recursion.py id(local_data) =\u0026gt; 4358913288 [\u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, 1, 2, \u0026lt;Recursion on list with id=4358913288\u0026gt;] Limiter la Sortie Imbriquée Pour des structures de données très profondes, il peut ne pas être désirable que la sortie inclut tous les détails. La donnée peut ne pas être formatée proprement, le texte formaté est peut-être trop volumineux pour être géré, ou certaines données peuvent être superflues.\n# pprint_depth.py from pprint import pprint from pprint_data import data pprint(data, depth=1) pprint(data, depth=2) Utilisez l\u0026rsquo;argument depth pour contrôler jusqu\u0026rsquo;où dans la structure de données imbriquée l\u0026rsquo;imprimante peut faire une récursion. Les niveaux non inclus dans la sortie sont représentés par une ellipse.\n$ python3 pprint_depth.py [(...), (...), (...), (...), (...)] [(1, {...}), (2, {...}), (3, [...]), (4, [...]), (5, [...])] Contrôler la Largeur de la Sortie La sortie par défaut pour le texte formaté est de 80 colonnes. Pour ajuster la largeur, utilisez l\u0026rsquo;argument width de pprint().\n# pprint_width.py from pprint import pprint from pprint_data import data for width in [80, 5]: print(\u0026#39;WIDTH =\u0026#39;, width) pprint(data, width=width) print() Quand la largeur est trop petite pour accommoder la structure de données formatée, les lignes ne sont pas tronquées, ni encapsulées au cas où cela introduirait une syntaxe non valide.\n$ python3 pprint_width.py WIDTH = 80 [(1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), (2, {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), (3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;tu\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;])] WIDTH = 5 [(1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), (2, {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), (3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;tu\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;])] Le drapeau compact demande à pprint() d\u0026rsquo;essayer de mettre plus de données sur chaque ligne individuelle, plutôt que d\u0026rsquo;étendre des structures de données complexes sur plusieurs lignes.\n# pprint_compact.py from pprint import pprint from pprint_data import data print(\u0026#39;DEFAULT:\u0026#39;) pprint(data, compact=False) print(\u0026#39;\\nCOMPACT:\u0026#39;) pprint(data, compact=True) Cet exemple montre que quand une structure de données ne tient pas sur une ligne, elle est scindée (comme pour le deuxième élément de la liste de données). Quand de multiples éléments peuvent tenir sur une ligne, comme avec le troisième ou quatrième membre, ils sont placés de cette façon.\n$ python3 pprint_compact.py DEFAULT: [(1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), (2, {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), (3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;tu\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;])] COMPACT: [(1, {\u0026#39;a\u0026#39;: \u0026#39;A\u0026#39;, \u0026#39;b\u0026#39;: \u0026#39;B\u0026#39;, \u0026#39;c\u0026#39;: \u0026#39;C\u0026#39;, \u0026#39;d\u0026#39;: \u0026#39;D\u0026#39;}), (2, {\u0026#39;e\u0026#39;: \u0026#39;E\u0026#39;, \u0026#39;f\u0026#39;: \u0026#39;F\u0026#39;, \u0026#39;g\u0026#39;: \u0026#39;G\u0026#39;, \u0026#39;h\u0026#39;: \u0026#39;H\u0026#39;, \u0026#39;i\u0026#39;: \u0026#39;I\u0026#39;, \u0026#39;j\u0026#39;: \u0026#39;J\u0026#39;, \u0026#39;k\u0026#39;: \u0026#39;K\u0026#39;, \u0026#39;l\u0026#39;: \u0026#39;L\u0026#39;}), (3, [\u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;]), (4, [\u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;]), (5, [\u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;tu\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;])] [API]: Application Programming Interface - Interface de Programmation Applicative [PEP]: Python Enhancement Proposals - Propositions d\u0026rsquo;Amélioration Python [RSS]: Really Simple Syndication - Syndication de contenu réellement simple [URL]: Uniform Resource Locator - Repère uniforme de ressource [p.ex.]: par exemple ",
            "content_html": "\u003ch1 id=\"structures-de-données\"\u003eStructures de Données\u003c/h1\u003e\n\u003cp\u003ePython inclut de nombreuses normes de programmation des structures de données, telles que \u003ccode\u003elist\u003c/code\u003e, \u003ccode\u003etuple\u003c/code\u003e, \u003ccode\u003edict\u003c/code\u003e, et \u003ccode\u003eset\u003c/code\u003e, dans le cadre de ses types natifs. Beaucoup d\u0026rsquo;application ne requièrent pas d\u0026rsquo;autres structures, mais quand elles le font, la bibliothèque standard fournit des versions puissantes et bien testées, prêtes à être utilisées.\u003c/p\u003e\n\u003cp\u003eLe module \u003ca\u003e\u003ccode\u003eenum\u003c/code\u003e\u003c/a\u003e fournit une implémentation du type \u003cem\u003eenumeration\u003c/em\u003e qui a des capacités d\u0026rsquo;itération et de comparaison. Il peut être utilisé pour créer des symboles bien définis pour les valeurs, à la place des chaînes ou entiers littéraux.\u003c/p\u003e\n\u003cp\u003eLe module \u003ca\u003e\u003ccode\u003ecollections\u003c/code\u003e\u003c/a\u003e inclus les implémentations de nombreuses structures de données qui étendent celles trouvées dans d\u0026rsquo;autres modules. Par exemple, \u003ccode\u003eDeque\u003c/code\u003e est une file d\u0026rsquo;attente double, qui permet l\u0026rsquo;addition ou la suppression d\u0026rsquo;éléments à chaque extrémité. \u003ccode\u003edefaultdict\u003c/code\u003e est un dictionnaire qui répond avec une valeur par défaut si une clé est manquante, alors que \u003ccode\u003eOrderedDict\u003c/code\u003e se souvient de la séquence dans laquelle les éléments sont ajoutés. \u003ccode\u003enamedtuple\u003c/code\u003e étend le tuple normal pour donner à chaque item membre un nom d\u0026rsquo;attribut en supplément de l\u0026rsquo;index numérique.\u003c/p\u003e\n\u003cp\u003ePour de grandes quantités de données, un \u003ca\u003e\u003ccode\u003earray\u003c/code\u003e\u003c/a\u003e peut utiliser plus efficacement la mémoire qu\u0026rsquo;une liste. Puisqu\u0026rsquo;un \u003ccode\u003earray\u003c/code\u003e est limité à un simple type de donnée, il peut utiliser une représentation de mémoire plus compacte qu\u0026rsquo;une \u003ccode\u003elist\u003c/code\u003e à usage général. En même temps, les instances \u003ccode\u003earray\u003c/code\u003e peuvent être manipulées en utilisant beaucoup des mêmes méthodes qu\u0026rsquo;une \u003ccode\u003elist\u003c/code\u003e, ainsi il peut être possible de remplacer une \u003ccode\u003elist\u003c/code\u003e avec un \u003ccode\u003earray\u003c/code\u003e sans faire beaucoup de changements.\u003c/p\u003e\n\u003cp\u003eLe tri d\u0026rsquo;items dans une séquence est un aspect fondamental de la manipulation de données. La \u003ccode\u003elist\u003c/code\u003e de Python inclus une méthode \u003ccode\u003esort()\u003c/code\u003e, mais parfois il est plus efficient de maintenir une liste dans un ordre trié, sans la trier à nouveau, à chaque fois que son contenu a changé.\u003c/p\u003e\n\u003cp\u003eLes fonctions dans \u003ca\u003e\u003ccode\u003eheapq\u003c/code\u003e\u003c/a\u003e modifient le contenu d\u0026rsquo;une liste tout en préservant l\u0026rsquo;ordre trié de la liste avec une faible surcharge.\u003c/p\u003e\n\u003cp\u003eUne autre option pour construire des listes triés ou des tableaux est \u003ca\u003e\u003ccode\u003ebisect\u003c/code\u003e\u003c/a\u003e. Il utilise une recherche binaire pour trouver le point d\u0026rsquo;insertion des nouveaux items, et est une alternative au tri répété d\u0026rsquo;une liste qui change fréquemment.\u003c/p\u003e\n\u003cp\u003eBien que la \u003ccode\u003elist\u003c/code\u003e native peut simuler une queue, en utilisant les méthodes \u003ccode\u003einsert()\u003c/code\u003e et \u003ccode\u003epop()\u003c/code\u003e, ceci n\u0026rsquo;est pas sûr. Pour avoir de vraies communications ordonnées entre les threads, utilisez le module \u003ca\u003e\u003ccode\u003equeue\u003c/code\u003e\u003c/a\u003e. \u003ca\u003e\u003ccode\u003emultiprocessing\u003c/code\u003e\u003c/a\u003e inclus une version de \u003ccode\u003eQueue\u003c/code\u003e qui fonctionne entre processus, rendant plus facile la conversion d\u0026rsquo;un programme multithread pour utiliser des processus à la place.\u003c/p\u003e\n\u003cp\u003e\u003ca\u003e\u003ccode\u003estruct\u003c/code\u003e\u003c/a\u003e est utile pour décoder les données d\u0026rsquo;une autre application, qui viennent peut être d\u0026rsquo;un fichier binaire ou d\u0026rsquo;un flux de données, dans les types natifs de Python pour une manipulation plus facile.\u003c/p\u003e\n\u003cp\u003eCe chapitre couvre deux modules relatifs à la gestion de la mémoire. Pour des structures de données hautement interconnectées, telles que des graphiques et des arbres, utilisez \u003ca\u003e\u003ccode\u003eweakref\u003c/code\u003e\u003c/a\u003e pour maintenir des références tout en permettant que le récupérateur de mémoire nettoie les objets après qu\u0026rsquo;ils ne soient plus nécessaires. Utilisez les fonctions dans \u003ca\u003e\u003ccode\u003ecopy\u003c/code\u003e\u003c/a\u003e pour dupliquer des structures de données et leurs contenus, incluant les copies récursives avec \u003ccode\u003edeepcopy()\u003c/code\u003e.\u003c/p\u003e\n\u003cp\u003eDéboguer des structures de données peut consommer du temps, spécialement lorsque vous parcourez les sorties imprimées de grandes séquences ou de dictionnaires. Utilisez \u003ca\u003e\u003ccode\u003epprint\u003c/code\u003e\u003c/a\u003e pour créer des représentations faciles à lire qui peuvent être imprimées dans la console ou écrites dans un fichier journal pour déboguer facilement.\u003c/p\u003e\n\u003cp\u003eEnfin, si les types disponibles ne répondent pas aux exigences, sous-classez l\u0026rsquo;un des types natifs et personnalisez-le, ou créez un nouveau type de conteneur en utilisant l\u0026rsquo;une des classes de base abstraites définies dans les \u003ca\u003e\u003ccode\u003ecollections\u003c/code\u003e\u003c/a\u003e en tant que base de départ.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\u003eenum - Type d\u0026rsquo;Énumération\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003ecollections - Types de Données de Conteneur\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003earray - Séquence de Données de Type Fixé\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eheapq - Algorithme de Tri Heap\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003ebisect - Maintenir les Listes dans un Ordre Trié\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003equeue - Implémentation FIFO Thread-Safe\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003estruct - Structures de Données Binaires\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eweakref - Références Impermanentes aux Objets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003ecopy - Objets Dupliqués\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003epprint - Structures de Données Pretty-Print\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"enum---type-dénumération\"\u003eenum - Type d\u0026rsquo;Énumération\u003c/h2\u003e\n\u003cp\u003eLe module \u003ccode\u003eenum\u003c/code\u003e définit un type d\u0026rsquo;énumération avec des capacités d\u0026rsquo;itération et de comparaison. Il peut être utilisé pour créer des symboles bien définis pour des valeurs, à la place des chaînes ou entiers littéraux.\u003c/p\u003e\n\u003ch3 id=\"créer-des-énumérations\"\u003eCréer des Énumérations\u003c/h3\u003e\n\u003cp\u003eUne nouvelle énumération est définie par l\u0026rsquo;utilisation de la syntaxe \u003ccode\u003eclass\u003c/code\u003e en sous-classant \u003ccode\u003eEnum\u003c/code\u003e et en ajoutant des attributs de classe décrivant les valeurs.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_create.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eMember name: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewont_fix\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Member value: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewont_fix\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalue))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes membres de \u003ccode\u003eEnum\u003c/code\u003e sont convertis en instances à mesure que la classe est analysée. Chaque instance a une propriété \u003ccode\u003ename\u003c/code\u003e correspondant au nom de membre et une propriété \u003ccode\u003evalue\u003c/code\u003e correspondante à la valeur assignée au nom dans la définition de classe.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_create.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMember name: wont_fix\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMember value: \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"itération\"\u003eItération\u003c/h3\u003e\n\u003cp\u003eItérer sur l\u0026rsquo;énumération \u003ccode\u003eclass\u003c/code\u003e produit des membres individuels d\u0026rsquo;énumération.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_iterate.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e status \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e BugStatus:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:15}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalue))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes membres sont produits dans l\u0026rsquo;ordre dans lequel ils sont déclarés dans la définition de classe.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_iterate.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003enew\u003c/span\u003e             \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eincomplete\u003c/span\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003einvalid\u003c/span\u003e         \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ewont_fix\u003c/span\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ein_progress\u003c/span\u003e     \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_committed\u003c/span\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_released\u003c/span\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"comparer-les-énumérations\"\u003eComparer les Énumérations\u003c/h3\u003e\n\u003cp\u003eParce que les membres d\u0026rsquo;énumération ne sont pas ordonnés, ils supportent la comparaison seulement par identité et égalité.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_comparison.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eactual_state \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewont_fix\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003edesired_state \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efix_released\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Equality:\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      actual_state \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e desired_state,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      actual_state \u003cspan style=\"color:#5bc4bf\"\u003e==\u003c/span\u003e BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewont_fix)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Identity:\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      actual_state \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e desired_state,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      actual_state \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewont_fix)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Ordered by value:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003etry\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e s \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e sorted(BugStatus)))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eexcept\u003c/span\u003e \u003cspan style=\"color:#ef6155\"\u003eTypeError\u003c/span\u003e \u003cspan style=\"color:#815ba4\"\u003eas\u003c/span\u003e err:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  Cannot sort: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(err))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes opérateurs de comparaison plus-grand-que et plus-petit-que soulèvent des erreurs d\u0026rsquo;exceptions \u003ccode\u003eTypeErrors\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_comparison.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eEquality: False True\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIdentity: False True\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOrdered by value:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  Cannot sort: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026lt;\u0026#39;\u003c/span\u003e not supported between instances of \u003cspan style=\"color:#48b685\"\u003e\u0026#39;BugStatus\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e and \u003cspan style=\"color:#48b685\"\u003e\u0026#39;BugStatus\u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eUtilisez la classe \u003ccode\u003eIntEnum\u003c/code\u003e pour les énumérations dans laquelle les membres doivent se comporter comme des nombres - par exemple, pour supporter les comparaisons.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_intenum.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eIntEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Ordered by value:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ejoin(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;  \u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e+\u003c/span\u003e s\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e s \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e sorted(BugStatus)))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_intenum.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eOrdered by value:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  fix_released\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  fix_committed\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  in_progress\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  wont_fix\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  invalid\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  incomplete\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  new\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"valeurs-dénumération-uniques\"\u003eValeurs d\u0026rsquo;Énumération Uniques\u003c/h3\u003e\n\u003cp\u003eLes membres d\u0026rsquo;énumération avec les mêmes valeurs sont suivis comme des références d\u0026rsquo;alias du même objet membre. Les alias n\u0026rsquo;entraînent pas la présence de valeurs répétées dans l\u0026rsquo;itérateur pour \u003ccode\u003eEnum\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_aliases.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    by_design \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    closed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e status \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e BugStatus:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:15}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalue))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eSame: by_design is wont_fix: \u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eby_design \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ewont_fix)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Same: closed is fix_released: \u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eclosed \u003cspan style=\"color:#5bc4bf\"\u003eis\u003c/span\u003e BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003efix_released)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eParce que \u003ccode\u003eby_design\u003c/code\u003e et \u003ccode\u003eclosed\u003c/code\u003e sont des alias pour d\u0026rsquo;autres membres, ils n\u0026rsquo;apparaissent pas séparément dans la sortie lors de l\u0026rsquo;itération de \u003ccode\u003eEnum\u003c/code\u003e. Le nom canonique pour un membre est le premier nom attaché à la valeur.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_aliases.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003enew\u003c/span\u003e             \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eincomplete\u003c/span\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003einvalid\u003c/span\u003e         \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ewont_fix\u003c/span\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ein_progress\u003c/span\u003e     \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_committed\u003c/span\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_released\u003c/span\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSame: by_design is wont_fix:  True\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eSame: closed is fix_released:  True\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour que tous les membres aient des valeurs uniques, ajoutez le décorateur \u003ccode\u003e@unique\u003c/code\u003e à \u003ccode\u003eEnum\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_unique_enforce.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003e@enum.unique\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#776e71\"\u003e# This will trigger an error with unique applied.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    by_design \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    closed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes membres qui ont des valeurs répétées déclenchent une erreur d\u0026rsquo;exception \u003ccode\u003eValueError\u003c/code\u003e quand la classe \u003ccode\u003eEnum\u003c/code\u003e est interprétée.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_unique_enforce.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eTraceback \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003emost recent call last\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;enum_unique_enforce.py\u0026#34;\u003c/span\u003e, line 11, in \u0026lt;module\u0026gt;\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    class BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eenum.Enum\u003cspan style=\"color:#5bc4bf\"\u003e)\u003c/span\u003e:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e  File \u003cspan style=\"color:#48b685\"\u003e\u0026#34;.../lib/python3.7/enum.py\u0026#34;\u003c/span\u003e, line 848, in unique\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003eenumeration, alias_details\u003cspan style=\"color:#5bc4bf\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eValueError: duplicate values found in \u0026lt;enum \u003cspan style=\"color:#48b685\"\u003e\u0026#39;BugStatus\u0026#39;\u003c/span\u003e\u0026gt;:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eby_design -\u0026gt; wont_fix, closed -\u0026gt; fix_released\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"création-dénumérations-par-programme\"\u003eCréation d\u0026rsquo;Énumérations par Programme\u003c/h3\u003e\n\u003cp\u003eDans certains cas, il est plus pratique de créer des énumérations par programme, plutôt que les coder en dur dans une définition de classe. Pour ces situations, \u003ccode\u003eEnum\u003c/code\u003e prend aussi en charge le fait de passer les noms des membres et les valeurs au constructeur de classe.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_programmatic_create.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBugStatus \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    value\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;BugStatus\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    names\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_released fix_committed in_progress \u0026#39;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e           \u003cspan style=\"color:#48b685\"\u003e\u0026#39;wont_fix invalid incomplete new\u0026#39;\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Member: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enew))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003eAll members:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e status \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e BugStatus:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:15}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalue))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eL\u0026rsquo;argument \u003ccode\u003evalue\u003c/code\u003e est le nom de l\u0026rsquo;énumération, qui est utilisée pour construire la représentation des membres. L\u0026rsquo;argument \u003ccode\u003enames\u003c/code\u003e liste les membres de l\u0026rsquo;énumération. Quand une chaîne unique est passée, elle est divisée en espaces et en virgules, et les jetons résultants sont utilisés comme noms pour les membres, auxquels sont automatiquement attribuées des valeurs commençant par \u003ccode\u003e1\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_programmatic_create.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eMember: BugStatus.new\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAll members:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_released\u003c/span\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_committed\u003c/span\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ein_progress\u003c/span\u003e     \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ewont_fix\u003c/span\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003einvalid\u003c/span\u003e         \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eincomplete\u003c/span\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003enew\u003c/span\u003e             \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour plus de contrôles sur les valeurs associées aux membres, la chaîne \u003ccode\u003enames\u003c/code\u003e peut être remplacée par une séquence de deux tuples ou un dictionnaire faisant correspondre des noms aux valeurs.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_programmatic_mapping.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eBugStatus \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum(\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    value\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;BugStatus\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    names\u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e[\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;incomplete\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;invalid\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;wont_fix\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;in_progress\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_committed\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        (\u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_released\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e),\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;All members:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e status \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e BugStatus:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{:15}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename, status\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalue))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans cet exemple, une liste de deux tuples est donnée au lieu d\u0026rsquo;une chaîne unique contenant seulement les noms des membres. Cela permet de reconstruire l\u0026rsquo;énumération \u003ccode\u003eBugStatus\u003c/code\u003e avec les membres dans le même ordre que la version définie dans \u003ccode\u003eenum_create.py\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_programmatic_mapping.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eAll members:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003enew\u003c/span\u003e             \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eincomplete\u003c/span\u003e      \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003einvalid\u003c/span\u003e         \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ewont_fix\u003c/span\u003e        \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ein_progress\u003c/span\u003e     \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_committed\u003c/span\u003e   \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003efix_released\u003c/span\u003e    \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"valeurs-des-membres-non-entiers\"\u003eValeurs des Membres Non Entiers\u003c/h3\u003e\n\u003cp\u003eLes valeurs des membres d\u0026rsquo;énumération ne sont pas restreints aux entiers. En fait, tout type d\u0026rsquo;objet peut être associé avec un membre. Si la valeur est un tuple, les membres sont passés en tant qu\u0026rsquo;argument individuel à \u003ccode\u003e__init__()\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_tuple_values.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;incomplete\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e               \u003cspan style=\"color:#48b685\"\u003e\u0026#39;invalid\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e               \u003cspan style=\"color:#48b685\"\u003e\u0026#39;wont_fix\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e               \u003cspan style=\"color:#48b685\"\u003e\u0026#39;in_progress\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;wont_fix\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_committed\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;in_progress\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_released\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e (\u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e, [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e])\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__init__\u003c/span\u003e(self, num, transitions):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enum \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e num\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etransitions \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e transitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecan_transition\u003c/span\u003e(self, new_state):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e new_state\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etransitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Name:\u0026#39;\u003c/span\u003e, BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Value:\u0026#39;\u003c/span\u003e, BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalue)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Custom attribute:\u0026#39;\u003c/span\u003e, BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etransitions)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Using attribute:\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecan_transition(BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enew))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eDans cet exemple, chaque valeur de membre est un tuple contenant l\u0026rsquo;ID numérique (qui peut être enregistré dans une base de données) et une liste de transitions valide, sortant de l\u0026rsquo;état actuel.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_tuple_values.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eName: BugStatus.in_progress\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eValue: \u003cspan style=\"color:#5bc4bf\"\u003e(\u003c/span\u003e3, \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_committed\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e])\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCustom attribute: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_committed\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsing attribute: True\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003ePour les cas les plus complexes, les tuples peuvent devenir difficiles à manier. Puisque les valeurs des membres peuvent être n\u0026rsquo;importe quel type d\u0026rsquo;objet, les dictionnaires peuvent être utilisés pour les cas où il y a beaucoup d\u0026rsquo;attributs distincts à suivre pour chaque valeur d\u0026rsquo;énumération. Les valeurs complexes sont directement transmises à \u003ccode\u003e__init __ ()\u003c/code\u003e en tant que seul argument autre que \u003ccode\u003eself\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# enum_complex_values.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eenum\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003eclass\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003eBugStatus\u003c/span\u003e(enum\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eEnum):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    new \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e7\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: [\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;incomplete\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;invalid\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;wont_fix\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e            \u003cspan style=\"color:#48b685\"\u003e\u0026#39;in_progress\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        ],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    incomplete \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e6\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;wont_fix\u0026#39;\u003c/span\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    invalid \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e5\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    wont_fix \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e4\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    in_progress \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e3\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_committed\u0026#39;\u003c/span\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_committed \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e2\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;in_progress\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_released\u0026#39;\u003c/span\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    fix_released \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#f99b15\"\u003e1\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: [\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e],\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    }\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003e__init__\u003c/span\u003e(self, vals):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enum \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e vals[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etransitions \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e vals[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    \u003cspan style=\"color:#815ba4\"\u003edef\u003c/span\u003e \u003cspan style=\"color:#06b6ef\"\u003ecan_transition\u003c/span\u003e(self, new_state):\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e        \u003cspan style=\"color:#815ba4\"\u003ereturn\u003c/span\u003e new_state\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ename \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e self\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etransitions\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Name:\u0026#39;\u003c/span\u003e, BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Value:\u0026#39;\u003c/span\u003e, BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalue)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Custom attribute:\u0026#39;\u003c/span\u003e, BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003etransitions)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Using attribute:\u0026#39;\u003c/span\u003e,\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e      BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ein_progress\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ecan_transition(BugStatus\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003enew))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eCet exemple exprime les mêmes données que l\u0026rsquo;exemple précédent, utilisant des dictionnaires plutôt que des tuples.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 enum_complex_values.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eName: BugStatus.in_progress\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eValue: \u003cspan style=\"color:#5bc4bf\"\u003e{\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;num\u0026#39;\u003c/span\u003e: 3, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;transitions\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_committed\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eCustom attribute: \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;new\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;fix_committed\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eUsing attribute: True\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"lire-aussi\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/enum.html\" rel=\"external\"\u003eDocumentation standard de la bibliothèque pour enum\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca title=\"Adding an Enum type to the Python standard library\" href=\"https://www.python.org/dev/peps/pep-0435\" rel=\"external\"\u003ePEP 435\u003c/a\u003e\u003c/strong\u003e - Ajouter un type Enum à la bibliothèque standard Python\u003c/li\u003e\n\u003cli\u003e\u003ca title=\"The original inspiration for enum, by Barry Warsaw.\" href=\"http://pythonhosted.org/flufl.enum/\" rel=\"external\"\u003eflufl.enum\u003c/a\u003e – L\u0026rsquo;inspiration originelle d\u0026rsquo;enum, par by Barry Warsaw.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"collections---types-de-données-de-conteneur\"\u003ecollections - Types de Données de Conteneur\u003c/h2\u003e\n\u003cp\u003e\u003cstrong\u003eBut\u003c/strong\u003e : Types de données de conteneur.\u003c/p\u003e\n\u003cp\u003eLe module \u003ccode\u003ecollections\u003c/code\u003e inclus les types de données de conteneur au-delà des types natifs \u003ccode\u003elist\u003c/code\u003e, \u003ccode\u003edict\u003c/code\u003e et \u003ccode\u003etuple\u003c/code\u003e.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca\u003eChainMap - Recherche dans plusieurs dictionnaires\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eCounter - Compter les objets hachables\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003edefaultdict - Retourner une valeur par défaut aux clés manquantes\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003edeque - File d\u0026rsquo;attente double\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003enamedtuple - Sous-classe de tuple avec champs nommés\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eOrderedDict - Se souvenir de l\u0026rsquo;ordre des clés ajoutées à un dictionnaire\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003ecollections.abc - Classes de base abstraites pour les conteneurs\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"lire-aussi-1\"\u003eLire aussi\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.python.org/fr/3.7/library/collections.html\" rel=\"external\"\u003eDocumentation standard de la bibliothèque pour collections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca\u003eNotes de portage de Python 2 à 3 pour les collections\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://www.python.org/dev/peps/pep-0342\" rel=\"external\"\u003ePEP 342\u003c/a\u003e\u003c/strong\u003e - Coroutines via Générateurs Améliorés\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ca href=\"https://www.python.org/dev/peps/pep-0492\" rel=\"external\"\u003ePEP 492\u003c/a\u003e\u003c/strong\u003e - Coroutines avec syntaxe \u003ccode\u003easync\u003c/code\u003e et \u003ccode\u003eawait\u003c/code\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"chainmap---recherche-dans-plusieurs-dictionnaires\"\u003eChainMap - Recherche dans plusieurs dictionnaires\u003c/h3\u003e\n\u003cp\u003eLa classe \u003ccode\u003eChainMap\u003c/code\u003e gère une séquence de dictionnaires, et recherche au-travers, dans l\u0026rsquo;ordre où ils sont donnés, pour trouver les valeurs associées aux clés. Une \u003ccode\u003eChainMap\u003c/code\u003e constitue un bon conteneur \u0026ldquo;contextuel\u0026rdquo;, car il peut être traité comme une pile pour laquelle des modifications sont apportées à mesure que la pile grandit, ces modifications étant à nouveau ignorées à mesure que la pile se réduit.\u003c/p\u003e\n\u003ch4 id=\"accéder-à-des-valeurs\"\u003eAccéder à des valeurs\u003c/h4\u003e\n\u003cp\u003eLa \u003ccode\u003eChainMap\u003c/code\u003e supporte la même API qu\u0026rsquo;une dictionnaire classique pour accéder aux valeurs existantes.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# collections_chainmap_read.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ecollections\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;C\u0026#39;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003em \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eChainMap(a, b)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Individual Values\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(m[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(m[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(m[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Keys = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(list(m\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003ekeys())))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Values = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(list(m\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003evalues())))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;Items:\u0026#39;\u003c/span\u003e)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#815ba4\"\u003efor\u003c/span\u003e k, v \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e m\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eitems():\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e    print(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(k, v))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint()\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u0026#34;d\u0026#34; in m: \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat((\u003cspan style=\"color:#48b685\"\u003e\u0026#39;d\u0026#39;\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003ein\u003c/span\u003e m)))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eLes correspondances sous-jacentes font l\u0026rsquo;objet d\u0026rsquo;une recherche dans l\u0026rsquo;ordre dans lequel elles ont été transmises au constructeur, ainsi la valeur indiquée pour la clé \u003ccode\u003ec\u003c/code\u003e provient du dictionnaire \u003ccode\u003ea\u003c/code\u003e.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 collections_chainmap_read.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eIndividual Values\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eb\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ec\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e C\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eKeys\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eValues\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e[\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;C\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eItems:\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003eb\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e B\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ec\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e C\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#ef6155\"\u003ea\u003c/span\u003e \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e A\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#34;d\u0026#34;\u003c/span\u003e in m: False\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch4 id=\"réordonner\"\u003eRéordonner\u003c/h4\u003e\n\u003cp\u003eLa \u003ccode\u003eChainMap\u003c/code\u003e enregistre dans son attribut \u003ccode\u003emaps\u003c/code\u003e une liste de correspondances, sur laquelle elle fait sa recherche. Cette liste est mutable, ainsi il est possible d\u0026rsquo;ajouter de nouvelles correspondances directement ou de changer l\u0026rsquo;ordre des éléments pour contrôler la recherche et le comportement de mise à jour.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-python\" data-lang=\"python\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# collections_chainmap_reorder.py\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#5bc4bf\"\u003eimport\u003c/span\u003e \u003cspan style=\"color:#fec418\"\u003ecollections\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003ea \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#48b685\"\u003e\u0026#39;a\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;A\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;C\u0026#39;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eb \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e {\u003cspan style=\"color:#48b685\"\u003e\u0026#39;b\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;B\u0026#39;\u003c/span\u003e, \u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e: \u003cspan style=\"color:#48b685\"\u003e\u0026#39;D\u0026#39;\u003c/span\u003e}\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003em \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e collections\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eChainMap(a, b)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(m\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emaps)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e\\n\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(m[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\u003cspan style=\"color:#776e71\"\u003e# reverse the list\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003em\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emaps \u003cspan style=\"color:#5bc4bf\"\u003e=\u003c/span\u003e list(reversed(m\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emaps))\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(m\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003emaps)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eprint(\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c = \u003c/span\u003e\u003cspan style=\"color:#f99b15\"\u003e{}\u003c/span\u003e\u003cspan style=\"color:#48b685\"\u003e\u0026#39;\u003c/span\u003e\u003cspan style=\"color:#5bc4bf\"\u003e.\u003c/span\u003eformat(m[\u003cspan style=\"color:#48b685\"\u003e\u0026#39;c\u0026#39;\u003c/span\u003e]))\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eQuand la liste de correspondances est renversée, la valeur associée à \u003ccode\u003ec\u003c/code\u003e change.\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#e7e9db;background-color:#2f1e2e;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;\"\u003e\u003ccode class=\"language-shell\" data-lang=\"shell\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e$ python3 collections_chainmap_reorder.py\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cs